2014-09-22 135 views
0

我有一個Fortran代碼。代碼包含兩個循環。我想並行只有內循環。這裏是我的代碼:openmp並行內部循環

!$OMP PARALLEL PRIVATE(i,j) 
do i=1, N 
    !$OMP PARALLEL DO 
    do j=1, M 
    ! do some calculations 
    end do 
    !$OMP END PARALLEL DO 
end do 
!$OMP END PARALLEL 

並行化是否正確?我不確定是否需要在開始處放置!$OMP PARALLEL PRIVATE(i,j)?我應該省略它並在第二次循環之前聲明PRIVATE(i)?無論如何,我有點困惑,請解釋什麼是正確的行爲。

回答

1

爲什麼i是私密的?所有線程都不需要嗎?它不能在整個內部循環期間改變(因爲它是外部循環的計數器)。如果聲明爲私有,則在並行部分的開始處未定義,除非使用firstprivate

Fortran中的OpenMP注意到j是並行化循環的循環計數器,因此它隱含地是私有的。所以沒有必要明確地聲明它。

接下來的事情是,你應該避免嵌套OpenMP的部分(即第二!$OMP PARALLEL

因爲我喜歡明確的,我會把它寫成

!$OMP PARALLEL PRIVATE(j) SHARED(i) 
do i=1, N 
    !$OMP DO 
    do j=1, M 
    ! do some calculations 
    end do 
    !$OMP END DO 
end do 
!$OMP END PARALLEL 
+0

由於我是新來的OpenMP我不知道如何避免嵌套的OpenMP部分。感謝您的好解釋! – Bob 2014-09-22 19:07:14

+1

也許你可以看看這個[教程](http://www.openmp.org/presentations/miguel/F95_OpenMPv1_v2.pdf)... – 2014-09-22 19:08:21