Caching OpenCL缓冲区缓存行为

Caching OpenCL缓冲区缓存行为,caching,opencl,specifications,Caching,Opencl,Specifications,我一直在想OpenCL中全局数据的缓存行为 假设我有一个指向内核中全局内存的指针。 现在我读取指针指向的位置。 稍后在内核中,我可能再次需要相同的数据,所以我通过指针再次读取它 现在的问题是,这个数据会被缓存,还是每次都会从全局内存中重新读取,因为其他线程可能已经修改了它? 如果没有缓存,那么每次我都必须创建一个本地副本,这样我就不会因为不断访问全局内存而损失大量性能 我知道这可能是特定于供应商的,但规范对此有何规定?有一些缓存,但GPU计算性能优异的关键是将“多次访问”的数据移动到私有或共享本

我一直在想OpenCL中全局数据的缓存行为

假设我有一个指向内核中全局内存的指针。 现在我读取指针指向的位置。 稍后在内核中,我可能再次需要相同的数据,所以我通过指针再次读取它

现在的问题是,这个数据会被缓存,还是每次都会从全局内存中重新读取,因为其他线程可能已经修改了它? 如果没有缓存,那么每次我都必须创建一个本地副本,这样我就不会因为不断访问全局内存而损失大量性能


我知道这可能是特定于供应商的,但规范对此有何规定?

有一些缓存,但GPU计算性能优异的关键是将“多次访问”的数据移动到私有或共享本地内存,而不是重新读取。在某种程度上,您可以将其视为“您控制缓存”。在OpenCL中,这将在您的内核中完成(并行!),然后您将有一个内存屏障(确保所有工作项都完成了复制),然后您的算法可以访问快速内存中的数据。参见矩阵乘法示例(由于每一列和每一行都会产生多个输出值,因此将它们复制到共享本地内存会加快算法的速度。

那些希望在工作组内对工作项(例如FPGA)进行本地兑现的人,可以在IWOCL2017上阅读Andrew Ling的这篇文章。这是正确使用本地缓存和为数据流计算提供了巧妙的通信。那些希望在并行对等设置中缓存的便利,并且仍然有硬件的人应该考虑POWER 8或POWER 9芯片。这些便利是以成本为代价的:缓存全局或虚拟内存集群互连可能必须有几个TBS带宽。真正的问题是:WH。AT是数据流计算的值,例如ML,尤其是在集群上,减少通信,增加数据重用。

是的,我已经阅读了英伟达OPENCL最佳实践文件。但是如果需要的数据是在线程之间共享的,那么将某些东西移动到共享内存是有意义的。这不是C。ase在我的应用程序中。只有将其移动到私有内存才有意义。但我的问题与标准定义的内容有关。我不想做假设。我知道图像可以缓存。但是缓冲区?标准没有定义任何缓存行为。这取决于每个实现。您最可移植的解决方案是从全局内存(缓冲区)读取ead值一次,并且不依赖缓存来快速重新读取。但是标准必须定义允许的缓存行为。您能告诉我在规范中哪里可以读取该值吗?标准不必定义缓存行为。这取决于实现。我说“但是标准必须定义允许的缓存行为。”。