C MPI_Send仅在静态分配缓冲区的情况下工作

C MPI_Send仅在静态分配缓冲区的情况下工作,c,mpi,C,Mpi,如果我想定义自己的类型,并将其用作带有MPI_Send的数据类型,以便仅从矩阵中获取偶数行,那么该矩阵(发送缓冲区)是否必须静态分配 当我动态地分配它时,我似乎遇到了问题。这是因为要发送数据,地址必须是连续的吗?否,使用MPI\u Send发送的内存不必静态分配 要发送数组子集,可能需要使用MPI\u Type\u index。这里是对示例的一个稍加修改的版本,其中我替换了静态分配的缓冲区 int buffer[27]; int* buffer = (int*)malloc(27 * size

如果我想定义自己的类型,并将其用作带有
MPI_Send
的数据类型,以便仅从矩阵中获取偶数行,那么该矩阵(发送缓冲区)是否必须静态分配


当我动态地分配它时,我似乎遇到了问题。这是因为要发送数据,地址必须是连续的吗?

否,使用
MPI\u Send
发送的内存不必静态分配

要发送数组子集,可能需要使用
MPI\u Type\u index
。这里是对示例的一个稍加修改的版本,其中我替换了静态分配的缓冲区

int buffer[27];
int* buffer = (int*)malloc(27 * sizeof(int));
到动态分配的缓冲区

int buffer[27];
int* buffer = (int*)malloc(27 * sizeof(int));
我希望这有助于:

#include <mpi.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int rank, size, i;
    MPI_Datatype type, type2;
    int blocklen[3] = { 2, 3, 1 };
    int displacement[3] = { 0, 3, 8 };
    int* buffer = (int*)malloc(27 * sizeof(int)); //int buffer[27];
    MPI_Status status;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    if (size < 2)
    {
        printf("Please run with 2 processes.\n");
        MPI_Finalize();
        return 1;
    }
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    MPI_Type_contiguous(3, MPI_INT, &type2);
    MPI_Type_commit(&type2);
    MPI_Type_indexed(3, blocklen, displacement, type2, &type);
    MPI_Type_commit(&type);

    if (rank == 0)
    {
        for (i=0; i<27; i++)
            buffer[i] = i;
        MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
    }

    if (rank == 1)
    {
        for (i=0; i<27; i++)
            buffer[i] = -1;
        MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
        for (i=0; i<27; i++)
            printf("buffer[%d] = %d\n", i, buffer[i]);
        fflush(stdout);
    }

    MPI_Finalize();
    free(buffer);
    return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
int秩,大小,i;
MPI_数据类型,类型2;
int blocklen[3]={2,3,1};
int置换[3]={0,3,8};
int*buffer=(int*)malloc(27*sizeof(int));//int-buffer[27];
MPI_状态;
MPI_Init(&argc,&argv);
MPI_通信大小(MPI_通信世界和大小);
如果(尺寸<2)
{
printf(“请使用2个进程运行。\n”);
MPI_Finalize();
返回1;
}
MPI通信等级(MPI通信世界和等级);
MPI类型连续(3、MPI类型和类型2);
MPI_类型_提交(&type2);
MPI类型索引(3、块、位移、类型2和类型);
MPI_类型_提交(&Type);
如果(秩==0)
{

对于(i=0;i这里所说的一切都是正确的,我只需要添加它(接下来,您可能需要确保多维数组在内存中是连续的,即使您发送的子集不是连续的。@niklasfi好的,谢谢您的回答,但我对多维数组的情况很感兴趣。我可能对这个问题的理解很差,但我不知道是否需要为所有静态矩阵分配内存y、 所以它们在内存中是连续的,或者我可以动态地执行吗?@JonathanDursi,这是我感兴趣的。因此,如果矩阵元素在内存中不是连续的,那么问题就会出现?@breakpoint-如果它们以可预测的方式是不连续的,比如说,更大数据结构的已知片段-那么你就没事了,你可以定义MPI数据类型为了有效地将它们拉出来并放入消息中(反之亦然),如果它们以一种不可预测的方式是不连续的,那么就在malloc()上循环比如说,构建阵列要困难得多,而且结构的每个实例都必须具有不同的MPI类型。对于技术计算,出于性能(缓存)原因,通常希望内存保持连续。