用于图像处理的高性能计算框架

框架介绍
GPUNPPNVIDIA Performance Primitives,NVIDIA公司针对GPU开发了的GPU加速的图像、视频、信号处理库,在安装完CUDA环境时会自动安装。通过调用NPP函数,可以免去手写CUDA内核函数,快速完成开发。
CUDACompute Unified Device Architecture: NVIDIA开发的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力,可大幅提升计算性能。需要首先了解它的开发语言CUDA C,然后进行开发。
CPUIPP

 Integrated Performance Primitives,Intel 提供的高性能多媒体函数库,包含许多从底层优化的函数,涵盖包括图像处理在内的多种应用,其接口形式与NPP库类似。对于图像处理,IPP提供的库函数介绍参考博客。

TBBThreading Building Blocks,Intel开发的用于并行编程的基于C++语言的框架,它是一套C++模板库。它提供了大量特性,具有比线程更高程度的抽象,主要用于多核CPU平台下的多线程处理加速。

总结如下:

1)NPP和IPP都是提供的封装好的库函数,主要提供通用算法。比如说图像处理中的滤波、色彩空间转换等。NPP用于GPU平台的并行加速,IPP用于CPU平台的多线程并行加速。

2)CUDA和TBB分别是GPU和CPU平台下的并行开发框架。典型地,对于图像处理中的for循环(逐像素)处理,CUDA可以通过编写内核函数完成多CUDA核的并行加速,而TBB则可以通过其特定接口完成多CPU的并行处理加速。

3)作者在开发的过程中,首先使用OpenMP进行CPU平台的图像处理加速,但是发现CPU占用率过高,并且处理速度没有提升。后续改用TBB进行开发,实现了预期目标。IPP和TBB都可以从Intel的官网下载,见这里。

最后提供一下作者使用TBB加速的关键代码段,主要完成的是彩色图像的色彩校正,在Xeon E3-1230 v2平台(4核心8线程)上,算法执行速度提升明显。代码如下:

//彩色图像色彩校正
void ColorCorrect8UC3(Mat source, Mat& dst, int nR, int nG, int nB)
{dst = source.clone();if ((nR == 100) && (nG == 100) && (nB == 100))return;Mat src = source.clone();if (nR < 0)nR = 0;if (nR > 100)nR = 100;if (nG < 0)nG = 0;if (nG > 100)nG = 100;if (nB < 0)nB = 0;if (nB > 100)nB = 100;int width = src.cols;int height = src.rows;unsigned char* pSrc = src.ptr();unsigned char* pDst = dst.ptr();//parallel_for配合blocked_range2d会对图像处理有很大的帮助//blocked_range2d的参数说明://(y起始值,y结束值,y步进值,x起始值,x结束值,x步进值)tbb::parallel_for(tbb::blocked_range2d(0, height, 1, 0, width, 1),[&](const tbb::blocked_range2d& r){for (int i = r.rows().begin(); i < r.rows().end(); ++i) {for (int j = r.cols().begin(); j < r.cols().end(); ++j) {pDst[i*width * 3 + j * 3 + 2] = (unsigned char)(pSrc[i*width * 3 + j * 3 + 2] * nR / 100.0);pDst[i*width * 3 + j * 3 + 1] = (unsigned char)(pSrc[i*width * 3 + j * 3 + 1] * nG / 100.0);pDst[i*width * 3 + j * 3 + 0] = (unsigned char)(pSrc[i*width * 3 + j * 3 + 0] * nB / 100.0);}}});
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部