C MPI_Isend()中的MPI分段错误
我是MPI编程新手!我试图测量点对点通信带宽 甜菜甜到处理器的实际应用。但现在我有一个分段错误!我不明白为什么会这样。我也尝试过ubuntu上的valgrind,但不知道。也许有人能帮我:D 感谢您的快速响应,但这并不能改变问题:( 我刚刚更新了错误 这里是源代码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,
#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));