【问题标题】:Error with MPI_BcastMPI_Bcast 出错
【发布时间】:2012-11-20 00:48:39
【问题描述】:

我收到 MPI_Bcast 错误(我认为这是一个旧错误)我不确定为什么会发生这种情况。错误如下:

An error occurred in MPI_Bcast    
on communicator MPI_COMM_WORLD  
MPI_ERR_TRUNCATE: message truncated      
MPI_ERRORS_ARE_FATAL: your MPI job will now abort

发生的代码是:

for (int i = 0; i < nbProcs; i++){
    for (int j = firstLocalGrainRegion; j < lastLocalGrainRegion; j++){
        GrainRegion * grainRegion = microstructure->getGrainRegionAt(j);
        int grainSize = grainRegion->getBoxSize(nb);
        double * newValues;
        if (myId == i)
            newValues = grainRegion->getNewValues();
        else
            newValues = new double[grainSize]; 
        MPI_Bcast(newValues, grainSize, MPI_DOUBLE, i, MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);

        if (myId != i)
            grainRegion->setNewValues(newValues);
    }   
}

【问题讨论】:

  • 您的问题可能与this question 中的问题相同。向我们展示更多代码上下文。
  • 另外:检查grainRegion-&gt;getBoxSize(nb) 在所有进程中返回的值是否相等,否则您可能会在MPI_Bcast 调用中得到不匹配的grainSize 值。
  • 请注意,所有进程的缓冲区必须相同(因为最终每个人都会在缓冲区中持有相同的东西)。如果要向所有进程发送 1 个值,则不需要整个数组。

标签: c++ mpi openmp


【解决方案1】:

错误有两个可能的原因。

第一个是你有一个待处理的上一个MPI_Bcast,在外循环之前的某个地方开始,它没有完成,例如方式类似于this question中的方式。

第二个可能是缓冲区大小不匹配,因为grainRegion-&gt;getBoxSize(nb) 在不同的进程中返回不同的值。您可以使用并行调试器检查代码,也可以在广播前添加一条打印语句,例如:

int grainSize = grainRegion->getBoxSize(nb);
printf("i=%d j=%d rank=%02d grainSize=%d\n", i, j, myId, grainSize);

使用这种特殊的输出格式,您应该能够简单地通过sort 运行输出,然后快速找到不匹配的值。由于屏障始终是同步的(广播可能不必如此),对MPI_Bcast 的不同调用几乎不可能像第一种可能的情况那样相互干扰。

如果发生这种情况,您的数据结构是分布式的,并且grainSize 的正确值确实仅在广播根进程中可用,那么您应该首先通知其他等级正确的大小。最简单(但不是最有效)的解决方案是广播grainSize。更好的解决方案是首先执行MPI_Allgather 与每个进程的颗粒区域数量(仅在必要时),然后执行MPI_Allgatherv 与每个区域的大小。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多