2014-07-21 141 views
-2

我最近遇到了編譯器特定的openmp問題。我寫了一個使用openmp和gfortran正確工作的代碼。我最近使用了ifort和openmp來編譯相同的代碼,現在openmp部分是segfaults。我已經削減大部分的脂肪去,寫了這個代碼片段其再現了我的錯誤openmp:使用ifort比gfortran不同的答案

!$omp parallel do schedule(dynamic) reduction(+:energy) default(private) shared(r,tr) 

    do i=0,listvar%ncellT-1 

      c1s = tr(i)%start 
      c1e = tr(i)%end 

      do j = c1s,c1e 

       x1 = r(j)%x; y1 = r(j)%y; z1 = r(j)%z 
       energy = energy + x1 
      enddo 
     enddo 

     !$omp end parallel do 

所有這些循環的作用是訪問指針元素r中從陣列TR,然後將這些元素之間循環。但是,ifort由於某種原因將無意義的值分配給c1s和c1e,導致代碼在我遍歷r時發生段錯誤。再次,代碼與gfortran一起工​​作。有沒有人有任何想法,爲什麼這可能是?

回答

-1

發現錯誤。出於某種原因,gfortran非常友好,爲所有線程初始化變量listvar!然而,IFORT需要使用firstprivate。我真的很驚訝gfortran從來沒有在這裏拋出一個錯誤。我在各種條件下使用gfortran運行代碼,並且每次都有效。

+4

這稱爲未定義的行爲。你不應該感到驚訝。 –

相關問題