Уже реализованы параллельные алгоритмы С++ 17?
Я пытался поиграть с новыми функциями параллельной библиотеки, предложенными в стандарте С++ 17, но я не мог заставить его работать. Я попробовал компиляцию с обновленными версиями g++ 8.1.1
и clang++-6.0
и -std=c++17
, но ни один из них не поддерживал #include <execution>
, std::execution::par
или что-то подобное.
При взгляде на cppreference для параллельных алгоритмов существует длинный список алгоритмов, требующих
Техническая спецификация предоставляет распараллеленные версии следующих 69 алгоритмов из algorithm
, numeric
и memory
: (... длинный список...)
похоже, что алгоритмы готовы "на бумаге", но еще не готовы к использованию?
В этом вопросе SO более года назад ответы утверждают, что эти функции еще не были реализованы. Но теперь я ожидал увидеть какую-то реализацию. Есть ли что-нибудь, что мы можем использовать уже?
Ответы
Ответ 1
Вы можете обратиться по адресу https://en.cppreference.com/w/cpp/compiler_support, чтобы проверить состояние реализации всех C++
. Для вашего случая просто Intel C++
поиск " Standardization of Parallelism TS
", и вы увидите, что только компиляторы MSVC
и Intel C++
поддерживают эту функцию сейчас.
Ответ 2
Intel выпустила параллельную библиотеку STL, которая следует за стандартом С++ 17:
Он сливается в GCC.
Ответ 3
Gcc еще не реализует TS параллелизма (см. Https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017)
Однако libstdc++ (с gcc) имеет экспериментальный режим для некоторых эквивалентных параллельных алгоритмов. См. Https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html.
Приступая к работе:
Любое использование параллельной функциональности требует дополнительной поддержки компилятора и времени выполнения, в частности поддержки OpenMP. Добавление этой поддержки не сложно: просто скомпилируйте приложение с флагом компилятора -fopenmp. Это будет ссылка на libgomp, библиотеку времени разгрузки GNU и многопользовательскую обработку, присутствие которой является обязательным.
Пример кода
#include <vector>
#include <parallel/algorithm>
int main()
{
std::vector<int> v(100);
// ...
// Explicitly force a call to parallel sort.
__gnu_parallel::sort(v.begin(), v.end());
return 0;
}
Ответ 4
GCC 9 будет иметь их
Упоминается по адресу https://gcc.gnu.org/gcc-9/changes.html.
Параллельные алгоритмы и (требуется Thread Building Blocks 2018 или новее).
Когда он получит метку релиза, я сделаю это. Интересно, чего потребует этот "Thread Building Blocks 2018".