2015-04-29 57 views
1

我使用下面的命令在程序的可用線程並行化一個循環:的OpenMP指定的線程數循環迭代

#pragma omp parallel for num_threads(threads) 
for(long i = 0; i < threads; i++) 
{ 
    array[i] = calculateStuff(i,...); 
} 

由於技術上的原因,我想保證線程編號0執行i=0,並且線程編號1執行i=1。換句話說,我總是想要i=omp_get_thread_num()。這可能嗎?

回答

4

嘗試

#pragma omp parallel for num_threads(threads) schedule(static,1) 

現在@Hristo伊利耶夫已經變成了我100%確信OpenMP標準需要靜態調度分配迭代0至線程0,1比1,

試試吧,讓我們知道你是如何得到的。

話又說回來

#pragma omp parallel for num_threads(threads) schedule(dynamic,1) 

應該工作過,因爲你只爲你的線程有儘可能多的迭代。可能的是,如果線程0在線程n開始之前完成其工作,則線程0將抓取迭代n

+0

我認爲你是對的。顯然openmp是默認的。我的程序中有一個錯誤,導致我看不到這個。謝謝。 –

+1

§2.7.1循環構造:當指定schedule(static,chunk_size)'時,迭代被分成 爲大小爲chunk_size的塊,並且將這些塊以循環方式分配給組中的線程按照線程號的順序。「即該標準確實需要它。 –

3

在這種特殊情況下使用循環會浪費資源。只需使用omp_get_thread_num()

#include <omp.h> 

#pragma omp parallel num_threads(threads) 
{ 
    int i = omp_get_thread_num(); 
    array[i] = calculateStuff(i,...); 
} 
+0

感謝您的提示。我會這樣做,但我不能選擇這個作爲正確的答案,因爲這不能回答這個問題。 –

+2

這不是一個答案,但更多的建議,以改善您的代碼。有時我希望Stack Overflow的評論在格式化方面可能會更精細些。 –

+0

同意! ------- –