2014-03-27 51 views
0

我使用MPI并行运行的程序和措施的执行时间。我目前正在通过在“voxelise”函数中给出一个开始和结束索引作为参数来分割每个进程之间的计算。这将在数​​据集的不同部分工作,并将结果存储在“p_voxel_data”中。MPI分段故障

我当时想所有这些子阵列发送到使用“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); 
} 

回答

1

你给MPI_Gather地址矢量对象,不涉及到矢量数据。 你必须做到:

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

当然,你必须确保尺寸是正确的了。

+0

这似乎是现在的工作表示感谢。 –