现在我们有了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?
发布于 2014-09-03 03:15:39
当然,SIMD仍然是相关的。
首先,SIMD可以更容易地与标量代码互操作,因为它可以直接读写相同的内存,而GPU需要将数据上传到GPU内存才能访问。例如,通过SIMD向量化像memcmp()这样的函数是很简单的,但是通过将数据上传到GPU并在GPU上运行来实现memcmp()是很荒谬的。延迟将是压倒性的。
其次,SIMD和GPU都不擅长高度分支的代码,但SIMD在某种程度上没有那么糟糕。这是由于GPU将多个线程( "warp")分组在单个指令调度器下的事实。那么,当线程需要采用不同的路径时会发生什么:一个线程采用if分支,而另一个线程采用else分支?这被称为“分支分歧”,而且速度很慢:所有的"if“线程在"else”线程等待时执行,然后"else“线程在"if”线程等待时执行。当然,CPU核心没有这个限制。
结果是,SIMD更适合于所谓的“中间工作负载”:中等大小的工作负载,具有一定的数据并行性,访问模式中的一些不可预测性,一些分支。GPU更适合具有可预测的执行流和访问模式的非常大的工作负载。
(还有一些外围原因,比如更好地支持CPU中的双精度浮点。)
发布于 2014-09-03 03:32:09
GPU有可控的专用缓存,CPU有更好的分支。除此之外,计算性能取决于SIMD宽度、整数核密度和指令级并行性。
另一个重要的参数是数据到CPU或GPU的距离。(您的数据可以是独立GPU中的opengl缓冲区,在使用CPU进行计算之前,您可能需要将其下载到RAM中,当主机缓冲区位于RAM中并需要在独立GPU上进行计算时,也可以看到同样的效果)
https://stackoverflow.com/questions/25630209
复制相似问题