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

时间:2014-04-25 03:25:40

标签: c++ cuda profiling

我使用Visual Profiler 6.0分析我的CUDA内核,几乎每一行都有一个显示Inactive threadsPredicated off threads百分比的栏。

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

据我所知,Inactive threads(以红色显示)是分散且处于非活动状态的线程(由于某些if语句),并且Predicated off threads(以蓝色显示)由编译器正确预测不活跃。这是对的吗?

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

Inactive threads print-screen

TFloatfloatdouble类型的模板。导致线程不活动的原因是什么?

我使用的是CUDA 6.0,代码在Tesla K40c上以计算能力3.5运行。

1 个答案:

答案 0 :(得分:2)

来自following link

  

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

所以看起来你的dimensionsCount在大多数线程上都是零(或关闭),并且在其他几个线程仍在计算之前它们就会退出。

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