GPGPU与多核?

dsi*_*cha 35 parallel-processing performance multithreading multicore gpgpu

从程序员的角度来看,GPGPU与常规多核/多线程CPU编程之间的关键实际区别是什么?特别:

  • 什么类型的问题更适合常规多核以及哪种类型更适合GPGPU?

  • 编程模型的主要区别是什么?

  • 什么是关键的底层硬件差异,需要编程模型的任何差异?

  • 哪一个通常更容易使用,多少?

  • 从长远来看,为GPU实现高级并行库是否切实可行,例如Microsoft的任务并行库D的std.parallelism

  • 如果GPU计算效率非常高,为什么CPU的设计更像GPU?

Aat*_*man 38

有趣的问题.我已经研究过这个问题所以我的回答是基于一些参考和个人经验.

什么类型的问题更适合常规多核以及哪种类型更适合GPGPU?

就像@Jared提到的那样.GPGPU专为非常常规的吞吐量工作负载而构建,例如图形,密集矩阵矩阵乘法,简单的photoshop滤波器等.它们擅长容忍长延迟,因为它们本身设计为容忍纹理采样,1000次循环操作.GPU核心有很多线程:当一个线程触发长延迟操作(比如内存访问)时,该线程将进入休眠状态(其他线程继续工作),直到长延迟操作完成.这使得GPU可以使执行单元比传统内核更加繁忙.

GPU处理分支是不好的,因为GPU喜欢批量"线程"(SIMD通道,如果你不是nVidia)进入warp并将它们一起发送到管道以节省指令获取/解码能力.如果线程遇到分支,它们可能会发散,例如,8线程扭曲中的2个线程可能占用分支,而其他6个线程可能不接受分支.现在经线必须分成两个大小为2和6的经线.如果你的核心有8个SIMD通道(这就是为什么原始经线会突变8个线程),那么现在你的两个新形成的经线将运行效率低下.2线程扭曲效率为25%,6线程扭曲效率为75%.你可以想象,如果GPU继续遇到嵌套分支,它的效率会变得非常低.因此,GPU不擅长处理分支,因此不应在GPU上运行带分支的代码.

GPU也是一种合作线程.如果线程需要相互通信,那么GPU将无法正常工作,因为GPU上不能很好地支持同步(但是nVidia就在它上面).

因此,GPU的最差代码是具有较少并行性的代码或具有大量分支或同步的代码.

编程模型的主要区别是什么?

GPU不支持中断和异常.对我来说这是最大的区别.除此之外,CUDA与C没有什么不同.您可以编写一个CUDA程序,将代码发送到GPU并在那里运行.您在CUDA中访问内存有点不同,但这又不是我们讨论的基础.

什么是关键的底层硬件差异,需要编程模型的任何差异?

我已经提到过了.最大的是GPU的SIMD特性,它要求代码以非常规的方式编写,没有分支和线程间通信.这是为什么,例如,CUDA限制代码中嵌套分支的数量的部分原因.

哪一个通常更容易使用,多少?

取决于您编码的内容以及您的目标.

易于矢量化的代码:CPU更容易编码但性能低下.GPU稍微难以编码,但却为降压提供了巨大的帮助.对于所有其他人来说,CPU更容易,而且性能通常也更好.

从长远来看,为GPU实现高级并行库是否切实可行,例如Microsoft的任务并行库或D的std.parallelism?

根据定义,任务并行性需要线程通信并且还具有分支.任务的想法是不同的线程做不同的事情.GPU设计用于执行相同操作的许多线程.我不会为GPU构建任务并行库.

如果GPU计算效率非常高,为什么CPU的设计更像GPU?

世界上很多问题都是曲折且不规则的.1000个例子.图形搜索算法,操作系统,Web浏览器等只是为了添加 - 甚至图形变得越来越像分支和通用目的,因为每一代GPU都将变得越来越像CPU.我并不是说它们会变得像CPU一样,但它们将变得更具可编程性.正确的型号介于功耗低的CPU和非常专用的GPU之间.


Jar*_*ing 24

即使在多核CPU中,您的工作单元也会比GPGPU上的工作单元大得多.GPGPU适用于扩展性非常好的问题,每个工作块都可以小得多.GPGPU具有更高的延迟,因为您必须先将数据移动到GPU的内存系统才能访问它.但是,一旦数据存在,如果问题可以适当扩展,那么GPGPU的吞吐量会更高.根据我的经验,GPGPU编程的问题是从正常内存到GPGPU的数据延迟.

此外,如果工作进程没有局部路由范围,GPGPU在跨工作进程进行通信时非常糟糕.如果你试图在整个GPGPU中进行通信,那么你将会遇到很多痛苦.因此,标准MPI库不适合GPGPU编程.

所有计算机都不像GPU那样设计,因为GPU在高延迟,高吞吐量计算方面非常出色,这些计算本质上是并行的,并且可以轻松分解.CPU所做的大部分内容并非本质上并行,并且不能非常有效地扩展到成千上万的同时工作者.幸运的是,图形编程确实如此,这就是为什么所有这一切都始于GPU.人们越来越多地发现他们可能看起来像图形问题的问题,这导致了GPGPU编程的兴起.但是,如果适合您的问题域,GPGPU编程真的值得您花时间.