在c++中加速图像过滤

Speed up image filter in C++

本文关键字:图像 过滤 加速 c++      更新时间:2023-10-16

我用c++写了一个图像过滤器。它取256行32bpp位图中的每个像素(将像素存储在一行接一行的连续数组中),在5x5区域内对相邻像素执行操作,并产生4个输出像素,使图像的分辨率达到原始图像的2倍。这些都在CPU上完成。

过滤器没有像我想的那么快。我需要它持续运行在16毫秒以下。我是否可以使用多线程来加速它,或者开销是否不一致,并且可能总共花费超过16毫秒的时间?还有其他方法可以加快速度吗?

如果多线程可以加速,那么实现越具体越好。任何代码示例将非常感激!

听起来你的问题是"琐碎的并行",所以多线程绝对可以帮助接近线性的改进。这是一个经典的数据细分问题。您可以将图像细分为N个区域(N = #您想要的线程)。每个区域将需要类似于(尺寸/N+4)像素的图像(每个区域将有一些重叠的像素,"鬼细胞",以适应您正在应用的5x5内核)。然后,所有线程写入公共"输出"区域的特定区域。由于线程的输出区域不重叠,因此不需要任何互斥锁或锁。

例如,如果你有一个256x256的图像,你使用4个线程:

  • 每个线程获得(256/4 + 4)= 68像素的条带。它们有自己独特的64像素区域,每边有2个额外的像素。它们在中心的64像素区域进行计算(外部像素仅用于5x5卷积内核)
  • 或者,每个线程获得一个132x132块(每边128x128 + 4),并做相同的。

这是一种经典的MPI细分技术,但在许多其他库中也很容易实现。

手头的任务显然是高度可并行的-这意味着多线程将有助于。一般的思路是:

  1. 为目标图像分配(连续)内存,考虑适当的间距/填充(如果需要)
  2. 计算你有多少cpu可用
  3. 将图像区域拆分为n区域-行,列或矩形区域
  4. 生成n并行工作线程,每个线程拾取一块工作
  5. 如果你为这些线程设置亲和性掩码,这样它们每次活动时都在同一个核心上执行,这肯定会有帮助