2015-11-28 23 views
0

默認情況下,循環變量是私有的。假設我們有一個線程這個循環頭:循環開始執行由OpenMP中的調度程序處理循環變量

#pragma omp parallel num_threads(4) 
{ 
    #pragma omp parallel for schedule(static,1) 
    for(i=0; i<40; i+=2) { 
    //... 
    } 
} 

之前,靜態調度可能會分配迭代如下:

主題1:迭代0,4,8, 12,16

線程2:迭代1,5,9,13,17

線程3:迭代2,6,10,14,18

線程4:迭代3,6,12,15,19

我不理解線程3是如何知道的i在其第三次迭代的正確值(如果循環順序執行,這將是第10次迭代)。 i是私人的,所以每個線程都有自己的副本並增加i。同樣,i的值必須以某種方式共享。這個怎麼用?

+0

[你見過?](https://msdn.microsoft.com/en-us/library/x5aw0hdf.aspx) – Kenney

回答

1

長話短說,OpenMP編譯器將爲該循環生成一個函數,該函數將由多個線程並行調用。

的循環迭代將是歸一化的和界限將要改寫爲是對thread_idthread_num參數:

// code generated for #pragma omp for 
void openmp_loop_0(int thread_id, int thread_num, ... closure ...) { 
    for(i=thread_id; i<40/2; i+=thread_num) { 
     ...a[i*2]... 
    } 
} 

// code replaced in the main() function 
thread t0(openmp_loop_0(0, 4, ...).start(); 
thread t1(openmp_loop_0(1, 4, ...).start(); 
... 
openmp_loop_0(3, 4, ...) 
t0.join(), t1.join(), t2.join(); 

例如線程將執行以下迭代:

tid #0: 0, 4, 8... 
tid #1: 1, 5, 9... 
tid #2: 2, 6, 10... 
tid #3: 3, 7, 11... 

這是實現OpenMP的天真,簡單的方法,它應該給你的整個機械是如何工作的想法。

+0

謝謝。如果'i'隨機增加會發生什麼? – null

+0

你可以對循環體內的循環迭代器做些什麼有限制。編譯器只會告訴你,該循環無法並行化。 – simpel01

+0

不應該每個線程都用不同的參數而不是其他函數調用'openmp_loop_0'嗎? – null