gpt4 book ai didi

c - 一维数组的 MPI_scatter

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:24 24 4
gpt4 key购买 nike

我是 MPI 的新手,我正在尝试编写使用 MPI_scatter 的程序。我有 4 个节点(0、1、2、3)。 Node0是master,其他都是slave。 Master 询问用户要发送给 slaves 的数组元素的数量。然后它创建大小为元素数 * 4 的数组。然后每个节点打印它的结果。

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

#define MASTER 0

int main(int argc, char **argv) {
int id, nproc, len, numberE, i, sizeArray;
int *arrayN=NULL;
int arrayNlocal[sizeArray];

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if (id == MASTER){
printf("Enter number of elements: ");
scanf("%d", &numberE);
sizeArray = numberE * 4;
arrayN = malloc(numberE * sizeof(int));
for (i = 0; i < sizeArray; i++){
arrayN[i] = i + 1;
}
}
MPI_Scatter(arrayN, numberE, MPI_INT, &arrayNlocal, numberE,MPI_INT, MPI_COMM_WORLD);
printf("Node %d has: ", id);
for (i = 0; i < numberE; i++){
printf("%d ",arrayNlocal[i]);
}
MPI_Finalize();
return 0;
}

作为错误我得到:

BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
PID 9278 RUNNING AT 192.168.100.100
EXIT CODE: 139
CLEANING UP REMAINING PROCESSES
YOU CAN IGNORE THE BELOW CLEANUP MESSAGES

最佳答案

  • arrayNlocal[sizeArray];中,sizeArray没有被初始化。最好的方法是向每个进程广播 numberE 并为 arrayNlocal 分配内存。像这样的东西:

    MPI_Bcast( &numberE, 1, MPI_Int, 0, MPI_COMM_WORLD)
  • arrayN 是一个大小为 sizeArray = numberE * 4 的数组,所以:

    arrayN = malloc(sizeArray * sizeof(int));
  • MPI_Scatter() 需要指向要在根节点上发送的数据的指针,以及指向通信器每个进程上的接收缓冲区的指针。由于 arrayNlocal 是一个数组:

     MPI_Scatter(arrayN, numberE, MPI_INT, arrayNlocal, numberE,MPI_INT,MASTER, MPI_COMM_WORLD);

或者:

    MPI_Scatter(arrayN, numberE, MPI_INT, &arrayNlocal[0], numberE,MPI_INT,MASTER, MPI_COMM_WORLD);
  • id 未在 id == MASTER 中初始化:它必须是 rank==MASTER

照原样,最后的打印可能会在进程之间以混合方式出现。尝试使用 mpicc main.c -o main -Wall 编译您的代码以启用所有警告:它可以在不久的将来为您节省几个小时!

关于c - 一维数组的 MPI_scatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33780715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com