鲲鹏社区首页
EN
注册
如何生成HMPI可执行测试程序

如何生成HMPI可执行测试程序

HPC

发表于 2023/04/27

188

在本章节中,我们将以通过调用MPI_Allreduce为例,带着大家掌握如何调用HMPI集合操作接口生成可执行程序。

如何调用HMPI结合操作接口

以调用MPI_Allreduce接口为例,实现将同一个通讯域中各个进程的int类型数据块进行求和运算,将最终结果发送给所有该通讯域中的所有进程的规约集合操作,示例文件名为test_case.c。

(1)头文件需要添加mpi.h

(2)在调用MPI_Allreduce前需要调用MPI_Init进行初始化

(3)MPI_Comm_rank获取当前进程号,MPI_Comm_size获取进程总数

test_case.c示例如下:

#include <mpi.h>#include <stdlib.h>#include <stdio.h>#include <string.h>

int main(int argc, char* argv[]){    int rank, size;    int i, j, k;    int equal, unequal, sum;    int send_success_flag = 0;    int success_flag_count = 0;    int count = 1024;    MPI_Init(&argc, &argv);    MPI_Comm_rank(MPI_COMM_WORLD, &rank);    MPI_Comm_size(MPI_COMM_WORLD, &size);
    int *sendbuf = (int *)malloc((size_t)count * sizeof(int));    if (!sendbuf) {        perror("can't allocate send buffer");        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);    }    
    int *recvbuf = (int *)malloc((size_t)count * sizeof(int));    if (!recvbuf) {        perror("can't allocate recv buffer");        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);    }
    for (i = 0; i < count; i++) {         sendbuf[i] = rank + 1;    }
    sum = ((size + 1) * (size) )/ 2;    
    for (k = 0; k < 100000; k++) {        MPI_Allreduce(sendbuf, recvbuf, count, MPI_INT, MPI_SUM, MPI_COMM_WORLD);    }    
    equal = 0;    unequal = 0;    for (j = 0; j < count; j++) {        if (recvbuf[j] == sum) {            equal++;        } else {    printf("rank : %d count : %d \n", rank, count);            unequal++;        }    }
    if (equal == count && unequal == 0) {        send_success_flag = 1;    } else {        send_success_flag = 0;    }    
    MPI_Allreduce(&send_success_flag, &success_flag_count, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);    
    if(rank == 0) {        if(success_flag_count == size) {            printf("All tests are success\n");        } else {            printf("some tests failed\n");        }    }
    free(sendbuf);    sendbuf = NULL;    free(recvbuf);    recvbuf = NULL;
    MPI_Finalize();
    return 0;}

上述示例中对MPI_ALLREDUCE集合操作进行了100000次迭代,是为更好展示HMPI优化的集合操作的优势。

编译可执行程序

如上test_case.c文件为例,执行如下命令编译生成可执行文件test_case。

mpicc test_case.c -o test_case

上述命令执行无报错,即编译成功,如有报错需根据具体报错进行纠正。

test_case在使用HMPI执行后,回显如下图:


根据上图回显显示看出HMPI不只有一种模式,Coll模式较于Non-coll模式时延具有优势,具体执行命令请参照使用HMPI工具拉起可执行程序的内容。

本页内容