當我嘗試使用OpenMP對Fortran90中的程序進行並行化時,出現分段錯誤錯誤。OpenMP專用陣列 - 分段錯誤:11
!$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聲明爲私有變量。有人可以給我一些想法,爲什麼是這種情況?非常感謝。 :)
UPDATE:
我修改之前的版本,這個版本可以打印出正確的結果。
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。當我有不同的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
我也試圖在這兩個子程序的幫助和主子程序分配/解除分配,並且只分配在幫助子程序分配/釋放。沒有什麼改變。
非常感謝您的回答。我想知道在使用它之前分配數組是否會將數組放入堆棧。我發現如果我在do循環之前分配(numstrain(n),stat = allocate_status),並且在do循環之後釋放它,它就可以正常工作!但是,如果除了將代碼移動到由此子例程調用的另一個幫助子例程之外,我還會執行相同的操作,則會再次發生分段錯誤。 – Ling0k
您能否編輯您的問題並在那裏添加附加信息?另外放置'numstrain'的定義,因爲給定了額外的細節,它可能不會成爲堆棧大小問題。 –
當然。抱歉讓人困惑。我更新了我的問題。 – Ling0k