Можно ли проверить 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, особенно при попытке использовать системный clang или системный gcc (который указывает на clang). Например, вот ошибка, которую мы получаем в Ventura 13.6.4 при попытке скомпилировать код, содержащий std::execution::par, с помощью системного gcc или системного clang:
code:

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

#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());

}
Моя система clang — версия clang 14.0.3. Вот аргумент, который я передаю компилятору, и полученная ошибка (ставя ... для обозначения длинных аргументов компилятора, которые не важны):

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

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 
^~~~~~~~~
Когда я меняю код, чтобы включить libc++, я получаю еще одну ошибку (также добавляя ... для обозначения неважных длинных аргументов компилятора):

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

clang -std=c++17 -stdlib=libc++ ...
Ошибка компилятора:

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

no member named 'par' in 'std::exception'

Я подумал, что это может быть связано с более молодой версией clang, чем та, что существует, поэтому я установил llvm из Brew и получил версию Clang 18.
Когда я запустил его с помощью llvm, я получил ту же ошибку компилятора: нет члена с именем par в 'std::excecution'.
Что интересно, что когда я собираю код с помощью 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 используйте политику выполнения, поскольку у них есть доступ к libstdС++ (если я правильно понимаю). По сути, я ищу способ узнать, существует ли 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 Ответы
    33 Просмотры
    Последнее сообщение 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++»