Как использовать новые политики выполнения C++17?

Я читал документацию std::algorithm по адресу cppreference.com и я заметил тег C++17 на многих участках классных вещей, которыми я еще не пользовался. Больше всего мое внимание привлекли новые политики выполнения. Прочитав о них, я понял, что я могу сделать любой цикл for_each многопоточным, просто указав политику выполнения.

Например, у меня есть программа, которая выводит изображение с 2D-графикой.

int main(){
    std::for_each(
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

Если я хочу сделать эту программу многопоточной, я смогу сделать это одной строкой.

int main(){
    std::for_each(
        std::execution::par_unseq, // c++17 feature
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

Однако, когда я впервые попробовал это (с g++ -std=c++17), я получил сообщение об ошибке, говорящее мне, что ‘std::execution’ has not been declared, поэтому я попытался добавить #include <execution>, но он говорит execution: No such file or directory. Я также пробовал #include<experimental/algorithm> вместо #include<algorithm>, но результат тот же. Как использовать эту новую функцию?


person Willy Goat    schedule 02.03.2017    source источник
comment
Убедитесь, что ваш g++ поддерживает эту функцию. C++17 даже официально еще не готов, скорее всего, еще несколько месяцев.   -  person chris    schedule 03.03.2017
comment
libstdc++ еще не поддерживает эту функцию, см. статус P0024R2: нет: gcc.gnu.org/onlinedocs/libstdc++/manual/   -  person    schedule 03.03.2017
comment
@underscore_d текст справки по причине дублирования закрытия читает что-то близкое к на этот вопрос уже был дан ответ в .... Не обязательно, чтобы Q был одинаковым. Вы должны ответить на старый вопрос и затем закрыть этот как дубликат.   -  person YSC    schedule 27.09.2018
comment
(это была неконкретная мысль, здесь я согласен, что это дубликат)   -  person YSC    schedule 27.09.2018


Ответы (4)


c++17 еще не был окончательно оформлен. И различные компиляторы еще не до конца его реализовали.

-std=c++17 означает «дайте мне весь С++ 17, который вы закончили», а не «будьте совершенно корректным компилятором С++ 17».

На данный момент эта функция не поддерживается вашим компилятором и/или стандартной библиотекой. Загляните через несколько недель/месяцев/лет.

Не существует общепринятого флага «пожалуйста, дайте мне C++17, если вы его полностью поддерживаете, а в противном случае дайте мне ошибку», который вы можете передать компилятору; отчасти потому, что от него мало практического применения. Если подмножества C++17, которое они предоставляют, достаточно, то вы выиграли. И если вам нужен полностью совместимый компилятор, определенные версии компиляторов не знают, есть ли в них ошибки, поэтому вы все равно не можете доверять флагу и должны будете протестировать его на версиях компилятора. И если вы уже знаете, какие версии компилятора имеют достаточно корректный C++17, вам не нужен флаг, чтобы сообщить вам об этом.

person Yakk - Adam Nevraumont    schedule 03.03.2017
comment
Есть ли какой-либо компилятор в какой-либо новейшей версии, которая его поддерживает? Я пробовал clang на транке и gcc 7. - person Zitrax; 26.03.2017
comment
-std=c++17 означает дать мне весь C++17, который вы закончили, а не быть абсолютно корректным компилятором C++17. Я думал, для этого и предназначено -std=c++1z? Что мне не хватает? - person Cássio Renan; 09.04.2018
comment
@cassio 1z предназначен до того, как C ++ 17 будет завершен; он может полностью реализовывать вещи, которые изменяются в стандарте или удаляются и т. д. 17 — это когда стандарт готов, но ваша поддержка может быть неполной. Или, другими словами, MSVC только что закончила поддержку C++11 в своем последнем патче (игнорируя ошибки). - person Yakk - Adam Nevraumont; 09.04.2018

Насколько я понимаю из cppreference, эта функция определена в документе P0024R2 и еще не поддерживается ни одним компилятором.

person Vladimir Nechaev    schedule 20.08.2017

Если вы используете g++, вы можете попробовать нестандартное расширение:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

person sashang    schedule 08.12.2017

Для компилятора Microsoft: см. C++17 Progress in VS 2017 15.5 и 15.6, где вы найдете:

Status  Std   Paper   Title
Partial C++17 P0024R2 Parallel Algorithms

Для GCC, как Фанаэль написал в своем comment, см. таблицу 1.5. Статус реализации C++ 2017 на https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017, где вы найдете

Library Feature                             Proposal    Status
The Parallelism TS Should be Standardized   P0024R2     No
person Alessandro Jacopson    schedule 09.04.2018