Скрытие связи в Matrix Vector Product с MPI - PullRequest
1 голос
/ 05 октября 2011

Мне нужно решить огромное линейное уравнение для нескольких правых частей (скажем, от 20 до 200).Матрица хранится в разреженном формате и распределяется по нескольким узлам MPI (скажем, от 16 до 64).Я запускаю решатель CG на узле ранга 0.Непосредственно решить линейное уравнение невозможно, поскольку матрица системы будет плотной (Sys = A ^ T * S * A).

Базовое умножение матрицы на вектор реализовано следующим образом:

broadcast x
y = A_part * x
reduce y

Хотя коллективные операции выполняются достаточно быстро (кажется, что OpenMPI использует двоичное дерево, такое как шаблон связи + Infiniband), на него все еще приходится довольно большая часть времени выполнения.По соображениям производительности мы уже рассчитали 8 правых сторон на итерацию (в основном SpM * DenseMatrix, просто чтобы завершить).

Я пытаюсь придумать хорошую схему, чтобы скрыть задержку связи, но я не сделалесть хорошая идея еще.Я также стараюсь воздерживаться от общения 1: n, хотя я еще не измерил, будет ли проблема масштабирования.

Любые предложения приветствуются!

Ответы [ 2 ]

0 голосов
/ 05 октября 2011

Если вам не нужны результаты старой правой части перед началом следующего запуска, вы можете попробовать использовать неблокирующую связь (ISend, IRecv) и сообщить результат при вычислении следующей правойуже со стороны.

Но убедитесь, что вы вызываете MPI_Wait перед чтением содержимого передаваемого массива, чтобы быть уверенным, что вы не читаете "старые" данные.

Если матрицыдостаточно велики (т. е. требуется достаточно много времени для вычисления матричного произведения), при таком подходе вообще не возникает задержка связи.

0 голосов
/ 05 октября 2011

Если ваша матрица уже распределена, можно ли будет использовать распределенный разреженный линейный решатель вместо того, чтобы запускать его только на ранге 0 и затем транслировать результат (если я правильно читаю ваше описание ...).Для этого есть множество библиотек, например, SuperLU_DIST, MUMPS, PARDISO, Aztec (OO) и т. Д.

Оптимизация "нескольких rhs" поддерживается, по крайней мере, SuperLU и MUMPS (другие не проверены, ноЯ был бы ОЧЕНЬ удивлен, если бы они не поддерживали это!), Так как они решают AX = B, где X и B - матрицы с потенциально> 1 столбцом.То есть каждое "rhs" сохраняется как вектор-столбец в B.

...