【问题标题】:Writing to global memory in CUDA在 CUDA 中写入全局内存
【发布时间】:2012-02-02 05:26:05
【问题描述】:

想问一下在CUDA中写入全局内存的效果。众所周知,全局内存读取通常会对性能产生很大影响(合并、缓存、银行冲突),因为它们可能需要相当多的周期来等待传入的内存,这可能会暂时阻塞执行。

但是,在 CUDA 中写入内存呢?它是否受到任何类型的内存写入模式的影响?总成本直接是内核中所有写入的总和吗?

任何相关的参考资料和 cmets 将不胜感激。

【问题讨论】:

  • 这正是使用实验程序探索的有趣问题。您可以编写一个基本的 OpenCL 或 CUDA 程序,以各种模式执行数百万次读取和写入。在一个循环中一遍又一遍地运行你的测试,看看你平均得到了什么。这可能是学习每个 API 的无聊部分以启动的好方法。
  • 感谢詹姆斯的评论!

标签: cuda opencl gpu gpgpu nvidia


【解决方案1】:

一般来说,您的问题的答案是“是”,商店类似于负载。不同之处在于,由于存储是“即发即弃”,如果有工作要做,不依赖于存储的地址,那么多处理器可以在发出存储后立即运行,并且停顿只会发生在遇到 read-after-write 依赖关系。

有关详细信息,我建议阅读最新的CUDA programming guide 的第 5.3.2 节。

有关不同架构系列的具体信息,另请参阅该文档的附录 F。例如,计算能力 1.x 比计算能力 2.x (Fermi) 设备具有更多的性能“悬崖”。

【讨论】:

  • 感谢您的回答。我意识到这个理论的大部分都可以通过微基准测试来证实。然而,当费米来到现场时,几乎没有什么事情会让人感到困惑。我注意到在 Fermi 之前,有内存合并的性能计数器,但现在它们消失了!这背后有什么原因吗?我不认为内存合并在 Fermi 中完全没有影响(对于读取和写入),而是它的概念由于缓存的贡献而变得复杂。所以,我猜,这就是英伟达移除这些计数器的原因。有人对此有任何想法吗?
  • 是的,没错。计数器被缓存命中/未命中计数器替换。最新的可视化分析器版本 (4.1) 通过从计数器中构建有用的指标而不是显示原始计数器数据,使解释这些数据变得更加容易。在 Fermi 上,这完全取决于获取的缓存行数,而不是合并的内存段数。
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2012-06-05
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
相关资源
最近更新 更多