首页 >后端开发 >C++ >C OpenMP 并行 For 循环中 std::vector 的替代方案是什么?

C OpenMP 并行 For 循环中 std::vector 的替代方案是什么?

Barbara Streisand
Barbara Streisand原创
2024-11-28 20:30:13257浏览

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

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

std::vector 是一种通用的数据结构,通常用于并行计算使用 OpenMP 循环。但是,在某些情况下,替代方案可能更合适,特别是在优先考虑速度或在循环期间遇到调整大小问题时。

共享数据结构的一个选项是使用 OpenMP 4.0 的自定义缩减。 's #pragma omp 声明减少。这减少了对关键部分的需求并简化了并行代码。

保留顺序的另一种替代方法是使用带有有序

部分的静态调度。这可以确保每个线程按顺序写入向量的特定部分,从而无需稍后合并。

在需要调整大小的场景中,使用

指针数组来跟踪线程的方法- 可以采用特定的前缀和。这种方法避免了在关键路径上调整大小的开销。

以下是这些替代方案的代码示例:

// Custom reduction
#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);
// Static scheduling with ordered sections
std::vector<int> vec;
#pragma omp parallel
{
    int ithread = omp_get_thread_num();
    int nthreads = omp_get_num_threads();
    #pragma omp single
    {
        prefix = new size_t[nthreads + 1];
        prefix[0] = 0;
    }
    std::vector<int> vec_private;
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < 100; i++) {
        vec_private.push_back(i);
    }
    prefix[ithread + 1] = vec_private.size();
    #pragma omp barrier
    #pragma omp single
    {
        for (int i = 1; i < (nthreads + 1); i++)
            prefix[i] += prefix[i - 1];
        vec.resize(vec.size() + prefix[nthreads]);
    }
    std::copy(vec_private.begin(), vec_private.end(), vec.begin() + prefix[ithread]);
}
delete[] prefix;
根据要求为您的具体情况选择适当的替代方案和性能考虑。实验和分析可以帮助确定最佳解决方案。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn