Примечание: я решил, как умножить разреженную матрицу - умножение плотных векторов на разбиение по строкам.
В 1D - Разделение разреженных матриц по порядку, сначала я прочитал различные разреженные матрицы из SuiteSparse Matrix Collection (https://sparse.tamu.edu/), используя «mmio.c» из https://math.nist.gov/MatrixMarket/mmio-c.html и разделив эту разреженную матрицу через RowWise на N x (N / p) -матрицы и назначить эти матрицы различным процессам (p = число процессов). После разбиения всей матрицы на разные части я просто создаю (N / p) x 1 плотный вектор для каждого процесса ,
После завершения раздела мне нужно было определить, какие процессы взаимодействуют друг с другом, чтобы неблокирующая связь точка-точка (MPI_Isend и MPI_IRecv) была небольшой. По этой причине мне нужно было создать график взаимодействия задач, который показывает, какие процессы взаимодействуют друг с другом. Процесс может отправить свою плотную векторную часть другим процессам, которые используют этот плотный вектор для локального умножения. Кроме того, процесс может получать различные плотные векторные части от других процессов. Например, после определения этих процессов я получил эти два зависимых процесса.
Пример
Процесс 0
Отправить иждивенцев
Процесс 1
Процесс 5
Процесс 6
Получите иждивенцев
Процесс 10
Процесс 13
Просматривая эти зависимые процессы, я использовал два цикла for в каждом процессе для отправки своей плотной векторной части и получения другой плотной векторной части от других процессов, используя неблокирующую двухточечную связь (MPI_Isend и MPI_Irecv). Для ожидания всех запросов на отправку и получение я использовал функцию MPI_Waitall.
В качестве заключительной части я реализовал разреженную матрицу - плотное векторное умножение.