博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多核加速处理图像
阅读量:6982 次
发布时间:2019-06-27

本文共 1360 字,大约阅读时间需要 4 分钟。

现在计算机的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 
#include
#include
#include
#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

 后记:

我又测试了一下,电脑是可以使用openmp加速的,需要打开vs2010 openmp优化选项,然后把Calc()函数改成如下形式就行了:

void Calc(int ymin,int ymax){    RGBQUAD color;    #pragma omp parallel for schedule(dynamic, 1) private(color)       for (int y=ymin;y

速度比自己写的多线程还快。

后后记:

最后我还是建议用自己写的多线程,不建议使用openMP,因为使用openMP处理后图像会产生很多麻点,这是不可接受的,就像下面一样:

使用自己控制的多线程则不存在这样的问题。

转载地址:http://mktpl.baihongyu.com/

你可能感兴趣的文章
修改了系统时间后,myeclipse 和tomcat下的代码不同步了
查看>>
IDEA 一直不停的scanning files to index解决办法
查看>>
运维少年系列 python and cisco (1)
查看>>
c#时间转换
查看>>
调度器Quartz的简述与使用总结
查看>>
smokeping 安装
查看>>
Linux下安装oracle数据库步骤
查看>>
yum 不小心删除后安装
查看>>
vim 使用
查看>>
为敏感信息设置安全屏障
查看>>
进程与线程
查看>>
经典SQL
查看>>
维基百科:主流移动设备的屏幕参数
查看>>
使用CGContext画线操作小记
查看>>
mysql fabric安装使用测试
查看>>
java 对 mongoDB 分组统计操作 以及一些常用操作
查看>>
当你扛不住的时候就读读
查看>>
解决安装rrdtool遇到的一个问题
查看>>
linux启动过程
查看>>
QString与LPCWSTR互转
查看>>