gpgpu 上 opencl 中的 SIMD-8、SIMD-16 或 SIMD-32
SIMD-8,SIMD-16 or SIMD-32 in opencl on gpgpu
我阅读了关于此主题(SIMD 模式)的几个关于 SO 的问题,但仍然需要 clarification/confirmation 了解其工作原理。
Why use SIMD if we have GPGPU?
SIMD intrinsics - are they usable on gpus?
CPU SIMD vs GPU SIMD?
如果我在 SIMD-8 模式下编译代码,以下几点是否正确?
1) 这意味着不同工作项的 8 条指令正在并行执行。
2) 这是否意味着所有工作项都只执行相同的指令?
3) 如果每个 wrok 项代码包含 vload16 加载,然后是 float16 操作,然后仅包含 vstore16 操作。 SIMD-8 模式仍然有效。我的意思是说 GPU 是否真的在为所有 8 个工作项执行相同的指令(vload16/float16/vstore16)?
我应该如何理解这个概念?
过去,许多 OpenCL 供应商需要使用矢量类型才能使用 SIMD。如今 OpenCL 供应商正在将工作项打包到 SIMD 中,因此无需使用向量类型。是否优先使用向量类型可以通过查询来检查:CL_DEVICE_PREFERRED_VECTOR_WIDTH_<CHAR, SHORT, INT, LONG, FLOAT, DOUBLE>
.
在 Intel 上,如果使用向量类型,向量化器首先对它们进行标量化,然后重新向量化以利用宽指令集。这在其他平台上可能会类似。
我阅读了关于此主题(SIMD 模式)的几个关于 SO 的问题,但仍然需要 clarification/confirmation 了解其工作原理。
Why use SIMD if we have GPGPU?
SIMD intrinsics - are they usable on gpus?
CPU SIMD vs GPU SIMD?
如果我在 SIMD-8 模式下编译代码,以下几点是否正确? 1) 这意味着不同工作项的 8 条指令正在并行执行。
2) 这是否意味着所有工作项都只执行相同的指令?
3) 如果每个 wrok 项代码包含 vload16 加载,然后是 float16 操作,然后仅包含 vstore16 操作。 SIMD-8 模式仍然有效。我的意思是说 GPU 是否真的在为所有 8 个工作项执行相同的指令(vload16/float16/vstore16)?
我应该如何理解这个概念?
过去,许多 OpenCL 供应商需要使用矢量类型才能使用 SIMD。如今 OpenCL 供应商正在将工作项打包到 SIMD 中,因此无需使用向量类型。是否优先使用向量类型可以通过查询来检查:CL_DEVICE_PREFERRED_VECTOR_WIDTH_<CHAR, SHORT, INT, LONG, FLOAT, DOUBLE>
.
在 Intel 上,如果使用向量类型,向量化器首先对它们进行标量化,然后重新向量化以利用宽指令集。这在其他平台上可能会类似。