CUDA - 更好的占用与更少的全局内存访问?

时间:2009-11-24 22:52:29

标签: arrays parallel-processing cuda

我的CUDA代码必须使用(减少到平均值/标准,计算直方图)4个数组,每个2048个浮点长并且已经存储在以前内核的设备内存中。

通常建议至少启动与多处理器一样多的块。但是,在这种情况下,我可以将每个数组加载到单个块的共享内存中,因此只能启动4个块。

这远不是“保持gpu忙”但是如果我使用更多的块,我将需要通过全局内存进行更多的块间通信,并且我预计由于额外的额外时间,多处理器的任何额外利用将是静脉用于将数据传入和传出全局内存。

在这种情况下并行化的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

CUDA中不建议使用块间通信。此外,Fermi将支持并发内核执行,因此未来更高的占用率将变得不那么重要。所以我建议现在只留下较低的占用率,除非性能低得令人无法接受。

答案 1 :(得分:1)

This example显示了如何使用Thrust在一次缩减中计算所有“摘要统计信息”。另一个示例显示了如何使用thrust::sort计算直方图。

答案 2 :(得分:0)

你正在做的工作量相对较小,所以你应该坚持使用四个街区。对于先前/后续内核,保持GPU本地数据仍然是一个优势。

Fermi将允许并发内核,正是这种情况最有利,因为在内核执行时你可以启动下一个内核来占用剩余的SM。但是,这确实假设两个内核之间没有依赖关系 - 当然,在上一个内核完成之前,您将无法启动依赖于先前内核结果的新内核。

答案 3 :(得分:0)

我认为您不需要同时使用所有2048个浮点数,如果必须减少,则可以将数组拆分为不同的部分,然后在块执行结束时合并结果。你能展示一些示例代码吗?