如何为矢量指令(OpenCL)准备大量数据?

如何为矢量指令(OpenCL)准备大量数据?,opencl,gpgpu,vectorization,memory-access,Opencl,Gpgpu,Vectorization,Memory Access,我正在OpenCL中进行数据并行处理,我希望通过使用向量指令SIMD来提高吞吐量。为了使用int4、double2等,我需要梳理输入数据数组。最好的方法是什么 从 作为一个组合缓冲区或单独的缓冲区 到 N可能高达20000,现在是两倍。我使用的是GCN GPGPU,首选的双矢量大小是2 -我应该准备另一个内核来梳理特定向量宽度的数据吗 -我想CPU做同样的事情会很慢。根据您的设备,您可能无法通过在OpenCL C代码中重新编写使用向量来获得胜利 在AMD的上一代硬件VLIW4/5中,你可以通过使

我正在OpenCL中进行数据并行处理,我希望通过使用向量指令SIMD来提高吞吐量。为了使用int4、double2等,我需要梳理输入数据数组。最好的方法是什么

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

N可能高达20000,现在是两倍。我使用的是GCN GPGPU,首选的双矢量大小是2

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


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

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

在AMD的上一代硬件VLIW4/5中,你可以通过使用像float4这样的向量来获得胜利,因为这是唯一一次使用向量硬件。然而,AMD的新硬件GCN是标量的,编译器可以对代码进行标量化。NVIDIA的硬件也一样,它一直是标量的

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

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


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

在转置数据后,您将在数据上运行什么样的算法?
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]