Vector OpenCl中的向量类型与一维数组

Vector OpenCl中的向量类型与一维数组,vector,kernel,opencl,Vector,Kernel,Opencl,我想实现我的内核的两个版本,一个向量版本和一个标量版本。 现在我想知道double4类型是否与大小为4的double数组的内存访问类似。 我想到的是对我的两个内核使用相同的数据类型,在标量内核中,我将单独处理每个组件(.s0…s3),就像使用常规数组一样。 在另一个世界中,我希望只在标量内核中使用OpenCl向量类型进行存储,并利用向量内核中的向量属性。 老实说,我不希望每个内核有不同的变量类型。 这对你们有意义吗? 这里有什么提示吗? 谢谢, Éric.关于内存访问模式: 这首先取决于Open

我想实现我的内核的两个版本,一个向量版本和一个标量版本。 现在我想知道double4类型是否与大小为4的double数组的内存访问类似。
我想到的是对我的两个内核使用相同的数据类型,在标量内核中,我将单独处理每个组件(.s0…s3),就像使用常规数组一样。
在另一个世界中,我希望只在标量内核中使用OpenCl向量类型进行存储,并利用向量内核中的向量属性。
老实说,我不希望每个内核有不同的变量类型。
这对你们有意义吗?
这里有什么提示吗?
谢谢,


Éric.

关于内存访问模式:

这首先取决于OpenCL内核编译器:一个合理的编译器将使用单个内存事务来获取单个工作项中使用的多个数组单元的数据,甚至是多个项目中使用的多个单元的数据。在NVidia GPU上,全局设备内存以128字节为单位读取,这使得每次读取合并多达(编辑:)32个浮点值是值得的;看

因此,使用
float4
甚至可能不足以最大限度地提高带宽利用率

关于在内核中使用向量类型:


我相信这些将是最有用的,如果不仅仅是在带有向量指令的CPU上,而不是在GPU上——在GPU上,工作项本质上是标量的;矢量化覆盖多个工作项。

关于内存访问模式:

这首先取决于OpenCL内核编译器:一个合理的编译器将使用单个内存事务来获取单个工作项中使用的多个数组单元的数据,甚至是多个项目中使用的多个单元的数据。在NVidia GPU上,全局设备内存以128字节为单位读取,这使得每次读取合并多达(编辑:)32个浮点值是值得的;看

因此,使用
float4
甚至可能不足以最大限度地提高带宽利用率

关于在内核中使用向量类型:


我相信这些将是最有用的,如果不仅仅是在带有向量指令的CPU上,而不是在GPU上——在GPU上,工作项本质上是标量的;向量化是在多个工作项上进行的。

2、4、8和16个元素向量就像2/4/8/16标量一样排列在内存中。例外情况是3个元素向量,它们使用的内存相当于4个元素向量。根据我的经验,使用向量的主要好处是,所有设备都支持某种形式的指令级并行,要么通过CPU上的SIMD指令,要么通过同时执行GPU上的独立指令。2、4、8和16元素向量就像2/4/8/16标量一样排列在内存中。例外情况是3个元素向量,它们使用的内存相当于4个元素向量。根据我的经验,使用向量的主要好处是,所有设备都支持某种形式的指令级并行,要么通过CPU上的SIMD指令,要么通过同时执行GPU上的独立指令。

我不确定是否明白你的问题。我将尝试一些一般性的提示和技巧

在私有内存中没有数组,所以这里向量可以派上用场。正如其他人所描述的,内存对齐是可比较的。有关详细信息,请参阅

缺少的选项是使用结构。阅读第一个答案的第二部分,了解更多

另一件可能很方便的事情是:

__attribute__((vec_type_hint(vectortype)))
英特尔对此有多种解释:


在一个内核中编写多个内核是相当棘手的。您可以使用

中所述的宏技巧,但不确定我是否了解您的问题。我将尝试一些一般性的提示和技巧

在私有内存中没有数组,所以这里向量可以派上用场。正如其他人所描述的,内存对齐是可比较的。有关详细信息,请参阅

缺少的选项是使用结构。阅读第一个答案的第二部分,了解更多

另一件可能很方便的事情是:

__attribute__((vec_type_hint(vectortype)))
英特尔对此有多种解释:


在一个内核中编写多个内核是相当棘手的。您可以使用宏技巧,如

128字节=4*32字节=4 32位浮点,而不是8中所述。此外,使用VLIW的AMD GPU还受益于矢量化代码。Nvidia GPU具有一定的指令级并行性—可以同时调度独立的指令。你可以不使用向量运算而利用它,但使用向量运算更容易。@chippies:是的,编辑了答案。但是,128字节=32*4字节=32 4字节浮点=32 32位浮点。对不起,我想的是128位(不是字节)内存访问指令。还有32位和64位访问,因此从内存带宽方面来看,float2或float4与float相比没有任何好处。我忘记了全局内存的实际事务是128字节的传输,但这是每个扭曲一个事务,这就是合并内存访问很重要的原因。128字节=4*32字节=4 32位浮点,而不是8。此外,使用VLIW的AMD GPU还受益于矢量化代码。Nvidia GPU具有一定的指令级并行性—可以同时调度独立的指令。你可以不使用向量运算而利用它,但使用向量运算更容易。@chippies:是的,编辑了答案。但是,128字节=32*4字节=32 4字节浮点=32 32位浮点。对不起,我想的是128位(不是字节)内存访问指令。还有32位和64位访问,因此从内存带宽方面来看,float2或float4与float相比没有任何好处。我忘记了全局内存的实际事务是128字节t