我在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会慢慢做同样的事情。
答案 0 :(得分:0)
根据您的设备,您可能无法通过重写在OpenCL C代码中使用向量来获胜。
在AMD的上一代硬件(VLIW4 / 5)中,您可以通过使用向量(如float4)获得胜利,因为这是使用向量硬件的唯一时间。但是,AMD的新硬件(GCN)是标量,编译器会对您的代码进行标量化。与NVIDIA的硬件一样,该硬件一直是标量。
即使在可以使用SSE / AVX向量指令的CPU上,我认为编译器会对您的代码进行标量化,然后在向量通道上运行多个工作项(自动向量化)。
因此,在花时间对所有内容进行矢量化之前先尝试一个例子。
您可能会集中精力确保内存访问完全合并;这通常是一个更大的胜利。