Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA:避免分支上的串行执行_C++_Cuda_Simd - Fatal编程技术网

C++ CUDA:避免分支上的串行执行

C++ CUDA:避免分支上的串行执行,c++,cuda,simd,C++,Cuda,Simd,假设由单个warp执行的CUDA内核(为简单起见)到达if-else语句,其中warp中的20个线程满足条件,32-20=12个线程不满足: if (condition){ statement1; // executed by 20 threads else{ statement2; // executed by 12 threads } 根据报告: warp一次执行一条公共指令[…]如果warp的线程通过依赖数据的条件分支发散,则warp将串行执行所采用的每个

假设由单个warp执行的CUDA内核(为简单起见)到达
if
-
else
语句,其中warp中的20个线程满足
条件,32-20=12个线程不满足:

if (condition){
    statement1;     // executed by 20 threads
else{
    statement2;     // executed by 12 threads
}
根据报告:

warp一次执行一条公共指令[…]如果warp的线程通过依赖数据的条件分支发散,则warp将串行执行所采用的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成时,线程会聚回同一执行路径

因此,这两条语句将在不同的周期中顺序执行

开普勒体系结构每个warp调度器包含2个指令调度单元,因此能够在每个周期为每个warp发出2条独立指令


我的问题是:在这种只有两个分支的设置中,为什么
statement1
statement2
不能由两个指令调度单元发出,以供warp中的32个线程同时执行,也就是说,20个线程执行
语句1
,而其他12个线程同时执行
语句2
?如果指令调度程序不是warp一次执行一条普通指令的原因,那么是什么原因?是指令集只提供32个线程范围的指令吗?或者与硬件相关的原因?

每个内核指令总是针对warp中的所有线程执行。因此,从逻辑上讲,不可能在同一经纱内的不同线程上同时执行不同的指令。这将违反GPU所基于的规则。关于你的问题:

开普勒体系结构每个warp调度器包含2个指令调度单元,因此能够在每个周期为每个warp发出2条独立指令

为什么语句1和语句2不能由两个指令调度单元发出,由warp中的32个线程同时执行,即20个线程执行语句1,而其他12个线程同时执行语句2

我不确定您是否意识到这一点,但如果
statement1
statement2
在计算上是独立的,那么它们可以在一个周期内执行:

  • 来自语句1的指令将在所有线程上执行
  • 由于第二个调度单元的作用,
    statement2
    中的指令也将在调度的同一周期内在所有线程上执行
  • 这就是GPU中分支散度的工作原理。一般来说,可以找到一些进一步的读数,例如。因此,我相信您已经免费得到了您所要求的——这两条语句都是在同一个周期内执行的(或者可以执行)

    编辑:

    正如Talonmes在评论中所述,有条件执行可能值得一提,因为它有时有助于防止分支分歧带来的惩罚。有关此主题的更多信息,请参见,引用:

    对于更简单的条件,NVIDIA GPU支持ALU上的条件求值,这不会导致分歧,对于整个扭曲遵循相同路径的条件,显然也没有惩罚


    可能值得一提的是,硬件支持条件谓词指令,对于短代码段,编译器通常更喜欢条件执行而不是分支发散。如果我理解正确,这两条语句将在相同的指令周期内执行,但由于GPU的SIMD/SIMT体系结构,不能同时使用?要重新表述,我的问题是,为什么GPU不能违反SIMD,让两个不同的语句在一个warp中由线程并发执行。或者SIMD是GPU的硬件功能,即在一个warp中执行线程的32个核不能同时执行不同的指令?关于条件执行与分支发散:我不清楚什么“更简单的条件”导致ALU的条件计算,因此没有分支发散惩罚。程序员如何影响这一点?在我看来,条件执行总是比分支执行更可取。@lodhb您是否阅读了链接文档?因为在我看来,您似乎在互换使用术语SIMD和SIMT,而事实并非如此。SIMD基本上与GPU无关。我相信,一旦你们对CUDA中的SIMT和分支散度有了很好的理解,你们就会理解我的答案。至于您稍后的评论,并不总是更可取,但在属于某个特定扭曲的每个线程内的条件计算值相同的情况下,肯定更可取。是的,但我相信,第二条指令可以被分派到由32个物理核组成的完全不同的组中执行。因此,语句1和语句2可以同时执行,但需要64个物理核。