OpenMP:如何优化线程安全的哈希表

问题描述

我正在尝试为性能关键型应用程序制作一个哈希表 (unordered_map) 线程安全的。我正在使用 OpenMP 来处理多线程。我尝试的第一个解决方案是对哈希表 critical 进行所有访问,但这最终降低了线程的性能,以至于并行版本不再更快。然后我想到了以下想法:制作 100 个单独的哈希表,初始化为空集,并将它们存储在一个数组中。使用一些哈希函数将键映射到范围[0,1,...,99],并将值存储在相应的哈希表中。下面是一个代码来演示这个想法:

auto hash_vec = vector<unordered_map<int,int> >(100); 
int prime = 534161472029; // some big prime
int rand_int = rand();  // random int used for 
int simple_hash(int v) {
     return (rand_int * v) % prime;
}
void safe_write(int key,int val) {
    int h = simple_hash(key) % 100;
    hash_vec[h][key] = val; // must be made safe
}
int safe_read() {
     int h = simple_hash(key) % 100;
     int val = hash_vec[h][key]; // must be made safe
     return val;
}

所以这个想法是,如果 h 的值不同,就不会有任何竞争条件。例如,如果 simple_hash(k1) 不等于 simple_hash(k2),同时调用 safe_write(k1,v1)safe_write(k2,v2) 不会导致任何线程等待。这样的事情可能吗?如果没有,是否有更好的方法来确保性能不会受到太大影响?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)