问题描述
据我了解,如果我具有以下形式的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操作是不必要的,仅用于减慢我的代码的速度。
不仅是不必要的,而且不存在。
我想知道是否有任何方法指示编译器不包括该表决操作,而是假设对条件束中的所有线程的条件求值均相同,并且仅运行代码?
否,因为您想要的是默认行为。