2012-06-07 51 views
0

第一篇文章!openmp創建隨機數的線程

主要編輯..

我有了這個程序計算的點積,使用gcc與-fopenmp編譯。問題是,它沒有創建我告訴它創建的線程數。在一臺計算機上,它會不斷產生2個線程,在另一臺計算機上。這兩個數字都不是賦予它們的數字。我正在使用(靜態,塊大小)調度,這是一種間接方式,可以通過更改塊大小來選擇要創建的線程數。我覺得運行時有些東西會覆蓋我的指令,因爲所有的計算機都使用相同的可執行文件。我也注意到,如果我給程序一個與總負載相等的塊大小,它將使用一個線程,但仍然產生與之前相同的線程數。我究竟做錯了什麼?

#pragma omp parallel shared(vector1, vector2, loadsize, vectorsize, final_sum) private(i, threadsum, threadid) 
    { 
    threadsum = 0; 
    threadid = omp_get_thread_num(); 

    #pragma omp for schedule(static, loadsize) 
     for (i = 0; i < vectorsize; i++){ 
      threadsum += vector1[i] * vector2[i];} 
    printf("thread %d reached up to index %d with a sum of %d\n", threadid, (i-1), threadsum); 
    #pragma omp critical 
     final_sum += threadsum; 
} 
printf("final sum: %d", final_sum);  

感謝,

扎克

回答

1

據我所知,CHUNKSIZE表示到線程執行的工作量。它從不控制線程的產生。你可以從你的代碼中看到,該線程催生當你調用

#pragma omp parallel 

不是當你調用

#pragma omp for schedule(static, loadsize) 

靜態和動態調度時,用來確定分配給線程的工作量,無論是在編譯時間還是運行時間。所以,不要將調度與線程數混淆。

如果你需要控制線程的數量,使用

omp_set_num_threads() 
+0

謝謝,它似乎對它創建的線程數有一個默認限制。我用omp_get_max_threads()檢查了它們,發現我僅限於2個線程。 – zedjay72

0

OpenMP擁有稱爲線程的動態數量特徵。運行時間可以自由決定並行塊是否可以使用比OMP_NUM_THREADS指定的線程更少的線程執行。一些運行時有它在默認情況下啓用,如果是,則可以通過以下方式之一被禁用:

  • OMP_DYNAMIC環境變量的值設置爲FALSE;
  • 致電omp_set_dynamic(0);
  • 使用num_treads(#threads)子句明確指定給定並行區域中的線程數。

omp_set_num_threads()以及環境變量設置OMP_NUM_THREADS將要使用的線程數的上限值的值,但實際數量可能仍然是小於,如果動態線程被啓用。默認值OMP_NUM_THREADS取決於實現:它等於GCC和Intel編譯器的邏輯CPU數量,等於最新的Oracle Studio編譯器的2