gpt4 book ai didi

c - 发送数组时 MPI_Recv 发生错误

转载 作者:行者123 更新时间:2023-12-04 15:34:10 25 4
gpt4 key购买 nike

#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 循环,其中包含一个带注释的打印语句。奇怪的是......在取消注释该循环时。一切正常。

最佳答案

想法:

  1. MPI_Init 应该是您程序中的第一件事。
  2. scanf 应该只有一个等级。
  3. N 不会跨等级通信,因此您正在分配未定义大小的内存。
  4. 定义尽可能接近其使用点的变量。将 int i 放在函数的顶部是一场等待发生的灾难。
  5. 末尾的障碍是不必要的。
  6. 所有列都需要分配自己的内存。

这让我们得到这段代码:

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

做得更好

广播命令是你的 friend :

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

关于c - 发送数组时 MPI_Recv 发生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60308967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com