要在Visual C++2012 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2005 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。
而要将 for 循环并行化处理,该怎么做呢?非常简单,只要在前面加上一行
#pragma omp parallel for
就够了!
也可以实际用一段简单的程序,来弄清楚它的运作方式。
#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 < 10; ++i)
Test(i);
system("pause");
}
上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子:
#include <omp.h>//注释掉这个头文件也可以
#include <stdio.h>
#include <stdlib.h>
#include <time.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[]) {
clock_t t1=clock(); //开始时钟单位是毫秒
#pragma omp parallel for
for(int i = 0; i < 10; ++i)
Test( i );
clock_t t2=clock();//结束时钟
double d=(double)(t2-t1)/CLOCKS_PER_SEC;//转化为秒
cout<<d<<endl;
cout<<d<<endl;
system("pause");
}
够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了!
0, 5, 1, 6, 2, 7, 3, 8, 4, 9,
可以从结果很明显的发现,他没有照着0到9的顺序跑了!而上面的顺序怎么来的?其实很简单,OpenMP只是把回圈 0 - 9 共十个步骤,拆成 0 - 4, 5 - 9 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~