有没有办法将线程显式映射到 CUDA 中的特定扭曲?

Posted

技术标签:

【中文标题】有没有办法将线程显式映射到 CUDA 中的特定扭曲?【英文标题】:Is there a way to explicitly map a thread to a specific warp in CUDA? 【发布时间】:2017-08-18 00:15:06 【问题描述】:

比如说,动态分析是在一个 CUDA 程序上完成的,因此某些线程最好在同一个 warp 中。

例如,假设我们有 1024 个 cuda 线程和 32 个 warp 大小。经过动态分析,我们发现线程 989、243、819、...、42(总共列出了 32 个线程)应该在同一个经。我们确定它们应该在同一个 warp 上,因为它们在代码执行方面几乎没有分歧——(在执行 CUDA 程序的动态分析时,它们可能不一定在同一个 warp 上)。

有没有办法控制线程在 CUDA 中扭曲调度?如果没有,是否有另一种 GPU 编程语言可以提供这种显式的扭曲调度。如果没有,可以做些什么(甚至可能是解决这个问题的非常低级的方法)?我希望至少有最后一个问题的答案,因为这可能是 CUDA 的实现方式——除非在硬件级别完成扭曲调度,这将是不幸的。谢谢!

【问题讨论】:

见***.com/questions/21535471/… 【参考方案1】:

不,您不能选择将线程分配给经纱。对此声明的支持覆盖here。

但是,使线程具有特定行为特征的是您编写的线程代码,而不是任何锁定在硬件中的东西。无论是数据访问模式,还是通过控制流的特定路径,都由程序员控制。

CUDA 线程发挥其特性的主要方式之一是通过生成全局唯一线程 ID,这是任何 CUDA 代码的典型样板,例如:

int idx=threadIdx.x+blockDim.x*blockIdx.x;

为每个线程创建一个规范的、全局唯一的一维线程索引。

但没有什么特别的理由必须这样。我也可以轻松做到:

int private_idx = threadIdx.x+blockDim.x*blockIdx.x;
int idx = desired_idx[private_idx];

然后可以按您想要的任何顺序对线程进行编号。如果您的 desired_idx 数组按照您的建议包含一组数字:

989, 243, 819, ..., 42

然后那些相邻的线程将采取与该顺序一致的行为。

【讨论】:

这是一个很好的解决方案——谢谢!此外,您链接到的堆栈溢出线程很有见地。特别是,warp 调度不是动态的——线程 0-31 总是映射到同一个 warp。正如您所提到的,我们可以强制线程 0-31 具有 desired_index

以上是关于有没有办法将线程显式映射到 CUDA 中的特定扭曲?的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 扭曲和每个块的最佳线程数

使用多少个 CUDA 核心来处理一个 CUDA 扭曲?

CUDA - 为啥基于扭曲的并行减少速度较慢?

CUDA中的warp和bank的机制是啥?

在 CUDA 内核启动后,线程块调度到特定 SM 的行为是啥?

是否可以将一个路由映射到MVC中的一组特定控制器操作?