为什么GPU库不支持自动功能组合?

时间:2013-01-09 21:28:07

标签: gpgpu

英特尔的Integrated Performance Primitives (IPP)库有一个名为Deferred Mode Image Processing (DMIP)的功能。它允许您指定一系列函数,组合函数,并通过缓存友好的平铺处理将组合函数应用于数组。这比为每个函数天真地遍历整个数组提供了更好的性能。

似乎这种技术也有利于在GPU上运行的代码。有许多GPU库可用,例如NVIDIA Performance Primitives (NPP),但似乎都没有像DMIP这样的功能。我错过了什么吗?或者有没有理由认为GPU库不会从自动化功能组合中受益?

1 个答案:

答案 0 :(得分:1)

GPU编程与CPU上的DMIP功能组合具有相似的概念。 虽然在GPU上“自动化”并不容易(某些第三方lib可能会这样做),但手动执行它比CPU编程更容易(参见下面的Thrust示例)。

DMIP的两个主要特征:

  1. 通过图像片段进行处理,以便数据可以适合缓存;
  2. 并行处理到不同的片段或执行图的不同独立分支。
  3. 在大图像上应用一系列基本操作时, 功能1省略了基本操作之间的RAM读/写。所有读/写都在缓存中完成,功能2可以使用多核CPU。

    GPGPU的DMIP功能1的类似概念是内核融合。可以将一个内核中的基本操作组合在一起,以避免多个GPU全局内存读/写,而不是将基本操作的多个内核应用于图像数据。

    使用Thrust的手动内核融合示例可以在this slides的第26页找到。

    似乎库ArrayFire在自动内核融合方面做出了显着的努力。

    GPGPU的DMIP功能2的类似概念是并发内核执行。 此功能扩大了带宽要求,但大多数GPGPU程序已经受带宽限制。因此,并发内核执行不太可能经常使用。

    CPU缓存与GPGPU共享内存/缓存

    CPU缓存省略了DMIP中的RAM读/写,而对于GPGPU的融合内核,寄存器执行相同的操作。由于DMIP中的CPU线程处理小图像片段,但GPGPU的线程通常只处理一个像素。一些寄存器足够大,可以缓冲GPU线程的数据。

    对于图像处理,当结果像素取决于周围像素时,通常使用GPGPU共享内存/缓存。图像平滑/过滤是需要GPGPU共享内存/缓存的典型示例。