2017-07-09 65 views
2

運行我在C想我的第一個OpenMP程序++,我的代碼是:OpenMP的似乎不是在並行

#pragma omp parallel for num_threads(2) 
for (int i=0;i<16;++i) 
{ 
    printf("Thread %d works with idx %d\n", omp_get_thread_num(), i); 
} 

我使用g ++ -O3 -fopenmp -std =編譯C++ 11

然而,當我運行程序時,我得到:

Thread 0 works with idx 0 
Thread 0 works with idx 1 
Thread 0 works with idx 2 
Thread 0 works with idx 3 
Thread 0 works with idx 4 
Thread 0 works with idx 5 
Thread 0 works with idx 6 
Thread 0 works with idx 7 
Thread 1 works with idx 8 
Thread 1 works with idx 9 
Thread 1 works with idx 10 
Thread 1 works with idx 11 
Thread 1 works with idx 12 
Thread 1 works with idx 13 
Thread 1 works with idx 14 
Thread 1 works with idx 15 

它是否並行運行?我一直在等待thread0 - thread1 - thread0 - thread1之類的東西。

這裏會出現什麼問題?先謝謝你!

+0

難道我的回答可以幫助您? – dreamcrash

回答

3

是的,它並行運行。您可以看到正在打印的兩個不同線索的ID。

我一直在等待thread0 - thread1 - thread0 - thread1, 之類的東西。

由於您沒有定義並行循環的調度,因此默認情況下它會將循環迭代分成塊並將它們分配給線程。在你的情況下,thread 0的塊from 0 to 7thread 18 - 15的塊。

如果你想線程以循環的方式工作(一前一後另一個),你必須聲明靜態並行與塊= 1的調度,如:#pragma omp parallel for schedule (static,1)

#pragma omp parallel for schedule (static,1) num_threads(2) 
for (int i=0;i<16;++i) 
{ 
    printf("Thread %d works with idx %d\n", omp_get_thread_num(), i); 
} 

更多關於OPENMP環路靜態調度:

鴻溝環路分成相等大小的塊或儘可能相等的 情況下循環迭代的數量不整除 乘以塊的線程數尺寸。默認情況下,塊 的大小爲loop_count/number_of_threads.Set chunk設置爲1以交織 迭代。

來源:OpenMP* Loop Scheduling

+0

循環方式是否保持並行執行?謝謝 – RonTLV

+0

是的,來自編譯指示的「並行」告訴編譯器,你想要並行運行這段代碼,「for」告訴編譯器你想給每個線程從for循環中進行一些迭代。循環法只是告訴編譯器應該如何在線程之間分配for循環迭代。 – dreamcrash