Dear all,
I am doing some tests using MPI_Allgatherv function recently. After these
tests, I found a wield problem of if.
When I wanted to use the MPI_Allgatherv function to gather a large number of
data from some processes(for example, 2GB data per process). If the number
of processes was even number, the function worked well and my network card
can receive *and *send data at the same time at his max speed; But if the
number of processes was odd number, the problem came, I found my network
card can only receive *or *send data at the same time at the max speed.
*My sample enviroments*: Openmpi 1.4.3, Linux 2.6.32
*My source codes*:
int main(int argc, char **argv)
{
char *psend_buf, *precv_buf;
int rank;
int process_cnt;
int repeat_time;
int *pele_cnt;
int *pdipal;
long buf_size; // Assume the long keyword is 64-bits width
buf_size = 2000; // 2000MB
repeat_time = 1;
MPI_Init(&argc, &argv);
MPI_Datatype mpi_meta;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &process_cnt);
precv_buf = (char*)malloc(buf_size * process_cnt * 1024 * 1024);
psend_buf = (char*)malloc(buf_size * 1024 * 1024);
memset(precv_buf, 0, buf_size * process_cnt * 1024 * 1024);
memset(psend_buf, 1, buf_size * 1024 * 1024);
// new data type: 1MB per unit
MPI_Type_contiguous(1024 * 1024, MPI_CHAR, &mpi_meta);
MPI_Type_commit(&mpi_meta);
pele_cnt = (int*)malloc(sizeof(int) * process_cnt);
pdipal = (int*)malloc(sizeof(int) * process_cnt);
for (int i = 0; i < process_cnt; i++)
{
pele_cnt[i] = buf_size;
pdipal[i] = i * buf_size;
}
for (int i = 0; i < repeat_time; i++)
{
MPI_Allgatherv(psend_buf, buf_size, mpi_meta, precv_buf, pele_cnt,
pdipal, mpi_meta, \
MPI_COMM_WORLD);
}
printf("rank %d, used time = %.3f\n", rank, totle_time);
free(psend_buf);
free(precv_buf);
free(pele_cnt);
free(pdipal);
MPI_Type_free(&mpi_meta);
MPI_Finalize();
}
I guess the problem is because of the implementation of the algorithm of
MPI_Allgather. Did anybody meet the same problem and have any suggestions
for me? Thanks
Best Regards
Xianjun
|