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

问题描述

据我了解,如果我具有以下形式的CUDA代码:

if (condition) {
    // do x
}
else {
    //do y
}

然后,由于扭曲中线程的SIMT执行,将对条件语句的执行进行序列化,并且将需要所有线程来运行代码的x和y部分。例外是分支很大,在这种情况下,编译器将使用__any插入检查,以避免不必要地运行代码。

但是,如果我已经提前知道扭曲中的所有线程将具有相同的condition值,那么就不需要执行__any操作,这只是在降低我的代码速度。 / p>

我想知道是否有任何方法指示编译器不包括该投票操作,而是假设对条件束中的所有线程的条件求值均相同,并且仅运行代码?

解决方法

然后,由于扭曲中线程的SIMT执行,将对条件语句的执行进行序列化,并且将需要所有线程来运行代码的x和y部分

只有在条件不能在扭曲内统一求值时,才会发生

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

那是完全不正确的。该编译器无法做到这一点,而从字面上反汇编NVIDIA曾经发布的任何版本的CUDA编译器发出的任何代码都可以证实这一点。有predicated execution,但与您所描述的完全不同。

但是,如果我已经提前知道扭曲中的所有线程将具有相同的condition值,则此__any操作是不必要的,仅用于减慢我的代码的速度。

不仅是不必要的,而且不存在。

我想知道是否有任何方法指示编译器不包括该表决操作,而是假设对条件束中的所有线程的条件求值均相同,并且仅运行代码?

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...