我有一个关于 GPU 编程的幼稚问题。 (ChatGPT 和 Claude 并没有真正给我一个令人信服的答案。也许我提示得不好。)
CUDA 和 OpenCL 等 GPU 编程语言以 3D 块结构(使用 Nvidia 术语)组织线程,并以 3D 网格组织块。 我知道这对于计算机图形学来说既方便又自然。但我想知道一个块中的两个线程或一个网格中的两个块的“距离”(参见下面的定义)是否对线程执行的性能有任何技术影响?
我的意思是,同一块中块索引处的两个线程 T1 和 T2 之间存在自然距离
自然距离是3维欧氏距离(但其他选择也是可能的)。 这个距离对硬件有影响吗? (例如,如果T1和T2很接近,那么他们可以更快地沟通?)我认为答案是否定的,但我在网上找不到令人信服的解释。
可以询问关于网格中块的距离的类似问题。
您可能会想到 CPU 核心到核心延迟图之类的东西: (来源:https://www.anandtech.com/show/21124/amd-ryzen-threadripper-7980x-and-7970x-review/4)
先决条件是内核可以相互通信——在 CPU 上它们可以。对于 GPU 来说,没有这样的映射,因为 GPU 上的流式多价处理器无法相互通信。只能从每个 SM 到 VRAM 以及每个 SM 内的线程之间通过共享内存(L1 缓存)进行通信。
您在软件中指定的线程块坐标并不是线程块在硬件上执行的位置。 GPU 调度程序动态地将线程块分配给空闲 SM,并且您在应用程序端对此的控制权为零。 3D 欧几里德距离纯粹是一个软件问题 - 线程块坐标都在底层进行了线性化,因此它们的 3D 坐标除了从何处加载数据之外没有任何意义。在硬件级别上,SM 之间可能存在延迟差异,具体取决于它们在芯片上的物理位置以及到内存控制器的走线长度,但您也无法控制这一点。