标签:指令 工作 区域 .com http tac 有一个 迭代 logs
承接前面两篇,这里直接逐一介绍和使用有关OpenMP的指令和函数
1、for
作用:for指令指定紧随其后的程序的循环的迭代必须由团队并行执行,只是假设已经建立了并行区域,否则它在单个处理器上串行执行。
格式:
1 #pragma omp for [clause ...] newline 2 schedule (type [,chunk]) 3 ordered 4 private (list) 5 firstprivate (list) 6 lastprivate (list) 7 shared (list) 8 reduction (operator:list) 9 collapse (n) 10 nowait for_loop
可以使用如下子句:
还可以通过Schedule子句(clause)设置for循环的并行化方法:(有关一种调度如何比其他调度更优化的讨论,请参阅http://openmp.org/forum/viewtopic.php?f=3&t=83)
nowait子句:如果指定,则线程在循环结束时不同步
ordered子句:指定必须像在串行程序中一样执行循环的迭代,可以对for的部分使用
collapse子句:指定嵌套循环中应将多少循环折叠到一个大的迭代空间中,并根据schedule子句进行划分 。折叠迭代空间中的迭代顺序被确定为顺序执行它们。可以改善表现。
其它的子句后面会做介绍
限制:
示例
1 #include <omp.h> 2 #define N 1000 3 #define CHUNKSIZE 100 4 5 main(int argc, char *argv[]) { 6 7 int i, chunk; 8 float a[N], b[N], c[N]; 9 10 /* Some initializations */ 11 for (i=0; i < N; i++) 12 a[i] = b[i] = i * 1.0; 13 chunk = CHUNKSIZE; 14 15 #pragma omp parallel shared(a,b,c,chunk) private(i) 16 { 17 18 #pragma omp for schedule(dynamic,chunk) nowait 19 for (i=0; i < N; i++) 20 c[i] = a[i] + b[i]; 21 22 } /* end of parallel region */ 23 24 }
2、section
作用:section是一种非迭代的工作共享结构,代码被划分成多个区域
格式:
1 #pragma omp sections [clause ...] newline 2 private (list) 3 firstprivate (list) 4 lastprivate (list) 5 reduction (operator: list) 6 nowait 7 { 8 9 #pragma omp section newline 10 11 structured_block 12 13 #pragma omp section newline 14 15 structured_block 16 17 }
注意:
示例
1 #include <omp.h> 2 #define N 1000 3 4 main(int argc, char *argv[]) { 5 6 int i; 7 float a[N], b[N], c[N], d[N]; 8 9 /* Some initializations */ 10 for (i=0; i < N; i++) { 11 a[i] = i * 1.5; 12 b[i] = i + 22.35; 13 } 14 15 #pragma omp parallel shared(a,b,c,d) private(i) 16 { 17 18 #pragma omp sections nowait 19 { 20 21 #pragma omp section 22 for (i=0; i < N; i++) 23 c[i] = a[i] + b[i]; 24 25 #pragma omp section 26 for (i=0; i < N; i++) 27 d[i] = a[i] * b[i]; 28 29 } /* end of sections */ 30 31 } /* end of parallel region */ 32 33 }
3、其它的不一一介绍了,请参阅:OpenMP
前面已经介绍了几个子句,这里主要介绍数据作用域子句。
1、private
作用:private子句将其列表中的变量声明为每个线程的私有变量
格式:
private (list)
要点:
2、shared
作用:shared子句声明其列表中的变量,以便在团队中的所有线程之间共享
格式:
shared (list)
要点:
3、reduction
作用:reduction子句对列表中的每个变量执行简化操作。为每个线程创建并初始化每个列表变量的私有副本。在缩减结束时,reduce变量应用于共享变量的所有私有副本,最终结果将写入全局共享变量。
格式:
1 reduction (operator: list)
示例:
并行循环的迭代将以相同大小的块分配给团队中的每个线程(SCHEDULE STATIC);
在并行循环结构的末尾,所有线程将添加其“result”值以更新主线程的全局副本;
1 #include <omp.h> 2 3 main(int argc, char *argv[]) { 4 5 int i, n, chunk; 6 float a[100], b[100], result; 7 8 /* Some initializations */ 9 n = 100; 10 chunk = 10; 11 result = 0.0; 12 for (i=0; i < n; i++) { 13 a[i] = i * 1.0; 14 b[i] = i * 2.0; 15 } 16 17 #pragma omp parallel for \ 18 default(shared) private(i) \ 19 schedule(static,chunk) \ 20 reduction(+:result) 21 22 for (i=0; i < n; i++) 23 result = result + (a[i] * b[i]); 24 25 printf("Final result= %f\n",result); 26 27 }
4、其它还有很多,省略
例如:
1 #include <omp.h> 2 int omp_get_num_threads(void)
详细的函数介绍可见OpenMP入门教程(二)
1、OMP_NUM_THREADS:设置在运行期间最大的线程数
setenv OMP_NUM_THREADS 8
2、OMP_DYNAMIC:启用或禁用动态调整可用于执行并行区域的线程数。有效值为TRUE或FALSE
setenv OMP_DYNAMIC TRUE
3、OMP_PROC_BIND:启用或禁用绑定到处理器的线程。有效值为TRUE或FALSE。
setenv OMP_PROC_BIND TRUE
4、OMP_STACKSIZE:控制创建(非主)线程的堆栈大小
setenv OMP_STACKSIZE 2000500B setenv OMP_STACKSIZE“3000 k” setenv OMP_STACKSIZE 10M setenv OMP_STACKSIZE“10 M” setenv OMP_STACKSIZE“20 m” setenv OMP_STACKSIZE“1G” setenv OMP_STACKSIZE 20000
4、还有很多其它的,省略
注:前面的运行API也能做与环境变量一样的工作,同时使用环境变量和运行时 API 会出现什么情况?运行时 API 将获得更高的优先权。
注:这是一个简单的OpenMP的练习网站:https://computing.llnl.gov/tutorials/openMP/exercise.html
参考链接:https://computing.llnl.gov/tutorials/openMP/#Abstract
标签:指令 工作 区域 .com http tac 有一个 迭代 logs
原文地址:https://www.cnblogs.com/lfri/p/10117193.html