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)

Можно ли сделать это лучше? Быстрее?

С уважением.

0 ответов

Другие вопросы по тегам