C和指针传输中的MPI

时间:2012-03-26 17:47:42

标签: mpi

我有一个新的小问题;

我有一个叫做的小指针:

int *a;

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

a = (int *) malloc(sizeof(int));
*a=5;

..然后我尝试传输它(比如处理1):

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

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

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);

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

但是,如果不是宣布' 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);

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

提前致谢!

3 个答案:

答案 0 :(得分:9)

行的含义

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

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

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

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

是“收到1个整数,并将其存储在&bb是常规int,所以一切都很好。在第一次接收时,你正在尝试要在int*变量中接收一个整数,b没有分配的内存,所以Recv无处可写。但是,我应该指出:

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

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

答案 1 :(得分: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);

答案 2 :(得分:1)

您得到的错误是您正在复制MPI_Recv中某些您不拥有且未初始化的内存*b中的结果。

不是MPI的专家,但肯定你不能将指针(即内存地址)传递给可能在另一台机器上运行的进程!