【问题标题】:当我为第二个数组第二次分配内存时,为什么 MPI 会出现分段错误?
【发布时间】:2022-01-23 09:48:27
【问题描述】:

所以这是在导致分段错误的行之前与 // 一起使用的代码:

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

int main (int argc, char *argv[]) {
  float *delta;
  int size,rank,*arr;

  MPI_Init (&argc, &argv); //initialize MPI library
  MPI_Comm_size(MPI_COMM_WORLD, &size); //get number of processes
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); //get my process id
  
    if (rank==0){
        //MPI_Alloc_mem(2*sizeof(int),MPI_INFO_NULL,arr);
        MPI_Alloc_mem(3* sizeof(float),MPI_INFO_NULL,delta);
        delta[0]=1;
        delta[1]=2;
        //arr[0]=1;
        for (int i=1; i<size; i++){
            MPI_Send(delta,3,MPI_FLOAT,i,4,MPI_COMM_WORLD);
            //MPI_Send(arr,2,MPI_INT,i,4,MPI_COMM_WORLD);
        }
    }
    else{
        MPI_Recv(delta, 3, MPI_FLOAT, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        //MPI_Recv(arr, 2, MPI_INT, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  }
  printf("delta:%f from process: %d\n",delta[0],rank);
  //printf("arr:%d from process: %d\n",arr[0],rank);
  MPI_Finalize(); //MPI cleanup
  return 0;
}

这是不起作用的代码:

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

int main (int argc, char *argv[]) {
  float *delta;
  int size,rank,*arr;

  MPI_Init (&argc, &argv); //initialize MPI library
  MPI_Comm_size(MPI_COMM_WORLD, &size); //get number of processes
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); //get my process id
  
    if (rank==0){
        MPI_Alloc_mem(2*sizeof(int),MPI_INFO_NULL,arr);
        MPI_Alloc_mem(3* sizeof(float),MPI_INFO_NULL,delta);
        delta[0]=1;
        delta[1]=2;
        arr[0]=1;
        for (int i=1; i<size; i++){
            MPI_Send(delta,3,MPI_FLOAT,i,4,MPI_COMM_WORLD);
            MPI_Send(arr,2,MPI_INT,i,4,MPI_COMM_WORLD);
        }
    }
    else{
        MPI_Recv(delta, 3, MPI_FLOAT, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        MPI_Recv(arr, 2, MPI_INT, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  }
  printf("delta:%f from process: %d\n",delta[0],rank);
  printf("arr:%d from process: %d\n",arr[0],rank);
  MPI_Finalize(); //MPI cleanup
  return 0;
}

为什么第二次分配内存会导致这种情况? 为了以防万一,我还尝试使用 malloc 而不是 MPI_Alloc_mem 进行此操作,但并没有真正改变任何东西。

【问题讨论】:

  • 您是否使用调试器准确查看崩溃的位置?请在帖子中包含调试器报告的回溯。

标签: arrays c segmentation-fault mpi


【解决方案1】:

您仅在进程零上分配缓冲区:在其他进程上没有缓冲区。也许您对发送/接收的工作方式感到困惑:它们不发送缓冲区,而是发送内容。所以接收者需要分配空间来接收数据。接收调用不会创建缓冲区,它只是将数据放入其中。

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 2017-06-16
    • 2021-01-04
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多