c - 使用 mpi_send 发送地址内容
问题描述
我正在编写一个程序,它向每个进程发送一个由 2 个数字组成的数组。我对数组表示法不满意。问题是,如果我想将指针表示法与通过 malloc 分配的地址内存一起使用,我将无法访问第二个元素。在此示例中,程序向每个进程发送一个带有指针符号的数组,其中包含数字 1 和 2。然后根打印收到的消息。谢谢
#include "stdio.h"
#include "stdlib.h"
#include "mpi.h"
int main(int argc, char *argv[])
{
float *send = malloc(sizeof(float) * 2);
float *recv = malloc(sizeof(float) * 2);
/*
float send2[2], recv2[2];
send2[0] = 1;
send2[1] = 2;
*/
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
*(send) = 1;
*(send + sizeof(float)) = 2;
MPI_Send(send, 2, MPI_FLOAT, 0, 99, MPI_COMM_WORLD);
if (rank == 0)
{
for (int i = 0; i < size; i++)
{
MPI_Recv(recv, 2, MPI_FLOAT, i, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("[%f][%f]\n", *(recv), *(recv + sizeof(float)));
//printf("[%f][%f]\n", recv2[0], recv2[1]);
}
}
MPI_Finalize();
return 0;
}
这是结果
juan@um18:~/Documentos/EjemplosMPI$ mpirun -np 4 ejecutables/ex
[1.000000][0.000000]
[1.000000][0.000000]
[1.000000][0.000000]
[1.000000][0.000000]
解决方案
对不起,花了将近 3 个小时后我才意识到
*(send + sizeof(float))=2
一定是
*(send + 1) = 2;
和 recv 函数一样。我认为沿着数组移动你必须增加地址内存来计算大小,但这只有在你使用空指针的情况下。如果您声明为浮点指针,则程序知道该大小有多大。