fortran 并行计算的问题,请教各位

问题遇到的现象和发生背景 fortran 写了一个OMP的并行,然后用makefile运行报告: 段错误(核心转储)
问题相关代码,请勿粘贴截图 #gfortran

FC = gfortran
#FFLAGS = -cpp -fopenmp --free-line-length-none -fmax-identifier-length=63 -O2 -mcmodel=medium
FFLAGS = -cpp -fopenmp --free-line-length-none -fmax-identifier-length=63 -O2

#if you use ifort
#FC = ifort
#FFLAGS = -fpp2 -openmp -O1
#FFLAGS = -fpp2 -openmp -O1 -mcmodel=medium -i-dynamic -i8

1: cx.o
$(FC) $(FFLAGS) $^ -o 1

cx.o:cx.f90
$(FC) $(FFLAGS) -c cx.f90

 clean:
rm -f test.o  1 *.o *.log

!程序部分,想仅仅对 j 作并行计算
!$omp parallel do default(shared) private(j)

do j=1,nn
do p=1,nn
do m=1,nn
do i=281559,452416

if ( k(m-1)<abs(k(j)-k(p))  .and.  abs(k(j)-k(p)) < k(m) )     then
  n=m-1
end if

gw(j)= (0.006258d0*k(j)*3k(p)*7Abs( g(j,i)*r(p,i)*r(n,i) )*2 + 0.006258d0k(j)*3k(p)*7Abs( g(j,i-1)*r(p,i-1)&
*r(n,i-1) )*2)/2.(t(i)-t(i-1))

sum(j)=sum(j)+gw(j)

   end do
 end do

end do
end do

!$omp end parallel do

运行结果及报错内容 段错误(核心已转储)
我的解答思路和尝试过的方法 直接用gfortran cx.f90 可以运算
我想要达到的结果想写一个并向语句,对j作并向计算。谢谢啦

你基础较薄弱,可以先看看书或视频 https://www.bilibili.com/video/BV1uA411v776

  !$omp parallel do default(shared) private(j,p,m,i,n) reduction(+:sum)
  do j=1,nn
    do p=1,nn
      do m=1,nn
        do i=281559,452416

          if ( k(m-1)<abs(k(j)-k(p))  .and.  abs(k(j)-k(p)) < k(m) )     then
            n=m-1
          end if
          gw(j)= (0.006258d0*k(j)*3k(p)*7Abs( g(j,i)*r(p,i)*r(n,i) )*2 + 0.006258d0k(j)*3k(p)*7Abs( g(j,i-1)*r(p,i-1)*r(n,i-1) )*2)/2.(t(i)-t(i-1))

          sum(j)=sum(j)+gw(j)

        end do
      end do
    end do
  end do
  !$omp end parallel do
  

这个不会,学习了

1、内存访问出错

这类问题的典型代表就是数组越界。

 

2、非法内存访问

出现这类问题主要是程序试图访问内核段内存而产生的错误。

 

3、栈溢出

Linux默认给一个进程分配的栈空间大小为8M。c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。 因此如果你数组开的过大变会出现这种问题。

排错方法,每行代码下打印一窜字符串,找到问题语句,把语句中的每个变量打印出来,包括类型。