我在这里有这些循环,我计算数组' tab'。 我尝试使用openmp减少但它不起作用。我得到一个段。 OMP_NUM_THREADS大于1的错误。
我做错了什么?
问候。
!$OMP PARALLEL DO DEFAULT(SHARED) &
!$OMP PRIVATE(ii,ix_tab,iy_tab,ipx,ipy,iw,C) &
!$OMP REDUCTION(+:tab)
do ii = 1,N
ix_tab = ...
iy_tab = ...
do ipy = -npy_max,npy_max
do ipx = -npx_max,npx_max
do iw = 1, M
C = Fx(iw,ipx,ix_tab) * Fy(iw,ipy,iy_tab)
tab(iw,ipx,ipy) = tab(iw,ipx,ipy) + A(iw,ii) * C
enddo
enddo
enddo
enddo
!$OMP END PARALLEL DO
---编辑---
好的,这是我的解决方案:
allocate wrk(nt,-npx_max:npx_max,-npy_max:npy_max,nthreads)
!$OMP PARALLEL DO DEFAULT(SHARED) &
!$OMP PRIVATE(tid,ii,ix_tab,iy_tab,ipx,ipy,iw,C)
tid = OMP_GET_THREAD_NUM() + 1
!$OMP DO
do ii = 1,N
ix_tab = ...
iy_tab = ...
do ipy = -npy_max,npy_max
do ipx = -npx_max,npx_max
do iw = 1, M
C = Fx(iw,ipx,ix_tab) * Fy(iw,ipy,iy_tab)
wrk(iw,ipx,ipy,tid) = wrk(iw,ipx,ipy,tid) + A(iw,ii) * C
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
do tid = 1, nthreads
tab(:,:,:) = tab(:,:,:) + wrk(:,:,:,tid)
enddo
deallocate(wrk)
可以做得更好吗?快?
问候。