众所周知,OpenCL向量类型float16
float16
没有使用添加向量操作,因为使用WaveFront即使没有矢量类型也使用向量操作(每个线程=每个SIMD-lane)。即float16
只能在大容量内存总线上加载/存储,例如在HBM(高带宽内存)上:https://stackoverflow.com/a/42315728/1558037
但 AMD CPU 上的float16
建议用于涉及CPU的SIMD通道(因为每个线程=每个整个CPU核心,而不是SIMD-lane): http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-resources/programming-in-opencl/image-convolution-using-opencl/image-convolution-using-opencl-a-step-by-step-tutorial-5/
结果:
GCN&#39> 一个线程查看一个SIMD元素 - 即一个线程映射到一个SIMD-lane ):Is there any guarantee that all of threads in WaveFront (OpenCL) always synchronized? < / p>
CPU 一个线程映射到整个CPU核心(有许多SIMD块,每个都有许多SIMD通道)
即。像float16
这样的矢量类型对GPU来说并不重要,但对CPU来说非常重要。
我们是否应该使用矢量类型,如果我们想为两种体系结构编写一次优化的OpenCL代码:CPU和GPU?
结论:
GPU或Intel-CPU并不需要矢量类型,但AMD-CPU需要它。
答案 0 :(得分:2)
通常,如果性能是您所关注的,那么为不同的体系结构使用相同的内核几乎总是一个坏主意。前GCN需要向量,GCN需要标量,CPU可以同时处理英特尔驱动程序,但只有你知道它,我不知道AMD的驱动程序是如何在CPU上做的。虽然CPU需要比GPU更宽的矢量。 CPU依赖于缓存,GPU更多地依赖于临时内存。 GPU拥有比CPU甚至梦想更多的寄存器......
在GCN的实际矢量类型上让我觉得我的代码看起来更好,并节省了打字和犯错的时间。 float v [4],float4 v,甚至float v0,v1,v2,v3,在大部分时间内都没有太大的区别。
如前所述,英特尔的CL驱动程序可以将线程映射到SIMD元素,该元素构成一个核心8个CL线程。