【问题标题】:vector type and one dimension array in OpenClOpenCl中的向量类型和一维数组
【发布时间】:2013-12-15 02:43:30
【问题描述】:

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

埃里克。

【问题讨论】:

    标签: vector kernel opencl


    【解决方案1】:

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

    【讨论】:

    • 谢谢大家,我现在对你的两个回复感到困惑。有人告诉我,NVIDIA GPU 不能很好地使用向量。所以我想有2个内核。我的 k20 的标量版本和 Xeon Phi 的矢量版本。好吧,在这里我也很困惑,因为我得到了这个设备的Device preferred double type vector width : 1
    • @Eric 请参阅下面关于内存访问和合并的评论以进行一些更正。关于首选向量宽度 1,假设您在 Nvidia GPU 上添加了两个 float4,这变成了 4 个浮点加法,因为 Nvidia GPU 指令集中没有向量指令。然而,这 4 个加法可以以任何顺序执行,允许提取一些 ILP,这对于当前的 Kepler 一代 GPU 很重要。 Xeon Phi 有矢量操作,所以它应该报告一个大于 1 的首选矢量宽度。
    【解决方案2】:

    关于内存访问模式:

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

    NVidia CUDA Best Pracices Guide: Coalesced Access to Global Memory

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

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

    我相信,如果不是仅在具有矢量指令的 CPU 上,而不是在 GPU 上(工作项本质上是标量的),这些将非常有用;矢量化涉及多个工作项。

    【讨论】:

    • 128 字节 = 4*32 字节 = 4 个 32 位浮点数,而不是 8 个。此外,使用 VLIW 的 AMD GPU 受益于矢量化代码。 Nvidia GPU 具有一些指令级并行性——可以同时调度独立指令。您可以在不使用向量操作的情况下利用它,但使用向量操作更容易。
    • @chippies:是的,编辑了答案。但是,128 字节 = 32 * 4 字节 = 32 个 4 字节浮点数 = 32 个 32 位浮点数。所以,32 IIANM。
    • 抱歉,我在考虑 128 位(不是字节)内存访问指令。还有 32 位和 64 位访问,因此从内存带宽方面来看, float2 或 float4 与 float 相比没有任何好处。我忘记了具有全局内存的实际事务是 128 字节的传输,但这是每个 warp 一个事务,这就是合并内存访问很重要的原因。
    【解决方案3】:

    不确定我是否收到您的问题。我会用一堆一般提示和技巧来尝试一下。

    您的私有内存中没有数组,因此向量可以派上用场。正如其他人所描述的,内存对齐是可比的。有关一些信息,请参阅http://streamcomputing.eu/blog/2013-11-30/basic-concepts-malloc-kernel/

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

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

    __attribute__((vec_type_hint(vectortype)))
    

    Intel有各种解释: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/中描述的宏技巧

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2019-12-02
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多