码迷,mamicode.com
首页 > 其他好文 > 详细

多核加速处理图像

时间:2014-08-02 15:07:13      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   os   io   for   art   

现在计算机的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"); }

 

多核加速处理图像,布布扣,bubuko.com

多核加速处理图像

标签:style   blog   color   使用   os   io   for   art   

原文地址:http://www.cnblogs.com/tiandsp/p/3886834.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!