OpenCl中的向量类型和一维数组

时间:2013-11-29 00:29:54

标签: vector kernel opencl

我想实现我的内核的两个版本,一个向量和一个标量版本。 现在我想知道是否让我们说double4类型在内存访问方面类似于大小为4的双倍数组。
我想到的是为我的两个内核使用相同的数据类型,在标量中我将单独处理每个组件(.s0 .. .s3),就像使用常规数组一样。
在其他世界中,我想使用OpenCl矢量类型仅存储在标量内核中,并利用矢量内核中的矢量属性。
老实说,我不希望每个内核都有不同的变量类型 这对你们有意义吗? 这里有任何提示吗? 谢谢,

埃里克。

3 个答案:

答案 0 :(得分:2)

2,4,8和16个元素向量在内存中布局,就像2/4/8/16标量一样。例外是3个元素向量,它使用与4个元素向量一样多的内存。根据我的经验,使用向量的主要好处是所有设备都支持某种形式的指令级并行,可以通过CPU上的SIMD指令或同时执行独立指令,这些都发生在GPU上。

答案 1 :(得分:1)

关于内存访问模式:

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

NVidia CUDA Best Pracices Guide: Coalesced Access to Global Memory

因此,使用float4可能甚至不足以最大化您的带宽利用率。

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

我相信这些对于带有向量指令的CPU而言大多数都是有用的,而不是在GPU上 - 工作项本身就是标量;矢量化超过了多个工作项。

答案 2 :(得分:1)

不确定我是否收到您的问题。我将尝试一些一般的提示和技巧。

你没有私有内存中的数组,所以这里的矢量可以派上用场。正如其他人所描述的那样,记忆对准是可比较的。有关详细信息,请参阅http://streamcomputing.eu/blog/2013-11-30/basic-concepts-malloc-kernel/

您缺少的选项是使用结构。阅读Arranging memory for OpenCL第一个答案的第二部分,了解更多信息。

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

__attribute__((vec_type_hint(vectortype)))

英特尔有各种解释:http://software.intel.com/sites/products/documentation/ioclsdk/2013XE/OG/Writing_Kernels_to_Directly_Target_the_Intel_Architecture_Processors.htm

在一个内核中编写多个内核非常棘手。您可以使用http://streamcomputing.eu/blog/2013-10-17/writing-opencl-code-single-double-precision/

中所述的宏技巧