【问题标题】:Initial performance hit using local memory使用本地内存的初始性能下降
【发布时间】:2014-03-02 21:36:45
【问题描述】:

使用本地内存时是否会影响初始性能? 我正在转换使用全局内存的现有内核,并且在成功转换后我看到性能下降。显然你可能认为我可能没有正确使用它,我什至可能同意并找到更多优化。但这不是这里的问题。

作为一个附带实验,我使用了与全局内存相同的内核,而无法访问本地内存。然后我所做的只是传递了一个带有本地内存的内核参数,大约 1024 个整数。在这里我看到这个内核执行时间几乎是原来的两倍。 那么本地内存的分配本身是否会导致一些初始性能下降?有没有人看到这个并且可能有一个解释?

[更新] 谢谢大家的 cmets 和答案。 我尝试编写一个单独的测试内核来查看这种行为是否可重复。不是。 我找到了一个帖子Is private memory slower than local memory? 提到过度使用私有内存可能会导致溢出到全局内存,因此可能会减慢内核执行速度。似乎这可能特定于 nVidia 卡,我想知道 AMD 卡上会发生什么。 难道是本地内存的分配突然导致私有内存溢出为本地内存腾出空间?我现在正在从这个角度看待我的实施,除非你们中的任何人另有建议。 是否有任何文件或书籍提到你们可能知道?

再次感谢。

【问题讨论】:

  • 你是如何使用全局内存的?您如何设置工作组来共享本地内存?你在使用 MEM_FENCE 命令吗?您是否不小心对内核进行了编码,使得所有线程都将全局复制到本地,而不是一个工作项将一个值从全局移动到本地?
  • @Austin,此时我的问题不在于使用本地内存,尽管我可能在稍后阶段需要帮助。它更多地是关于创建本地内存缓冲区并看到速度变慢(我的问题中的第 2 段)。在我的实验中,我只使用了全局内存,并没有以任何方式引用本地内存。我通过作为内核参数传递来创建本地内存缓冲区,并且这样做内核需要两倍的时间。你见过这样的行为吗。有什么解释为什么吗?谢谢。
  • 您使用什么硬件以及您使用的本地工作大小是多少?使用本地内存可能会减少可以调度到计算单元的工作组的数量,因为它们都必须适合可用的本地内存。
  • @chippies,我有 nVidia GTX 260。它报告 16k 本地内存。具体谈论我的实验(我的问题中的第 2 段),我没有安排任何工作组。尽管此时我不记得我是否将 localsize 设置为 1 或将其设置为 NULL(并且不小心让 OpenCL 决定了工作组的大小)。我将不得不使用这两个值重新运行,看看是否有任何区别。谢谢。
  • 取决于算法,并不是所有的进程都可以用本地内存加速。事实上,有些内核使用全局内存可能会更好。

标签: opencl


【解决方案1】:

使用非最佳规模的本地工作组或在 WG 内同步 WI 可能会影响性能。

读入本地内存本身不会对性能造成任何影响 - 它的速度与读入私有内存的速度相同(都放在芯片上)。

此外,请检查您的数据是否适合本地内存大小,因为它通常较小。

【讨论】:

  • 那么如何确定最优尺寸呢?它只是2个或多个东西的力量吗?
  • 这取决于硬件架构。通常,gpu 是集群的组合,其中包含流处理器 (ALU)。这种处理器的数量或多个是最佳的 - WI 将在同一块芯片上共享资源。例如,对于 AMD 卡,WLIV 架构的最佳尺寸是 64 的倍数
猜你喜欢
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2021-06-07
相关资源
最近更新 更多