Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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\u Win\u shared\u查询不返回实际大小?_C_Mpi_Shared Memory - Fatal编程技术网

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)。