众所周知,OpenCL矢量型float16
float16 on AMD (GCN)不使用加法向量操作,因为即使没有向量类型,矢量操作也使用WaveFront (每个线程=每个SIMD-lane)。也就是说,float16只能帮助在内存的大宽度总线上加载/存储,例如在HBM (高带宽内存):https://stackoverflow.com/a/42315728/1558037上。float16 on AMD 来包含CPU的SIMD通道(因为每个线程=每个CPU核心,而不是SIMD-):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/。

因此:
也就是说,矢量类型(如float16 )对GPU没有多大影响,但对CPU非常重要。
如果我们想为两种架构编写一次优化的OpenCL代码: CPU和GPU,我们应该使用向量类型吗?
结论:
矢量类型不是GPU或Intel-CPU所需要的,而是AMD-CPU需要的.
发布于 2017-02-20 10:27:59
通常,如果性能是您所关心的,那么在不同的体系结构中使用相同的内核几乎总是一个坏主意。前GCN的想要向量,GCN的想要标量,CPU的两者都可以处理英特尔驱动,但只有当你知道它,我不知道AMD的驱动程序是如何在CPU上。而CPU需要比GPU更宽的矢量。CPU依赖高速缓存,GPU更依赖于scratch内存。GPU拥有比CPU更多的寄存器.
在GCN上,实际上的向量类型只会让我觉得我的代码更好看,并且在输入和出错上节省了一些时间。float v4,float4 v,甚至float v0,v1,v2,v3,在大多数时间内都不会有太大的区别。
如前所述,Intel的CL驱动程序可以将线程映射到SIMD元素,该元素构成一个核心的8个CL线程。
https://stackoverflow.com/questions/42328259
复制相似问题