首页 > 解决方案 > 使用 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]

标签: cmpi

解决方案


对不起,花了将近 3 个小时后我才意识到

*(send + sizeof(float))=2

一定是

*(send + 1) = 2;

和 recv 函数一样。我认为沿着数组移动你必须增加地址内存来计算大小,但这只有在你使用空指针的情况下。如果您声明为浮点指针,则程序知道该大小有多大。


推荐阅读