现在我们的GPGPU上有CUDA和OpenCL等语言,多媒体SIMD扩展(SSE / AVX / NEON)是否仍然有用?
我最近读了一篇关于如何使用SSE指令来加速排序网络的文章。我觉得这很漂亮但是当我告诉我的comp arch教授他笑了,并说在GPU上运行类似的代码会破坏SIMD版本。我不怀疑这一点,因为SSE非常简单,GPU是大型高度复杂的加速器,具有更多的并行性,但它让我想到,有多种情况下多媒体SIMD扩展比使用GPU更有用吗?
如果GPGPU使SIMD冗余,为什么英特尔会增加他们的SIMD支持? SSE是128位,现在它是带有AVX的256位,明年它将是512位。如果GPGPU更好地处理具有数据并行性的代码,为什么英特尔会推动这些SIMD扩展?他们可能能够将等效资源(研究和区域)放入更大的缓存和分支预测器中,从而提高串行性能。
为什么要使用SIMD而不是GPGPU?
答案 0 :(得分:6)
绝对SIMD仍然具有相关性。
首先,SIMD可以更容易地与标量代码互操作,因为它可以直接读取和写入相同的内存,而GPU需要将数据上传到GPU内存才能访问它。例如,通过SIMD直接矢量化像memcmp()这样的函数,但通过将数据上传到GPU并在那里运行来实现memcmp()是荒谬的。延迟会很糟糕。
其次,SIMD和GPU在高分支代码上都很糟糕,但SIMD的情况稍差。这是因为GPU在单个指令调度程序下组合了多个线程(一个" warp")。那么当线程需要采用不同的路径时会发生什么:在一个线程中采用if分支,而在另一个线程中采用else分支?这被称为"分支差异"它很慢:所有"如果"线程执行而#34; else"线程等待,然后"否则"线程执行时," if"线程等待。当然,CPU内核没有这个限制。
结果是SIMD更适合所谓的中间工作负载:"工作负载达到中等规模,具有一些数据并行性,访问模式中的一些不可预测性,一些分支。对于具有可预测的执行流程和访问模式的非常大的工作负载,GPU更好。
(还有一些外围原因,例如更好地支持CPU中的双精度浮点数。)
答案 1 :(得分:0)
GPU具有可控制的专用缓存,CPU具有更好的分支功能。除此之外,计算性能依赖于SIMD宽度,整数核心密度和指令级并行性。
另一个重要参数是数据与CPU或GPU的距离。 (您的数据可能是独立GPU中的opengl缓冲区,您可能需要在使用CPU进行计算之前将其下载到RAM,当主机缓冲区在RAM中并且需要在离散GPU上计算时,可以看到相同的效果)