我遇到了一个新的小问题;
我有一个小指针叫做:
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);
...一切似乎都很好!有人可以帮我弄清楚发生了什么以及如何只使用指针吗?
提前致谢!
最佳答案
行的含义
MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
如下:“a
是内存中的一个点,我有 1 个整数。发送它。`
在您上面发布的代码中,这是绝对正确的:a
确实指向一个整数,因此它被发送了。这就是为什么您可以使用第二种方法接收它的原因,因为该行的含义
MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
是“接收 1 个整数,并将其存储在 &b
。b
是一个常规的 int
,所以一切都很好。在第一个接收,您正在尝试将整数接收到 int*
变量中b
没有指向分配的内存,所以 Recv
无处可写。但是,我应该指出:
永远不要将指针的内容传递给 MPI 中的另一个进程
MPI 进程无法读取彼此的内存,虚拟寻址使得一个进程的指针对另一个进程完全没有意义。
关于C 中的 MPI 和指针传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877057/