С++ 17 обновил 69 алгоритмов STL для поддержки parallelism, используя необязательный параметр ExecutionPolicy (как 1-й аргумент). например.
std::sort(std::execution::par, begin(v), end(v));
Я подозреваю, что стандарт С++ 17 сознательно ничего не говорит о как для реализации многопоточных алгоритмов, оставляя его для авторов библиотек, чтобы решить, что лучше (и позволяет им изменять их умы, позже). Тем не менее, я очень хочу понять на высоком уровне, какие проблемы рассматриваются при реализации параллельных алгоритмов STL.
Некоторые вопросы, на мой взгляд, включают (но не ограничиваются ими!):
- Как максимальное количество используемых потоков (приложением С++) связано с количеством ядер процессора и/или GPU на машине?
- Какие различия существуют в количестве потоков, используемых каждым алгоритмом? (Будет ли каждый алгоритм использовать любое количество потоков в каждом случае?)
- Есть ли какое-либо отношение к другим параллельным вызовам STL для других потоков (в одном приложении)? (например, если поток вызывает std:: for_each (par,...), будет ли он использовать больше/меньше/одинаковых потоков в зависимости от того, будет ли std:: sort (par,...) уже запущен на каком-то другом потоке (s)? Возможно ли пул потоков?)
- Рассматривается ли какое-либо отношение к тому, насколько заняты ядрами из-за внешних факторов? (например, если 1 ядро очень занято, скажем, анализируя сигналы SETI, будет ли приложение С++ уменьшать количество потоков, которое оно использует?)
- В некоторых алгоритмах используются только ядра ЦП? или только ядра GPU?
- Я подозреваю, что реализация будет отличаться от библиотеки к библиотеке (компилятор для компилятора?), даже подробности об этом будут интересны.
Я понимаю, что суть этих параллельных алгоритмов - защитить программиста от необходимости беспокоиться об этих деталях. Тем не менее, любая информация, которая дает мне представление высокого уровня о том, что происходит внутри вызовов библиотеки, будет оценена.