数据预取以重叠内存访问和计算CUDA

数据预取以重叠内存访问和计算CUDA,cuda,Cuda,为了优化cuda内核的性能,我尝试将全局内存中的数据预取(或预读取)到内核中,以尝试重叠内存带宽和计算 我的实现基于以下逻辑: // Original code for (i = 0; i < N; i++) { sum += array[i]; } // Code with pre-fetch temp = array[0]; for (i = 0; i < N-1; i++) { temp2 = array[i+1]; sum += temp;

为了优化cuda内核的性能,我尝试将全局内存中的数据预取(或预读取)到内核中,以尝试重叠内存带宽和计算

我的实现基于以下逻辑:

// Original code
for (i = 0; i < N; i++) {
    sum += array[i];
}

// Code with pre-fetch
temp = array[0];
for (i = 0; i < N-1; i++) {
    temp2 = array[i+1];
    sum += temp;
    temp = temp2;
}
sum += temp;
//原始代码
对于(i=0;i
想法是尝试同时执行temp2=array[i+1]和sum+=temp,这样我就可以将当前元素的执行与下一个元素的数据获取重叠起来

与最初的实现相比,这样的实现在速度上产生了非常小的提高(约3%)。我想知道是否有明确的方法告诉cuda重叠这两行代码的执行?如何确保这些行并行运行,从而在读取全局内存和执行某些计算之间实现良好的重叠


谢谢你花时间阅读我的问题

您的示例只能显示性能的最小提高(如果有的话),因为这两个操作(从全局内存加载和执行求和)的速度非常不同:访问全局内存的速度要慢得多

典型的方法是将数据从全局内存加载到共享内存,而不是使用数据执行大量计算(注意:共享内存在性能方面相当于共享一级缓存:一级缓存的主要区别在于必须显式寻址)


典型的例子(请参阅)是矩阵乘法:在共享内存中加载两个矩阵的N×N平方块(即N*N个元素),然后执行部分积(即N*N*N个操作):每个元素N个操作。

非常感谢您的回复@Sigismondo!!但是,我的应用程序每次全局写入只需要1次全局读取,因此使用共享内存只会使其速度变慢(因为这将涉及每次写入操作1次全局内存读取+1次共享内存读取)。对于这样的应用程序,有没有其他方法可以提高性能?实际上没有多少。。。如果您的数据来自CPU,那么主要的瓶颈将是通过PCI express总线(cudaMemcpy())的传输。如果没有,您可以通过正确合并访问来尽最大努力,但由于内存瓶颈,您将远离GPU的理论性能。