在fortran中openmp减少多维数组

时间:2015-04-10 09:40:58

标签: multidimensional-array fortran openmp reduction

我在这里有这些循环,我计算数组' 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)

可以做得更好吗?快?

问候。

0 个答案:

没有答案