Назначение номера итерации статическому расписанию OpenMP вручную - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь распараллелить следующий фрагмент кода, используя OpenMP. Показанная часть в основном является версией матричного алгоритма Томаса (инверсия матрицы) для неявного решателя при моделировании потока жидкости / турбулентности. Я сократил его точную форму, чтобы сделать вопрос легко понятным.

REAL(KIND=DP), INTENT(INOUT), DIMENSION(1:10) :: A, C_old, C_new, D
INTEGER :: K

!$OMP PARALLEL DO SCHEDULE(STATIC) NUM_THREADS(3)&
!$OMP SHARED(A, C_old, C_new, D)

      DO K = 2,9
         C_new(K) =  C_old(K)/(A(K)*C_new(K-1))
      END DO

!$OMP END PARALLEL

C(1) = C(10) = 0, потому что они находятся на фиксированных границах (верхняя и нижняя стенки канала). Следовательно, нет необходимости обновлять их.

Как видно, для вычисления C(2) требуется информация C(1), а для вычисления C(3) требуется информация MODIFIED C(2) и так далее. Или, другими словами, это прямая развертка (алгоритм здесь https://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm). Следовательно, для трех (03) числа потоков я хочу, чтобы распределение итераций по потокам было [1,2,3,4], [4,5,6,7], [7,8,9,10]. Но если япросто сделайте SCHEDULE STATIC, я бы не смог управлять этим, и распределение могло бы быть [1,2,3], [4,5,6], [7,8,9,10] по трем потокам. Это дало бы ошибочные результаты, поскольку информация о точках сетки 4 и 7 не передаетсяв другие темы.

Пожалуйста, дайте мне знать, если есть способ, которым я могу заставить индексы быть решенными определенной цепью без какой-либо расы? Скажем,

thread #1 solve indices [1,2,3,4]<br> thread #2 solve indices [4,5,6,7] и т. д.

...