我最近遇到了编译器特定的openmp问题。我编写了一个使用openmp和gfortran正常工作的代码。我最近使用ifort和openmp来编译相同的代码,现在openmp部分是segfaults。我已经减少了大部分的脂肪,并编写了这段代码来重现我的错误
!$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
所有这个循环都是从数组tr访问r中元素的指针,然后在这些元素之间循环。但是,ifort由于某种原因将无意义的值分配给c1s和c1e,导致代码在循环r时出现段错误。同样,代码与gfortran一起使用。有谁知道为什么会这样?
答案 0 :(得分:-1)
发现错误。出于某种原因,gfortran非常友好地为所有线程初始化变量listvar!但是,IFORT需要使用firstprivate。我真的很惊讶gfortran从未在这里犯过错误。我已经在很多条件下使用gfortran运行代码,并且每次都有效。