众所周知,OpenCL 向量类型
float16
(GCN) 上的
float16
不使用加法向量运算,因为即使没有向量类型,也可以通过使用 WaveFront 来使用向量运算(每个线程 = 每个 SIMD 通道)。 IE。 float16
仅有助于在大宽度内存总线上进行加载/存储,例如在 HBM(高带宽内存)上:https://stackoverflow.com/a/42315728/1558037但是
AMD CPU上的
float16
建议用于涉及CPU的SIMD通道(因为每个线程=每个整个CPU核心,而不是SIMD通道):http://developer.amd.com/工具和 SDK/opencl-zone/opencl-resources/programming-in-opencl/image-convolution-using-opencl/image-convolution-using-opencl-a-step-by-step-tutorial-5/ 结果:
在 GCN 上,一个线程查看一个 SIMD 元素 - 即一个 线程映射到一个 SIMD 通道上):是否可以保证 WaveFront (OpenCL) 中的所有线程始终同步?
在 CPU 一个线程映射到整个一个 CPU 核心(有许多 SIMD 块,每个块有许多 SIMD 通道)
即像
float16
这样的向量类型对于 GPU 来说并不重要,但对于 CPU 来说却非常重要。
如果我们想为 CPU 和 GPU 两种架构编写一次优化的 OpenCL 代码,我们是否应该使用向量类型?
结论:
GPU 或 Intel-CPU 不太需要向量类型,但 AMD-CPU 需要。
一般来说,如果您关心的是性能,那么对不同的架构使用相同的内核几乎总是一个坏主意。 Pre-GCN 需要向量,GCN 需要标量,CPU 可以使用 Intel 驱动程序处理这两种情况,但前提是您意识到这一点,而且我不知道 AMD 驱动程序在 CPU 上的表现如何。虽然 CPU 需要比 GPU 更宽的向量。 CPU 依赖缓存,GPU 更多依赖临时内存。 GPU 拥有的寄存器比 CPU 想象的还要多......
在 GCN 上,实际上向量类型只是让我觉得我的代码看起来更好,并且节省了一些打字和犯错误的时间。
float v[4]
、float4 v
,甚至float v0, v1, v2, v3
,在大多数情况下都没有多大区别。
正如之前所说,Intel 的 CL 驱动程序可以将一个线程映射到一个 SIMD 元素,这使得一个核心有 8 个 CL 线程。