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

框架    介绍
GPU    NPP    NVIDIA Performance Primitives,NVIDIA公司针对GPU开发了的GPU加速的图像、视频、信号处理库,在安装完CUDA环境时会自动安装。通过调用NPP函数,可以免去手写CUDA内核函数,快速完成开发。
CUDA    Compute Unified Device Architecture: NVIDIA开发的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力,可大幅提升计算性能。需要首先了解它的开发语言CUDA C,然后进行开发。
CPU    IPP    
 Integrated Performance Primitives,Intel 提供的高性能多媒体函数库,包含许多从底层优化的函数,涵盖包括图像处理在内的多种应用,其接口形式与NPP库类似。对于图像处理,IPP提供的库函数介绍参考博客。

TBB    Threading 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);
            }
        }
    });
}
————————————————
版权声明:本文为CSDN博主「zhoukehu91」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhoukehu_CSDN/article/details/125077112

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值