数据预取到重叠存储器访问和计算CUDA

时间:2014-04-03 17:43:28

标签: 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;
    temp = temp2;
}
sum += temp;

我的想法是尝试同时执行temp2 = array [i + 1]和sum + = temp,这样我就可以将当前元素的执行与下一个元素的数据提取重叠。

与原始版本相比,这种实现产生了非常小的加速增长(约3%)。我想知道是否有一种明确的方式告诉cuda重叠执行这两行代码?如何确保这些行同时运行,从而在读取全局内存和执行某些计算之间实现良好的重叠

感谢您抽出宝贵时间阅读我的问题。

1 个答案:

答案 0 :(得分:1)

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

典型的方法是将数据从全局内存加载到共享内存,而不是使用位于那里的数据执行大量计算(注意:共享内存相当于共享的L1缓存,就性能:与L1缓存的主要区别在于它必须明确地解决。)

典型示例(请参阅this link in the Cuda C Programming Guide)使用矩阵乘法:在共享内存中加载两个矩阵的N乘N平方块(即N * N个元素),并执行部分乘积(这是N * N * N次操作):每个元素N次操作。