gpgpu

GPGPU是一种新趋势,它在年轻的计算机科学家的脑海中引发了许多新问题。 在本文中,我将介绍有关此主题的一些常见问题解答。

哪些类型的问题更适合常规多核,哪些类型的问题更适合GPGPU?

GPU包含一些固定功能和可编程硬件。 当GPU趋向于越来越多的可编程单元时,当今的GPU执行一些常见的图形任务,例如纹理采样和使用专用硬件进行渲染。 相反,像素阴影是使用可编程SIMD内核完成的。 GPGPU工作负载主要在SIMD着色器内核上运行。

GPU是为非常规则的吞吐量工作负载而构建的,例如图形,密集矩阵矩阵乘法,简单的photoshop过滤器等。它们固有的设计可承受纹理采样的延迟(1000多次循环操作),因此擅长承受长时间延迟。 。 GPU内核具有许多线程:当一个线程触发长时间等待操作(例如,内存访问)时,该线程将进入睡眠状态(其他线程继续工作),直到长时间等待操作完成为止。 这使GPU可以使执行单元的工作量比传统内核多得多。

GPU之所以难以处理分支,是因为GPU喜欢将“线程”(如果不是nVidia,则为SIMD通道)批处理为翘曲并将它们一起发送到管道中,以节省指令获取/解码能力。 如果线程遇到分支,则它们可能会发散,例如8线程扭曲中的2个线程可以选择分支,而其他6个线程则不可以。 现在,经纱被分为大小为2和6的两个经纱。这些新形成的经纱将运行效率低下。 2线程扭曲将以25%的效率运行,而6线程扭曲将以75%的效率运行。 您可以想象,如果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?

世界上许多问题都是分支性的和不规则的。 数以千计的例子。 图表搜索算法,操作系统,Web浏览器等。补充一下,甚至图形也像每一代一样变得越来越分支和通用,因此GPU也将越来越像CPU。 我并不是说它们将变得像CPU,但它们将变得更具可编程性。 正确的模型位于低功耗CPU和非常专业的GPU之间。