То, что у вас есть, это свертка. Это можно сделать с помощью быстрого преобразования Фурье за N log2 (N) времени. Ваш алгоритм N ^ 2. Если вы используете FFT, одного ядра, вероятно, будет достаточно!
вел некоторый поиск, но не смог найти ничего, что могло бы быть связано с моим вопросом (извините, если мой вопрос излишний!). В любом случае, как говорится в заголовке, у меня возникают проблемы с улучшением последовательной реализации моего кода. Фрагмент кода, который мне нужно распараллелить, выглядит следующим образом (это Fortran90 с OpenMP):
do n=1,lm
do m=1,jm
do l=1,im
sum_u = 0
sum_v = 0
sum_t = 0
do k=1,lm
!$omp parallel do reduction (+:sum_u,sum_v,sum_t)
do j=1,jm
do i=1,im
exp_smoother=exp(-(abs(i-l)/hzscl)-(abs(j-m)/hzscl)-(abs(k-n)/vscl))
sum_u = sum_u + u_p(i,j,k) * exp_smoother
sum_v = sum_v + v_p(i,j,k) * exp_smoother
sum_t = sum_t + t_p(i,j,k) * exp_smoother
sum_u_pert(l,m,n) = sum_u
sum_v_pert(l,m,n) = sum_v
sum_t_pert(l,m,n) = sum_t
end do
end do
end do
end do
end do
end do
Я сталкиваюсь с проблемами состояния гонки? Или я просто помещаю директиву не в том месте? Я довольно новичок в этом, поэтому я прошу прощения, если это слишком упрощенная проблема.
В любом случае, без распараллеливания, код мучительно медленный. Чтобы дать представление о размере проблемы, индексы lm, jm и im равны 60, 401 и 501 соответственно. Так что распараллеливание имеет решающее значение. Любая помощь или ссылки на полезные ресурсы будут очень благодарны! Я использую xlf для компиляции приведенного выше кода, если это вообще полезно.
Спасибо! -Джен