C和指针传输中的MPI

kst*_*tis 2 mpi

我有一个新的小问题;

我有一个小指针叫:

int *a;
Run Code Online (Sandbox Code Playgroud)

现在..在我的main方法中的某个地方,我使用以下行为它分配一些空间并分配一个值:

a = (int *) malloc(sizeof(int));
*a=5;
Run Code Online (Sandbox Code Playgroud)

..然后我尝试传输它(比如流程1):

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我尝试接收该指针

int *b;
MPI_Recv(b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

printf("This is what I received: %d \n", *b);
Run Code Online (Sandbox Code Playgroud)

我收到有关缓冲区的错误!

但是,如果不是将'b'声明为指针,而是执行以下操作:

int b;
MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

printf("This is what I received: %d \n", b);
Run Code Online (Sandbox Code Playgroud)

......一切似乎都很好!有人可以帮我弄清楚发生了什么,以及如何只使用指针?

提前致谢!

sus*_*att 9

这条线的含义

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)

如下:" a是内存中的一个点,我有一个整数.发送它

在上面发布的代码中,这是绝对正确的:a确实指向一个整数,因此它被发送.这就是为什么你可以使用第二种方法接收它,因为线的含义

MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
Run Code Online (Sandbox Code Playgroud)

是"接收1个整数,并将其存储在&b.b是一个常规的int,所以它都很好.在第一次接收时,你试图在int*变量中接收一个整数,没有分配的内存b指向,所以Recv无处可去写信.但是,我应该指出:

永远不要将指针的内容传递给MPI中的另一个进程

MPI进程无法读取彼此的内存,而虚拟寻址使得一个进程的指针对另一个进程完全没有意义.

  • 我认为真正的问题是没有为int*b分配内存!此外,如果需要,MPI负责将数据从一个进程传输到另一个进程,这样一个进程就不必能够读取另一个进程的内存! (2认同)
  • 没错,真正的问题是`b`是未分配的.这仍然是一个相当有争议的问题,因为指针本身不应该在任何情况下传递. (2认同)

mor*_*ort 5

这个问题与处理指针和分配内存有关; 这不是MPI特定的问题.

在第二个变体中,int a自动为一个整数分配内存.通过传递,&a您将指向已分配的内存段.在第一个变体中,指针的内存是自动分配的,但不是指针所指向的内存.因此,当您传入指针时,MPI会尝试写入未分配的内存,从而导致错误.

它会以这种方式工作:

int *b = (int *) malloc(sizeof(int));
MPI_Recv(b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
Run Code Online (Sandbox Code Playgroud)