Я пытаюсь распараллелить следующий фрагмент кода, используя 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]
и т. д.