为了优化我的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重叠执行这两行代码?如何确保这些行同时运行,从而在读取全局内存和执行某些计算之间实现良好的重叠
感谢您抽出宝贵时间阅读我的问题。
答案 0 :(得分:1)
您的示例只能显示性能的最小增加(如果有),因为这两个操作(从全局内存加载并执行求和)具有非常不同的速度:访问全局内存要慢得多。
典型的方法是将数据从全局内存加载到共享内存,而不是使用位于那里的数据执行大量计算(注意:共享内存相当于共享的L1缓存,就性能:与L1缓存的主要区别在于它必须明确地解决。)
典型示例(请参阅this link in the Cuda C Programming Guide)使用矩阵乘法:在共享内存中加载两个矩阵的N乘N平方块(即N * N个元素),并执行部分乘积(这是N * N * N次操作):每个元素N次操作。