我一直想知道 OpenCL 中全局数据的缓存行为。
假设我有一个指向内核中全局内存的指针。现在我读取了指针指向的位置。稍后在内核中我可能再次需要相同的数据,所以我通过指针再次读取它。
现在的问题是,这些数据会被缓存,还是每次都从全局内存中重新读取,因为其他线程可能已经修改了它?如果它没有被缓存,那么我每次都必须制作一个本地副本,这样我就不会因为不断访问全局内存而损失大量性能。
我知道这可能是特定于供应商的,但是规范对此有何评论?
我一直想知道 OpenCL 中全局数据的缓存行为。
假设我有一个指向内核中全局内存的指针。现在我读取了指针指向的位置。稍后在内核中我可能再次需要相同的数据,所以我通过指针再次读取它。
现在的问题是,这些数据会被缓存,还是每次都从全局内存中重新读取,因为其他线程可能已经修改了它?如果它没有被缓存,那么我每次都必须制作一个本地副本,这样我就不会因为不断访问全局内存而损失大量性能。
我知道这可能是特定于供应商的,但是规范对此有何评论?
There is some caching but the key to great GPU compute performance it is move "accessed many time" data to private or shared local memory and not re-read it. In a way, you can think of this as "you control the caching". In OpenCL this would be done in your kernel (in parallel!) and then you'd have a memory barrier (to ensure all work items have finished the copy) then your algorithm has access to the data in fast memory. See the matrix multiply example (since each column and row contributes to multiple output values, copying them to shared local memory accelerates the algorithm.
那些想要在工作组内为工作项目(例如在 FPGA 上)进行本地兑现的人可以阅读 Andrew Ling 在 IWOCL2017 上的这篇论文https://www.iwocl.org/wp-content/uploads/iwocl2017-andrew -ling-fpga-sdk.pdf。这是正确使用本地缓存和智能通信进行数据流计算的一个很好的例子。那些希望在并行对等设置中方便缓存并且仍然有硬件为他们做这件事的人应该考虑使用 POWER8 或 POWER9 芯片。这些便利是有代价的:缓存全局或虚拟内存集群互连可能必须有几 TB 的带宽。真正的问题是:缓存对于数据流计算(例如机器学习)的价值是什么,尤其是在集群上,与通过其他方式减少通信和增加数据重用相比。