Гибридные OpenMP и MPI для ускорения отправки данных - PullRequest
0 голосов
/ 18 апреля 2020

Я использую MPI для отправки данных для обработки. Интересно, может ли OpenMP ускорить отправку данных?
Вот фон:
Основной процесс (rank 0) производит большое matrix , и собирается отправлять всем процессам (включая себя).

Сначала я пытаюсь использовать MPI_Scatterv, и это работает, но я думаю, что это занимает слишком много времени. Затем я использую OpenMP для ускорения отправки данных, поэтому я изменяю MPI_Scatterv на MPI_Send. Простой код выглядит так:

double* matrix;
double* local_matrix;
int local_n;
int n;
int comm_sz;
/*...Init matrix, comm_sz and...*/
MPI_Request req_r;
MPI_Irecv(local_matrix, local_n * local_n, MPI_DOUBLE, 0, 0, comm, &req_r);
if (my_rank == 0)
{
#   pragma omp parallel for num_threads(4)
    for (int i = 0; i < comm_sz; ++i)
    {
        int offset = ...;    /*The offset corresponding to start of matrix*/
        MPI_Send(matrix + offset, 1, block_t, i, 0, comm);    /*Send to i_th process with tag = 0*/
    }
}
MPI_Wait(&req_r, MPI_STATUS_IGNORE);

matrix и local_matrix - это одномерный массив, comm_sz - это номер процесса, block_t - это самоопределенный MPI_Type, содержит local_n*local_n double, который представляет подматрицу matrix, а offset - это смещение, соответствующее началу matrix.


Но после эксперимента затраты времени плохие.

  • только MPI_Scatterv: почти 1,02 с
  • только MPI_Send: почти 1,38 с
  • OpenMP с MPI_Send: почти 1,55 с

My вопрос:
1. Почему использование OpenMP не может ускорить MPI_Send?
2. И есть ли способы ускорить отправку с помощью многопоточность ?

PS:
1. При использовании OpenMP я уже звоню MPI_Init_thread.
2. Используя MPI_Wtime(), чтобы получить все время траты.

...