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

框架介绍
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<int>(0, height, 1, 0, width, 1),
		[&](const tbb::blocked_range2d<int>& 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);
			}
		}
	});
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值