我的电脑是4核的,用常规的方法写出来的程序只能用到一个核,在处理数据时感觉等待的时间有点长,于是就想学点并行计算的工具来充分利用资源,加快程序的执行时间。关于并行计算的工具,网上有很多介绍,就不详细描述了。但是我想说明一点的是,之所以选择openMP是因为足够简单,只需要几行简单的代码,就可以让你的代码在多个核中并行运行了。
学习资源
学习一个新东西,最重要的是找到合适的学习资源,下面是我找的一些比较好的资源,可以按如下顺序依次学习。
Getting Started with OpenMP 这个是intel出的一个简单的介绍和教程,总共有三节,看完了自己动手写写代码,就能掌握到常用的方法了。
OpenMP 跟上面一个相比,这个还会包括一些使用方法的说明,查看起来更方面一些吧。我比较喜欢这个教程。另外还有一本中文的教材也可以看看,叫MPI与OpenMP并行程序设计,直接看第十七章就可以了。
教学视频 Introduction to OpenMP 这个是Youtube上的一个教学视频系列,每个小视频五到十分钟,总共22个视频,看看视频,思考一下出的题目,也会很有收获的。这个视频系列有一个pdf文档可以参考看。文档下载请点这里
OpenMP in Visual C++ 这个是微软针对visual studio写的,叫你怎么在vs中写c++代码时使用opencv,因为我就是使用c++代码,所以这个正合我意。不过这个没有什么例子,倒像是字典式的介绍,你可以用来查询。
并行计算
首先,需要说明的是,OpenMP(Multi Processor)是针对单机多核的,多个核之间共享内存。因为是共享内存,所以在使用的时候需要注意一些问题,下面会再详细说。
来说说并行计算的概念,顾名思义,并行计算就是让程序在多个核之间并行运行,如上图所示,主线程中程序顺序执行,到了并行区,就分为多个线程,多线程结束后又恢复到一个线程顺序执行。之所以会在单线程和多线程之间来回变,是因为不是所有的代码都能够并行的,因为数据之间有一些强耦合关系,只能顺序执行。但是,我们的程序中经常会出现一些可以并行执行的代码,比如大多数for循环,只要能把这部分并行就能对程序提速很多了,下面的例子就主要以for循环为例来说明,讲解一些常用的并行手段。
OpenMP使用示例
说了这么多,可以开始来学习怎么使用OpenMP了,在vs中编写c++程序时,在 project property 中的 C/C++ 下的Language中,Open MP Support 选择为支持就行了,然后在程序中只需要把OpenMP的头文件include进来,就可以使用了,同时因为OpenMP是在编译预处理阶段处理的,如果你的电脑是单核那么就会按照单线程运行,所以程序有很强的移植性,真的很方面有木有^_^
不过需要强调的时,使用Debug模式和Release模式时都要选择支持OpenMP哦。不然你会发现程序怪怪的,不要问我是怎么知道的。
OpenMp Demo1
#include <stdio.h>
#include <omp.h>
int main(int argc, char** argv)
{
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < 100; ++i){
//return the thread ID
int pro_id = omp_get_thread_num();
printf_s("thread %d : %d\n", pro_id, i);
}
}
return