微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。