CMake+Ninja构建不会跨库并行化
CMake + Ninja build does not parallelize across libraries
我们有一个(C++)程序,它被设置为一系列具有嵌套层次结构的共享库。也就是说,libB.so使用来自的函数,从而链接到libA.so,libC.so使用来自和链接到libB.so和libA.so的函数,等等
对于我们当前的CMake+Ninja构建系统,我注意到并行构建似乎不会在库之间发生。也就是说,虽然Ninja通常会使用12个内核来构建,但如果我接触了libA中的单个源文件,但在libC中有多个,Ninja将只使用单个处理器来构建libA源文件,直到链接了libA.so,此时它将使用12个处理器来编译libC源文件。-如果libA源代码中的编译出现错误,它甚至不会尝试将libC文件编译为对象文件,即使我将-k传递给ninja。
当然,链接libC.so需要延迟到链接libA.so,但将源文件编译为libC源的对象文件不应该因为链接libA而延迟。
关于设置CMake文件以表达库之间依赖关系的最佳方式,我是否缺少一些东西?还是这是忍者工作方式的一个不可逾越的限制?
这是最近在CMake邮件列表上问到的。其中一个开发者的回应证实了你报告的行为是故意的:
不幸的是,这对于获得CMake项目的正确构建是必要的一般来说,因为我们支持使用addcustom_command的情况在图书馆";foo";生成包含在图书馆编译";条";链接到";foo";,但是我们没有好的除了bar的排序依赖关系之外,这种依赖关系的表达方式在foo上。
虽然在某些情况下,CMake可能会得到改进,以放松这一限制,但这似乎还没有完成(截至CMake 3.6)。在Kitware问题跟踪器中已经有了这方面的开放门票。
更新:这似乎在CMake 3.9.0中得到了修复,尽管这一变化导致了随后在3.12.0或3.11.2中修复的回归。
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如何使用 Pthreads 并行化图像翻转?
- 所有Visual Studio安装程序崩溃,可视化构建工具也无法正常工作
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- CMake+Ninja构建不会跨库并行化
- Visual Studio - 并行化构建不会提高性能