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