c 17 параллельных алгоритмов и CMake

#c #cmake #parallel-processing #c -standard-library #tbb

# #c #cmake #параллельная обработка #c -стандартная библиотека #tbb

Вопрос:

Похоже, что все больше и больше реализаций стандартных библиотек полагаются на TBB для своих параллельных алгоритмов. Это немного удивительно для меня, так как я не думал, что стандартные библиотеки будут иметь внешние зависимости (помимо подобных вещей pthread ), но это другой вопрос, который я себе представляю.

Моя проблема в том, что мне нужно сейчас вставить это в мои файлы. CMakeLists.txt

Первая плохая новость: официальной поддержки CMake для TBB нет, а сам TBB не предоставляет никаких FindTBB.cmake файлов. Вы можете найти его здесь и там в Интернете, но если стандартные библиотеки начнут полагаться на него, было бы неплохо, чтобы он официально поддерживался CMake. Идет ли это дальше по линии?

Затем мне нужно иметь в моем файле немного запутанный код CMakeLists.txt , чтобы find_package(TBB REQUIRED) при необходимости связать соответствующие целевые объекты (в зависимости от стандартной библиотеки, версии и т.д.). Похоже, Conan уже предлагает пакет, который скрывает все это от пользователя. Вы просто получаете parallelstl и все. Будет ли у нас что-то подобное в CMake в будущем?

Мы уже можем использовать эти параллельные алгоритмы в CMake сегодня, но было бы здорово упростить создание таких проектов.

Комментарии:

1. Хм, какие реализации стандартной библиотеки делают это? Предполагается, что стандартная библиотека должна быть автономной. Если ваш требует, чтобы вы ссылались на какую-то другую библиотеку, то это реализация низкого качества.

2. @PeteBecker GCC 9 libstdc (версия 9.1 )

3. youtu.be/-KT8gaojHUU описывает текущую ситуацию. По-видимому, libcxx также должно зависеть от TBB, поскольку он использует ту же реализацию, что и Intel. Однако их план состоит в том, чтобы заменить параллельный серверный сервер в какой-то момент в будущем.

4. Что касается CMake в TBB: недавно TBB перешел на CMake, в настоящее время он еще не выпущен в производство, но доступен в ветках master и onetbb_2021 . Кроме того, выпуски TBB поддерживают интеграцию CMake. Вот несколько инструкций для TBB 2020 и старше, как его использовать find_package(TBB) .

5. @Touloudou, ммм, звучит как одна из тех замен, которые мы ждем вечно, но никогда не происходят.

Ответ №1:

У меня есть Ubuntu 21.10 с установленными GCC и TBB ( libtbb-dev 2020.3-1 ). Поскольку TBB использует pkg-config то, что сработало для меня, это:

 # file CMakeLists.txt

find_package(PkgConfig REQUIRED)
pkg_search_module(TBB REQUIRED tbb)
link_libraries(PkgConfig::TBB)
 

К сожалению, когда я позже установил intel-oneapi 2021.4.0 which включает в себя свой собственный TBB (in /opt/intel/oneapi ), это перестало работать.
По-видимому, эта более новая версия TBB не может использоваться в качестве резервной копии для (параллельного) STL GCC (генерирует ошибки компиляции в моей системе), поэтому я сделал это, чтобы выбрать TBB системы, а не /opt/intel версию.

 link_libraries(-ltbb) #(PkgConfig::TBB)
 

Это противоречит цели CMake, поэтому я также ищу более надежное решение.
На данный момент я рекомендую не устанавливать oneapi TBB, если вы хотите, чтобы он работал с системным GCC.