是否有明確設置/限制std::async
和相關類使用的並行度(=單獨線程數)的方法?與std :: async並行的控制程度
Perusing the thread support library還沒有出現任何有希望的東西。
盡我所知,std::async
實現(通常是?)在內部使用線程池。是否有標準化的API來控制它?
對於背景:我在設置(共享羣集),我必須手動限制使用的核心數量。如果我沒有做到這一點,負載分擔調度程序會發生變化,我會受到懲罰。特別是,std::thread::hardware_concurrency()
沒有保存任何有用的信息,因爲物理核心的數量與我所處的約束無關。
這裏有一個相關的代碼(在C++ 17並行TS,可能會被使用parallel std::transform
寫):
auto read_data(std::string const&) -> std::string;
auto multi_read_data(std::vector<std::string> const& filenames, int ncores = 2) -> std::vector<std::string> {
auto futures = std::vector<std::future<std::string>>{};
// Haha, I wish.
std::thread_pool::set_max_parallelism(ncores);
for (auto const& filename : filenames) {
futures.push_back(std::async(std::launch::async, read_data, filename));
}
auto ret = std::vector<std::string>(filenames.size());
std::transform(futures.begin(), futures.end(), ret.begin(),
[](std::future<std::string>& f) {return f.get();});
return ret;
}
從設計的角度來看我期待有std::execution::parallel_policy
(從並行TS),以允許指定(事實上,這是我在我爲我的碩士論文設計的框架中是如何做到的)。但似乎並非如此。
理想情況下,我想爲C++ 11提供一個解決方案,但如果有一個用於更高版本的解決方案,我仍然想知道它(儘管我無法使用它)。
爲什麼你使用'std :: async'開頭?線程池實現不符合標準,並且標準符合的將爲每個任務打開一個新線程。無論如何,它吸引 –
@DavidHaim這似乎是最簡單的解決方案。我試圖儘可能少編寫代碼來並行處理這些函數調用,而且我希望能夠使用標準庫而不必使用它。顯然不是。 –
只要委員會堅持浪費時間在覈心語言功能上而不是重要的現代功能上,我們就會被迫自己寫解決方案。 –