2011-03-10 21 views
0

我在Ubuntu 10.04,gcc版本4.4.3。我正在編譯c + +代碼omp.h和g ++參數-fopenmp。大多數情況下,一切都按預期工作。我有超線程四核,所以幾乎8核心。openmp隨機使用只有一個核心

隨機地,當我運行我的軟件(並觀看系統監視器)時,所有8個核心的低音達到100%,粉絲開始踢球,這一切都很划算。在半秒鐘內,所有核心都停止運行,其中一個仍在運行。

此時如果我取消我的程序(只是簡單地按Ctrl + C)並重新啓動它 - 它按預期工作,所有核心保持100%的工作。

下面是在箱子代碼片段是有用:

28 #include <time.h> 
29 #include <omp.h> 
30 #include <string> 
... 
713 #ifdef _OPENMP 
714   if(omp_get_dynamic()) 
715     omp_set_dynamic(1); 
716 #endif 
717 
718 #pragma omp parallel 
719   { 
720 #pragma omp for schedule(dynamic) private(node) 
721     for (int c = 0; c < buffer->GetCount(); c++) { 
... initialize objects pointers etc 
724 #pragma omp critical(BUFFER_LOOKUP) 
725       { 
... perform chunk of code that is a choke 
734       } 
+1

看看這個http://www.viva64.com/en/a/0054/ openmp疑難解答指南 – 2011-03-10 19:55:00

回答

1

從調度omp_set_dynamic(n)的maual頁: Ñ...指示的值。如果線程在隨後的並行區域中可用的數可以由運行時調整。如果非零,運行時可以調整線程數(如果爲零),則運行時不會動態調整線程數

嘗試使用#pragma omp parallel num_threads(n)設置所需的線程數omp_set_dynamyc。

+0

好問題。你爲什麼要做omp_set_dynamic(1)? – ejd 2011-03-11 02:00:57

+0

因爲我不知道*先驗*我會有多少個。我希望它在任何計算機上運行所有可用內核 – Mikhail 2011-03-11 02:28:13

+0

然後,您將其設置不正確。您應該檢查omp_get_dynamic是否爲「true」,如果是,則執行omp_set_dynamic(0) - 即將其設置爲「false」。你上面的例子說,如果它是「真」,那麼將它設置爲「真」。除非您知道將要設置的內容,否則您不希望運行時設置它。 – ejd 2011-03-11 03:29:34

相關問題