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

Is there a way to explicitly map a thread to a specific warp in CUDA?

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

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

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

不,您不能选择将线程分配给 warp。 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

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