Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MPI_b播放动态二维数组_C_Mpi - Fatal编程技术网

C MPI_b播放动态二维数组

C MPI_b播放动态二维数组,c,mpi,C,Mpi,我正在尝试将带有bcast的动态2d数组传递给所有列组。 我有以下代码 #include <stdlib.h> #include <mpi.h> int main(int argc, char **argv) { float **array; int rank,size,i,j; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank);

我正在尝试将带有bcast的动态2d数组传递给所有列组。 我有以下代码

#include <stdlib.h>
#include <mpi.h>

int main(int argc, char **argv)
{   
    float **array;
    int rank,size,i,j;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);

    if(rank==0)
    {
        array = (float **)malloc(10*sizeof(float));
        for(i=0;i<10;i++)
            array[i] = (float *)malloc(10*sizeof(float));

        for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            array[i][j]=i+j;
    }
    MPI_Bcast(array,10*10,MPI_FLOAT,0,MPI_COMM_WORLD);
    MPI_Finalize();
}
#包括
#包括
int main(int argc,字符**argv)
{   
浮点**数组;
int秩,大小,i,j;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
如果(秩==0)
{
数组=(浮点**)malloc(10*sizeof(浮点));

对于(i=0;i数组应该是100,而不是10

array = (float **)malloc(100*sizeof(float)); 

您可能希望将第一个malloc更改为

malloc(10*sizeof(void*)) 
因为数组存储指针和浮点数而不是整数:

array[i][j]=1.0;

数组
应该是100而不是10,因为每行分配10个浮点。JackN的答案有这样做的代码

但是,在秩0以外的任何进程上,指向数组的指针将为
null
。 您需要在所有进程上初始化数组,然后在根上填充数组


您只需将malloc代码移出
if(rank==0)
块,它应该按照您的预期工作。

这里有三个问题—一个涉及分配,一个涉及分配位置,一个涉及MPI如何工作,其他答案都没有涉及到所有问题

第一个也是最严重的问题是在哪里分配东西。正如@davidb正确指出的那样,目前您只在任务0上分配内存,因此其他任务没有内存来接收广播

一般来说,对于C语言中的2d分配,您的代码几乎完全正确。在这段代码中:

     array = (float **)malloc(10*sizeof(float));
     for(i=0;i<10;i++)
         array[i] = (float *)malloc(10*sizeof(float));
您正在告诉MPI发送由
数组
指向的100个连续浮点数。您注意到库例程无法知道数组是否是指向2d、3d或12d数组开头的指针,或者单个维度是什么;它不知道是否必须跟随指针,如果跟随,则不知道要跟随多少个指针

因此,您希望发送一个指向100个连续浮点的浮点指针,并使用分配伪多维数组(*)的常规C方式,您不必知道。您不必知道此布局中第二行与第一行之间的距离,甚至不知道距离的方向。因此,您真正想要做的是:

int malloc2dfloat(float ***array, int n, int m) {

    /* allocate the n*m contiguous items */
    float *p = (float *)malloc(n*m*sizeof(float));
    if (!p) return -1;

    /* allocate the row pointers into the memory */
    (*array) = (float **)malloc(n*sizeof(float*));
    if (!(*array)) {
       free(p);
       return -1;
    }

    /* set up the pointers into the contiguous memory */
    for (int i=0; i<n; i++) 
       (*array)[i] = &(p[i*m]);

    return 0;
}

int free2dfloat(float ***array) {
    /* free the memory - the first element of the array is at the start */
    free(&((*array)[0][0]));

    /* free the pointers into the memory */
    free(*array);

    return 0;
}
int-malloc2dfloat(浮点***数组,int-n,int-m){
/*分配n*m个连续项*/
float*p=(float*)malloc(n*m*sizeof(float));
如果(!p)返回-1;
/*将行指针分配到内存中*/
(*数组)=(浮点**)malloc(n*sizeof(浮点*);
如果(!(*数组)){
自由基(p);
返回-1;
}
/*将指针设置到连续内存中*/

对于(int i=0;i如果要分配一个10*10的数组,代码:

array = (float **)malloc(10*sizeof(float))
应该是

array = (float **)malloc(10*sizeof(float*))

你的意思是,如果我想要一个10x10的2d数组,我必须分配一个100x1的数组?我可以像2d数组一样访问它?是的。并且去掉(i=0;i@davidb还有@jackn:伙计们,如果你告诉他malloc 100*sizeof(float),他想要一个带有指向10个数组指针的数组(这些数组将包含浮点数)您还应该告诉他如何设置行主顺序或列主顺序的指针。或者,可以使用1D缓冲区数组并从bcasted缓冲区重新构造n维数组
float **array;
/* ... */
malloc2dfloat(&array, 10, 10);
if (rank == 0) {
    for(i=0;i<10;i++)
         for(j=0;j<10;j++)
              array[i][j]=i+j;
}
MPI_Bcast(&(array[0][0]), 10*10, MPI_FLOAT, 0, MPI_COMM_WORLD);
array = (float **)malloc(10*sizeof(float))
array = (float **)malloc(10*sizeof(float*))