并发编程高性能计算【免费下载链接】oneTBBoneAPI Threading Building Blocks (oneTBB)项目地址https://gitcode.com/gh_mirrors/on/oneTBB点击查看免费下载oneTBBoneAPI Threading Building Blocks的全部公共接口通过一组 C 头文件对外暴露并同时提供面向旧版 TBB 的兼容头文件路径以及实验性的 C20 模块接口单元tbb.cppm。本文以官方参考文档 headers_and_modules.rst 为骨架结合仓库内真实头文件、模块实现与测试用例系统讲解头文件目录布局、tbb/tbb.h伞形头文件的组织方式以及如何在 CMake 工程中编译并导入tbb模块读完即可在你的项目中正确选择头文件引入方式并完成 C20 模块化改造。1. 头文件体系总览oneTBB 的公共 API 全部由头文件定义安装后头文件位于install-prefix/include目录下分为两套平行的路径目录用途install-prefix/include/oneapi/tbb主 API 头文件目录所有 oneTBB 接口的正式定义位置install-prefix/include/tbb兼容头文件目录为旧版 TBB 用户提供相同的头文件集合此外在install-prefix/include/oneapi/下还有一个特殊的源文件tbb.cppm即 C20 模块接口单元实验特性详见第 4 节。整个include/目录在构建时通过 CMakeLists.txt 中的install(DIRECTORY include/ ...)整体安装因此两套路径会一起被部署。在仓库中include/oneapi/tbb/目录实际包含约 50 个独立头文件覆盖并行算法、并发容器、互斥、内存分配、任务调度、流图等全部功能域例如并行算法parallel_for.h、parallel_reduce.h、parallel_pipeline.h、parallel_sort.h、partitioner.h等并发容器concurrent_hash_map.h、concurrent_queue.h、concurrent_vector.h、concurrent_unordered_map.h等互斥与同步mutex.h、rw_mutex.h、spin_mutex.h、queuing_mutex.h、null_mutex.h等内存分配scalable_allocator.h、cache_aligned_allocator.h、tbb_allocator.h、memory_pool.h等任务调度与任务组task.h、task_arena.h、task_group.h、task_scheduler_observer.h等基础设施tick_count.h、info.h、global_control.h、profiling.h、version.h等每个具体接口的专属头文件在其对应的 API 参考文档中有明确标注你在引用某个类或函数时应优先查阅其所属头文件以便做细粒度引入。2. 兼容头文件tbb/X.h与oneapi/tbb/X.h完全等价为了让旧版 TBB#include tbb/parallel_for.h这类写法的用户平滑迁移oneTBB 在install-prefix/include/tbb目录下提供了与install-prefix/include/oneapi/tbb完全相同的头文件集合。核心等价规则对于任意头文件X.h#include oneapi/tbb/X.h与#include tbb/X.h完全等价。这一规则在仓库源码中体现得极为直观。绝大多数兼容头文件就是一行重定向例如 include/tbb/tbb.h 的全部有效内容只是#include ../oneapi/tbb.hinclude/tbb/version.h 同样如此#include ../oneapi/tbb/version.h也就是说tbb/...路径下的头文件通过相对包含直接指向oneapi/tbb/下的正式头文件因此两套写法在编译语义上完全一致不会产生符号重复或定义不一致的问题。仓库测试 test/tbb/test_tbb_header_module.cppm 中也同时包含了tbb/tbb.h与oneapi/tbb/detail/_config.h来验证两套路径可以共存使用。3. 伞形头文件oneapi/tbb.h与tbb/tbb.h如果你不希望逐个引入功能头文件oneTBB 提供了两个伞形umbrella头文件oneapi/tbb.h一次性包含全部 oneTBB API 头文件tbb/tbb.h等价的兼容路径版本内容即重定向到../oneapi/tbb.h官方建议是当不需要细粒度头文件控制时直接使用伞形头文件最方便若你的程序只用到少量 TBB 构造则应优先只包含对应的具体头文件以缩短编译时间。查看 include/oneapi/tbb.h 的实现其注释明确说明本头文件批量包含 TBB 提供的全部功能声明除第三方依赖头文件外其中列出的任何头文件都可以独立于其他头文件被包含。该文件按功能域组织了一批#include例如#include oneapi/tbb/blocked_range.h #include oneapi/tbb/concurrent_hash_map.h #include oneapi/tbb/parallel_for.h #include oneapi/tbb/parallel_reduce.h #include oneapi/tbb/task_group.h #include oneapi/tbb/flow_graph.h #include oneapi/tbb/scalable_allocator.h #include oneapi/tbb/version.h // ... 其余约 40 个头文件值得注意的一个实现细节是部分**预览特性preview feature**头文件只有在对应宏启用时才会被伞形头文件包含。例如 include/oneapi/tbb.h 中#if __TBB_PREVIEW_CONCURRENT_LRU_CACHE #include tbb/concurrent_lru_cache.h #endifmemory_pool.h、numa_allocation.h等同样受__TBB_PREVIEW_*宏门控。这意味着仅包含oneapi/tbb.h并不会无条件暴露全部预览 API预览接口的可见性由编译期的特性宏决定——这一点在使用 C20 模块时尤其关键见第 4 节。4. TBB C20 模块实验特性注意TBB C20 模块目前是实验性特性接口在未来版本中可能发生变化。4.1 什么是 tbb.cppmoneTBB 提供 C20 模块接口单元tbb.cppm允许你通过import tbb;使用 oneTBB而无需引入任何库头文件。模块以源文件形式安装到install-prefix/include/oneapi/tbb.cppm必须作为你自己的构建目标的一部分来编译它不是预编译好的二进制模块。仓库中的 include/oneapi/tbb.cppm 完整展示了模块的实现方式module; #include oneapi/tbb.h // 全局模块片段中引入全部头文件 export module tbb; export namespace oneapi { namespace tbb ::tbb; } // export namespace oneapi export using ::TBB_runtime_interface_version; export using ::TBB_runtime_version; export namespace tbb { // 并行算法 using tbb::v1::blocked_range; using tbb::v1::parallel_for; using tbb::v1::parallel_reduce; using tbb::v1::parallel_sort; // 并发容器 using tbb::v1::concurrent_hash_map; using tbb::v1::concurrent_queue; using tbb::v1::concurrent_vector; // 互斥 using tbb::v1::mutex; using tbb::v1::spin_mutex; // 流图 using tbb::flow::v1::graph; using tbb::flow::v1::function_node; // ... 更多导出符号 }从实现可以看出模块在全局模块片段中一次性包含伞形头文件oneapi/tbb.h然后通过显式using声明把各命名空间tbb::v1、tbb::flow::v1等中的核心类型与函数导出到模块命名空间中。同时模块还导出了两个版本符号TBB_runtime_interface_version与TBB_runtime_version定义于 include/oneapi/tbb/version.h供消费者做版本判断。模块内同样遵守预览特性宏门控例如#if __TBB_PREVIEW_MEMORY_POOL using tbb::v1::memory_pool; using tbb::v1::fixed_pool; #endif #if __TBB_PREVIEW_NUMA_ALLOCATION using tbb::v1::allocate_numa_interleaved; #endif这与伞形头文件的行为保持一致。ABI 兼容性使用import tbb;的翻译单元与使用库头文件的翻译单元是 ABI 兼容的——两者最终都链接同一个 oneTBB 运行时库因此可以在同一程序中混用模块化与非模块化的 TBB 代码。4.2 CMake 集成方式将tbb模块接入 CMake 目标的标准做法完整示例见 cxx20_modules_support.rstcmake_minimum_required(VERSION 3.28) project(myapp CXX) set(CMAKE_CXX_STANDARD 20) find_package(TBB REQUIRED) add_executable(my_executable main.cpp) target_link_libraries(my_executable PRIVATE TBB::tbb) 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 )要点说明通过TBB::tbb目标的INTERFACE_INCLUDE_DIRECTORIES属性定位tbb.cppm的安装位置将tbb.cppm注册为FILE_SET cxx_modules TYPE CXX_MODULESCMake 会把它作为 C20 模块源文件参与你目标的编译前提条件需要 CMake 3.28 或更高版本且编译器与生成器均支持 C20 模块。编译成功后在 C 源文件中即可直接导入模块。仓库示例 doc/main/tbb_userguide/examples/cxx20_module_example.cpp 中的基本用法为import tbb; int main() { tbb::parallel_for(0, 100, [](int i) { /* ... */ }); }4.3 启用预览特性宏必须在编译模块时定义TBB_PREVIEW_*宏通常在包含 TBB 头文件之前于源码中定义。但模块有一个本质区别消费者在import tbb;之前定义的宏无法影响已经编译好的模块接口——模块接口单元在编译时已经固定。因此启用预览特性的正确姿势是在编译tbb.cppm本身时即编译使用该模块的目标时通过target_compile_definitions定义宏find_package(TBB REQUIRED) add_executable(my_executable main.cpp) target_link_libraries(my_executable PRIVATE TBB::tbb) 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 ) # 编译使用模块的目标时启用预览特性 X target_compile_definitions(my_executable PRIVATE TBB_PREVIEW_FEATURE_X1)之后预览 API 会被包含进编译后的模块对所有import tbb;的翻译单元可见。注意在典型的 CMake 集成方式下tbb.cppm是作为你的目标的一部分编译的所以通过target_compile_definitions定义的TBB_PREVIEW_*宏在模块构建时已经生效无需再在应用源文件中重复定义。在其他非 CMake 场景下务必保证编译模块与编译源码时定义的预览宏一致否则会产生接口不一致的问题。4.4 预定义宏不可用配合oneapi/tbb/version.h使用C20 模块不导出预处理器宏。因此import tbb;之后头文件中定义的版本宏、特性测试宏如TBB_VERSION_MAJOR、TBB_HAS_FEATURE_X等统统不可见。官方给出的解决方法是在import tbb;的同时另行包含oneapi/tbb/version.h头文件来获取这些宏。仓库示例 doc/main/tbb_userguide/examples/cxx20_module_example.cpp 演示了这种混用模式// 假定应用在编译时已预定义预览宏 #include oneapi/tbb/version.h // 宏在这里可用 import tbb; static_assert(TBB_VERSION_MAJOR 2023, Major version 2023 or later is required); // 特性测试宏同样可用 #ifdef TBB_HAS_FEATURE_X // use feature X #endif4.5 测试验证仓库针对模块化使用提供了专门的测试对用于验证模块接口的完整性与 ABI 兼容性test/tbb/test_tbb_header_module.cppm模块接口单元在全局模块片段中包含tbb/tbb.h与oneapi/tbb/detail/_config.h然后export module tbb_header_test;并包含完整的头文件测试用例test_tbb_header.cpptest/tbb/test_tbb_header_module_consumer.cpp消费端测试通过import tbb_header_test;调用DefinitionPresence()验证模块接口中所有符号定义齐全并通过Secondary()验证与普通头文件方式混用不会产生多重定义链接错误。这两个测试共同印证了import tbb;与头文件方式 ABI 兼容、可混用的官方结论。5. 如何选择引入方式结合上文可以给出如下选择建议场景推荐做法快速验证、示例程序、只需要少量 API直接#include oneapi/tbb.h伞形头文件生产代码、追求编译速度按接口精确包含如#include oneapi/tbb/parallel_for.h旧 TBB 代码迁移、习惯tbb/路径保持#include tbb/...写法语义与oneapi/tbb/...完全等价使用 C20 模块构建CMake ≥ 3.28编译tbb.cppm后import tbb;需要版本宏时再补包含oneapi/tbb/version.h需要预览特性头文件方式在包含头文件前定义TBB_PREVIEW_*宏模块方式在编译模块目标时用target_compile_definitions定义总结oneTBB 的头文件体系围绕install-prefix/include展开oneapi/tbb/存放全部正式 API 头文件tbb/提供逐行重定向的兼容层oneapi/tbb.h/tbb/tbb.h提供批量引入的伞形入口而实验性的tbb.cppm则把整个 API 面以 C20 模块的形式重新导出在保持 ABI 兼容的前提下让使用者通过import tbb;获得更快的编译隔离。理解这三层结构以及预览宏在头文件与模块两种模式下的不同生效时机是在实际工程中正确引用 oneTBB 接口、避免宏失效与接口不一致问题的关键。赞分享并发编程高性能计算【免费下载链接】oneTBBoneAPI Threading Building Blocks (oneTBB)项目地址https://gitcode.com/gh_mirrors/on/oneTBB点击查看免费下载相关推荐为什么选择PainterEngine10个让你爱不释手的强大功能为什么选择PainterEngine10个让你爱不释手的强大功能 PainterEngine是一款基于C语言开发的轻量级应用/游戏引擎凭借其软件渲染技术和跨图形学游戏开发编译器/解释器嵌入式音视频超图神经网络解锁复杂关系数据建模的终极指南超图神经网络解锁复杂关系数据建模的终极指南 你是否在处理社交网络群组分析、蛋白质相互作用网络或推荐系统时感到传统图神经网络力不从心当数据关系不再是简单的成对人工智能机器学习深度学习图计算一次模型事故的完整复盘Qwen3.8-27B-Heretic-Abliterated-Uncensored-GGUF的IQ3_M文件为何输出乱码修复全程记录一次模型事故的完整复盘Qwen3.8 27B Heretic Abliterated Uncensored GGUF的IQ3_M文件为何输出乱码修复全程记录大模型本地部署模型量化上一篇Open Battery Information开源电池修复工具的完整指南下一篇HanekeSwift最佳实践生产环境中的配置与监控终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考