CUDA 中的非活动线程与断定线程
Posted
技术标签:
【中文标题】CUDA 中的非活动线程与断定线程【英文标题】:Inactive threads vs. predicated off threads in CUDA 【发布时间】:2014-04-25 03:25:40 【问题描述】:我正在使用 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。
【问题讨论】:
我认为在不知道clustersCount
和dimensionsCount
的定义的情况下,很难看出你的循环是否发散。您是否尝试过在基于 Maxwell 的 GPU 上使用 CUDA 7.5 中的新分析器功能?
【参考方案1】:
来自following link:
warp 中的线程可以被禁用有两个原因:处于非活动状态和被断定。如果块大小不是扭曲大小的倍数,则块中的最后一个扭曲将具有非活动线程。当 warp 中的一些线程退出内核而其他线程继续运行时,退出的线程将变为非活动状态。当发生分歧分支时,线程会被断定,因为线程所采用的单独路径必须被序列化,并且线程对于它们不采用的路径被禁用。
所以看起来您的dimensionsCount
在大多数线程上为零(或接近),并且它们在其他几个线程仍在计算之前退出。
另一方面,当实际分支条件被命中时,可能会记录“predicated off”——一些线程跳转到退出(但仍处于活动状态!),其他跳转到循环。快照右侧的 SASS 代码也建议了这一点:唯一的蓝色条出现在 BRA
指令处。
【讨论】:
小修正,右侧快照显示的是 SASS(特定 GPU 架构的机器代码),而不是 PTX(便携式虚拟 ISA)以上是关于CUDA 中的非活动线程与断定线程的主要内容,如果未能解决你的问题,请参考以下文章