使用向量最小化OpenCL中的全局内存读取?

时间:2014-12-14 17:55:32

标签: performance opencl

假设我的内核需要4个(或3个或2个)不相关的float或double args,或者我想从全局内存访问4个单独的浮点数。这会导致4个独立的全局内存访问吗?访问4个浮点数的单个向量或比访问4个独立的向量快一倍?如果是这样,我最好将它们打包成一个载体,然后使用#defines来引用各个成员吗?

如果这确实提高了性能,我是否必须自己完成,或者编译器是否足够聪明,可以自动将4个单独的浮点数转换为单个向量?这是“自动矢量化”吗?我已经看到了一些文档中提到的自动向量化,但没有详细解释它的作用,除了它似乎只是CPU的可选性能优化,而不是GPU。

1 个答案:

答案 0 :(得分:0)

使用向量取决于内核本身。如果您同时需要所有四个值(例如:在内核开始时,在循环开始时),最好打包它们,因为它们将在一次读取期间分配(单个向量中的值按顺序存储)。

另一方面,当您只需要一些值时,只需阅读所需内容即可加快执行速度。

另一种情况是当你逐个阅读它们时,每个读数除以一些计算(即给GPU一些时间来获取数据)。


基本上,这些数据读段,行为类似于缓冲区。如果你有足够的实例,读取次数是相同的(在可选原因中),真正重要的是这些读取的使用情况。

编译器通常会解压缩这些结构,所以只有加速,你才能很好地存储所有变量,所以当你读取时,你只需要一次读取就可以填充它们,其余的缓冲区则用于另一个实例。

例如,我将使用128位宽总线和4个浮点数(32位)。

 (32b * 4) / 128b = 1 instance/read

对于标量数据类型,有N个读数(N =变量数),每个读取在每个实例中填充一个变量,直到获取的变量数。

 32b / 128b = 4 instance/read

所以在我的例子中,如果你有4个实例,那么总是会有至少4次读取,不管是什么和唯一的事情,你可以做的就是通过一些计算覆盖获取时间,如果它甚至可能的话。