OpenMP(Multi Processor)是针对单机多核的,多个核之间共享内存。因为是共享内存,所以在使用的时候需要注意一些问题。
并行计算就是让程序在多个核之间并行运行,如上图所示,主线程中程序顺序执行,到了并行区,就分为多个线程,多线程结束后又恢复到一个线程顺序执行。之所以会在单线程和多线程之间来回变,是因为不是所有的代码都能够并行的,因为数据之间有一些强耦合关系,只能顺序执行。但是,我们的程序中经常会出现一些可以并行执行的代码,比如大多数for循环,只要能把这部分并行就能对程序提速很多了。
如果报错提示为:C++/CLI、C++/CX 或 OpenMP 不支持两阶段名称查找;请使用 /Zc:twoPhase。将项目属性—C/C++—语言—符合模式,改为否即可。
上图代码中,#pragma omp parallel 语句告诉编译器下面的语句块是一个并行块,需要并行执行(同样语句会执行多次),然后在并行块中有一个for循环, #pragma omp for 告诉编译器要把下面的for循环拆开在多个处理器中并行执行,这个for循环要做的就是打印当前的线程ID号和循环变量 i,如果是单线程,那么就会按照从0到99的顺序打印,但当多线程执行时,也还是会输出0 - 99, 但是输出的顺序就会变乱。如下图所示
#pragma omp parallel 和 #pragma omp for 可以写在一起,#pragma omp parallel for(放在for循环的上方即可),调试结果和上图一样。
下面这个程序中,#pragma omp parallel 告诉了编译器有下面有一个并行块,然后每个线程都会把该并行块的程序执行一遍,结果就是执行了八遍(我电脑是八核)。并行块中的定义的变量和代码会是局部的,每个线程都会拷贝一份执行,然后并行块外面定义的变量将会在并行块中共享。我们并不是要for语句执行八次,而是要for语句拆开执行。