繁体   English   中英

C++:使用 OpenMP 插入 std::vector

[英]C++: std::vector insert with OpenMP

我在以下 function 中遇到分段错误,它使用向量插入创建与 OpenMP 并行的点网格。

std::vector<n_point_t> fill_points(size_t Nn1, size_t Nn2) {
    std::vector<n_point_t> grid;
    grid.reserve(Nn1*Nn2);
    #pragma omp parallel for
    for (size_t i=0; i<Nn1; i++) {
        std::vector<n_point_t> subgrid = get_subgrid(Nn2);
        grid.insert(grid.begin()+i*Nn2, subgrid.begin(), subgrid.end());
    }
    return grid;
}

n_point_t定义为

union n_point_t {
    double coords[6];
    struct {
        double n1x;
        double n1y;
        double n1z;
        double n2x;
        double n2y;
        double n2z;
    };
};

get_subgrid(size_t Nn2)创建一个大小为Nn2n_point_t网格。

插入肯定是造成分段错误的原因。 我不明白这里的问题。 由于插入索引,每个线程都应该插入到grid的不同部分。

即使我使用#pragma omp critical保护插入,我也会遇到分段错误。

由于您确实提前调用了reserve() ,因此这里不会发生重新分配。 但是您将一个危险的参数grid.begin()+i*Nn2传递给insert 不能保证它是有效的迭代器。

如果subgrid的长度小于N2怎么办? 你会得到一个不连续的向量吗? 请不要这样做。 它在单个线程中工作,只是因为grid.begin()+i*Nn2恰好是有效的。 换句话说,不要试图去触碰向量的未使用的 memory。

如果必须使用多个线程,一种建议的解决方案可能是resize()向量并分配它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM