【发布时间】:2017-05-01 20:44:36
【问题描述】:
我正在尝试将 openmp 用于 for 循环,我试图在其中插入/更新哈希映射 (std::unordered_map)
哈希映射和键实际上是一个类的成员,所以我分配了指针来表示它们的地址。键也是一个全局函数返回的哈希值。
以下似乎是最简单的方法,但哈希映射未正确更新。有些东西是错的,但我不知道如何解决。在此先感谢。
void MyClass::ProcessBuffer(void)
{
omp_set_num_threads(4);
std::unordered_map<unsigned long long,unsigned int>* hashptr=&m_sequencehash;
std::vector<std::string>* bufferptr=&m_buffer;
unsigned int sizevec=m_kmer_size;
size_t i;
#pragma omp parallel for
for (i=0; i<READSTR_BUF_SIZE;++i)
{
++(*hashptr)[_hash((*bufferptr)[i],sizevec)];
}
}
【问题讨论】:
-
std::unordered_map不是线程安全的,因此您的代码存在竞争条件,从而导致未定义的行为。 -
只是好奇你将从并行操作中获得的性能提升,最终需要锁定线程安全?!
-
您可能会考虑使用 TBB 并发 hashmap threadingbuildingblocks.org/docs/help/tbb_userguide/… 您不需要使用 TBB 的其余部分,尽管这也可能有意义!
-
并发映射对于此目的来说是一种过度杀伤,因为它只需要在初始化步骤期间并发访问。但是,内存中的 map-reduce 库非常适合这种情况。
标签: c++ multithreading openmp