OpenMP学习笔记

       程序员这份工作应该是不分旺季、淡季的,做项目能让人忙起来,学习新东西同样能让人忙起来。学习新东西应该是一条翻山越岭、没有尽头的旅程。因为除了很多现有的经典技术可以去学习外,每隔一段时间还会有新技术涌现,可以说只要想学东西,永远都学不完,所以在微博上看到了很多号称终身学习的人,忍不住让人观望一下。
       最近在搞图像保边平滑算法,但算法步骤多、计算量大,导致计算非常耗时,优化来优化去始终不理想。于是想看看并行计算相关资料,希望借助cpu多核优势,利用并行计算的方式降低算法执行时间。于是看了下OpenMP,这个比较简单、容易上手的多线程并行编程模型。对OpenMP的第一点认识就是她不是一种编程语言,她是一个编译器指令和库函数的集合,当然也可以看做是一个并行编程模型,除此之外还有MPI、IPP、TBB等并行编程模型。 OpenMP是基于派生/连接(fork/join)的编程模型,fork/join并行机制: 并行区前,串行命令派生出多条并行命令并行执行,执行到并行区末等待,等所有并行任务都结束,再转到串行执行。 如下图所示:
                                             OpenMP学习笔记_第1张图片
       OpenMP配置很简单,不需要下载什么sdk、添加什么环境变量,主流c/c++编译器,如gcc与visual c++,都内在支持OpenMP。如果你正在使用vs系列编辑器,比如vs2005,只需要右键工程 ->属性 ->配置属性 -> c/c++ -> 语言 ->OpenMP支持,选择 “是(/openmp)” 即可。工程设置完毕,在工程源文件内再包含 一下OpenMP头文件即可: #inculude 。至此即可在源文件内调用OpenMP库函数,或者在想并行计算的代码前使用OpenMP的指令了。不过本文就不介绍OpenMP的编程细节了,因为这方面的资料太多了。学习过程中我主要参考了这篇博客《OpenMP并行程序设计》, 后来有心的网友将其整理成pdf文档《OpenMP简易教程》,并重新做了排版,相较原文阅读起来更加舒服。另外附上学习中所参考的另一篇博客《五种主要多核并行编程方法分析与比较》。
       回头在说说我使用OpenMP对上面提到的保边平滑算法优化情况。实验过程发现,对于分辨率较高的图像,比如1920×1600的大图,使用for指令对for循环进行并行计算,优化效果较明显,算法计算时间降低了0.1秒,但对于800×600的中、小图,使用OpenMP反而更耗时,也就是在线程调度和管理上耗费了很多时间,得不偿失。静下心想想OpenMP毕竟还是软件线程级的并行计算,无非是将cpu多核利用更充分罢了,与CUDA这种使用图形硬件级并行计算还是有本质区别。程序优化之路漫而长啊!





你可能感兴趣的:(摘录,/,整理,/,随笔)