我使用Visual Profiler 6.0分析我的CUDA内核,几乎每一行都有一个显示Inactive threads
和Predicated off threads
百分比的栏。
我想知道这两个值究竟是什么意思,它们有多糟糕?
据我所知,Inactive threads
(以红色显示)是分散且处于非活动状态的线程(由于某些if语句),并且Predicated off threads
(以蓝色显示)由编译器正确预测不活跃。这是对的吗?
如果这是真的,我不明白为什么我的内核中的一堆行有95%的非活动线程,唯一的if是循环:
TFloat
是float
或double
类型的模板。导致线程不活动的原因是什么?
我使用的是CUDA 6.0,代码在Tesla K40c上以计算能力3.5运行。
答案 0 :(得分:2)
有两个原因可以禁用warp中的线程:处于非活动状态,并被断言。如果块大小不是warp大小的倍数,则块中的最后一个warp将具有非活动线程。当warp中的某些线程退出内核而其他线程继续时,退出的线程将变为非活动状态。当发生不同的分支时,线程会被断言,因为线程占用的单独路径必须被序列化,并且线程被禁用以用于它们不采用的路径。
所以看起来你的dimensionsCount
在大多数线程上都是零(或关闭),并且在其他几个线程仍在计算之前它们就会退出。
另一方面,当实际分支条件被命中时,可以记录“谓词关闭” - 一些线程跳转到退出(但仍然活动!),其他跳转到循环。快照右侧的SASS代码也会建议这一点:BRA
指令中只显示蓝条。