OpenMP(Open Muti-Processing)
OpenMP缺点:
1:作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合;
2:另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。
关于openMP实现 临界区 与互斥锁 可参考 reference3
windows系统下使用
==========================WINDOWS系统中使用==========================
基本使用:
在visual C++2010中使用OpenMP
1:将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp);
2:在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h;
3:在要并行化的for循环前面加上 #pragma omp parallel for
如下简单例子:
//未使用OpenMP
#include <stdio.h>
#include <stdlib.h>
void Test(int n) {
for(int i = 0; i < 10000; ++i)
{
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[])
{
for(int i = 0; i < 16; ++i)
Test(i);
system("pause");
}
结果为:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,
//使用OpenMP
<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
void Test(int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[])
{
#pragma omp parallel for
for(int i = 0; i < 16; ++i)
Test(i);
system("pause");
}
(我的笔记本为2核 4线程)
显示结果为:
0,12,4,8,1,13,5,9,2,14,6,10,3,15,7,11,
OpenMP将循环0-15拆分成0-3,4-7,8-11,12-15四个部分来执行。
当编译器发现#pragma omp parallel for后,自动将下面的for循环分成N份,(N为电脑CP