我正在使用 OpenCL 求解二维拉普拉斯方程。全局内存访问版本比使用共享内存的版本运行得更快。用于共享内存的算法与 OpenCL Game of Life 代码中的算法相同。
https://www.olcf.ornl.gov/tutorials/opencl-game-of-life/
如果有人遇到同样的问题,请帮忙。如果有人想查看内核,我可以发布它。
我正在使用 OpenCL 求解二维拉普拉斯方程。全局内存访问版本比使用共享内存的版本运行得更快。用于共享内存的算法与 OpenCL Game of Life 代码中的算法相同。
https://www.olcf.ornl.gov/tutorials/opencl-game-of-life/
如果有人遇到同样的问题,请帮忙。如果有人想查看内核,我可以发布它。
如果您的全局内存确实比本地内存版本运行得更快(假设两者都根据您使用的内存空间进行了同等优化),那么本文也许可以回答您的问题。
以下是它所说的摘要:
内核中本地内存的使用为可在同一计算单元上运行的并发工作组的数量增加了另一个限制。
因此,在某些情况下,消除此约束并忍受全局内存访问的高延迟可能会更有效。在同一计算单元上运行的更多波前( NVidia 术语中的扭曲,每个工作组分为波前/扭曲)允许您的 GPU 更好地隐藏延迟:如果一个正在等待内存访问完成,另一个可以在此期间计算。
最后,每个内核将花费更多的时间来继续,但你的 GPU 将完全繁忙,因为它同时运行更多的内核。
不,它没有。它只是说所有其他事物都是平等的,从本地内存访问比从全局内存访问快。在我看来,内核中的全局访问正在被合并,从而产生更好的性能。
使用共享内存(与 CPU 共享的内存)并不总是更快。使用现代显卡它只会在 GPU/CPU 都对相同数据执行操作并且需要彼此共享信息的情况下更快,因为内存不必从卡复制到系统,反之亦然。
但是,如果您的程序完全在 GPU 上运行,则可以通过仅在本地内存 (GDDR5) 中运行来更快地执行,因为 GPU 的内存不仅可能比您的系统快得多,而且不会有任何延迟通过 PCI-E 通道读取内存。
将显卡的内存视为一种“l3 缓存”,而您的系统内存是整个系统共享的资源,您仅在多个设备需要共享信息时(或缓存已满)才使用它。我不是 CUDA 或 OpenCL 程序员,我什至从未在这些应用程序中编写过 Hello World。我只阅读了几篇白皮书,这只是常识(或者我的计算机科学学位毕竟有用)。