MPI字符数组无法向各进程分发字符的问题及需求实现
MPI字符数组散射到对应进程的问题修复
原代码的核心问题
- MPI_Scatter参数错误:
- 发送缓冲区:根进程里
a是指向字符数组的指针,调用MPI_Scatter时不该传&a——这会把指针本身的地址发出去,而非数组里的实际字符数据,正确的应该直接传a。 - 接收缓冲区:
a1已经是接收缓冲区的起始地址,传&a1会传递指针的指针,导致无法正确接收字符,应该直接传a1。
- 发送缓冲区:根进程里
- 内存管理不规范:根进程用
malloc分配的a未释放,所有进程用new分配的a1未delete,虽不影响功能,但属于代码隐患。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <mpi.h> int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); int my_rank; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); int size; MPI_Comm_size(MPI_COMM_WORLD, &size); char *a = NULL; const int broadcast_root = 0; if (my_rank == broadcast_root) { printf("enter any string: "); a = (char *)malloc(size * sizeof(char)); // 限制输入长度避免缓冲区溢出,假设进程数为4时最多输入4个字符 scanf("%4s", a); } char *a1 = new char[1]; // 每个进程仅需接收1个字符,无需分配8个字节 MPI_Scatter(a, 1, MPI_CHAR, a1, 1, MPI_CHAR, broadcast_root, MPI_COMM_WORLD); printf("process %d : %c\n", my_rank, *a1); // 释放分配的内存 if (my_rank == broadcast_root) { free(a); } delete[] a1; MPI_Finalize(); return EXIT_SUCCESS; }
关键修改说明
- 修正
MPI_Scatter的缓冲区参数,让MPI能正确访问发送/接收的内存地址。 - 缩小
a1的分配大小,匹配实际需求,避免内存浪费。 - 增加内存释放逻辑,消除内存泄漏隐患。
- 优化
scanf格式串,限制输入长度,防止缓冲区溢出。
运行结果
启动4个进程并输入abcd后,各进程会分别输出:
process 0 : a process 1 : b process 2 : c process 3 : d
内容的提问来源于stack exchange,提问作者Tarek Rahman
相关产品推荐
相关产品推荐

