如何生成HMPI可执行测试程序
发表于 2023/04/27
0
在本章节中,我们将以通过调用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工具拉起可执行程序的内容。


