2011-11-04 65 views
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)。

感謝您的任何幫助/意見!

+0

我沒有看到任何錯誤,所以我可以建議解除'jsta = max j框的限制'這部分?如果數組索引是那裏的方式,可能會導致seg錯誤。您可以使用-C選項編譯您的代碼以啓用數組綁定檢查。 – yosukesabai

+0

這可能是因爲堆棧內存不足。嘗試使用allocate()或指針將字段放在堆上。也許你的系統也有一些環境變量來增加堆棧。最後,它是否適用於小型問題? – FFox

+0

感謝您的有用建議。我會試着重新審視這個問題,並讓大家知道我是否學到了什麼! – JRC

回答

1

我正在使用英特爾Fortran編譯器,但我有類似的體驗,像你一樣,在運行時出現分段錯誤。

在我的情況下,以下解決了這個問題,這增加了線程堆棧的大小。我希望這有幫助。

[[email protected]]$ ulimit -s unlimited 
[[email protected]]$ export OMP_STACKSIZE=1g # 1GB for thread stack size