片段是我嘗試完成的通用版本。使用OpenMp在內部循環中循環陣列
program main
integer, save:: j,Nj,k,Nk,AllocateStatus
!double precision:: array(100000)
double precision, dimension(:), allocatable:: array
INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,
+ OMP_GET_THREAD_NUM
Nj = 100000
Nk = 100
allocate(array(Nk),STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** Not enough memory ***"
array = 0.0
!$OMP PARALLEL PRIVATE(NTHREADS, TID)
!$OMP DO
do j=1, Nj
!print *, "id", OMP_GET_THREAD_NUM()
!DO COMPUTATIONALLY INTENSIVE PART
do k=1, Nk
array(k)=array(k)+1
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
print *, array
stop
end
在非的OpenMP版本的array
每個元素將是100000使用OpenMP作爲片段中,我得到約99000數組元素我不是我需要什麼樣的變化做出明確獲得openmp版本以獲得與串行版本相同的輸出。
編輯:
在外部循環中完成的操作對相互不依賴的,但這些操作的輸出需要在像array
一個變量來累積地跟蹤。因此,每個線程的臨時數組可以在外循環完成後組合起來,但是我不知道如何進行縮減。下面的代碼是否有意義?
program main
integer, save:: j,Nj,k,Nk,AllocateStatus
!double precision:: array(100000)
double precision, dimension(:), allocatable:: a_tmp,a_total
INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,
+ OMP_GET_THREAD_NUM
Nj = 100000
Nk = 100
allocate(a_tmp(Nk),STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** Not enough memory ***"
allocate(a_total(Nk),STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** Not enough memory ***"
a_tmp = 0.0
a_total = 0.0
!$OMP PARALLEL PRIVATE(NTHREADS, TID,a_tmp)
!$OMP DO
do j=1, Nj
!print *, "id", OMP_GET_THREAD_NUM()
do k=1, Nk
a_tmp(k)=a_tmp(k)+1
enddo
enddo
!$OMP END DO
a_total=a_total+a_tmp
!$OMP END PARALLEL
print *, a_total
stop
end
在每個線程上使用臨時數組並減少循環外的選項(內存不是問題)? – schuberm
希望編輯清除一些東西。 – schuberm