2017-04-03 21 views
0

我不知道是否可以設置每個部分的線程數在OpenMP並行區域,即:在openmp中設置每個節的線程數?

real*8  :: x 
real*4  :: y 
integer*8 :: ii 
integer*4 ** jj 
x = 0.0d0 
y = 0.0 
!$OMP PARALLEL 
!$OMP SECTIONS 
!$OMP SECTION NUM_THREADS(3) 
do ii=1,100000000000 
    x=x+(cos(sin(tan(ii*1.0d0)))**(x/ii) 
end do 
!$OMP SECTION NUM_THREADS(1) 
do jj=1,10000 
    x=x+exp(jj*0.001) 
end do 
!$OMP END SECTIONS 
!$OMP END PARALLEL 

此代碼不能與ifort 16.0的工作,但我只是不知道是否有別的一個可以做..?

編輯:當我嘗試設置每節的線程數時,出現錯誤(編譯期間)...我想爲每節指定不同數量的線程。

編輯2:錯誤消息= 2×

錯誤#5082:語法錯誤,實測 'NUM_THREADS' 期待的 「< 」END-OF-STATEMENT「>」 一個時;

在兩個!OMP SECTION NUM_THREADS(i)聲明

赦免倉促令狀..

+0

這是什麼意思*「這段代碼不起作用」*?它什麼也沒說。錯誤的結果?他們看起來像什麼?他們爲什麼錯了?一些錯誤消息?他們看起來像什麼?你的編譯命令是怎樣的?它與標題有什麼共同之處(設置線程數量)? –

+0

@Vladimir F - 感謝您的快速回復 - 我希望我的編輯更清晰 –

+0

這段代碼試圖做什麼?它在'x'上具有競爭條件,而「章節」的要點是並行執行這兩個部分,這看起來也是錯誤的。你不是隻想要一個並行的,那麼兩個omp for循環每個都有一個還原子句? (雖然第一個循環有一個循環依賴,所以不容易並行化!) –

回答

0

現在你已經告訴我們,我們需要知道這是再明顯的問題是什麼什麼...

... num_threads子句僅適用於parallel指令。

不可能以簡單明瞭的方式將m中的n線程分配給一個部分,而將其餘n-m線程分配給另一部分。你可能會一起破解一些東西來達到這個效果,但是它會違背OpenMP編程的五穀。

0

你要做的是違背OpenMP的哲學,你不應該完全控制線程。但是,您可以使用黑客技術:OpenMP和pthread的組合。也就是說,包含pthread語句的OMP PARALLEL塊(pthread將使您完全控制將在OMP塊中使用哪些線程)。過去,我正在試驗這個,儘管我沒有嘗試完成你想要做的事情,但我設法得到了一些有趣的結果,證明OpenMP + pthread組合是可能的。此外,一些編譯器(如gfortran)在後臺通過pthreads實現OpenMP。

當然,您需要爲您將使用的pthread語句編寫Fortran綁定,但這不是什麼問題。真正的問題是,這種方法根據定義存在問題。它混合了兩種截然不同的並行模型,它是一種破解,所以你是獨立的。在嚴肅的應用程序中,我不會這麼做,但是,如果有足夠的反覆試驗,這是一種做你正在嘗試做的事情的方法。

+0

它不一定非要那麼複雜。嵌套的OpenMP更容易。 –

相關問題