2017-02-20 27 views
0

Я довольно новичок в OpenMP. Я хочу написать все элементы большой матрицы в вектор, используя потоки OpenMP, чтобы ускорить процесс.Запись элементов матрицы в вектор с использованием OpenMP

В моем последовательном коде я просто делаю следующее:

m=1 
DO k=1,n_lorentz 
    DO i=1,n_channels 
    DO p=1,n_lorentz 
      DO j=1,n_channels 
      vector(m) = Omega(j,p,i,k) 
      m=m+1 
     END DO 
    END DO 
    END DO 
END DO 

Теперь я хотел бы использовать цикл OMP писать элементы Omega в вектор в параллельной моде:

!$OMP PARALLEL DO PRIVATE(k,i,p,j) 
    ! bla bla 
!$OMP END PARALLEL DO 

Вопрос в том, как отслеживать текущий векторный индекс, поскольку в этом случае параметр из m из серийного кода будет увеличиваться на разные потоки, что приведет к полному беспорядку.

ответ

4

Один ответ: вам не нужно отслеживать m. Вместо этого, анализируя цикл, мы находим, что:

  • Каждый раз, когда j увеличивается на единицу, m увеличивается на одну единицу;
  • Разница: p Увеличивает обороты, m увеличивается на n_channels;
  • Увеличивает обороты игрока i, m увеличивается на n_channels*n_lorentz;
  • Каждый раз, когда k увеличивается на 1, m увеличивается на n_channels*n_lorentz*n_channels.

Из этих наблюдений можно написать явное выражение для m:

m = j + n_channels*((p-1) + n_lorentz*((i-1) + n_channels*(k-1))) 

Будучи в состоянии явного вычисления индекса должен решить вашу проблему :).

+0

Спасибо! Это действительно делает работу :) – Cooliofan