支持多线程方法来构建数组中所有元素的集合吗
Stand multi-threaded approach to build the set of all elements in an array?
我有一个要哈希的元素数组(它是一个模板数组;如果你喜欢,也可以是一个向量)和一个空哈希表。我有一个有几个核心(和超线程)的CPU,我想尽可能地利用它将所有数组元素插入到集合中。STL(或Boost或其他免费库)中是否有代码可以做到这一点?
我意识到一些琐碎的解决方案是:
- 使用并发/线程安全集(例如hash-backed),并让每个线程插入数组的一部分
- 让每个线程创建自己的集合,然后重复计算集合并集
但重点是我宁愿不写自己的代码,而是选择常用的代码编辑此外,我想要一个不需要我使用某些特定线程管理/池系统的解决方案,但我可以将其用于我的任意线程。
注意:
- 不用说,集合插入不会插入重复副本
- 数组可能有重复项(事实上,我希望集合元素的数量小于数组长度的1%,但不能总是这样)
- 该套件不需要支持元件移除,或者可能速度较慢等
在http://www.threadingbuildingblocks.org.特别地,有concurrent_unordered_set
和其他并发友好的容器,以及函数模板(例如parallel_for
和parallel_for_each
),以便于编写并行代码。TBB是开源和跨平台的。
同样的功能也存在于微软的并行模式库(ppl)中。
将矢量元素插入concurrent_unordered_set的一些代码草图。该代码使用最新版本的TBB进行了测试,但为了简洁起见,省略了一些部分。
#include <tbb/tbb.h>
#include <tbb/concurrent_unordered_set.h> // missing in tbb.h
int main() {
std::vector<MyDataType> v;
tbb::concurrent_unordered_set<MyDataType> s;
/* (1) */
tbb::parallel_for_each( v.begin(), v.end(), [&](const MyDataType& item){
s.insert(item);
} );
/* (2) */
tbb::parallel_for( size_t(0), size_t(v.size()), [&](size_t i){
s.insert(v[i]);
} );
/* (3) */
tbb::parallel_for(
tbb::blocked_range<std::vector<MyDataType>::iterator>(v.begin(), v.end()),
[&](const tbb::blocked_range<std::vector<MyDataType>::iterator>& range){
s.insert(range.begin(), range.end()); // inserts a sequence
}
);
return 0;
} // main
变体(1)是最简单的,但也是最慢的,因为parallel_for_each
当前不聚合循环迭代的处理。在这段代码中,单个迭代中的工作量太小,无法证明任务创建和执行的开销是合理的。
变体(2)使用parallel_for
,它在单个任务中聚合多个迭代,因此速度更快,但仍然非常简单。
变体(3)是最快的,但也是最冗长的。它显式地使用blocked_range
,从而向用户的代码公开聚合。这样做的好处是,给定范围内的所有向量元素都可以通过一次调用插入到集合中。它增加了几个百分点的性能,并且一些冗长可以用例如typedefs来隐藏。
免责声明:我是TBB开发人员。
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- c++找不到具有相同哈希的无序集合元素
- 从C++无序集合中高效提取元素
- 如何在比较时更改集合元素的值(在 c++ 中)?
- 打印无序映射的第二个元素,即集合
- 在集合中查找使用结构C++的元素
- 如何在集合中迭代替代元素(或进行特定大小的飞跃)?
- 消除集合的第一个元素
- 将集合的随机元素添加到列表中,然后将其从原始集合中移除
- 将字符串集合中的元素添加到字符串集合的向量中
- 如何从一个无序集合中获取一个元素
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- C++ 如何以特定模式遍历矢量的不同集合元素
- 生成所有可能的元素选择,每个元素都来自不同的集合
- 我们如何使用下面的集合构造函数构造设置元素
- 我可以在一行代码中将向量中与条件匹配的所有元素插入到集合中吗?
- 是否可以在C STL中获得集合的单个元素
- 如何替换集合中的元素
- 使用常量键从集合中擦除元素
- 访问双元素集合中的另一个元素的简洁语法是什么?