У меня есть верхняя треугольная матрица и вектор результата b.
Моей программе нужно решить линейную систему:
Ax = b
используя метод конвейера.
И одним из ограничений является то, что количество процессов меньше, чем количество
уравнения (скажем, это может быть от 2 до числа Of-Equations-1).
У меня сейчас нет кода, я думаю о псевдокоде ..
Моя идея состояла в том, что один из процессов создаст случайную верхнюю треугольную матрицу (A)
вектор б.
допустим, это случайная матрица:
1 2 3 4 5 6
0 1 7 8 9 10
0 0 1 12 13 14
0 0 0 1 16 17
0 0 0 0 1 18
0 0 0 0 0 1
и вектор б [10 5 8 9 10 5]
и у меня меньше процессов, чем число уравнений (скажем, 2 процесса)
поэтому я подумал, что какой-то процесс отправит каждой строке процесса из матрицы и соответствующее число из вектора b.
поэтому последняя строка матрицы и последнее число в векторе b будут отправлены
process [numProcs-1] (здесь я имею в виду последний процесс (процесс 1))
чем он вычисляет X и отправляет результат в процесс 0.
Теперь процессу 0 нужно вычислить 5 строк матрицы и вот я застрял ..
У меня есть X, который был вычислен процессом 1, но как процесс может отправить самому себе
следующая строка матрицы и соответствующее число из вектора b, которые должны быть вычислены?
Является ли это возможным? Я не думаю, что это правильно отправлять «себе»
Да, MPI позволяет процессу отправлять данные самому себе, но нужно быть очень осторожным в отношении возможных взаимоблокировок при использовании операций блокировки. В этом случае обычно связывают неблокирующую отправку с блокирующим приемом или наоборот, либо используют такие вызовы, как MPI_Sendrecv
, Отправка сообщения себе, как правило, заканчивается тем, что сообщение просто копируется в памяти из исходного буфера в целевой, без использования сети или другой тяжелой техники.
И нет, общение с собой не обязательно плохо. Наиболее очевидным преимуществом является то, что он делает код более симметричным, так как удаляет / уменьшает специальную логику, необходимую для управления самовзаимодействием. Отправка / получение от себя также происходит в большинстве вызовов коллективной связи. Например, MPI_Scatter
также отправляет часть данных в корневой процесс. Чтобы предотвратить некоторые случаи отправки самому себе, которые излишне реплицируют данные и снижают производительность, MPI позволяет использовать режим на месте (MPI_IN_PLACE
) для большинства коммуникационных коллективов.
Является ли это возможным? Я не думаю, что это правильно отправлять «себе»
Конечно, можно общаться с самим собой. Для этого есть даже коммуникатор: MPI_COMM_SELF. Разговаривать с собой не так уж редко.
Ваша настройка звучит так, как будто вы предпочитаете использовать коллективы MPI. Посмотрите на MPI_Scatter и MPI_Gather и посмотрите, не предоставляют ли они вам ту функциональность, которую вы ищете.