【发布时间】:2018-03-21 11:11:18
【问题描述】:
blockIdx与GPU设备上线程块的执行顺序有什么关系吗?
我的动机是我有一个内核,其中多个块将从全局内存中的同一位置读取,如果这些块能够同时运行会很好(因为 L2 缓存命中很好)。在决定如何将这些块组织成一个网格时,是否可以肯定地说blockIdx.x=0 与blockIdx.x=1 相比与blockIdx.x=200 更可能同时运行?并且我应该尝试将连续索引分配给从全局内存中相同位置读取的块?
明确地说,我不是在询问块间依赖关系(如this question),从程序正确性的角度来看,线程块是完全独立的。我已经在使用共享内存来广播块内的数据,我无法让块变得更大。
编辑:再一次,我很清楚
线程块需要独立执行:必须可以以任何顺序执行它们,并行或串行。
并且这些块是完全独立的——它们可以按任何顺序运行并产生相同的输出。我只是在问我将块排列到网格中的顺序是否会影响最终同时运行的块,因为这确实会通过 L2 缓存命中率影响性能。
【问题讨论】:
-
来自CUDA Programming Guide:“线程块需要独立执行:必须能够以任何顺序并行或串行执行它们。”但是您可以使用一个全局变量,为刚开始的每个新块增加一个全局变量,并将该变量用作您的“块 id”。我很确定在 SO 上至少有一个关于如何在此处执行此操作的问题。
-
这不是我要问的,我已经编辑了这个问题以更清楚地说明这一点。正如您所建议的那样,我并没有试图确定实际的执行顺序;我在问内置变量
blockIdx是否与发出执行块的顺序有任何关系。 -
许多硬件特性让我相信无法预测任何连接。例如,在某个特定 sm 上调度块没有规则,它还取决于其他进程、可能同时运行的内核,甚至可能是内存操作。
标签: cuda