当我尝试通过的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)的内存访问冲突发生。 我已经宣布我和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),则返回段错误:11。 变量,当它返回我分割故障:11是不同的,当我有不同的NUM_THREADS。
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
我也试图在帮助子程序和主子程序都分配/解除分配,只有在帮助子程序分配/解除分配。 没有被改变。