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