- 并发编程
- 高性能计算
【免费下载链接】oneTBB
oneAPI Threading Building Blocks (oneTBB)
导读
oneAPI Threading Building Blocks(oneTBB)是英特尔主导的开源 C++ 并行编程库,覆盖任务调度、并行算法、并发容器与内存分配等能力。本指南以仓库文档 doc/main/tbb_userguide/Mac_OS.rst 为核心,系统讲解 oneTBB 在 macOS* 平台上的安装目录结构、动态库命名与符号链接规则、CMake/pkg-config 集成文件以及环境脚本的用法,并结合仓库中的 cmake/config_generation.cmake、integration/mac/env/vars.sh.in、integration/pkg-config/tbb.pc.in 等源码级证据展开底层原理。读完本文,你将能熟练定位 macOS 上 oneTBB 的各组件、正确设置编译链接环境,并用 CMake 或 pkg-config 将 oneTBB 集成进自己的项目。
一、macOS 安装目录结构总览
oneTBB 文档约定使用<tbb_install_dir>表示安装的顶层目录(即安装前缀,例如通过-DCMAKE_INSTALL_PREFIX指定的路径)。以下表格完整描述了 macOS* 下各组件相对<tbb_install_dir>的存放位置及其对应的环境变量:
| 组件 | 位置 | 环境变量 |
|---|---|---|
| 头文件(Header files) | <tbb_install_dir>/include/oneapi/tbb.h<tbb_install_dir>/include/oneapi/tbb/*.h | C_INCLUDE_PATHCPLUS_INCLUDE_PATH |
| 共享库(Shared libraries) | <tbb_install_dir>/lib/<lib><variant>.<version>.dylib | LIBRARY_PATHDYLD_LIBRARY_PATH |
| 符号链接(Symbolic links) | <tbb_install_dir>/lib/<lib><variant>.dylib→<tbb_install_dir>/lib/<lib><variant>.<ver_major>.dylib<tbb_install_dir>/lib/<lib><variant>.<ver_major>.dylib→<tbb_install_dir>/lib/<lib><variant>.<ver_major>.<ver_minor>.dylib | — |
| CMake 文件 | <tbb_install_dir>/lib/cmake/tbb/*.cmake | — |
| pkg-config 文件 | <tbb_install_dir>/lib/pkgconfig/tbb.pc | — |
| vars 脚本 | <tbb_install_dir>/env/vars.sh | — |
上表中各占位符的含义如下:
- <lib>—— 动态库基础名,取值为
libtbb、libtbbmalloc或libtbbmalloc_proxy。其中libtbb是任务调度与并行算法主库,libtbbmalloc是可扩展内存分配器,libtbbmalloc_proxy是 malloc 替换代理库(Debug_Versus_Release_Libraries.rst 对其功能有进一步说明)。 - <variant>——
_debug或空字符串。空字符串表示 Release 库,_debug表示带内部正确性检查的 Debug 库(详见下文第八节)。 - <version>—— 二进制版本号,形式为
<ver_major>.<ver_minor>,例如12.2。
这套布局与 Linux* 版本(见 doc/main/tbb_userguide/Linux_OS.rst)最显著的区别是:macOS 的lib目录下不区分ia32/intel64架构子目录,动态库直接以lib/<lib><variant>.<version>.dylib的扁平形式存放,这一差异在 cmake/config_generation.cmake 的 Darwin 分支中得到了确认:set(TBB_LIB_PREFIX "lib")、set(TBB_LIB_EXT "${_${_tbb_component}_bin_version}.dylib"),且_libdir_for_pc_file直接指向${prefix}/lib。
二、头文件:统一入口与按功能拆分的子头文件
macOS 安装包中的头文件位于:
<tbb_install_dir>/include/oneapi/tbb.h—— 总入口头文件,一条#include即可引入全部公开 API;<tbb_install_dir>/include/oneapi/tbb/*.h—— 按功能拆分的子头文件。
在仓库中,这些头文件对应 include/oneapi/tbb.h 与 include/oneapi/tbb 目录下的约 96 个头文件,包括parallel_for.h、parallel_reduce.h、task_group.h、concurrent_queue.h、concurrent_hash_map.h、scalable_allocator.h、global_control.h等,覆盖并行算法、任务、并发容器、同步原语与内存分配五大类能力。此外还有兼容旧命名空间的 include/tbb 目录(如tbb/tbb.h、tbb/parallel_for.h),新代码建议优先使用oneapi/tbb.h。
要让编译器在编译期找到这些头文件,可设置环境变量:
export C_INCLUDE_PATH="${TBBROOT}/include:${C_INCLUDE_PATH}" export CPLUS_INCLUDE_PATH="${TBBROOT}/include:${CPLUS_INCLUDE_PATH}"其中C_INCLUDE_PATH对 C/C++ 编译均生效,CPLUS_INCLUDE_PATH专门作用于 C++ 编译。这两个变量正是 integration/mac/env/vars.sh.in 中实际导出的内容,与文档表格完全一致。
三、共享库命名规则与符号链接链
macOS 下 oneTBB 的共享库文件名为:
<lib><variant>.<version>.dylib例如 Release 主库可能是libtbb.12.2.dylib,Debug 主库是libtbb_debug.12.2.dylib,内存分配器对应libtbbmalloc.12.2.dylib等。其中<version>即上一节所述<ver_major>.<ver_minor>形式的二进制版本号,它与仓库 include/oneapi/tbb/version.h 中定义的__TBB_BINARY_VERSION直接对应——该宏的注释明确说明它"用于 SONAME、manifest 等",当前仓库取值为 12。
为了给链接器和运行时提供一个稳定的无版本号入口,安装包还创建了一条两级符号链接链:
<lib><variant>.dylib → <lib><variant>.<ver_major>.dylib <lib><variant>.<ver_major>.dylib → <lib><variant>.<ver_major>.<ver_minor>.dylib例如:
libtbb.dylib → libtbb.12.dylib libtbb.12.dylib → libtbb.12.2.dylib链接期只需指定-ltbb(即链接libtbb.dylib),运行时动态加载器再沿符号链接解析到具体的.12.2.dylib文件。这一"短名 → 主版本 → 完整版本"的层次结构是 macOS 动态库的典型布局,既方便-l<lib>形式的链接,也便于版本升级时保持向后兼容。
从源码角度验证:在 cmake/config_generation.cmake 的 Darwin 分支中,库扩展名被设置为"${_${_tbb_component}_bin_version}.dylib",其中_bin_version来自TBB_BINARY_VERSION等配置变量;该分支同时把_tbb_release_dll/_tbb_debug_dll直接赋值为_tbb_release_lib/_tbb_debug_lib(macOS 无独立导入库.lib,这一点与 Windows 不同),最终生成的 TBBConfig.cmake.in 即按NAMES lib<component><bin_version>.dylib的模式查找库文件并定义导入目标。
四、CMake 集成文件:find_package(TBB) 的机制
macOS 安装目录下的<tbb_install_dir>/lib/cmake/tbb/*.cmake是一组供 CMake 的find_package(TBB)使用的包配置与版本文件(生成模板见 cmake/templates/TBBConfig.cmake.in 与 cmake/templates/TBBConfigVersion.cmake.in)。在 CMake 配置阶段,TBBConfig.cmake.in 会按需查找三个组件tbb;tbbmalloc;tbbmalloc_proxy,并为每个组件创建TBB::<component>形式的IMPORTED SHARED 目标:
add_library(TBB::${_tbb_component} SHARED IMPORTED)目标自动携带INTERFACE_INCLUDE_DIRECTORIES(指向<tbb_root>/include),并区分 Release 与 Debug 两个导入配置(IMPORTED_LOCATION_RELEASE/IMPORTED_LOCATION_DEBUG,见 TBBConfig.cmake.in)。该模板还处理了组件内部依赖:tbbmalloc_proxy会自动追加依赖TBB::tbbmalloc(TBBConfig.cmake.in)。
在 macOS 上采用 CMake 集成只需两步(完整说明见 doc/GSG/integrate.rst):
find_package(TBB REQUIRED) target_link_libraries(my_executable TBB::tbb)若需要内存分配器或 malloc 替换,可链接多个目标,例如:
target_link_libraries(my_executable TBB::tbb TBB::tbbmalloc)如果想进一步启用实验性的 C++20 modules 支持,可以按 doc/GSG/integrate.rst 给出的方式把oneapi/tbb.cppm作为模块源加入目标:
get_target_property(_tbb_include_dir TBB::tbb INTERFACE_INCLUDE_DIRECTORIES) target_sources(my_executable PRIVATE FILE_SET cxx_modules TYPE CXX_MODULES BASE_DIRS ${_tbb_include_dir} FILES ${_tbb_include_dir}/oneapi/tbb.cppm )配置时,需确保CMAKE_PREFIX_PATH或TBB_DIR指向包含lib/cmake/tbb的目录,CMake 便会自动定位到TBBConfig.cmake。
五、pkg-config 支持:lib/pkgconfig/tbb.pc
macOS 安装目录下还提供了<tbb_install_dir>/lib/pkgconfig/tbb.pc,供 pkg-config 工具使用。仓库中的模板 integration/pkg-config/tbb.pc.in 生成的实际内容大致如下:
prefix=/path/to/tbb/install libdir=${prefix}/lib includedir=${prefix}/include Name: oneAPI Threading Building Blocks (oneTBB) Description: C++ library for parallel programming on multi-core processors. Version: 2023.2.0 Libs: -L${libdir} -ltbb Cflags: -I${includedir}注意 Darwin 分支只生成一个tbb.pc(不像 Linux 分支还额外生成tbb32.pc,见 cmake/config_generation.cmake),因为 macOS 下库文件不按 32/64 位架构分目录存放。
编译一个测试程序test.cpp只需一条命令:
g++ -o test test.cpp $(pkg-config --libs --cflags tbb)展开后的含义是:
pkg-config --cflags tbb输出-I<prefix>/include(头文件搜索路径);pkg-config --libs tbb输出-L<prefix>/lib -ltbb(库搜索路径与库名)。
如果tbb.pc不在系统默认 pkg-config 搜索路径中,请先设置PKG_CONFIG_PATH(这正是 integration/mac/env/vars.sh.in 导出的变量之一):
export PKG_CONFIG_PATH="${TBBROOT}/lib/pkgconfig:${PKG_CONFIG_PATH}"六、vars.sh:一键配置开发环境
安装目录下的<tbb_install_dir>/env/vars.sh是官方提供的一键环境配置脚本。仓库中的模板 integration/mac/env/vars.sh.in 展示了其完整行为——它会依次导出以下变量:
export TBBROOT=<install_dir> export DYLD_LIBRARY_PATH="${TBBROOT}/lib:${DYLD_LIBRARY_PATH}" export LIBRARY_PATH="${TBBROOT}/lib:${LIBRARY_PATH}" export C_INCLUDE_PATH="${TBBROOT}/include:${C_INCLUDE_PATH}" export CPLUS_INCLUDE_PATH="${TBBROOT}/include:${CPLUS_INCLUDE_PATH}" export PKG_CONFIG_PATH="${TBBROOT}/lib/pkgconfig:${PKG_CONFIG_PATH}"使用方式(安装完 oneTBB 后,在安装目录执行):
cd <tbb_install_dir> source env/vars.sh配置完成后,C_INCLUDE_PATH/CPLUS_INCLUDE_PATH让编译器找到头文件,LIBRARY_PATH/DYLD_LIBRARY_PATH让链接器与动态加载器找到libtbb*.dylib,PKG_CONFIG_PATH让 pkg-config 找到tbb.pc,一条命令即可覆盖第一节表格中列出的全部环境变量。需要注意source是在当前 shell 会话中生效的,若想固化,可将其写入~/.zshrc或~/.bash_profile。
七、实战:在 macOS 上编译并运行第一个 oneTBB 程序
下面这个示例来自 doc/GSG/next_steps.rst,用oneapi::tbb::parallel_reduce并行计算 1 到 100 的整数和:
#include <oneapi/tbb.h> #include <cstdio> int main() { int sum = oneapi::tbb::parallel_reduce( oneapi::tbb::blocked_range<int>(1, 101), 0, [](oneapi::tbb::blocked_range<int> const& r, int init) -> int { for (int v = r.begin(); v != r.end(); v++) { init += v; } return init; }, [](int lhs, int rhs) -> int { return lhs + rhs; } ); printf("Sum: %d\n", sum); return 0; }parallel_reduce会将blocked_range<int>(1, 101)划分成多个子区间并行求和,再把各分区的局部结果归约起来。配置正确时输出Sum: 5050。
方式一:CMake(推荐)
cmake_minimum_required(VERSION 3.1) project(example) find_package(TBB REQUIRED) add_executable(example example.cpp) target_link_libraries(example TBB::tbb)配置构建时通过CMAKE_PREFIX_PATH指向安装目录,例如:
cmake -DCMAKE_PREFIX_PATH=<tbb_install_dir> .. cmake --build . ./example方式二:pkg-config
source <tbb_install_dir>/env/vars.sh g++ -std=c++11 example.cpp -o example $(pkg-config --libs --cflags tbb) ./example方式三:直接指定路径编译
不借助任何工具时,需要显式给出头文件与库路径(macOS 下库位于lib/平铺目录,比 Linux 的lib/<arch>/gcc4.8更直接):
g++ -std=c++11 example.cpp -o example \ -I<tbb_install_dir>/include \ -L<tbb_install_dir>/lib -ltbb ./example注意:运行时动态加载器查找libtbb*.dylib依赖DYLD_LIBRARY_PATH(或 dylib 内记录的安装路径),因此直接链接方式下运行前也建议先执行source <tbb_install_dir>/env/vars.sh,或在构建时通过-Wl,-rpath,<tbb_install_dir>/lib写入 rpath。
八、Debug 与 Release 库的选择
macOS 安装包同时提供 Release 与 Debug 两套库,通过文件名的<variant>段区分(详见 doc/main/tbb_userguide/Debug_Versus_Release_Libraries.rst):
| 库 | 说明 | 适用场景 |
|---|---|---|
tbb_debug/tbbmalloc_debug/tbbmalloc_proxy_debug | 包含大量对库的正确使用方式的内部检查 | 配合以TBB_USE_DEBUG=1宏编译的代码 |
tbb/tbbmalloc/tbbmalloc_proxy | 追求最高性能,去除了大部分正确性检查 | 配合TBB_USE_DEBUG未定义或为 0 的代码 |
官方建议:先用 Debug 版本测试程序,确认对库的使用正确后,再切到 Release 版本发布;否则在 Release 版本下不正确的使用方式可能导致难以预期的行为。
Debug/Release 的选择通过编译宏TBB_USE_DEBUG控制,其取值(undefined、0、1、2)在 include/oneapi/tbb/version.h 中均有对应处理分支。另外,仓库中 doc/main/tbb_userguide/Debug_Versus_Release_Libraries.rst 还提到:oneTBB 支持 Intel Inspector / VTune Profiler / Advisor 等工具,完整支持需要以TBB_USE_PROFILING_TOOLS=1编译,该宏在TBB_USE_DEBUG=1时默认为 1。
九、从源码构建并安装到 macOS(补充)
如果你希望自己从源码构建 oneTBB(例如需要自定义安装前缀或关闭测试),可参考 INSTALL.md 与 cmake/README.md 中的说明,大体流程为:
# 克隆仓库 git clone https://gitcode.com/gh_mirrors/on/oneTBB.git cd oneTBB # 配置(自定义安装前缀,并关闭测试以加速构建) cmake -DCMAKE_INSTALL_PREFIX=<my_install_dir> -DTBB_TEST=OFF .. # 构建 cmake --build . # 安装(默认前缀在 UNIX 系为 /usr/local,可通过 CMAKE_INSTALL_PREFIX 覆盖) cmake --install .构建后安装目录的结构即与本文第一节的表格一致:头文件在<prefix>/include,动态库在<prefix>/lib,CMake 与 pkg-config 文件分别位于<prefix>/lib/cmake/tbb与<prefix>/lib/pkgconfig。
macOS 平台还有一个可选特性:通过 CMake 选项TBB_BUILD_APPLE_FRAMEWORKS可将tbb构建为 Apple framework(FRAMEWORK TRUE,并设置 bundle identifier 与版本信息,见 src/tbb/CMakeLists.txt),适合需要以.framework形式分发的场景;默认情况仍以普通.dylib安装。其他常用配置选项(如-DTBB_VERIFY_DEPENDENCY_SIGNATURE、构建类型Debug/Release等)的说明可参考 INSTALL.md。
结语
macOS 上的 oneTBB 安装布局可以用一句话概括:头文件集中在include/,动态库平铺在lib/且通过两级符号链接提供稳定的无版本入口,配套的 CMake、pkg-config 与vars.sh分别服务于不同集成方式。实际开发中,推荐优先使用find_package(TBB)+TBB::tbb的 CMake 方案,以获取平台无关的依赖管理;临时实验则可用source env/vars.sh后直接g++ -ltbb编译。相关进一步阅读:Integrate oneTBB、Next Steps、Package Contents、Debug Versus Release Libraries。
- 并发编程
- 高性能计算
【免费下载链接】oneTBB
oneAPI Threading Building Blocks (oneTBB)
相关推荐
Asciidoctor项目在macOS系统上的安装指南
Asciidoctor项目在macOS系统上的安装指南 还在为macOS上安装Asciidoctor而烦恼?本文提供最完整的安装方案,从新手到专家都能找到适合自
文档CLIXTool项目在macOS系统上的安装指南
XTool项目在macOS系统上的安装指南 前言 XTool是一款创新的开发工具,它允许开发者在不依赖Xcode构建系统的情况下进行声明式、基于Swift Pa
开发工具CLI移动开发在 macOS 上安装 Go 开发环境:Homebrew 安装、GOPATH 目录规划与环境变量配置实战指南
在 macOS 上安装 Go 开发环境:Homebrew 安装、GOPATH 目录规划与环境变量配置实战指南 本指南基于当前仓库 guides/installa
教程示例工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考