比如说,动态分析是在一个CUDA程序上进行的,这样某些线程最好不会出现在同一个warp中。
例如,让我们假装我们有1024个cuda线程和一个warp大小为32.经过动态分析后我们发现线程989,243,819,...,42(列出32个总线程)应该是相同的经。我们确定它们应该在同一个warp上,因为它们在代码执行方面几乎没有差异 - (在执行CUDA程序的动态分析时,它们可能不一定在同一个warp上)。
有没有办法控制线程在CUDA中扭曲调度?如果没有,是否有另一种GPU编程语言可以提供这种显式的warp调度。如果没有,可以做些什么(可能甚至是一个非常低级的方法来解决这个问题)?我希望至少有一个答案可以解决这个问题,因为这可能是CUDA的实现方式 - 除非在硬件级别进行warp调度,这是不幸的。谢谢!
答案 0 :(得分:2)
不,你不能选择线程分配给warp。对此声明的支持涵盖here。
然而,使线程占用特定字符的行为是你编写的线程代码,而不是锁定到硬件中的任何东西。无论是数据访问模式还是通过控制流的特定路径,它都由程序员控制。
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
然后那些相邻的线程将采取与该排序一致的行为。