1

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

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

这远非“让 GPU 保持忙碌”,但如果我使用更多块,我将需要通过全局内存进行更多的块间通信,并且我预计由于传输数据所花费的额外时间,多处理器的任何额外利用都会受到影响进出全局内存。

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

4

4 回答 4

1

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

于 2009-11-25T13:40:42.327 回答
1

这个例子展示了如何使用 Thrust 在单个归约中计算所有“汇总统计信息”。另一个示例显示了如何使用 计算直方图thrust::sort

于 2010-10-09T02:09:03.930 回答
0

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

于 2009-12-11T11:03:55.283 回答
0

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

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

于 2009-11-25T15:54:02.650 回答