英特尔的Integrated Performance Primitives (IPP)库有一个名为Deferred Mode Image Processing (DMIP)的功能。它允许您指定一系列函数,组合函数,并通过缓存友好的平铺处理将组合函数应用于数组。这比为每个函数天真地遍历整个数组提供了更好的性能。
似乎这种技术也有利于在GPU上运行的代码。有许多GPU库可用,例如NVIDIA Performance Primitives (NPP),但似乎都没有像DMIP这样的功能。我错过了什么吗?或者有没有理由认为GPU库不会从自动化功能组合中受益?
答案 0 :(得分:1)
GPU编程与CPU上的DMIP功能组合具有相似的概念。 虽然在GPU上“自动化”并不容易(某些第三方lib可能会这样做),但手动执行它比CPU编程更容易(参见下面的Thrust示例)。
DMIP的两个主要特征:
在大图像上应用一系列基本操作时, 功能1省略了基本操作之间的RAM读/写。所有读/写都在缓存中完成,功能2可以使用多核CPU。
GPGPU的DMIP功能1的类似概念是内核融合。可以将一个内核中的基本操作组合在一起,以避免多个GPU全局内存读/写,而不是将基本操作的多个内核应用于图像数据。
使用Thrust的手动内核融合示例可以在this slides的第26页找到。
似乎库ArrayFire在自动内核融合方面做出了显着的努力。
GPGPU的DMIP功能2的类似概念是并发内核执行。 此功能扩大了带宽要求,但大多数GPGPU程序已经受带宽限制。因此,并发内核执行不太可能经常使用。
CPU缓存省略了DMIP中的RAM读/写,而对于GPGPU的融合内核,寄存器执行相同的操作。由于DMIP中的CPU线程处理小图像片段,但GPGPU的线程通常只处理一个像素。一些寄存器足够大,可以缓冲GPU线程的数据。
对于图像处理,当结果像素取决于周围像素时,通常使用GPGPU共享内存/缓存。图像平滑/过滤是需要GPGPU共享内存/缓存的典型示例。