OpenMP сокращение многомерных массивов в Фортране
У меня есть эти циклы здесь, где я рассчитываю массив "вкладка". Я попытался использовать сокращение 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)
Можно ли сделать это лучше? Быстрее?
С уважением.