【问题标题】:Can I bypass cache in OpenCL?我可以绕过 OpenCL 中的缓存吗?
【发布时间】:2016-06-07 04:26:36
【问题描述】:

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

这是一个严重的问题,会导致性能下降 20% 或更多。

【问题讨论】:

  • 如果你想重用你刚刚放入全局内存的任何值,那么使用你已经保存在私有内存中的值。再次调用全局值会进行另一次读取,因为没有任何方法可以确保工作项的值在写入后没有更改。实际上不涉及缓存。
  • @DarkZeros 那么为什么输出一个工作组的结果总和会比输出每个工作项的结果缓存命中率高呢?
  • 在简单的 nbody 内核中为 xyz 坐标使用纯全局内存提供了与本地内存优化的性能相当的性能。性能比率类似于本地/缓存带宽比率。这可能是缓存的工作,但我没有检查 LLVM 输出,所以我不确定。 xyz 数据为 768kB,因此可以放入 L2 缓存中。

标签: caching opencl gpgpu


【解决方案1】:

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

这些只是我的假设,可能是错误的,但我可以肯定的是,供应商会尽最大努力优化他们的 GPU 以适应当前最常见的操作,这样他们就可以通过实现一点点来吹嘘当前游戏中的 FPS 高于竞争对手。试图超越他们通常不是一个好主意。

【讨论】:

  • 实际上是写在文档中,写入缓存在GCN GPU上。并且写入可以将缓存命中率从 90% 降低到 50%。我同意缓存写入在 GPU 上毫无意义,除非您的临时结果既不适合寄存器也不适合不常见的 LDS。所以我认为可能有一种方法可以绕过缓存进行写入。无论如何,指令集中都存在缓存策略(虽然我没有深入研究。)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2019-02-24
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多