【问题标题】:TBB Concurrent Hash mapTBB 并发哈希图
【发布时间】:2011-09-16 19:20:04
【问题描述】:

我正在实现 tbb 的并发哈希映射,以将其性能与一组其他并发哈希表进行比较。

但是我得到的性能是可怕的,我简直不敢相信它与其他并发哈希表相比这么慢

这是我的实现:

class TBB: public TestDs{
    typedef tbb::concurrent_hash_map<int,int, HashCompare<int> > hash_t;
private:
        hash_t _ds;
public:
        TBB(const Configuration& config) : _ds(config.initial_count) {
        }

    bool containsKey(int key) {
        hash_t::accessor a;

        if(_ds.find(a,key)){
            return true;
        }
        else 
            return false;
    }

    int get(int key) {
        hash_t::accessor a;

        if(_ds.find(a,key)){
             return (int)(a->second);
        }
        else 
            return 0;
    }

    int put(int key, int value) {
        return _ds.insert( std::make_pair(key, value) );
    }

    int remove(int key) {
        return _ds.erase(key);
    }

    int size() {
        return _ds.size();
    }
    const char* name() {
        return "TBB";
    }
    void print() {}
    void shutdown() {}

};

有没有人发现我的实现有任何问题,或者知道它执行缓慢的任何原因? 在单线程环境中插入 200,000 个元素需要 30 多分钟。从这个角度来看,几乎所有其他表都在不到 5 分钟的时间内执行了此测试。

这是我的构建代码:

-w  -DNDEBUG -g -msse2 -m32  -DINTEL -D_REENTRANT -lrt -pthread -fno-strict-aliasing -l cds -l tbb -lllalloc 

更新:我已调整我的测试代码以将哈希表预填充为 1000,而不是 100,000。 再次运行时,tbb 执行 92 op/sec,而另一个实现执行 89431 op/sec。 (64线程环境)……光说好像不太对……

附加信息:计算机是 HP Z600 工作站,具有 6gb 内存和 6 个内核。

通知交叉定位于:http://software.intel.com/en-us/forums/showthread.php?t=86119

【问题讨论】:

  • 您在编译时没有启用优化?
  • 什么是“其他实现”?
  • 不管是什么原因,在禁用优化的情况下比较性能是没有意义的。您不妨比较一下卸下车轮后两辆车的速度。
  • @Steven:这与调试无关。如果打开优化会破坏您的代码,那么首先破坏的是您的代码。
  • @Steven:我没有时间看太深,希望其他人可以,但是这样看:TBB 数据结构不仅仅是业余爱好者的代码,它们由一些最优秀的人编程,并在其上进行测试。如果您遇到性能问题,要么是您与之比较的结构被破坏(例如,没有正确处理线程安全),要么您的测试代码没有反映数据结构的假设方式在实践中使用。我真的非常怀疑这不是 TBB 的错。试着看看你是否可以简化测试并找出问题。

标签: c++ hashmap tbb concurrenthashmap


【解决方案1】:

HashCompare::hash() 返回sizeof(int),我猜这意味着每个条目都映射到同一个桶中。看起来您并没有将它用作哈希表,而更像是一个链表。

您可以尝试使用 Boost 的哈希:

#include <boost/functional/hash.hpp>

template<typename K> 
struct HashCompare { 
    static size_t hash( const K& key )                  { return boost::hash_value(key); } 
    static bool   equal( const K& key1, const K& key2 ) { return ( key1 == key2 ); } 
}; 

【讨论】:

  • 你在哪里看到HashCompare的实现?
  • 天哪,谢谢!这很有意义!
  • 不客气。我希望它有效。我很想知道它与其他实现的实际比较。
  • 是的,TBB 现在在表修改(插入/更新/删除)少于总操作的 70% 的情况下表现更好。不管更高,我的桌子表现得更好。 (在 90% 时,我们每秒执行两倍的操作),目前我正在重写算法以删除一些状态变量,并进行其他改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多