并行运行代码,但使用 CMake 和/或 Make 按顺序运行部分

Run code parallel but sections sequentially with CMake and/or Make?

本文关键字:Make 顺序 运行部 CMake 代码 运行 并行      更新时间:2023-10-16

我正在使用CMake构建我的项目。此项目使用多个外部库,其中一个库未正确指定其依赖项。这会导致我的构建在运行并行生成作业时失败。我想知道 cmake 和/或 make 中是否有一个功能可以串行运行某段代码和其他所有内容。

更具体地说,我正在使用FindCUDA.cmake模块,并在其中使用cuda_add_executable&cuda_add_library。我相当确信,在构建 CUDA 库时,FindCUDA 模块没有列出其依赖项,从而导致在读取和写入中间对象文件到磁盘时出现竞争条件。有没有办法我可以简单地串行运行cuda_add_library宏,同时并行运行构建的其余部分?

所有 CMake 代码都是单线程运行的。CMake 开发人员已经通过错误跟踪器等多次联系,如果他们可以实现一些并行功能,但每次都被拒绝。

截至目前(当前的CMake v3.24.3),我不知道有任何并行内置功能。CMake 根本不并行执行。CMake 提供了一种统一的方式来指示构建系统(MSBuild、Make、Ninja 等)并行构建(参见文档 CMake -j switch),但之后责任将移交给构建系统。

如果CMake不支持,则很难通过CMake同步其他软件的任何输出。

如果您在 CMake 中的项目结构支持它,则可以通过使用 的答案(此处)usr1234567描述的方法绕过此限制。

据我所知,您不能影响每个目标的构建并行性。但是你可以解决这个问题。

您可以先构建需要按顺序构建的目标(或具有重复调用的多个目标)

cmake --build . --target seq_target -j 1

然后你可以构建整个项目,所以剩下的一切都可以并行构建。已构建的不会再次构建,因此不会发生错误:

cmake --build . -j 8