簡體   English   中英

當我為第二個數組第二次分配 memory 時,為什么 MPI 會出現分段錯誤?

[英]Why does MPI give segmentation fault when I allocate memory for a second time for a second array?

所以這是在導致分段錯誤的行之前與 // 一起使用的代碼:

#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;
}

為什么第二次分配 memory 會導致這種情況? 我還嘗試使用 malloc 而不是 MPI_Alloc_mem 以防萬一,但並沒有真正改變任何東西。

我對MPI_Alloc_mem不熟悉,所以我使用的是malloc 正如@Victore Eijkhout提到的,您需要在每個進程上為您的陣列分配相同數量的 memory。 這是您的代碼的工作版本:

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

int main (int argc, char *argv[]) {
  float *delta;
  int *arr;
  int size,rank;
  int tag;
  MPI_Status status;
  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){
        arr = malloc(2 * sizeof(int));
        delta = malloc(3 * sizeof(float));
        //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]=10;
        arr[1] = 20;
        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{
        arr = malloc(2 * sizeof(int));
        delta = malloc(3 * sizeof(float));
        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("Process %d: arr:[%d, %d] | delta:[%f, %f]\n", rank, arr[0], arr[1], delta[0], delta[1]);

  MPI_Finalize(); //MPI cleanup
  return 0;
}

output:

Process 3: arr:[10, 20] | delta:[1.000000, 2.000000]
Process 0: arr:[10, 20] | delta:[1.000000, 2.000000]
Process 2: arr:[10, 20] | delta:[1.000000, 2.000000]
Process 1: arr:[10, 20] | delta:[1.000000, 2.000000]

您僅在進程零上分配緩沖區:在其他進程上沒有緩沖區。 也許您對發送/接收的工作方式感到困惑:它們不發送緩沖區,而是發送內容。 所以接收者需要分配空間來接收數據。接收調用不會創建緩沖區,它只會將數據放入其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM