首页 > 后端开发 > C++ > OpenMP 并行 For 循环中'std::vector”的最佳替代品是什么?

OpenMP 并行 For 循环中'std::vector”的最佳替代品是什么?

Susan Sarandon
发布: 2024-12-05 12:30:11
原创
818 人浏览过

What are the Best Alternatives to `std::vector` in OpenMP Parallel For Loops?

C OpenMP 并行 For 循环:std::vector 的替代品

OpenMP 的并行 for 循环提供了一种并行化代码的便捷方法。然而,在这些循环中使用共享数据结构可能会引入性能瓶颈。一种常用的数据结构 std::vector 可能不是并行循环中共享使用的最佳选择。

std::vector 的替代品

For并行 for 循环中的最佳性能和线程安全性,请考虑以下替代方案std::vector:

具有用户定义缩减的 std::vector

OpenMP 4.0 引入了用户定义缩减,允许您为自定义数据定义自定义缩减操作结构。这种方法可以通过避免锁定共享数据的开销来提高性能。

示例:

#pragma omp declare reduction(merge : std::vector<int> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end()))

std::vector<int> vec;
#pragma omp parallel for reduction(merge: vec)
for (int i = 0; i < 100; i++) vec.push_back(i);
登录后复制

有序向量

如果共享向量中元素的顺序至关重要,请考虑以下因素方法:

std::vector<int> vec;
#pragma omp parallel
{
    std::vector<int> vec_private;
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < N; i++) vec_private.push_back(i);

    #pragma omp for schedule(static) ordered
    for (int i = 0; i < omp_get_num_threads(); i++) {
        #pragma omp ordered
        vec.insert(vec.end(), vec_private.begin(), vec_private.end());
    }
}
登录后复制

自定义并行向量类

对于复杂的共享数据结构,您可能需要实现自定义并行向量类来在循环期间处理大小调整,同时确保线程安全高效性能。

示例:

class ParallelVector {
private:
    std::vector<int> data;
    std::atomic<size_t> size;

public:
    void push_back(int value) {
        size++;
        data.push_back(value);
    }

    size_t getSize() {
        return size.load();
    }
};

ParallelVector vec;

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < 100; i++) vec.push_back(i);
}
登录后复制

std::vector 替代方案的选择取决于并行循环的具体要求。考虑线程安全、性能和易于实施等因素,为您的应用程序选择最合适的解决方案。

以上是OpenMP 并行 For 循环中'std::vector”的最佳替代品是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板