簡體   English   中英

C ++的並行性unordered_map

[英]Parallelism with C++ unordered_map

我有一個類型為std::unordered_map<std::string, int64_t> sMap 它包含許多字符串以及與每個字符串相關聯的“權重”。 我想找到N個最大權重的字符串。

如果我想使用單個線程執行此操作,我想可以創建像這樣的成對優先級隊列

std::priority_queue<
    std::pair<std::string, int64_t>,
    std::vector<std::pair<std::string, int64_t>>,
    std::function<bool(std::pair<std::string, int64_t>&,
            std::pair<std::string, int64_t>&)>> prQ(comparePair);

然后遍歷整個unordered_map,將元素插入到prQ中,同時保持長度N。

我想使用多個線程來達到相同的目的。 我當時正在考慮分配每個線程在unordered_map的幾個元素上工作,以創建一個長度為N的本地優先級隊列,該隊列可以在最后合並為一個全局隊列。

我現在面臨的問題是,我從unordered_map :: begin()獲得的迭代器不適用於+運算符。 至少那是我得到的error: no match for 'operator+' (operand types are 'std::unordered_map<std::basic_string<char>, long int>::iterator {aka std::__detail::_Node_iterator<std::pair<const std::b asic_string<char>, long int>, false, true>}' and 'int')error: no match for 'operator+' (operand types are 'std::unordered_map<std::basic_string<char>, long int>::iterator {aka std::__detail::_Node_iterator<std::pair<const std::b asic_string<char>, long int>, false, true>}' and 'int')因此,我無法真正指定特定對象要處理的元素范圍線。 []運算符將采用預期的鍵,而不是偏移量。

從本質上講,我似乎找不到一種可以使每個線程僅使用幾個元素的數據並行循環的方法。 那我該如何使用多個線程解決這個問題呢?

編輯:@Brian Vandberg請我提供一個簡化的示例代碼,該代碼會生成我正在談論的錯誤。

std::unordered_map<std::string, int64_t> sMap;
//Initialize sMap values
int start = 0, end = 2;
for(auto i = sMap.begin() + start; sMap.begin() + end; ++i) {
    std::cout<<i->first<<"\t"<<i->second<<"\n";
}

首先,我不確定是否要為此問題使用優先級隊列(單線程或作為特定線程執行的一部分)。 標准庫具有nth_element ,可用於在線性時間中找到第n個元素。 之后,找到哪個元素更大也是線性時間。

如果速度是問題,您可能會考慮,如果大小是問題,您可能會考慮( nth_element將有效地迫使您創建數據副本)。 在這個解決方案你迭代的地圖(或它的一部分)結束, push_back只有權重成vector ,在要執行nth_element 在第二階段,再次在地圖上循環,然后選擇權重較高的那些。


假設您有循環:

std::size_t j = 0;
for(const auto &e: sMap)
{
    if(++j % k != i)
        continue;
    // Rest of code goes here.
}

然后,如果將其用於k中的i個線程,它將在線程之間划分元素。 而且,雖然所有線程都在相同的元素上進行迭代(如果只是跳過它們中的大多數),則它是並行發生的。


每個線程可以針對最大m個元素生成其候選對象,然后使用上述方法(使用nth_element )或任何其他方法從km個候選對象中選擇最大m個元素。

有趣的是,在實踐中, sMap大小將產生任何加速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM