Concurrency 如果我们想同时为CPU和GPU编写一次优化的代码,我们应该使用向量类型吗?

Concurrency 如果我们想同时为CPU和GPU编写一次优化的代码,我们应该使用向量类型吗?,concurrency,opencl,vectorization,gpgpu,amd,Concurrency,Opencl,Vectorization,Gpgpu,Amd,众所周知,OpenCL向量类型float16 AMD GPU(GCN)上的float16不使用加法矢量运算,因为即使没有矢量类型,矢量运算也会使用波前(每个线程=每个SIMD通道)。也就是说,float16只能用于在大宽度内存总线上加载/存储,例如在HBM(高带宽内存)上: 但是float16onAMD CPU建议用于涉及CPU的SIMD通道(因为每个线程=每个整个CPU内核,而不是SIMD通道): 因此: 在GCN上一个线程查看一个SIMD元素-即一个线程映射到一个SIMD通道上):

众所周知,OpenCL向量类型
float16

  • AMD GPU(GCN)上的
    float16
    不使用加法矢量运算,因为即使没有矢量类型,矢量运算也会使用波前(每个线程=每个SIMD通道)。也就是说,
    float16
    只能用于在大宽度内存总线上加载/存储,例如在HBM(高带宽内存)上:

  • 但是
    float16
    onAMD CPU建议用于涉及CPU的SIMD通道(因为每个线程=每个整个CPU内核,而不是SIMD通道):


因此:

  • GCN上一个线程查看一个SIMD元素-即一个线程映射到一个SIMD通道上):

  • CPU上一个线程映射到整个一个CPU内核上(具有多个SIMD块,每个块具有多个SIMD通道)

也就是说,向量类型,如
float16
对GPU来说并不重要,但对CPU来说非常重要

如果我们想为两种体系结构(CPU和GPU)编写一次优化的OpenCL代码,我们应该使用向量类型吗


结论:


GPU或Intel CPU不太需要向量类型,但AMD-CPU需要向量类型。

一般来说,如果性能是您关心的问题,那么在不同的体系结构中使用相同的内核几乎总是一个坏主意。前GCN的想要向量,GCN的想要标量,CPU都可以用Intel驱动程序处理,但只有当你知道它的时候,我不知道AMD的驱动程序在CPU上做得怎么样。而CPU需要比GPU更宽的矢量。CPU依赖于缓存,而GPU更依赖于暂存内存。GPU的寄存器多得让CPU做梦也想不到

在GCN上,实际上向量类型只是让我觉得我的代码看起来更好,并且节省了一些打字和出错的时间。浮动v[4]、浮动4V,甚至浮动v0、v1、v2、v3,在大多数情况下都没有多大区别


如前所述,Intel的CL驱动程序可以将一个线程映射到SIMD元素,该元素构成一个核心8个CL线程

你有没有检查过当使用float16 vs float时,使用像CodeXL这样的探查器输出的ISA代码时使用了多少VGRP?@huseyin tugrul buyukisik没有,我没有。你是什么意思,我的陈述中有错误吗?不,只是告诉你一些优化是这样看的。例如,我的gpu编译使用vgpr,即使我不使用向量。Vgpr比我的amd GPUIT中的sgpr有更多的内存更像“标量”体系结构的可读性(即使它们在SIMD上工作),据我所知,GPU也有很深的管道,所以不应该有理由在发出其他3个浮点时不完成1个浮点。另外,我在某个地方读到,GCN能够在4个周期内完成1个向量元素fp(因此,对于4个元素,必须像7-8一样),在相同的4个周期内,在1个标量元素fp的基础上,使用指令级parallelismamd使用SSE,在使用向量时,我对其进行了测试,但其性能远不及手工调整的汇编性能(可能只是我的fx8150)。intels编译器要好得多。从float到float4,x2-x2.5的速度和float8接近x3的速度一样快。也许汇编之间的性能差距来自AVX-SSE-MMX转换如果存在intel驱动程序,float可以和float8一样快,如果你做得对的话。但至少我认为,在没有CL的情况下使用AVX更容易、更合理。