Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.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
使用MPI_Bcast(…)广播动态分配的2d阵列_Mpi - Fatal编程技术网

使用MPI_Bcast(…)广播动态分配的2d阵列

使用MPI_Bcast(…)广播动态分配的2d阵列,mpi,Mpi,我必须使用malloc动态创建一个数组,根进程会这样做,然后这些数组应该被广播到所有其他进程,这些进程现在将打印它,实际上需要的是其他进程将独立地更改矩阵的值。我的主要问题是我无法将整个阵列广播到所有进程 #include <stdlib.h> #include <mpi.h> int main(int argc, char **argv) { int **array; int rank,size,i,j; MPI_Init(&a

我必须使用malloc动态创建一个数组,根进程会这样做,然后这些数组应该被广播到所有其他进程,这些进程现在将打印它,实际上需要的是其他进程将独立地更改矩阵的值。我的主要问题是我无法将整个阵列广播到所有进程

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

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

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

    size= 4;
    array = (int **)malloc(size*sizeof(int *));
    for(i=0;i<size;i++)
        array[i] = (int *)malloc(size*sizeof(int));
    if(rank==0)
    {
        int t= 0;
        for(i=0;i<size;i++)
        {
            for(j=0;j<size;j++){
                array[i][j]=t++;
                printf("%4d",array[i][j]);
            }
            printf("\n");
        }
        printf("size is %zu\n",sizeof(array));
    }
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD);
    printf("size %d proec %d\n",size,rank);

    MPI_Bcast((int **)&(array[0][0]),size*size,MPI_INT,0,MPI_COMM_WORLD);
    MPI_Barrier(MPI_COMM_WORLD);
    printf("process %d prainting matrix:\n",rank);

    for (i= 0; i <size;i++)
    {
        for(j= 0; j < size; j++)
            printf("%d [%d]\t",array[i][j],rank);
        printf("\n");
    }

    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
}
#包括
#包括
int main(int argc,字符**argv)
{   
整数**数组;
int秩,大小,i,j;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
MPI_数据类型数据类型;
尺寸=4;
数组=(int**)malloc(size*sizeof(int*);

对于(i=0;i而言,问题在于直线

MPI_Bcast((int **)&(array[0][0]),size*size,MPI_INT,0,MPI_COMM_WORLD);
你应该这样做

for(i=0;i<size;i++)
{
  MPI_Bcast((int **)&(array[i][0]),size,MPI_INT,0,MPI_COMM_WORLD);
}
它输出

Ox13B91A0
Ox13B91C0
Ox13B91E0
Ox13B6B90
end array  = Ox13B6B9C
end pointer= Ox13BB06C
正如您所看到的
结束数组
结束指针
是不同的。如果您现在查看每个
malloc
的地址,增量是0x20(大于
4*size(int)=10
),然后突然减少0x2650

连续
malloc
分配内存,不保证内存是相邻分配的

因此,您不能使用
MPI\u Bcast((int**)和(array[0][0]),size*size,MPI\u int,0,MPI\u COMM\u WORLD);
发送,因为
和(array[0][0])
到&
(array[0][0])+(size*size-1)*sizeof(int)
之间的数据实际上并不包含要发送的数据

然而,一个
malloc
分配一块连续内存

因此,您可以发送
MPI\u Bcast((int**)和(array[i][0]),大小,MPI\u int,0,MPI\u COMM\u WORLD);

待考虑

设置发送和接收是有成本的,发送是有成本的。因此,MPI“某物”呼叫越少,效果越好

因此,您的矩阵实际上应该分配一个
malloc

将修改后的代码与此代码进行比较

#include <mpi.h>

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

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

    size= 4;
    array = (int *)malloc(size*size*sizeof(int));

    if(rank==0)
    {
        int t= 0;
        for(i=0;i<size;i++) { for(j=0;j<size;j++){ array[i*size+j]=t++; } }
    }

    MPI_Bcast(array,size*size,MPI_INT,0,MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);
    printf("process %d printing matrix:\n",rank);

    for (i= 0; i <size;i++)
    {
        for(j= 0; j < size; j++)
            printf("%d [%d]\t",array[i*size+j],rank);
        printf("\n");
    }
    MPI_Finalize();
}
#包括
int main(int argc,字符**argv)
{   
int*数组;
int秩,大小,i,j;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
MPI_数据类型数据类型;
尺寸=4;
数组=(int*)malloc(size*size*sizeof(int));
如果(秩==0)
{
int t=0;

对于(i=0;i您必须在连续内存中分配数组。快速搜索SO将指向几个可接受的答案。i真正的解决方法是如何在连续内存中分配内存,因为
MPI_Bcast()
在循环中是高度次优的。此外,保存
int**array
更容易,因此可以通过
array[i][j]
访问元素(即使这需要两个
malloc()
用于
array
array[0]
和array[1:size-1`必须手动填充)
#include <mpi.h>

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

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

    size= 4;
    array = (int *)malloc(size*size*sizeof(int));

    if(rank==0)
    {
        int t= 0;
        for(i=0;i<size;i++) { for(j=0;j<size;j++){ array[i*size+j]=t++; } }
    }

    MPI_Bcast(array,size*size,MPI_INT,0,MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);
    printf("process %d printing matrix:\n",rank);

    for (i= 0; i <size;i++)
    {
        for(j= 0; j < size; j++)
            printf("%d [%d]\t",array[i*size+j],rank);
        printf("\n");
    }
    MPI_Finalize();
}