1

我的理解是,如果我有以下形式的 CUDA 代码:

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

然后由于扭曲中线程的 SIMT 执行,条件的执行将被序列化,并且所有线程都需要运行代码的 x 和 y 部分。例外情况是如果分支很大,在这种情况下编译器将插入一个检查 using__any以避免不必要的运行代码。

但是,如果我已经提前知道 warp 中的所有线程都将具有相同的值condition,那么这个__any操作是不必要的,只是为了减慢我的代码速度。

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

4

1 回答 1

0

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

当条件在扭曲中不统一评估时才会发生这种情况

例外情况是如果分支很大,在这种情况下编译器将插入一个检查 using__any以避免不必要的运行代码。

这是完全不正确的。该编译器不这样做,并且从字面上反汇编任何版本的 CUDA 编译器所发出的任何代码都是微不足道的 NVIDIA 曾经发布过以确认这一点。有predicated execution,但这与您描述的有很大不同。

但是,如果我已经提前知道 warp 中的所有线程将具有相同的条件值,那么这个 __any 操作是不必要的,只是为了减慢我的代码速度。

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

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

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

于 2020-09-01T01:49:47.777 回答