Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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++ 带有memcpy错误的简单MPI_聚集测试_C++_C_Amazon Web Services_Parallel Processing_Mpi - Fatal编程技术网

C++ 带有memcpy错误的简单MPI_聚集测试

C++ 带有memcpy错误的简单MPI_聚集测试,c++,c,amazon-web-services,parallel-processing,mpi,C++,C,Amazon Web Services,Parallel Processing,Mpi,我正在学习MPI,并尝试创建一些函数的示例。我有好几份工作要做,但我在MPI_Gather方面遇到了问题。我有一个更复杂的拟合测试,但我把它缩减到最简单的代码。但是,我仍然得到以下错误: root@master:/home/sgeadmin# mpirun ./expfitTest5 Assertion failed in file src/mpid/ch3/src/ch3u_request.c at line 584: FALSE memcpy argument memory ranges o

我正在学习MPI,并尝试创建一些函数的示例。我有好几份工作要做,但我在MPI_Gather方面遇到了问题。我有一个更复杂的拟合测试,但我把它缩减到最简单的代码。但是,我仍然得到以下错误:

root@master:/home/sgeadmin# mpirun ./expfitTest5
Assertion failed in file src/mpid/ch3/src/ch3u_request.c at line 584: FALSE
memcpy argument memory ranges overlap, dst_=0x1187e30 src_=0x1187e40 len_=400

internal ABORT - process 0
我正在通过AWSEC2运行一个主实例和两个节点实例。我已经安装了所有合适的库,因为我已经安装了其他MPI示例。我的计划是:

int main()
{
    int world_size, world_rank;
    int nFits = 100;
    double arrCount[100];
    double *rBuf = NULL;

    MPI_Init(NULL,NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    assert(world_size!=1);
    int nElements = nFits/(world_size-1);

    if(world_rank>0){
    for(int k = 0; k < nElements; k++)
    {
            arrCount[k] = k;
    }}

    MPI_Barrier(MPI_COMM_WORLD);

    if(world_rank==0)
    {
            rBuf = (double*) malloc( nFits*sizeof(double));
    }

    MPI_Gather(arrCount, nElements, MPI_DOUBLE, rBuf, nElements, MPI_DOUBLE, 0, MPI_COMM_WORLD);

    if(world_rank==0){
    for(int i = 0; i < nFits; i++)
    {
            cout<<rBuf[i]<<"\n";
    }}

    MPI_Finalize();

  exit(0);
}
intmain()
{
int世界大小、世界排名;
int nFits=100;
双计数[100];
double*rBuf=NULL;
MPI_Init(NULL,NULL);
MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小);
MPI通信等级(MPI通信世界级和世界级);
断言(世界大小!=1);
国际要素=nFits/(世界规模-1);
如果(世界排名>0){
对于(int k=0;kcout收集操作中的
root
进程确实参与了该操作。即,它将数据发送到自己的接收缓冲区。这也意味着您必须为其在接收缓冲区中的部分分配内存


现在您可以使用
MPI\u Gatherv
并指定一个
recvcounts[0]//Cuth> <代码> StEntCys>代码0,以密切关注您的示例。但是通常您会以一种root参与同样的方式来编写MPI应用程序,即“代码> int NealsNoSt/Word大小”/Cuff.< /P>您将其标记为C++,但这不是有效的C++:<代码> int nFoint=100;双AcCuT[nFut]第二,在执行此操作之前,您从未检查过
world\u size==1
int-nElements=nFits/(world\u size-1);
。第三,如果调用
MPI\u-Gather
rBuf
是空指针怎么办?
int-nElements=nFits/(world\u size-1)
应该是
int-neelements=nFits/world\u size;
不是吗?world\u size=3,一个主节点和两个节点。元素只在两个节点上拆分,但是world\u size包括主节点,所以我们从元素数量中删除它。对于未接收的进程,在MPI\u聚集中rBuf应该为空,所以在本例中,ld_rank==1和world_rank==2。因此,所有代码都可以正常工作。这些问题都没有真正解决我收到的错误。@HoosierPhysics--是的,但您没有测试这些错误条件,我们所拥有的只是您发布的代码。我们看不到这些变量背后的内容。您仍然有rank#0向发送数据因此,接收缓冲区<代码> RBUF 需要是“代码> NEnths*WorksSimule Load。目前,您有缓冲区溢出。您还可以考虑使用<代码> MPIIGeNoD()/<代码>代替 MPIySead()。
如果认为更方便的话。啊,这正是我所困惑的。关于MPI_Gather的示例和文档并没有真正说明这一点。这为我澄清了一切。如果是这样,用MPI实现主/节点系统的最佳实践是什么?如果我有一个主实例和100个节点实例的系统ces,我要在它们之间拆分一个计算,我真的要在这个过程中包含主进程吗?所以在101个实例之间拆分计算,然后进行收集?你可能混淆了集体根和主/从系统中主进程的概念。根进程基本上是一个正常的进程/秩,在主/从系统中起着特殊的作用集体操作。根进程通常参与计算。而主进程被认为是主动将任务分配给工作进程/从进程的人。主进程通常不参与计算。主进程/从进程习惯用法用于动态分配任务,而集体操作通常运行对区域分解进行分析。