如何生成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工具拉起可执行程序的内容。
本页内容