OpenCL共享内存优化

时间:2013-06-03 08:35:32

标签: opencl shared-memory

我使用OpenCL解决了2d拉普拉斯方程。 全局内存访问版本比使用共享内存的版本运行得更快。 用于共享内存的算法与OpenCL Game of Life代码中的算法相同。

https://www.olcf.ornl.gov/tutorials/opencl-game-of-life/

如果有人遇到同样的问题,请帮忙。如果有人想看到内核我可以发布它。

3 个答案:

答案 0 :(得分:2)

如果您的全局内存确实比本地内存版本运行得更快(假设两者都根据您使用的内存空间进行了同等优化),那么this paper可能会回答您的问题。

以下是对内容的总结:

在内核中使用本地内存会对可以在同一计算单元上运行的并发工作组数量添加另一个约束。

因此,在某些情况下可能更有效地消除此约束并忍受全局内存访问的高延迟。在同一计算单元上运行的更多 wavefronts warps 在NVidia用语中,每个工作组分为波前/扭曲)允许GPU更好地隐藏延迟:如果正在等待要完成内存访问,另一个可以在此期间进行计算。

最后,每个内核都会花费更多的时间来继续,但是你的GPU会完全忙碌,因为它会同时运行更多的内核。

答案 1 :(得分:0)

不,它没有。它只说所有其他东西都是平等的,从本地内存访问比从全局内存访问更快。在我看来,内核中的全局访问正在coalesced,从而产生更好的性能。

答案 2 :(得分:0)

使用共享内存(与CPU共享的内存)并不总是更快。使用现代显卡只有在GPU / CPU在相同数据上执行oepratoins并且需要彼此共享信息的情况下才会更快,因为内存不必从卡复制到系统反之亦然。

但是,如果您的程序完全在GPU上运行,那么通过在本地内存(GDDR5)中独占运行可以更快地执行,因为GPU的内存不仅可能比您的系统快得多,也不会有任何通过PCI-E通道读取内存导致的延迟。

将显卡的内存视为一种“l3缓存”,系统的内存是整个系统共享的资源,只有在多个设备需要共享信息时(或者缓存已满)才能使用它。我不是CUDA或OpenCL程序员,我甚至从未在这些应用程序中编写Hello World。我只阅读了一些白皮书,这只是常识(或者我的计算机科学学位毕竟是有用的)。