发送数组时 MPI_Recv 发生错误
Posted
技术标签:
【中文标题】发送数组时 MPI_Recv 发生错误【英文标题】:An error occured in MPI_Recv while sending an array 【发布时间】:2020-06-04 03:09:00 【问题描述】:#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv)
int N;
scanf("%d", &N);
double *a = (double *)malloc(N * sizeof(double));
int i, rank, size, tag = 99, tag1 = 100;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
for(int j=0;j<N;++j)
a[j] = j+0.1;
for (i = 1; i < size; i++)
MPI_Send(&N, 1, MPI_INT, i, tag1, MPI_COMM_WORLD);
MPI_Send(a, N, MPI_DOUBLE, i, tag, MPI_COMM_WORLD);
else
MPI_Recv(&N, 1, MPI_INT, 0, tag1, MPI_COMM_WORLD, &status);
MPI_Recv(a, N, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &status);
// for(int j=0;j<N*2;++j)
// printf("%d %f\n", rank, a[j]);
MPI_Barrier(MPI_COMM_WORLD);
printf("Message from process %d : %f\n", rank, a[rank]);
MPI_Finalize();
return 0;
我正在第 0 个进程中创建数组“a”并将其发送到其余进程。但是这样做时我收到以下错误。
[nikhil:8599] *** An error occurred in MPI_Recv
[nikhil:8599] *** reported by process [4228579329,1]
[nikhil:8599] *** on communicator MPI_COMM_WORLD
[nikhil:8599] *** MPI_ERR_BUFFER: invalid buffer pointer
[nikhil:8599] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[nikhil:8599] *** and potentially your MPI job)
[nikhil:08593] 2 more processes have sent help message help-mpi-errors.txt / mpi_errors_are_fatal
[nikhil:08593] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages
谁能解释我为什么会收到这个错误?
正如您在代码中看到的,有一个 for 循环,其中包含一个已注释的 print 语句。奇怪的是……取消注释该循环。它工作正常。
【问题讨论】:
感谢您提供最低限度的工作示例! 【参考方案1】:想法:
MPI_Init
应该是您程序中的第一件事。
scanf
应该只有一个等级。
N
不会跨等级通信,因此您分配的内存大小未定义。
尽可能在接近其使用点的地方定义变量。将int i
放在函数的顶部是一场等待发生的灾难。
最后的屏障是不必要的。
所有队伍需要分配自己的内存。
这让我们得到了这段代码:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv)
MPI_Init(&argc, &argv);
const int tag = 99;
const int tag1 = 100;
int rank, size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
double *a; //Pointer to the memory we will allocate
int N;
if (rank == 0)
scanf("%d", &N);
a = (double *)malloc(N * sizeof(double));
for(int j=0;j<N;++j)
a[j] = j+0.1;
for (int i = 1; i < size; i++)
MPI_Send(&N, 1, MPI_INT, i, tag1, MPI_COMM_WORLD);
MPI_Send(a, N, MPI_DOUBLE, i, tag, MPI_COMM_WORLD);
else
MPI_Status status;
MPI_Recv(&N, 1, MPI_INT, 0, tag1, MPI_COMM_WORLD, &status);
//Have to allocate memory on all ranks
a = (double *)malloc(N * sizeof(double));
MPI_Recv(a, N, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &status);
// for(int j=0;j<N*2;++j)
// printf("%d %f\n", rank, a[j]);
printf("Message from process %d : %f\n", rank, a[rank]);
MPI_Finalize();
return 0;
做得更好
广播命令在这里是你的朋友:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define MPI_Error_Check(x) const int err=x; if(x!=MPI_SUCCESS) fprintf(stderr, "MPI ERROR %d at %d.", err, __LINE__);
int main(int argc, char **argv)
MPI_Init(&argc, &argv);
int rank, size;
MPI_Error_Check(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
MPI_Error_Check(MPI_Comm_size(MPI_COMM_WORLD, &size));
int N;
if (rank==0)
scanf("%d", &N);
MPI_Error_Check(MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD));
double *a = (double *)malloc(N * sizeof(double));
if(rank==0)
for(int j=0;j<N;++j)
a[j] = j+0.1;
printf("Message from process %d : N=%d\n", rank, N);
MPI_Error_Check(MPI_Bcast(a, N, MPI_DOUBLE, 0, MPI_COMM_WORLD));
fprintf(stderr, "Message from process %d : %f\n", rank, a[rank]);
free(a);
MPI_Finalize();
return 0;
做得更好
最快的交流方式就是不交流。在您的情况下,一旦知道 N
的值,每个等级就可以自行重新创建数据:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define MPI_Error_Check(x) const int err=x; if(x!=MPI_SUCCESS) fprintf(stderr, "MPI ERROR %d at %d.", err, __LINE__);
int main(int argc, char **argv)
MPI_Init(&argc, &argv);
int rank, size;
MPI_Error_Check(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
MPI_Error_Check(MPI_Comm_size(MPI_COMM_WORLD, &size));
int N;
if (rank==0)
scanf("%d", &N);
MPI_Error_Check(MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD));
double *a = (double *)malloc(N * sizeof(double));
for(int j=0;j<N;++j)
a[j] = j+0.1;
printf("Message from process %d : N=%d\n", rank, N);
fprintf(stderr, "Message from process %d : %f\n", rank, a[rank]);
free(a);
MPI_Finalize();
return 0;
【讨论】:
你能检查我的代码吗?我遇到了相同类型的错误,但无法修改我的代码。 ***.com/questions/71200986/…以上是关于发送数组时 MPI_Recv 发生错误的主要内容,如果未能解决你的问题,请参考以下文章
我想知道为啥当我发送一个数组以使用 jquery ajax (django,jquery) 查看时发生错误