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

Posted

技术标签:

【中文标题】CUDA 中的非活动线程与断定线程【英文标题】:Inactive threads vs. predicated off threads in CUDA 【发布时间】:2014-04-25 03:25:40 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

我认为在不知道clustersCountdimensionsCount 的定义的情况下,很难看出你的循环是否发散。您是否尝试过在基于 Maxwell 的 GPU 上使用 CUDA 7.5 中的新分析器功能? 【参考方案1】:

来自following link:

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

所以看起来您的dimensionsCount 在大多数线程上为零(或接近),并且它们在其他几个线程仍在计算之前退出。

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

【讨论】:

小修正,右侧快照显示的是 SASS(特定 GPU 架构的机器代码),而不是 PTX(便携式虚拟 ISA)

以上是关于CUDA 中的非活动线程与断定线程的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 学习(十九)优化策略4:线程使用计算和分支

CUDA 学习(十九)优化策略4:线程使用计算和分支

CUDA笔记(一)线程与数据量的关系

cuda-sdk 的 nbody 代码中的线程管理

cuda 线程栅栏

CUDA学习5 常量内存与事件