9

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 

更新: ハッシュ テーブルを 100,000 ではなく 1000 に事前設定するようにテスト コードを調整しました。再度実行すると、tbb は 92 オペレーション/秒を実行しますが、別の実装では 89431 オペレーション/秒を実行します。(64スレッド環境)…なんか言い方がおかしい…。

追加情報: コンピューターは、6 GB の RAM と 6 コアを搭載した HP Z600 ワークステーションです。

相互配置に注意してください: http://software.intel.com/en-us/forums/showthread.php?t=86119

4

1 に答える 1

12

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 ); } 
}; 
于 2011-09-16T21:53:36.380 に答える