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)