【问题标题】:How to prepare large amount of data for vector instructions (OpenCL)?如何为向量指令准备大量数据(OpenCL)?
【发布时间】:2014-04-17 08:52:37
【问题描述】:

我正在 OpenCL 中进行数据并行处理,我想通过使用向量指令 (SIMD) 来增加吞吐量。为了使用 int4、double2 等,我需要梳理输入数据数组。做这个的最好方式是什么?

来自

A[0] A[1] A[2] ... A[N] B[0] B[1] B[2] ... B[N] C[0]...C[N] D[0]...D[N]

作为一个组合缓冲区或单独的缓冲区

A[0] B[0] C[0] D[0] A[1] B[1] C[1] D[1] ... A[N] B[N] C[N] D[N]

N 可能高达 20000,现在翻倍。我正在使用 GCN GPGPU,首选双向量大小为 2。

-我应该准备另一个内核来梳理特定向量宽度的数据吗?

-我想 CPU 做同样的事情会很慢。

【问题讨论】:

  • 转置后的数据要运行什么样的算法?

标签: opencl gpgpu vectorization memory-access


【解决方案1】:

根据您的设备,您可能无法通过在 OpenCL C 代码中重写以使用向量来获得成功。

在 AMD 的上一代硬件 (VLIW4/5) 中,您可以通过使用向量(如 float4)获得胜利,因为这是唯一一次使用向量硬件。但是,AMD 的新硬件 (GCN) 是标量的,编译器会标量您的代码。 NVIDIA 的硬件也是如此,它一直是标量的。

即使在可以使用 SSE/AVX 矢量指令的 CPU 上,我认为编译器也会对您的代码进行标量化,然后跨矢量通道运行多个工作项(自动矢量化)。

所以在花时间对所有内容进行矢量化之前先尝试一个示例。

您可以将精力集中在确保内存访问完全合并上;这通常是一个更大的胜利。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 2018-01-02
    • 2016-08-17
    • 2012-02-14
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多