0

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

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

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

4

1 回答 1

2

不,您不能选择将线程分配给经纱。此处介绍了对该声明的支持。

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

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

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

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

但是没有什么特别的理由必须这样。我可以很容易地做到:

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

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

989, 243, 819, ..., 42

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

于 2017-03-24T22:27:55.090 回答