TBB Concurrent Hash map - PullRequest
       11

TBB Concurrent Hash map

8 голосов
/ 16 сентября 2011

Я реализую параллельную хэш-карту 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() {}

};

Кто-нибудь видит какие-либо проблемы с моей реализацией или знает, по какой причине она может работать медленно?Требуется более 30 минут, чтобы вставить 200 000 элементов в среде с одним потоком.Чтобы представить это в перспективе, почти все другие таблицы выполняют этот тест менее чем за 5 минут.

Вот мой код сборки:

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

ОБНОВЛЕНИЕ: Я настроил свой код тестирования напредварительно заполните хеш-таблицы до 1000 вместо 100 000.При повторном запуске tbb выполняет 92 операции в секунду, в то время как другая реализация выполняет 89431 операции в секунду.(Среда 64 потоков) ... Просто сказать, что что-то кажется неправильным ....

Дополнительная информация: Компьютер представляет собой рабочую станцию ​​HP Z600 с 6 ГБ оперативной памяти и 6 ядрами.

ПримечаниеКрестовая позиция по адресу: http://software.intel.com/en-us/forums/showthread.php?t=86119

1 Ответ

12 голосов
/ 17 сентября 2011

You 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 ); } 
}; 
...