【发布时间】:2015-02-19 19:34:34
【问题描述】:
假设我的内核采用 4(或 3,或 2)个不相关的浮点数或双参数,或者我想从全局内存中访问 4 个单独的浮点数。这会导致 4 次单独的全局内存访问吗?访问 4 个浮点数或双精度的单个向量是否比访问 4 个单独的向量快?如果是这样,我是否最好将它们打包成一个向量,然后使用#defines 来引用各个成员?
如果这确实提高了性能,我是否必须自己做,或者编译器是否足够聪明,可以自动将 4 个单独的浮点读取转换为一个向量?这就是“自动矢量化”吗?我在一些文档中看到了自动矢量化,但没有详细解释它的具体作用,只是它似乎是仅针对 CPU 而不是 GPU 的可选性能优化。
【问题讨论】:
-
“无关”是什么意思?内存引擎通常以 128 字节为单位请求内存(这个数字取决于硬件),因此如果所有 4 个浮点数都在 128 字节之内(连续),那么您只会获得一个内存事务。这称为合并内存访问,自动矢量化是完全不相关的事情。
-
“不相关”是指概念上不相关 - 将它们存储为单个向量在语义上并不直观。例如,它们不是空间中某个点的 4 个坐标,也不是像素的颜色值,也不是矢量所要处理的那种东西。
-
是否足以让所有浮点数彼此相距 128 字节,或者它们也必须位于同一个 128 字节对齐的块中?我可以通过将它们设为单个向量而不是 4 个单独的值来保证适当的存储吗?
-
128 字节只是一个例子。你可能想read this question。
-
我已经对合并内存读取进行了一些搜索,但没有找到任何解释它何时以及如何发生以及何时可以依赖它的信息。如果在读取一个值时,它恰好与稍后将读取的值相邻,那么编译器是否足够聪明地注意到这一点并编译第二次访问而不是第二次读取全局内存?如果第二次读取没有访问全局内存,它访问的是什么?私人记忆?
标签: performance opencl