我有一个C ++程序,它可以很好地使用OpenMP来并行化循环。
但是,有一些代码片段 - 那些使用队列和优先级队列等的代码 - 如果我声明对它们的访问权限很关键,它们只能并行工作。
另一种选择是使用TBB数据对象,例如concurrent_queue
。但是,我可以将这些数据对象与OpenMP一起使用,而不使用任何其他TBB吗?
赞赏来源和链接。
谢谢!
更新
例如,是否允许TBB和OpenMP的以下混合使用?
concurrent_queue<int> queue;
#pragma omp parallel for
for( int i=0; i<1000; i++ )
queue.push(i);
答案 0 :(得分:3)
为了补充其他人的答案,您正在寻找的信息也可以在TBB教程中找到(参见latest TBB documentation)。几段摘录:
英特尔®线程构建模块与其他线程兼容 包。因为该库不是为解决所有线程问题而设计的, 它可以与其他线程包无缝共存。
-
英特尔®线程构建模块提供高度并发的容器 类。这些容器可以与原始Windows *或Linux *线程一起使用,也可以在 与基于任务的编程相结合。
答案 1 :(得分:1)
TBB旨在与openMP协同工作,在程序员手册中列出了有效的方法。
您可以随时将关键部分更改为TBB互斥锁,或使用scoped_locks将std :: mutex更改为。
答案 2 :(得分:0)
tbb中的所有并发数据结构和同步对象对OpenMP都可以正常工作(任务也会如此,但这可能有点傻)。