Caching 我可以绕过OpenCL中的缓存吗?

Caching 我可以绕过OpenCL中的缓存吗?,caching,opencl,gpgpu,Caching,Opencl,Gpgpu,实际上,我从未遇到过需要缓存写入全局内存的值的情况。但我无法找到阻止GPU污染缓存的方法,就像我在CPU上使用非时态写入一样 这是一个严重的问题,可能会使性能下降20%或更高。最近很少有关于这方面的信息,但是什么让您认为写操作是缓存的呢?除非使用原子操作,否则GPU不关心一致性。如果在写入内存位置后读取该位置,则即使在同一工作组中也会得到未定义的结果,除非在操作之间设置全局内存屏障。这意味着缓存写入的值是毫无意义的,因为此时所有着色器执行必须已经写入了它们的数据。你可以肯定,这将不适合任何缓存!

实际上,我从未遇到过需要缓存写入全局内存的值的情况。但我无法找到阻止GPU污染缓存的方法,就像我在CPU上使用非时态写入一样


这是一个严重的问题,可能会使性能下降20%或更高。

最近很少有关于这方面的信息,但是什么让您认为写操作是缓存的呢?除非使用原子操作,否则GPU不关心一致性。如果在写入内存位置后读取该位置,则即使在同一工作组中也会得到未定义的结果,除非在操作之间设置全局内存屏障。这意味着缓存写入的值是毫无意义的,因为此时所有着色器执行必须已经写入了它们的数据。你可以肯定,这将不适合任何缓存! GPU与CPU完全不同。在一个概念中找到的概念不容易转化为另一个概念


这些只是我的假设,这可能是错误的,但我可以肯定的是,供应商会尽最大努力优化他们的GPU,以实现当前最常见的操作,只是为了让他们可以通过在当前标题中实现比竞争对手稍高的FPS来吹嘘。试图智胜他们通常不是一个好主意。

实际上,这是写在文档中的,写入的内容缓存在GCN GPU上。写操作可以将缓存命中率从90%降低到50%。我同意,在GPU上缓存写操作是毫无意义的,除非你有一个临时结果,既不能放入寄存器也不能放入LDS,这是很少见的。所以我认为可能有一种方法可以通过缓存进行写操作。无论如何,指令集中都存在缓存策略(不过我没有深入研究它。)…如果您想重用刚刚放入全局内存的任何值,请使用已保存在私有内存中的值。再次调用全局值会进行另一次读取,因为无法确保工作项的值在写入后没有更改。实际上不涉及缓存。@暗零,那么为什么输出整个工作组的一个结果和会比输出每个工作项的结果产生更高的缓存命中率?在简单的nbody内核中使用xyz坐标的纯全局内存与局部内存优化的结果相比,具有相当的性能。性能比率与本地/缓存带宽比率相似。这可能是缓存的工作,但我没有检查LLVM输出,所以我不确定。xyz数据为768kB,因此可以放入二级缓存中。