2013-03-18 49 views
3

性能方面,以下哪項更高效?OpenMP性能影響:私有指令與聲明構造內部的變量

分配在主螺紋和複製值到所有線程:

int i = 0; 
#pragma omp parallel for firstprivate(i) 
for(; i < n; i++){ 
    ... 
} 

聲明和在每個線程

#pragma omp parallel for 
for(int i = 0; i < n; i++){ 
    ... 
} 

聲明在主線程變量分配可變的,但在分配給它每個線程。

int i; 
#pragma omp parallel for private(i) 
for(i = 0; i < n; i++){ 
    ... 
} 

這似乎是一個愚蠢的問題和/或性能影響可能可以忽略不計。但是我並行化了一個執行少量計算並被調用了很多次的循環,所以我可以從這個循環中排除任何優化都是有幫助的。

我正在尋找更低層次的解釋以及OpenMP如何處理此問題。

例如,如果並行了大量的線程我假設第二個執行效率會比較高,因爲初始化使用xor變量大於變量複製到所有的線程高效得多

+0

您是否嘗試過測量它,還是您要求我們爲您做這件事? – paddy 2013-03-18 01:23:23

+0

我沒有測量它,但我沒有在數字上尋求答案,我尋求更低層次的答案。 – 2013-03-18 01:27:39

+0

這個問題會更有趣,如果你有*試圖測量它,然後要求解釋結果。 – paddy 2013-03-18 01:29:04

回答

4

沒有在你提交的3個版本中,它們之間的性能差異很大,因爲它們中的每一個都使用#pragma omp parallel for。因此,OpenMP將自動將每個迭代分配給不同的線程。因此,變量i將變爲每個線程的私有,並且每個線程將具有用於迭代的不同範圍來處理。變量'i'自動設置爲私有,以避免更新此變量時的競爭條件。因爲變量'i'將在並行上是私有的,所以不需要將私有(i)置於#pragma omp parallel for上。

儘管如此,你的第一個版本將產生自OpenMP的錯誤期待環路正下方的#pragma omp parallel for具有以下格式:

for(init-expr; test-expr;incr-expr)

序預先計算的工作範圍內。

for指令對所有 關聯的for-loops的結構施加限制。具體而言,所有相關聯的for循環必須 具有以下規範形式:

爲(INIT-EXPR;測試EXPR; INCR表達式)結構化塊(OpenMP Application Program Interface PAG 39/40。)

編輯:我測試了你的最後兩個版本,並檢查了生成的程序集。兩個版本都生成相同的程序集,如您所見 - >version 2version 3

+1

默認的循環調度(即,當沒有指定'schedule'子句時)是依賴於實現的。大多數實現默認爲'static',這是最自然的,但這不是標準保證的。 – 2013-03-18 12:57:22

+0

@HristoIliev感謝您的評論,不知道。我將刪除該部分,以避免產生歧義。 – dreamcrash 2013-03-18 13:25:49