C MPI_Isend()中的MPI分段错误

C MPI_Isend()中的MPI分段错误,c,debugging,segmentation-fault,mpi,C,Debugging,Segmentation Fault,Mpi,我是MPI编程新手!我试图测量点对点通信带宽 甜菜甜到处理器的实际应用。但现在我有一个分段错误!我不明白为什么会这样。我也尝试过ubuntu上的valgrind,但不知道。也许有人能帮我:D 感谢您的快速响应,但这并不能改变问题:( 我刚刚更新了错误 这里是源代码 #include "mpi.h" #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int myrank,

我是MPI编程新手!我试图测量点对点通信带宽 甜菜甜到处理器的实际应用。但现在我有一个分段错误!我不明白为什么会这样。我也尝试过ubuntu上的valgrind,但不知道。也许有人能帮我:D

感谢您的快速响应,但这并不能改变问题:( 我刚刚更新了错误

这里是源代码

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

int main(int argc, char *argv[]){

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

 int *arraySend = (int *)malloc(25000*sizeof(int));
 int *arrayRecv = (int *)malloc(25000*sizeof(int));
 double startTime = 0.0, endTime = 0.0;
 MPI_Status status,statusSend, statusRecv;
 MPI_Request requestSend, requestRecv;

 if(size != 2){
   if(myrank == 0){
       printf("only two processors!\n");
       MPI_Finalize();  
       return 0;
    }
 }

 if(myrank == 0){
     startTime = MPI_Wtime();
     MPI_Send(&arraySend, 25000, MPI_INT, 1, 0,MPI_COMM_WORLD);
 }else{
     MPI_Recv(&arrayRecv, 25000, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
 } 

 if(myrank == 0){
   endTime = MPI_Wtime();
   printf("100k Bytes blocking: %f Mb/s\n", 0.1/(endTime-startTime));
   startTime = MPI_Wtime();
   MPI_Isend(&arraySend, 25000, MPI_INT, 1, 0, MPI_COMM_WORLD, &requestSend);
   MPI_Wait(&requestSend, &statusSend);
  }else{
   MPI_Irecv(&arrayRecv,25000,MPI_INT,0,0,MPI_COMM_WORLD, &requestRecv);
   MPI_Wait(&requestRecv, &statusRecv);
  }

 if(myrank == 0){
    endTime = MPI_Wtime();
    printf("100k Bytes non-blocking: %f Mb/s\n", 0.1/(endTime-startTime));
 }
 free(arraySend);
 free(arrayRecv);
 MPI_Finalize();
 return 0;
}

传递的数组的大小错误

sizeof(arraySend)
应该是简单的
25000
,因为在定义数据类型时,MPI会自动扣除大小(这里是MPI_INT)。只有当您有一个位数组时,您通常需要在代码中使用
sizeof()

尝试在堆栈上而不是堆上分配内存,例如,而不是:

 int *arraySend = (int *)malloc(25000*sizeof(int));
使用:

int-arraySend[25000];

然后在mpi调用中使用
arraySend
而不是
&arraySend


如果您可以使用C++,您也可以使用从传入的数据自动计算大小的尼斯Boost MPI头。

< P>如果您使用的是一个体面的MPI实现,可以使用<代码> MPRUN -GDB < /C> >,DOC

也>代码>和ARRaySuth//Cord>不是指向分配的内存的指针,而是指向“类型<代码”指针的指针。>int*。这也是一个问题。您是否看到阻塞操作与非阻塞操作的组合在速度上有什么不同,然后依次是等待?
 int *arraySend = (int *)malloc(25000*sizeof(int));