使用MPI_Bcast(…)广播动态分配的2d阵列
我必须使用malloc动态创建一个数组,根进程会这样做,然后这些数组应该被广播到所有其他进程,这些进程现在将打印它,实际上需要的是其他进程将独立地更改矩阵的值。我的主要问题是我无法将整个阵列广播到所有进程使用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
#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();
}