【发布时间】:2018-11-14 17:32:55
【问题描述】:
我一直在研究比 GPU 上用于基本计算的设备可用内存更大的流数据集。主要限制之一是 PCIe 总线通常限制在 8GB/s 左右,内核融合可以帮助重用可重用的数据,并且它可以利用 GPU 内的共享内存和局部性。我发现的大多数研究论文都很难理解,并且大多数都在复杂的应用程序中实现了融合,例如https://ieeexplore.ieee.org/document/6270615。我读过很多论文,但都未能解释一些将两个内核融合在一起的简单步骤。
我的问题是融合实际上是如何工作的?。将普通内核更改为融合内核的步骤是什么?此外,是否需要多个内核才能融合它,因为融合只是一个花哨的术语,用于消除一些内存绑定问题,并利用局部性和共享内存。
我需要了解如何将内核融合用于基本 CUDA 程序,例如矩阵乘法或加法和减法内核。一个非常简单的例子(代码不正确,但应该给出一个想法)如:
int *device_A;
int *device_B;
int *device_C;
cudaMalloc(device_A,sizeof(int)*N);
cudaMemcpyAsync(device_A,host_A, N*sizeof(int),HostToDevice,stream);
KernelAdd<<<block,thread,stream>>>(device_A,device_B); //put result in C
KernelSubtract<<<block,thread,stream>>>(device_C);
cudaMemcpyAsync(host_C,device_C, N*sizeof(int),DeviceToHost,stream); //send final result through the PCIe to the CPU
【问题讨论】:
-
Nitpick:PCIe gen 3 x16 链接通常能够以 12 GB/秒的速度将数据移入/移出 GPU。 PCIe 链路是全双工的,因此对于具有两个 DMA 引擎的 GPU,某些应用程序可以传输高达 25 GB/秒的速度。如果有“许多论文”关于内核融合的好处,请提供至少两篇的引用。我不知道内核融合是提高内存受限内核性能的通用方法,但我很高兴在评估中被证明是错误的。
-
你能推荐一些改进内存绑定程序的例子吗?那将是非常非常有用的。这里有几个链接:delivery.acm.org/10.1145/2690000/2683615/…link.springer.com/article/10.1007/s11227-015-1483-z大规模生产模板应用程序中的自动 GPU 内核转换。 DOI:dx.doi.org/10.1145/2749246.2749255
-
应在问题中添加其他信息以进行澄清。带有底层链接的正确引用优于裸链接(链接可能会腐烂)。我假设这些论文的建议是:代替(内核 1)获取数组 A,应用处理步骤 1,生成数组 B; (内核2)取数组B,应用处理步骤2,产生数组C;使用 (kernel1&2) 获取数组 A,应用处理步骤 1 和 2,生成数组 C。内核 1 和 2 的融合因此降低了内存带宽需求。
标签: cuda