gpgpu上opencl中的SIMD-8、SIMD-16或SIMD-32

gpgpu上opencl中的SIMD-8、SIMD-16或SIMD-32,opencl,gpgpu,Opencl,Gpgpu,我在本主题(SIMD模式)中阅读了一些关于SO的问题,但仍然需要对事情的工作原理进行一些澄清/确认 如果我在SIMD-8模式下编译代码,以下几点正确吗? 1) 这意味着不同工作项的8条指令正在并行执行 2) 这是否意味着所有工作项只执行同一条指令 3) 如果每个wrok项目代码包含vload16 load,则仅包含float16操作和vstore16操作。SIMD-8模式仍将工作。我的意思是说GPU对所有8个工作项执行相同的指令(vload16/float16/vstore16)是真的吗

我在本主题(SIMD模式)中阅读了一些关于SO的问题,但仍然需要对事情的工作原理进行一些澄清/确认

如果我在SIMD-8模式下编译代码,以下几点正确吗? 1) 这意味着不同工作项的8条指令正在并行执行

2) 这是否意味着所有工作项只执行同一条指令

3) 如果每个wrok项目代码包含vload16 load,则仅包含float16操作和vstore16操作。SIMD-8模式仍将工作。我的意思是说GPU对所有8个工作项执行相同的指令(vload16/float16/vstore16)是真的吗


我应该如何理解这个概念?

过去,许多OpenCL供应商需要使用向量类型才能使用SIMD。现在OpenCL供应商正在将工作项打包到SIMD中,因此不需要使用向量类型。通过查询:
CL\u DEVICE\u PREFERRED\u vector\u WIDTH\u
可以检查是否首选使用向量类型


在“英特尔”上,如果使用矢量类型,则矢量器首先对其进行标量化,然后重新矢量化以利用宽指令集。这在其他平台上可能会类似。

有趣的问题。我从未听说过有人在GPU上进行SIMD优化。GPU使用(几乎)与CPU相同的SIMD-只是编程模型不同,在GPU上公开标量线程,在CPU上公开向量线程。关于第3点的任何评论)都意味着如果我在内核代码中使用vload16或float16之类的指令。我正在增加每个项目的冗余工作。你不认为如果我遵循这一点,它会使vload16或float16类型指令的存在无效吗?问题是这实际上是一个调整因素。另一方面,您可能会发现,将更多ALU操作打包到每个工作项中会使内核受益。把它看得更像一个循环展开优化。您可能不需要它来获取SIMD映射,但您可以从有关独立ALU操作的额外信息中获益。在这一点上,你只需要进行实验,找到所有这些因素的最佳组合,或者依赖于编译器使用的启发式方法。我想我甚至不知道SIMD引擎到ALU的映射。我正在研究英特尔体系结构。你能先把它画出来吗?以下是其文档的链接: