【发布时间】:2016-05-17 03:02:42
【问题描述】:
我正在尝试在CUDA Reduction 实施优化,并成功完成到第 6 部分。感谢大家帮助我。为了全面了解 CUDA,我还需要完成最终优化,如幻灯片 #31 中所述,称为算法级联。
这个想法本质上是每个线程有 512 个元素,并在执行归约之前按顺序对所有元素求和。
我尝试了一种方法,我的每个线程都从内存中访问连续的 512 个数字。不幸的是,它的表现最差。我猜是银行冲突的原因,但仍然没有弄清楚。你们中的任何人都可以提出这种行为的原因吗?
我还将在下面发布 Nvidia 提供的示例代码。
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + threadIdx.x;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n) {
sdata[tid] += g_idata[i] + g_idata[i+blockSize];
i += gridSize;
}
__syncthreads();
有几个参数未定义。我可以推断 blockSize 等于每个块的线程数。但我无法推断变量“gridSize”的重要性。什么是访问内存的适当方式以便我们获得更好的性能?这是跨步访问的示例吗?
提前感谢您的帮助,如果您有任何其他问题,请在下方发表评论。
【问题讨论】:
-
在相应的CUDA sample code 中提供了所有这些缩减代码的完整示例。您不必猜测任何参数。我怀疑您是否提供了足够的信息来解释您的观察。如果您对第 6 部分的实现表现不佳,也许您应该运行 CUDA 示例代码并研究差异。
标签: optimization cuda nvidia reduction