0

我在 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 做同样的事情会很慢。

4

1 回答 1

0

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

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

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

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

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

于 2014-04-19T16:11:49.590 回答