: .
}
int main(int argc, char* argv[])
{
clock_t t1 = clock();
#pragma omp parallel for
for ( int j = 0; j < 2; j++ ){
test();
}
clock_t t2 = clock();
printf("Total time = %d\n", t2‐t1);
test();
return 0;
}
在 test()函数中,执行了 1 亿次循环,主要是用来执行一个长时间的操作。
在 main()函数里,先在一个循环里调用 test()函数,只循环 2 次,我们还是看一下在双核
CPU 上的运行结果吧:
Time = 297
Time = 297
Total time = 297
Time = 297
可以看到在 for 循环里的两次 test()函数调用都花费了 297ms, 但是打印出的总时间却只花
费了 297ms,后面那个单独执行的 test()函数花费的时间也是 297ms,可见使用并行计算后
效率提高了整整一倍。OpenMP 并行程序设计(二)
1、fork/join 并行执行模式的概念
OpenMP 是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计
使用的。
前面一篇文章中已经试用了 OpenMP 的一个 Parallel for 指令。从上篇文章中我们也可以发现
OpenMP 并行执行的程序要全部结束后才能执行后面的非并行部分的代码。这就是标准的并
行模式 fork/join 式并行模式,共享存储式并行程序就是使用 fork/join 式并行的。
标准并行模式执行代码的基本思想是,程序开始时只有一个主线程,程序中的串行部分都由
主线程执行,并行的部分是通过派生其他线程来执行,但是如果并行部分没有结束时是不会
执行串行部分的,如上一篇文章中的以下代码:
int main(int argc, char* argv[])
{
clock_t t1 = clock();
#pragma omp parallel for
for ( int j = 0; j < 2; j++ ){
test();
}
clock_t t2 = clock();
printf("Total time = %d\n", t2‐t1);
test();
return 0;
}
在没有执行完 for 循环中的代码之前,后面的 clock_t t2 = clock();这行代码是不会执行的,如
果和调用线程创建函数相比,它相当于先创建线程,并等待线程执行完,所以这种并行模式
中在主线程里创建的线程并没有和主线程并行运行。
2、OpenMP 指令和库函数介绍
下面来介绍 OpenMP 的基本指令和常用指令的用法,
在 C/C++中,OpenMP 指令使用的格式为
#pragma omp 指令 [子句[子句]…]
前面提到的 parallel for 就是一条指令,有些书中也将 OpenMP 的“指令”叫做“编译指导语
句”,后面的子句是可选的。例如:
#pragma omp parallel private(i, j)
parallel 就是指令, private 是子句
为叙述方便把包含#pragma 和 OpenMP 指令的一行叫做语句,如上面那行叫 parallel 语句。
OpenMP 的指令有以下一些:
parallel,用在一个代码段之前,表示这段代码将被多个线程并行执行for,用于
OpenMP编程指南 来自淘豆网m.daumloan.com转载请标明出处.