如果我们有GPGPU,为什么要使用SIMD?

jon*_*en1 5 cuda gpgpu simd cpu-architecture computer-architecture

现在我们的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?

rid*_*ish 6

完全SIMD仍然是相关的.

首先,SIMD可以更容易地与标量代码互操作,因为它可以直接读取和写入相同的内存,而GPU需要在访问之前将数据上传到GPU内存.例如,这是简单的向量化例如memcmp()通过SIMD功能,但它是荒谬通过将数据上传到GPU并运行它有实现memcmp().延迟会很糟糕.

其次,SIMD和GPU在高度冗余的代码中都很糟糕,但SIMD的情况要差一些.这是因为GPU在单个指令调度程序下组合了多个线程("warp").那么当线程需要采用不同的路径时会发生什么:在一个线程中采用if分支,而在另一个线程中采用else分支?这被称为"分支差异"并且它很慢:所有"if"线程在"else"线程等待时执行,然后"else"线程在"if"线程等待时执行.当然,CPU内核没有这个限制.

结果是SIMD更适合所谓的"中间工作负载:"工作负载达到中等规模,具有一些数据并行性,访问模式中的一些不可预测性,一些分支.对于具有可预测的执行流和访问模式的非常大的工作负载,GPU更好.

(还有一些外围原因,例如更好地支持CPU中的双精度浮点数.)