小白的OpenMP學習總結
阿新 • • 發佈:2018-11-19
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嗎?
2)這段程式碼的私有變數和公有變數
3)程式總的執行流程如何
4)私有變數、公有變數共用memory的具體細節
5)openmp是資料並行還是任務並行
待更......