gpt4 book ai didi

c++ - MPI 段错误

转载 作者:行者123 更新时间:2023-11-28 06:59:28 40 4
gpt4 key购买 nike

我正在使用 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 地址提供给 vector 对象,而不是地址给 vector 数据。你必须这样做:

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

当然,您也必须确保尺寸正确。

关于c++ - MPI 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701623/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com