То, что у вас есть, это свертка. Это можно сделать с помощью быстрого преобразования Фурье за ​​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 для компиляции приведенного выше кода, если это вообще полезно.

Спасибо! -Джен

Ответы на вопрос(2)

Ваш ответ на вопрос