C 为什么MPI\u Win\u shared\u查询不返回实际大小?
在下面的代码中,我正在测试C 为什么MPI\u Win\u shared\u查询不返回实际大小?,c,mpi,shared-memory,C,Mpi,Shared Memory,在下面的代码中,我正在测试MPI\u Win\u shared\u query是否返回查询的共享缓冲区的正确大小。在手册中,我理解为它应该返回实际尺寸。然而,当我使用MPICH进行测试时,我意识到它返回“大约”字节,同样地,当我使用openmpi进行测试时。注意,我说的是“around”,它不返回确切的字节数 因此,问题是我们是否可以相信MPI\u Win\u shared\u query确实给出了准确的大小,或者我们应该从另一种方法获得大小-它应该返回以字节为单位的大小或实际的元素数 代码可以
MPI\u Win\u shared\u query
是否返回查询的共享缓冲区的正确大小。在手册中,我理解为它应该返回实际尺寸。然而,当我使用MPICH
进行测试时,我意识到它返回“大约”字节,同样地,当我使用openmpi
进行测试时。注意,我说的是“around”,它不返回确切的字节数
因此,问题是我们是否可以相信MPI\u Win\u shared\u query
确实给出了准确的大小,或者我们应该从另一种方法获得大小-它应该返回以字节为单位的大小或实际的元素数
代码可以使用两个核心运行:mpirun-np2./exe
#include <mpi.h>
#include<stdlib.h>
#include<stdio.h>
int main( int argc, char *argv[])
{
MPI_Init(&argc, &argv);
MPI_Win win;
MPI_Comm MPI_COMM_SHM;
int rank;
long int mb = 0;
double* bufptr;
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
int MB = 10000;
if(rank==0) mb = MB*1e6/sizeof(double);
MPI_Comm_split_type( MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, &MPI_COMM_SHM);
MPI_Aint size_bytes,size_of_T, lb;
MPI_Info infoAlloc;
MPI_Info_create( &infoAlloc );
MPI_Info_set( infoAlloc, "alloc_shared_noncontig", "true" );
MPI_Type_get_extent(MPI_DOUBLE_PRECISION, &lb, &size_of_T);
size_bytes = mb*size_of_T;
int disp_unit = size_of_T;
printf("%Size when sending:===> bytes: %ld nelem: %ld %ld\n", size_bytes, mb, size_of_T);
MPI_Win_allocate_shared( size_bytes, disp_unit, infoAlloc
, MPI_COMM_SHM, &bufptr, &win);
double *rbuf;
MPI_Aint rsize;
int disp;
if(rank != 0)
{
MPI_Win_shared_query(win, 0, &rsize, &disp, &rbuf);
printf("Receiving sizes %d %ld %ld\n", rank, rsize, rsize/disp);
}
MPI_Finalize();
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
MPI_Init(&argc,&argv);
MPI_Win Win;
MPI_通信MPI_通信SHM;
整数秩;
长整型mb=0;
双*bufptr;
MPI通信等级(MPI通信世界和等级);
int MB=10000;
如果(秩==0)mb=mb*1e6/sizeof(双精度);
MPI通信分割类型(MPI通信世界、MPI通信类型共享、0、MPI通信信息NULL和MPI通信SHM);
MPI_Aint size_字节,size_of T,lb;
MPI_信息公开;
MPI\u信息\u创建(&infoAlloc);
MPI_信息集(infoAlloc,“alloc_shared_nonctig”,“true”);
MPI类型获取范围(MPI双精度、磅和尺寸);
size_bytes=mb*size_/T;
int disp_单位=T的大小;
printf(“%发送时的大小:=>字节数:%ld nelem:%ld%ld\n”,大小为字节数,mb,大小为字节数);
MPI_Win_allocate_shared(大小字节、显示单元、信息分配)
,MPI_COMM_SHM和bufptr及win);
双*rbuf;
MPI___rsize;
int disp;
如果(秩!=0)
{
MPI_Win_共享_查询(Win、0、&rsize、&disp、&rbuf);
printf(“接收尺寸%d%ld%ld\n”,等级,rsize,rsize/disp);
}
MPI_Finalize();
}
“在每个进程上,它分配大小至少为字节的内存,这些内存在comm
中的所有进程之间共享,并返回指向baseptr
中本地分配的段的指针,该段可用于调用进程的加载/存储访问。”将alloc\u shared\u nonctig
设置为true
允许MPI分配非连续内存,因此它可能会将分配填充并对齐到内存页边框(x86上为4 KiB)。