#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.