Мне нужно решить огромное линейное уравнение для нескольких правых частей (скажем, от 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, хотя я еще не измерил, будет ли проблема масштабирования.
Любые предложения приветствуются!