【问题标题】:SIMD-8,SIMD-16 or SIMD-32 in opencl on gpgpugpgpu 上 opencl 中的 SIMD-8、SIMD-16 或 SIMD-32
【发布时间】:2015-10-23 13:17:38
【问题描述】:

我阅读了几个关于这个主题(SIMD 模式)的 SO 问题,但仍然需要稍微澄清/确认事情的工作原理。

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) 如果每个工作项代码包含 vload16 load 然后 float16 操作,然后仅 vstore16 操作。 SIMD-8 模式仍然有效。我的意思是说,GPU 是否真的要为所有 8 个工作项执行相同的指令(vload16/float16/vstore16)?

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

【问题讨论】:

  • 有趣的问题。我从未听说有人在 GPU 上进行 SIMD 优化。
  • GPU 使用(几乎)与 CPU 相同的 SIMD - 只是编程模型不同,在 GPU 上公开标量线程,在 CPU 上公开矢量线程。
  • 第 3 点上的任何 cmets)

标签: opencl gpgpu


【解决方案1】:

过去,许多 OpenCL 供应商需要使用向量类型才能使用 SIMD。现在 OpenCL 供应商正在将工作项打包到 SIMD 中,因此不需要使用向量类型。是否优先使用向量类型可以通过查询来检查:CL_DEVICE_PREFERRED_VECTOR_WIDTH_<CHAR, SHORT, INT, LONG, FLOAT, DOUBLE>

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

【讨论】:

  • 所以这意味着如果我在内核代码中使用像 vload16 或 float16 这样的指令。我正在增加每个项目的冗余工作。你不觉得如果我按照这个,它会取消 vload16 或 float16 类型指令的存在。
  • 问题是这确实是一个调整因素。它可能会这样做,另一方面,您可能会发现内核受益于将更多 ALU 操作打包到每个工作项中。更像是一个循环展开优化。您可能不需要它来获得 SIMD 映射,但您可以从有关独立 ALU 操作的额外信息中受益。此时,您只需进行试验以找到所有这些因素的最佳组合,或者依赖编译器使用的启发式方法。
  • 伙计们,我对这里的概念完全感到困惑。我想我什至不知道 SIMD 引擎到 ALU 的映射。我正在研究英特尔架构。你能先映射一下吗?这是其文档的链接:software.intel.com/sites/default/files/managed/71/a2/…
猜你喜欢
  • 2019-12-23
  • 2011-01-08
  • 2020-02-15
  • 1970-01-01
  • 2015-08-24
  • 2023-02-19
  • 1970-01-01
  • 2016-05-03
  • 2011-04-11
相关资源
最近更新 更多