在 C++ OpenMP 中为每个线程定义一个优先级队列
Posted
技术标签:
【中文标题】在 C++ OpenMP 中为每个线程定义一个优先级队列【英文标题】:Define a priority queue per thread in C++ OpenMP 【发布时间】:2017-02-17 19:00:14 【问题描述】:我在 OpenMP 中并行化了一个 for 循环,我试图为每个线程创建一个优先级队列,以便我可以更新与线程对应的优先级队列,所以我正在尝试这样的事情:
#include <queue>
#include <omp.h>
void test()
// I need a priority queue per thread
// std::priority_queue<int> q_per_thread;
# pragma omp parallel for num_threads(10)
for(int i = 0; i < 100; i++)
// push i to the queue corresponding to the thread
这可能吗?
【问题讨论】:
并行循环后队列中的数据要做什么? 为什么每个线程都有一个队列和循环?循环用于数据并行,您不和不应该必须关心处理数据的线程。您不应该关注 task 并行性或代理吗? 【参考方案1】:您需要一组优先级队列,因为您将在并行 OpenMP 部分中拥有多个线程:
// I need a priority queue per thread
std::vector<std::priority_queue<int>> q_per_thread(10);
# pragma omp parallel for num_threads(10)
for(int i = 0; i < 100; i++)
// push i to the queue corresponding to the thread
q_per_thread[omp_get_thread_num()].push(i);
编辑:修复它
【讨论】:
在我看来这个答案***.com/a/42341174/2542702更好。【参考方案2】:如果优先级队列的范围只是并行区域,那么您可以编写此代码以使其明确(并避免构建线程数和令人不快的num_threads(10)
子句和omp_get_thread_num()
调用)类似这个
#pragma omp parallel
std::priority_queue<int> q;
#pragma omp for
for (int i = 0; i < 100; i++)
// push i to the queue corresponding to the thread
q.push(i);
... whatever else you're intending to do with the q ...
【讨论】:
以上是关于在 C++ OpenMP 中为每个线程定义一个优先级队列的主要内容,如果未能解决你的问题,请参考以下文章