MPI分段故障

MPI Segmentation fault

本文关键字:故障 分段 MPI      更新时间:2023-10-16

我正在使用MPI并行运行程序并测量执行时间。我目前通过在"voxelise"函数中给出起始和结束索引作为参数来分割每个进程之间的计算。这将处理数据集的不同部分,并将结果存储在"p_voxel_data"中。

然后我想使用"MPI_Gather"将所有这些子数组发送到根进程,以便数据可以写入文件并停止计时器。

程序执行良好,当我有"MPI_Gather"行注释掉,我得到类似于这样的输出:

Computing time: NODE 3 = 1.07 seconds.
Computing time: NODE 2 = 1.12 seconds.

但是当包含这一行时,我得到

"APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)

并且根节点0的计算时间显示为一个负数"-1.40737e+08"谁能建议任何问题在我的电话MPI_Gather?

int main(int argc, char** argv)
//-----------------------------
{
    int rank;
    int nprocs;
    MPI_Comm comm; 
    MPI::Init(argc, argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    /* Set up data for voxelise function */
    . . . . . .
    clock_t start(clock());
    // Generate the density field
    voxelise(density_function,
        a,
        b,
        p_control_point_set,
        p_voxel_data,
        p_number_of_voxel,
        p_voxel_size,
        p_centre,
    begin,
        endInd  );
    std::vector<float> completeData(512);
    std::vector<float> cpData(toProcess);
    std::copy(p_voxel_data.begin() + begin, p_voxel_data.begin() + endInd, cpData.begin());
    MPI_Gather(&cpData, toProcess, MPI::FLOAT, &completeData, toProcess, MPI::FLOAT, 0, MPI_COMM_WORLD);
    // Stop the timer
    clock_t end(clock());
    float number_of_seconds(float(end - start) / CLOCKS_PER_SEC);
    std::cout << "Computing time:t" << "NODE " << rank << " = " << number_of_seconds << " seconds." <<std::endl;
    if(rank == 0) {
    MPI::Finalize();
    return (EXIT_SUCCESS);
}

您正在给MPI_Gather地址向量对象,而不是地址向量数据。你必须这样做:

MPI_Gather(&cpData[0], toProcess, MPI::FLOAT, &completeData[0], ...

当然你也要确保尺寸是正确的