Можно ли проверить std::execution::par в заголовочном файле перед компиляцией?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли проверить std::execution::par в заголовочном файле перед компиляцией?

Сообщение Anonymous »

Я на Mac Ventura 13.6.4. Когда я изучаю онлайн -заголовок , я узнаю, что есть проблема при попытке составить некоторые политики выполнения. Например, с Clang я вижу, что использование std :: execution :: par в настоящее время не поддерживается для C ++ 17, я полагаю, потому что в Clang был сделан переключатель для использования Libc ++ вместо libstdc ++. Это означает, что Apple Clang в настоящее время не поддерживает политики выполнения, которые будут поддерживать другие компиляторы. Обратите внимание на красную окно, показанную в следующей диаграмме:
https://en.cppreference.com/w/cpp/compi ... y_features /> В настоящее время у нас есть какой -то код, который хорошо собирает GCC и Minggw, потому что они поддерживали Libstdc ++. Тем не менее, мы получаем ошибки при попытке компиляции с более новыми системами Mac, особенно при попытке использовать системный кланг или системный GCC (который указывает на Clang). Например, вот ошибка, которую мы получаем на Ventura 13.6.4 при попытке скомпилировать какой -то код, содержащий std :: execution :: par with System GCC или System Clang:
код:

Код: Выделить всё

#include 
#include 
#include 

int main(){
std::vector vec = {1, 2, 3, 4, 5, 10, 20, 4 };
std::sort(std::execution::par, vec.begin(), vec.end());

}
< /code>
Моя система Clang - Clang версия 14.0.3. Вот аргумент, который я предоставляю компилятору и полученную ошибку (поместить ... чтобы обозначить длинные компиляторы, которые не важны): < /p>
clang -std=c++17 -stdlib=libstdc++ ...

Ошибка:

Код: Выделить всё

clang: warning: include path for libstdc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
: fatal error: 'cstddef' file not found
#include 
^~~~~~~~~
< /code>
Когда я изменяю код, чтобы включить Libc ++, я получаю еще одну ошибку (также ставит ... для обозначения длинных аргументов компилятора, которые не важны): < /p>
clang -std=c++17 -stdlib=libc++ ...
< /code>
Ошибка компилятора: < /p>
no member named 'par' in 'std::exception'

Я думал, что это может быть связано с более молодой версией Clang, чем то, что там, поэтому я установил LLVM из Brew и получил версию 18 Clang.
Когда я запустил его с LLVM, я получил такую ​​же ошибку компилятора без участника, названного PAR в 'std :: Excection' .
Что интересно, есть Что когда я строю с G ++-13, который я скачал с Homebrew, я могу скомпилировать код. Я обнаружил, что Libstdc ++. Dylib находится в папке LIB для G ++-13, поэтому я думаю, что именно поэтому. Либо он связывается с этим и находит политику выполнения, либо нашла ее в заголовке выполнения, установленном с компилятором. Конкретные компиляторы, используемые в CPP, и определяют пару различных способов построения. Мне любопытно, есть ли способ определить, существует ли политика в заголовке. Например, я видел реализации с __has_include (...)

Код: Выделить всё

#if __has_include()
#include 
#define EXECUTION_POLICY
#endif

#ifdef EXECUTION_POLICY
// To use sequential processing, change "par" to "seq".
std::sort(std::execution::par, vec.begin(), vec.end());
#else
// Some compilers have not implemented execution policies.
std::sort(vec.begin(), vec.end());
Можно ли вместо этого определить, существует ли политика выполнения в заголовке файла? Насколько я понимаю, libstdc++ до версии Maveric 10.9 все еще существует.
Я ищу функцию или, возможно, какую-то реализацию, которая будет выглядеть так:

Код: Выделить всё

#look for the execution header
#if the execution header exists, look for 'par'
#if par exists, define EXECUTION_POLICY
#if par does not exist, run the code without the parallel policy
Мы думаем, что нас устраивает, что некоторые Mac не имеют возможностей распараллеливания с помощью std::execution::par. Например, если мы перепишем код, чтобы удалить политику выполнения, он по-прежнему компилируется и работает нормально.
Однако мы хотели бы сохранить возможность старых систем Mac используйте политику выполнения, поскольку у них есть доступ к libstdc++ (если я правильно понимаю). По сути, я ищу способ узнать, существует ли std::execution::par. Насколько я понимаю, std::execution::par на самом деле относится к перечислению. Не уверен, что можно просто определить, существует ли перечисление, прежде чем произойдет копиляция. Что вы думаете по этому поводу?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... compilatio
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Можно ли проверить std::execution::par в заголовочном файле перед компиляцией?
    Anonymous » » в форуме C++
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • Std::boyer_moore_searcher и std::execution::par недоступны в AppleClang 14.0.0
    Anonymous » » в форуме C++
    0 Ответы
    115 Просмотры
    Последнее сообщение Anonymous
  • Сравнение производительности параллельной сортировки: std::sort, std::execution::par и OpenMP
    Anonymous » » в форуме C++
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Сравнение производительности параллельной сортировки: std::sort, std::execution::par и OpenMP
    Anonymous » » в форуме C++
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Ошибка с std::execution::par при запуске Make на Mac M1 [дубликат]
    Гость » » в форуме C++
    0 Ответы
    75 Просмотры
    Последнее сообщение Гость

Вернуться в «C++»