CUDA中的非活动线程与断言线程

Nig*_*fik 5 c++ profiling cuda

我正在使用Visual Profiler 6.0对CUDA内核进行性能分析,几乎在每一行上都有一个栏,显示Inactive threads和的百分比Predicated off threads

我想知道这两个值到底是什么意思,它们有多“不好”?

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

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

非活动线程打印屏幕

TFloat对于两种模板floatdouble类型。是什么导致那里的线程不活动?

我正在使用CUDA 6.0,并且代码在具有计算能力3.5的Tesla K40c上运行。

Dim*_*eks 3

来自以下链接

禁用扭曲中的线程有两个原因:不活动和断言关闭。如果块大小不是 warp 大小的倍数,则块中的最后一个 warp 将具有非活动线程。当 warp 中的某些线程退出内核而其他线程继续运行时,退出的线程将变为非活动状态。当发生发散分支时,线程将被断言,因为线程所采用的单独路径必须被序列化,并且线程对于它们不采用的路径将被禁用。

因此,看起来dimensionsCount大多数线程的值为零(或接近),并且它们在其他一些线程仍在计算之前退出。

另一方面,当满足实际分支条件时,可能会记录“谓词关闭” - 某些线程跳转到退出(但仍然处于活动状态!),其他线程跳转到循环。快照右侧的 SASS 代码也建议了这一点:BRA指令中出现唯一的蓝色条。