You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPI字符数组无法向各进程分发字符的问题及需求实现

MPI字符数组散射到对应进程的问题修复

原代码的核心问题

  1. MPI_Scatter参数错误:
    • 发送缓冲区:根进程里a是指向字符数组的指针,调用MPI_Scatter时不该传&a——这会把指针本身的地址发出去,而非数组里的实际字符数据,正确的应该直接传a。
    • 接收缓冲区:a1已经是接收缓冲区的起始地址,传&a1会传递指针的指针,导致无法正确接收字符,应该直接传a1。
  2. 内存管理不规范:根进程用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:01:01