当我尝试通过 OpenMP 在 Fortran90 中并行化我的程序时,我收到了分段错误错误。
!$OMP PARALLEL DO NUM_THREADS(4) &
!$OMP PRIVATE(numstrain, i)
do irep = 1, nrep
do i=1, 10
PRINT *, numstrain(i)
end do
end do
!$OMP END PARALLEL DO
我发现如果我注释掉“PRINT *, numstrain(i)”或删除 openmp 标志,它可以正常工作。我认为这是因为当我并行访问 numstrain(i) 时会发生内存访问冲突。我已经将 i 和 numstrain 声明为私有变量。有人可以告诉我为什么会这样吗?非常感谢。:)
更新:
我修改了以前的版本,这个版本可以打印出正确的结果。
integer, allocatable :: numstrain(:)
integer :: allocate_status
integer :: n
!$OMP PARALLEL DO NUM_THREADS(4) &
!$OMP PRIVATE(numstrain, i)
n = 1000000
do irep = 1, nrep
allocate (numstrain(n), stat = allocate_status)
do i=1, 10
PRINT *, numstrain(i)
end do
deallocate (numstrain, stat = allocate_status)
end do
!$OMP END PARALLEL DO
但是,如果我将 numstrain 访问移动到由该子例程调用的另一个子例程(代码附在下面),1. 它总是在一个线程中处理。2. 在某个点(i=4 或 5),它返回 Segmentation Fault:11。当我有不同的 NUM_THREADS 时,它返回 Segmentation Fault:11 时的变量 i 是不同的。
integer, allocatable :: numstrain(:)
integer :: allocate_status
integer :: n
!$OMP PARALLEL DO NUM_THREADS(4) &
!$OMP PRIVATE(numstrain, i)
n = 1000000
do irep = 1, nrep
allocate (numstrain(n), stat = allocate_status)
call anotherSubroutine(numstrain)
deallocate (numstrain, stat = allocate_status)
end do
!$OMP END PARALLEL DO
subroutine anotherSubroutine(numstrain)
integer, allocatable :: numstrain(:)
do i=1, 10
PRINT *, numstrain(i)
end do
end subroutine anotherSubroutine
我还尝试在帮助子程序和主子程序中分配/解除分配,并且只在帮助子程序中分配/解除分配。什么都没有改变。