
C OpenMP 并行 For 循环:std::vector 的替代品
std::vector 是一种通用的数据结构,通常用于并行计算使用 OpenMP 循环。但是,在某些情况下,替代方案可能更合适,特别是在优先考虑速度或在循环期间遇到调整大小问题时。
共享数据结构的一个选项是使用 OpenMP 4.0 的自定义缩减。 's #pragma omp 声明减少。这减少了对关键部分的需求并简化了并行代码。
保留顺序的另一种替代方法是使用带有有序
部分的静态调度。这可以确保每个线程按顺序写入向量的特定部分,从而无需稍后合并。
在需要调整大小的场景中,使用
指针数组来跟踪线程的方法- 可以采用特定的前缀和。这种方法避免了在关键路径上调整大小的开销。
以下是这些替代方案的代码示例:
1 2 3 4 5 6 | #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);
|
登录后复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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中文网其他相关文章!