2014-06-19 181 views
1

爲什麼此程序將結果打印爲64而不是5000?如果計數變量正在關鍵部分中更新,我預計只有一個線程可以在任何給定的時間點訪問它。因此,每個線程將能夠增加計數,併產生結果5000,所以爲什麼我得到64而不是回答?使用omp_set_num_threads()更新線程的線程更新數量比預期的要少

#include <iostream> 
#include <omp.h> 
using namespace std; 

int main() 
{ 
    int count = 0; 
    omp_set_num_threads(5000); 
    #pragma omp parallel 
    { 
     #pragma omp critical 
     { 
      count++; 
     } 
    } 
    cout << "count = " << count << endl; 
    system("pause"); 
    return 0; 
} 

回答

5

正如Michael Dussere指出的那樣,您將得到64個答案,因爲您的實現只啓動64個線程。它可能會使用內部默認值來限制最大線程數(嘗試更改環境變量OMP_THREAD_LIMIT或調用omp_get_thread_limit()以查看是否如此)。

這種限制的原因是創建線程需要資源 - 每個線程必須擁有自己的堆棧空間,Linux上的進程表項等。這些並不是輕量級的無狀態Erlang線程,它們在用戶空間中進行調度。在我使用gcc或icpc的8核系統上,由於資源不足,將線程號設置爲1024或更高的任何值都會失敗,但設置系統參數可能會改變此限制。

在線程所需的資源和大多數單映像系統的核心數量顯着少於5000個這一事實之間,目前尚不清楚在大多數系統上使用5000個線程可以實現的功能。

+0

Jonathan Dursi,那我應該怎麼添加兩個5000個元素的數組呢? 64個線程如何執行SIMD添加5000個元素? –

+0

@ user3670482,只需使用'omp parallel for',不用擔心線程的數量;分解將爲你完成,每個線程將處理多個項目。這是OpenMP中的常用方法 - 這不是CUDA,或者甚至是SIMD(它現在可以在4.0中通過OpenMP調用,但是是獨立的) - 它是通常的粗粒度並行性,甚至是性能所必需的,用於處理多個項目的線程。 –

2

您可以使用omp_set_num_threads設置的值不是無限制的。 這取決於您使用的OpemMP實現,您計算機的核心數量等。

因爲當前線程組中應該有64個線程,所以得到64。您可以使用omp_get_num_threads進行檢查。