1
我正在將一些OpenMP指令添加到一大套相當昂貴的嵌套循環中。我相信我需要在我的指令中使用一個減少子句,因爲數組上的操作不一定是獨立的。但是,當試圖添加reduce指令時,我的應用程序內核轉儲(但是編譯)。我正在使用IBM的XL Fortran編譯器和OpenMP 3.0一起使用。我的(簡體)代碼如下:Fortran 90/95使用數組(總和)減少OpenMP
!$omp parallel do reduction(+:f) private(n,m,l,i,j,k, &
!$omp parm,ista,iend,jsta,jend,ksta,kend)
do n=1,lm !k
do m=1,jm !j
do l=1,im !i
if (val(l,m,n) .ne. zero) then
jsta=max j bounds in box
jend=min j bounds in box
ista=max i bounds in box
iend=min i bounds in box
ksta=min k bounds in box
kend=max k bounds in box
do k=ksta,kend
do j=jsta,jend
do i=ista,iend
parm = exp(-dx*(abs(i-l)) &
-dy*(abs(j-m)) &
-dz*(abs(k-n)))
f(i,j,k) = f(i,j,k)+ val(l,m,n) * parm
end do
end do
end do
end if
end do
end do
end do
其中f有尺寸(im,jm,lm)。這只是一個語法問題嗎?我一直在試圖解決幾個較小的玩具問題,但是我很難通過一個較小的測試來了解我在這方面的應用。爲了便於參考,我在幾個月前提出了一個類似的問題,但自那時以來,問題發生了一些變化,我不相信現在的解決方案如此簡單(link)。
感謝您的任何幫助/意見!
我沒有看到任何錯誤,所以我可以建議解除'jsta = max j框的限制'這部分?如果數組索引是那裏的方式,可能會導致seg錯誤。您可以使用-C選項編譯您的代碼以啓用數組綁定檢查。 – yosukesabai
這可能是因爲堆棧內存不足。嘗試使用allocate()或指針將字段放在堆上。也許你的系統也有一些環境變量來增加堆棧。最後,它是否適用於小型問題? – FFox
感謝您的有用建議。我會試着重新審視這個問題,並讓大家知道我是否學到了什麼! – JRC