如果已知一个warp中的所有线程的条件相同,如何避免在CUDA程序中执行条件的两个分支?

如果已知一个warp中的所有线程的条件相同,如何避免在CUDA程序中执行条件的两个分支?,cuda,gpu,Cuda,Gpu,我的理解是,如果我有CUDA表格代码: if (condition) { // do x } else { //do y } 然后,由于warp中线程的SIMT执行,条件的执行将被序列化,所有线程都需要同时运行代码的x和y部分。例外情况是如果分支很大,在这种情况下,编译器将使用\uu any插入检查,以避免不必要地运行代码 但是,如果我已经提前知道一个warp中的所有线程都将具有相同的条件值,那么这个\u任何操作都是不必要的,只会降低代码的速度 我想知道是否有任何方法可以指示编

我的理解是,如果我有CUDA表格代码:

if (condition) {
    // do x
}
else {
    //do y
}
然后,由于warp中线程的SIMT执行,条件的执行将被序列化,所有线程都需要同时运行代码的x和y部分。例外情况是如果分支很大,在这种情况下,编译器将使用
\uu any
插入检查,以避免不必要地运行代码

但是,如果我已经提前知道一个warp中的所有线程都将具有相同的
条件值
,那么这个
\u任何
操作都是不必要的,只会降低代码的速度

我想知道是否有任何方法可以指示编译器不包含这个投票操作,而是假设对warp中所有线程的条件求值都相同,并且只运行相应的代码块

然后,由于warp中线程的SIMT执行,条件的执行将被序列化,所有线程都需要运行代码的x和y部分

只有当条件在扭曲中的计算不一致时,才会发生这种情况

例外情况是如果分支很大,在这种情况下,编译器将使用
\uu any
插入检查,以避免不必要地运行代码

这是完全错误的。该编译器并没有做到这一点,而且只要反汇编NVIDIA发布的任何版本的CUDA编译器发出的代码就可以了。有,但这与你所描述的大不相同

但是,如果我已经提前知道一个warp中的所有线程都将具有相同的条件值,那么任何操作都是不必要的,只会降低代码的速度

它不仅没有必要,而且根本不存在

我想知道是否有任何方法可以指示编译器不包含这个投票操作,而是假设对warp中所有线程的条件求值都相同,并且只运行相应的代码块

不,因为您想要的是默认行为

然后,由于warp中线程的SIMT执行,条件的执行将被序列化,所有线程都需要运行代码的x和y部分

只有当条件在扭曲中的计算不一致时,才会发生这种情况

例外情况是如果分支很大,在这种情况下,编译器将使用
\uu any
插入检查,以避免不必要地运行代码

这是完全错误的。该编译器并没有做到这一点,而且只要反汇编NVIDIA发布的任何版本的CUDA编译器发出的代码就可以了。有,但这与你所描述的大不相同

但是,如果我已经提前知道一个warp中的所有线程都将具有相同的条件值,那么任何操作都是不必要的,只会降低代码的速度

它不仅没有必要,而且根本不存在

我想知道是否有任何方法可以指示编译器不包含这个投票操作,而是假设对warp中所有线程的条件求值都相同,并且只运行相应的代码块


不,因为您想要的是默认行为。

我对编译器插入
\u any
的说法表示怀疑。我在条件语句的两侧都编写了复杂的代码,但在SASS中没有看到。我知道你可以找到,但我认为这是过时的信息,一个可能不再真实的实现细节。在任何情况下,都不存在这种情况,而warp投票是一种成本相对较低的指令。相反,(幻灯片49)表明,如果决策边界在warp之外,则可以避免分歧的成本(对于该warp)。我的理解是,只有当warp中的一个或多个线程实际选择了一条发散路径时,warp执行引擎才会遵循该路径。如果warp中的0个线程选择了一个特定的发散路径,那么warp执行引擎足够聪明,不会安排该路径(所有线程都被屏蔽)。我对编译器插入
\u any
的说法表示怀疑。我在条件语句的两侧都编写了复杂的代码,但在SASS中没有看到。我知道你可以找到,但我认为这是过时的信息,一个可能不再真实的实现细节。在任何情况下,都不存在这种情况,而warp投票是一种成本相对较低的指令。相反,(幻灯片49)表明,如果决策边界在warp之外,则可以避免分歧的成本(对于该warp)。我的理解是,只有当warp中的一个或多个线程实际选择了一条发散路径时,warp执行引擎才会遵循该路径。如果扭曲中的0个线程选择了特定的发散路径,那么扭曲执行引擎足够聪明,不会调度该路径(所有线程都被屏蔽)。