如果我们想为 CPU 和 GPU 编写一次优化代码,我们是否应该使用向量类型?
Should we use the vector-types, if we want to write once optimized code for both: CPU and GPU?
众所周知,OpenCL 矢量类型 float16
float16
on AMD GPU (GCN) 不使用加法向量运算,因为即使没有向量类型也使用向量运算WaveFront(每个线程 = 每个 SIMD 通道)。 IE。 float16
仅对 load/store 大宽度内存总线有帮助,例如 HBM(高带宽内存):
但 AMD CPU 上的 float16
建议用于涉及 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/
结果:
在 GCN 的 上,一个线程查看一个 SIMD 元素 - 即一个 线程映射到一个 SIMD 通道 ):
on CPU一个线程映射到整个CPU-Core (具有许多 SIMD 块,每个块具有许多 SIMD 通道)
即float16
等向量类型对 GPU 来说无关紧要,但对 CPU.
非常重要
如果我们想为两种架构编写一次优化的 OpenCL 代码,我们是否应该使用矢量类型:CPU 和 GPU?
结论:
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 线程。
众所周知,OpenCL 矢量类型 float16
float16
on AMD GPU (GCN) 不使用加法向量运算,因为即使没有向量类型也使用向量运算WaveFront(每个线程 = 每个 SIMD 通道)。 IE。float16
仅对 load/store 大宽度内存总线有帮助,例如 HBM(高带宽内存):但 AMD CPU 上的
float16
建议用于涉及 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/
结果:
在 GCN 的 上,一个线程查看一个 SIMD 元素 - 即一个 线程映射到一个 SIMD 通道 ):
on CPU一个线程映射到整个CPU-Core (具有许多 SIMD 块,每个块具有许多 SIMD 通道)
即float16
等向量类型对 GPU 来说无关紧要,但对 CPU.
如果我们想为两种架构编写一次优化的 OpenCL 代码,我们是否应该使用矢量类型:CPU 和 GPU?
结论:
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 线程。