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