【发布时间】: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