1. 程式人生 > >小白的OpenMP學習總結

小白的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嗎?

    2)這段程式碼的私有變數和公有變數

    3)程式總的執行流程如何

    4)私有變數、公有變數共用memory的具體細節

    5)openmp是資料並行還是任務並行

 

 

待更......