片段是我尝试完成的通用版本。使用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