多核加速处理图像

现在计算机的cpu一般都是多核的,而很多程序都没有进行多核优化,这就没有办法充分利用cpu的性能了。

比如用vs2010中写一个while(1)循环,在旧电脑上cpu运行是占100%的,而在新的4核电脑上运行则只占25%,似乎没办法再高了。

很多地方说用openmp可以发挥多核处理的能力,不过我在程序中加入openmp的优化指令后还是没办法运行到100%,也许是我哪里弄错了。

因此,我这里没有使用openmp,而是使用多线程的方式来进行运算加速。

比如要处理10000*10000像素的图像,可以开四个线程,每一个线程分别处理2500*10000像素,这样速度就能提高4倍了。

而试验的效果也正好验证了上面所说的方法,提高的速度非常接近4倍。

当然,如果是8核或16核,开8或16个线程,基本上就能提高8倍或16倍了。

图像算法一般还是很容易写成并行的,我这里用了freeimage图像库,cpu是i5 4590。

处理10000*10000的图像,单线程用了3500ms左右,四线程用了900ms左右,基本上算提高4倍了。

程序也许可以开更多的线程,不过我还没有尝试。

代码如下,功能就是颜色取反:

#include <iostream>
#include <Windows.h>
#include <process.h>
#include <time.h>
#include "FreeImage.h"
using namespace std;
//就设成全局变量吧
FREE_IMAGE_FORMAT fif;
FIBITMAP *img;
FIBITMAP *re;int h;
int w;
int bpp;

void Init()
{
    string name="img.jpg";
    fif=FreeImage_GetFileType(name.c_str());
    img=FreeImage_Load(fif,name.c_str());
    h=FreeImage_GetHeight(img);
    w=FreeImage_GetWidth(img);
    bpp=FreeImage_GetBPP(img);
    re=FreeImage_Allocate(w,h,bpp);

}

void Calc(int ymin,int ymax)
{
    for (int y=ymin;y<ymax;y++)
    {
        for (int x=0;x<w;x++)
        {
            RGBQUAD color;
            FreeImage_GetPixelColor(img,x,y,&color);
            color.rgbBlue-=255;
            color.rgbGreen-=255;
            color.rgbRed-=255;
            FreeImage_SetPixelColor(re,x,y,&color);
        }
    }
}

void CalcAll()
{
    Calc(0,h);
}

//每个线程处理图像的1/4
void Calc1(PVOID param)
{
    Calc(0,int(h/4));
}

void Calc2(PVOID param)
{
    Calc(int(h/4),int(h/2));
}

void Calc3(PVOID param)
{
    Calc(int(h/2),int(3*h/4));
}

void Calc4(PVOID param)
{
    Calc(int(3*h/4),h);
}

void main()
{
    double start,end;
    HANDLE hThread[4];
    Init();

    start=clock();
        CalcAll();
    end=clock();
    cout<<end-start<<endl;

    start=clock();
        hThread[0]=(HANDLE)_beginthread(Calc1,0,NULL);
        hThread[1]=(HANDLE)_beginthread(Calc2,0,NULL);
        hThread[2]=(HANDLE)_beginthread(Calc3,0,NULL);
        hThread[3]=(HANDLE)_beginthread(Calc4,0,NULL);
        WaitForMultipleObjects(4,hThread,true,INFINITE);
    end=clock();
    cout<<end-start<<endl;

    FreeImage_Unload(img);
    FreeImage_Unload(re);

    system("pause");
}

多核加速处理图像

时间: 2024-11-08 23:35:35

多核加速处理图像的相关文章

(多核DSP快速入门)3.利用EMCV进行图像灰度转换的单核DSP程序

原创文章 转载请注册来源http://blog.csdn.net/tostq 教程目录:http://blog.csdn.net/tostq/article/details/51245979 在CCS中应用EMCV有两种方法: (1)通过导入EMCV静态库的方法 (2)直接将EMCV的源代码导入项目文件中,虽然EMCV的源文件是C++格式的,而C++基本兼容C,而项目文件一般是用C写的,所以还需要将.c文件改成.cpp就可以了. 一.在新建空项目后,导入静态链接库和相关头文件 (1)这里的头文件

随时更新———个人喜欢的关于模式识别、机器学习、推荐系统、图像特征、深度学习、数值计算、目标跟踪等方面个人主页及博客

目标检測.识别.分类.特征点的提取 David Lowe:Sift算法的发明者,天才. Rob Hess:sift的源代码OpenSift的作者,个人主页上有openSift的下载链接.Opencv中sift的实现.也是參考这个. Koen van de Sande:作者给出了sift,densesift,colorsift等等经常使用的特征点程序.输出格式见个人主页说明,当然这个特征点的算法,在Opencv中都有实现. Ivan Laptev:作者给出了物体检測等方面丰富C\C++源代码,及部

个人喜欢的关于模式识别、机器学习、推荐系统、图像特征等方面个人主页及博客 转

目标检测.识别.分类.特征点的提取 David Lowe:Sift算法的发明者,天才. Rob Hess:sift的源码OpenSift的作者,个人主页上有openSift的下载链接,Opencv中sift的实现,也是参考这个. Koen van de Sande:作者给出了sift,densesift,colorsift等等常用的特征点程序,输出格式见个人主页说明,当然这个特征点的算法,在Opencv中都有实现. Ivan Laptev:作者给出了物体检测等方面丰富C\C++源码,及部分训练好

CorAnimation7-高效绘图、图像IO以及图层性能

高效绘图 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必要的情况下,相比Core Animation和OpenGL,Core Graphics要慢了不少. 软件绘图不仅效率低,还会消耗可观的内存.CALayer只需要一些与自己相关的内存:只有它的寄宿图会消耗一定的内存空间.即使直接赋给contents属性一张图片,也不需要增加额外的照片存储大小.如果相同

基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理

基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 原文转自http://blog.csdn.net/wangpengqi/article/details/8115614 感谢wangpengqi的共享. 一.简单介绍 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然如今也有管脚全兼容的单核.本文要介绍的就是当中的一款低功耗处理器OMAP L138. OMAP L138包含一个主频300M的ARM9处理器内核和一个300M的C6748DSP内核

h.264并行解码算法2D-Wave实现(基于多核非共享内存系统)

在<Scalable Parallel Programming Applied to H.264/AVC Decoding>书中,作者基于双芯片18核的Cell BE系统实现了2D-Wave并行解码算法. Cell BE架构 首先来了解一下Cell BE.Cell BE全称为Cell Broadband Engine,是一种微处理器架构,Cell处理器由索尼.东芝.IBM共同研发,曾应用于PlayStation 3.Cell BE的架构如下图 一个Cell微处理器中共有9个核心,其中有1个PP

【转】【PNG压缩工具】PNG 图像的优化及压缩工具介绍

图像格式有许多种不同类型,在互联网上最常见的有JPEG.GIF.BMP.TIFF和PNG.每一种图像格式都有它自己的用途,比如GIF是用于动画的,JPEG是用于高清图片的,这种图片在保存或者调整大小后会自动降低其清晰度,而我们最喜爱的PNG最适合于小型且透明的图片.PNG文件的另一个巨大的优势是这些文件都是无损的,这就意味着你可以在不丢失清晰度的情况下对PNG文件进行压缩. 你在互联网上可以很容易地找到压缩PNG文件的工具,而且大多数,而不是全部都会由于采用不同的算法而生成不同大小的文件,除非这

基于OpenCL的图像积分图算法改进

复杂的算法却未必低效,简单的算法往往要付出代价,这个代价可能很大.在opencl环境下编程,与我们在CPU上的传统编程思想有一些差异,这些差异看似微不足道,但往往是细节决定成功,就是这些看似微不足道的差异,在多核的GPU上被无限放大,导致同一种算法在GPU和CPU运行效果有着巨大的差别. 之前写过一篇文章<基于OpenCL的图像积分图算法实现>介绍了opencl中积分图算法的基本原理(不了解积分图概念的朋友可以先参考这篇文章),并基于这个基本原理提供了kernel实现代码.但经过这两个月的实践

13 个免费的 PNG 图像的优化和压缩工具

图像格式有许多种不同类型,在互联网上最常见的有JPEG.GIF.BMP.TIFF和PNG.每一种图像格式都有它自己的用途,比如GIF是用于动画的,JPEG是用于高清图片的,这种图片在保存或者调整大小后会自动降低其清晰度,而我们最喜爱的PNG最适合于小型且透明的图片.PNG文件的另一个巨大的优势是这些文件都是无损的,这就意味着你可以在不丢失清晰度的情况下对PNG文件进行压缩. 你在互联网上可以很容易地找到压缩PNG文件的工具,而且大多数,而不是全部都会由于采用不同的算法而生成不同大小的文件,除非这