Я использую 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()
, чтобы получить все время траты.