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
你基础较薄弱,可以先看看书或视频 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操作申请的变量在堆中,其他变量一般在存储在栈中。 因此如果你数组开的过大变会出现这种问题。
排错方法,每行代码下打印一窜字符串,找到问题语句,把语句中的每个变量打印出来,包括类型。