Czy istnieje sposób jawnego ustawienia/ograniczenia stopnia paralelizmu (= liczba oddzielnych wątków) używanego przez std::async
i powiązanych klas?Kontrola stopnia paralelizmu z std :: async
Perusing the thread support library nie znalazłem niczego obiecującego.
Tak blisko, jak mogłem się domyślić, implementacje std::async
(zwykle?) Korzystają z puli wątków wewnętrznie. Czy istnieje standardowy interfejs API do kontrolowania tego?
Dla tła: Jestem w ustawieniu (klastrze współdzielonym), w którym muszę ręcznie ograniczyć liczbę używanych rdzeni. Jeśli tego nie zrobię, planista dzielenia obciążenia rzuca dopasowanie i jestem ukarany. W szczególności, std::thread::hardware_concurrency()
nie zawiera żadnych użytecznych informacji, ponieważ liczba rdzeni fizycznych jest nieistotna dla ograniczeń, w których jestem.
Oto odnośny fragment kodu (co w C++ 17 z TS równoległości, prawdopodobnie być napisane przy użyciu 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;
}
Z punktu widzenia projektu bym oczekiwać std::execution::parallel_policy
klasa (od paralelizmu TS), aby umożliwić określenie, że (w rzeczywistości tak to zrobiłem w ramach zaprojektowałem dla mojej pracy magisterskiej). Ale tak się nie wydaje.
Idealnie chciałbym rozwiązania dla C++ 11, ale jeśli jest jeden dla późniejszych wersji nadal chciałbym o tym wiedzieć (choć nie mogę go użyć).
dlaczego używasz 'std :: async' na początek? Implementacje puli wątków i tak nie są zgodne, a standardowe zgodne z nimi otworzą nowy wątek dla każdego zadania. Tak czy siak, to jest do bani –
@DavidHaim Wydawało się to najłatwiejszym rozwiązaniem Próbuję napisać tak mało kodu, jak to tylko możliwe, aby przetwarzać te wywołania funkcji równolegle, i miałem nadzieję, że uda mi się uciec przy użyciu standardowej biblioteki. Wygląda na to, że nie. –
będziemy zmuszeni sami pisać rozwiązania, o ile komisja będzie nalegać na marnowanie czasu na podstawowe funkcje językowe zamiast na ważne nowoczesne narzędzia. –