c – CUDA中的非活动线程与谓词关闭线程

我使用Visual Profiler 6.0分析我的CUDA内核,几乎每一行都有一个条形图,显示非活动线程和预测线程的百分比.

我想知道这两个值究竟是什么意思,它们有多糟糕?

据我所知,非活动线程(以红色显示)是分散且处于非活动状态的线程(由于某些if语句),并且编译器正确断言Predicated off线程(以蓝色显示)为非活动状态.那是对的吗?

如果这是真的,我不明白为什么我的内核中的一堆行有95%的非活动线程,唯一的if是循环:

TFloat是float或double类型的模板.导致线程不活动的原因是什么?

我正在使用CUDA 6.0,代码在Tesla K40c上运行,计算能力为3.5.

最佳答案 从
following link

There are two reasons threads within a warp can be disabled: being inactive, and being predicated off. If the block size is not a multiple of the warp size, the last warp in the block will have inactive threads. When some threads within a warp exit the kernel while others continue, the exiting threads become inactive. Threads become predicated off when divergent branches occur, because the separate paths taken by the threads must be serialized, and threads are disabled for paths they do not take.

所以看起来你的dimensionsCount在大多数线程上都是零(或接近),并且在其他一些线程仍在计算之前就会退出.

另一方面,当实际分支条件被命中时,可以记录“谓词关闭” – 一些线程跳转到退出(但仍然活动!),其他跳转到循环.快照右侧的SASS代码也会建议这一点:BRA指令中只显示蓝色条.

点赞