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

Cuda 如果我们有GPGPU,为什么要使用SIMD?,cuda,gpgpu,simd,computer-architecture,cpu-architecture,Cuda,Gpgpu,Simd,Computer Architecture,Cpu Architecture,既然我们有了使用CUDA和OpenCL等语言的GPGPU,那么多媒体SIMD扩展(SSE/AVX/NEON)还有用吗 我最近读了一篇关于如何使用SSE指令加速排序网络的文章。我觉得这很不错,但当我告诉我的公司教授时,他笑了,说在GPU上运行类似的代码会破坏SIMD版本。我不怀疑这一点,因为SSE非常简单,GPU是大型、高度复杂的加速器,具有更多的并行性,但这让我思考,在许多情况下,多媒体SIMD扩展是否比使用GPU更有用 如果GPGPU使SIMD冗余,英特尔为什么要增加对SIMD的支持?SSE是

既然我们有了使用CUDA和OpenCL等语言的GPGPU,那么多媒体SIMD扩展(SSE/AVX/NEON)还有用吗

我最近读了一篇关于如何使用SSE指令加速排序网络的文章。我觉得这很不错,但当我告诉我的公司教授时,他笑了,说在GPU上运行类似的代码会破坏SIMD版本。我不怀疑这一点,因为SSE非常简单,GPU是大型、高度复杂的加速器,具有更多的并行性,但这让我思考,在许多情况下,多媒体SIMD扩展是否比使用GPU更有用

如果GPGPU使SIMD冗余,英特尔为什么要增加对SIMD的支持?SSE是128位,现在AVX是256位,明年将是512位。如果GPGPU能够更好地处理具有数据并行性的代码,为什么Intel会推出这些SIMD扩展?他们可能能够将等效资源(研究和区域)放入更大的缓存和分支预测器中,从而提高串行性能


为什么要使用SIMD而不是GPGPU?

SIMD绝对仍然相关

首先,SIMD可以更轻松地与标量代码进行互操作,因为它可以直接读取和写入相同的内存,而GPU要求在访问数据之前将数据上载到GPU内存。例如,通过SIMD对memcmp()这样的函数进行矢量化很简单,但是通过将数据上传到GPU并在GPU上运行来实现memcmp()是荒谬的。延迟将是令人崩溃的

第二,SIMD和GPU在高度分支的代码方面都不好,但SIMD稍差一些。这是因为GPU将多个线程(一个“扭曲”)分组在一个指令调度器下。那么,当线程需要采用不同的路径时会发生什么情况:if分支在一个线程中,else分支在另一个线程中?这被称为“分支发散”,速度很慢:所有“if”线程在“else”线程等待时执行,然后“else”线程在“if”线程等待时执行。当然,CPU内核没有这个限制

结果是SIMD更适合于所谓的“中间工作负载”:中等大小的工作负载,具有一些数据并行性、访问模式中的一些不可预测性、一些分支。GPU更适合具有可预测的执行流和访问模式的超大工作负载


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

GPU有可控的专用缓存,CPU有更好的分支。除此之外,计算性能依赖于SIMD宽度、整数内核密度和指令级并行性


另一个重要参数是数据到CPU或GPU的距离。(您的数据可能是离散GPU中的opengl缓冲区,在使用CPU进行计算之前,您可能需要将其下载到RAM中,当主机缓冲区位于RAM中并且需要在离散GPU上计算时,可以看到相同的效果)

FWIW,Intel似乎完全有意将SIMD大小增加到相同大小(甚至更长)比GPU的宽度。i、 合并CPU和GPU。@神秘啊,是吗?你有我能读到的参考资料吗?英特尔的OpenCL实现使用SSE和AVX进行优化,实际上提供了相当不错的加速(在他们的CPU上而不是Xeon Phi上)。SIMD/AVX/NEON除了在背景中漂移外,哪儿也去不了。他们可能会为各种前端(如OpenCL)做繁重的工作。@Mysticial,根据Agner Fog的微结构手册,Intel计划达到1024,但没有进一步的计划。设置gpgpu需要时间,simd版本可能已经完成了。gpgpu启动后速度很快,但工作负载的大小可能不值得这么做。感谢您的见解。这正是你关于将数据“上传”到GPU的观点。AMD的加速处理单元似乎在与CPU核心相同的芯片上集成了一种GPGPU。我不确定细节,但我认为它们共享二级或三级缓存。你认为这个论点也适用于这样的设备吗?你在CUDA/OpenCL中提出了分支分歧,并说“CPU核心”没有这个限制。这是一种不公平的说法。首先,SIMD指令按核心运行。SIMD代码中不能有if/else语句。您必须解包数据并单独进行操作,这可能与您提到的分支分歧一样糟糕或更糟。我一直想问类似的问题。我以为GPU基本上是大宽度的SIMD设备,有很多慢“内核”?SIMT不是真正的软件而不是硬件吗。我的意思是,每个“线程”看起来不同,但它使用的是SIMD,SIMD单元中的每个其他线程都必须等待其他线程。我使用AVX使用<代码> MM256IVMeMasaskEPI8进行某些事情。对于某些情况,解包确实是必要的,但不是全部,例如在线程ID上分支。或者考虑MEMCPMP示例:所有需要“解压缩”的是登记单的一个汇总位。当然,分支本身不是SIMD指令,但这是因为它不一定是:SIMD可以轻松地将其卸载到CPU的分支机器上。GPU并没有那个么奢侈。SIMD仍然优于GPU的一个很好的例子是视频编码。搜索空间如此之大,以至于您需要根据比较结果尽快进行分支,因为已经排除了对块进行编码的可能方法。在排序示例中,我认为如果排序后的数组被CPU使用,这可能会很有用。但是我的教授认为最好把它交给GPU,然后重新排序。他的研究是关于GPGPU的,所以我认为他有偏见,但仍然。。。我有疑问。要排序的数组的长度是多少?排序的复杂性是多少?