小白的OpenMP阶段学习总结
1、进程与线程
- 到看书之前,一直都不清楚进程和线程的异同,上操作系统实验时遇到fork函数,不知道应该说子进程还是子线程。
- 后才知道,几个或一个线程被同一个进程派生(fork),每个线程有自己的栈和程序计数器。当一个线程完成了执行,就又合并(join)到启动它的进程中。
2、缺省作用域
我觉得是没有显式写出的变量的作用域吧。如OpenMP中有一个句子default(none),如果在pragma句子后面添加这句,就被要求明确写出所有变量的作用域。例如
#pragma omp parallel for num_threads(10) \ default(none) reduction(+:sum) private(k, factor) \ shared(n)
3、第一个OpenMP程序-曲边梯形面积
- 题面如下:
- 代码
#include <stdio.h> #include <stdlib.h> #include <omp.h> double f(double x); int main(){ double a=0, b=100, h, approx; int n=1e9; int i; //int thread_count; //thread_count = strtol(argv[1], NULL, 10); // 读入线程数 //printf("Enter a, b, and n\n"); //scanf("%lf %lf %d", &a, &b, &n); h=(b-a)*1.0/n; approx=(f(a)+f(b))/2.0; #pragma omp parallel for num_threads(24) reduction(+: approx) for (i=1; i<n; i++) approx += f(a+i*h); approx*=h; printf("approx=%.7f\n", approx); return 0; }
- 一些问题(solved & solving):
1)每个线程都会进入for循环,那,是会运行(线程数*n-1)遍for吗?
调度方案默认为static。例如:
# pragma omp parallel for num_threads(24)
for (i=0; i<12; i++){
printf("hello, my id is -> %d\n", omp_get_thread_num());
}
它的运行如下:
// 开四个线程
for (k: 0-3){ ... } for (k: 3-6){ ... } for (k: 6-9){ ... } for (k: 9-12){ ... }
2)这段代码的私有变量和公有变量
3)程序总的运行流程如何
4)私有变量、公有变量共用memory的具体细节
5)openmp是数据并行还是任务并行
待更......
#pragma omp parallel for num_threads(24) reduction(+:sum) privte(factor)