65

どのビルド ツールを使用しても、並列ビルドを行うことは可能ですか?

Unix ではmake -jN、N はスレッドの数を追加できます。Windows では、Visual Studio で並列ビルドに使用される に追加しました... CXX_FLAG "/MP"(?) CMAKE_MAKE_PROGRAMCMakeを実行しますか?

一般解とは?

私はこれを思いつきました:

# Add some multithreaded build support
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project")
if(MULTITHREADED_BUILD)
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
            message(STATUS ${CMAKE_BUILD_TOOL})
            set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}")
            message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}")
    elseif(MSVC)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
      message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    endif()
endif()
4

6 に答える 6

21

CMake v2.8.8 以降を使用している場合は、 GNUの代わりにNinjaを使用できます。make

mkdir build
cd    build
cmake -G Ninja ..
ninja              # Parallel build (no need -j12)

また

mkdir build
cd    build
cmake -G Ninja ..
cmake --build .    # Parallel build using Ninja

ご覧のとおり、 を使用する必要はありませんCMAKE_MAKE_PROGRAM。ビルドはデフォルトで並行して実行され、使用可能な CPU コアに応じてジョブの数が最適化されます。

Ninja は、起動フェーズを高速化するための低レベルの JSON 構成に基づいています。そのため、JSON 構成を手動で記述するのは簡単ではありません。私は常に高レベルのツール/IDE を使用して生成します。

C++ ビルドは多くの場合、大量のメモリを必要とするため、コンピュータは CPU コアの数と同じメモリを提供する必要があります。

Ruslanが指摘したように、CMake 3.12 (2018) にはビルドをコア (ジョブ)に制限する新しいオプションがあり、メモリ消費を制限します ( ドキュメントも参照してください)。古い CMake バージョンを使用している場合でも、引き続き使用できます。このオプションは、残りを基礎となるビルダー ツール (ここでは Ninja) に直接渡すように CMake に指示します。cmake --build -j <N><N>cmake --build -- -j <N>--

于 2015-06-30T07:55:09.463 に答える
1

ベースのジェネレーターparallelmake.sh用のスクリプトを書くことに落ち着きました。Unix Makefilesこれはここで行われます: https://github.com/gabyx/ApproxMVBB

そして、CMake ファイルの関連部分:

https://github.com/gabyx/ApproxMVBB/blob/master/CMakeLists.txt#L89

# Add some multithreaded build support =====================================================================================================
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
SET(MULTITHREADED_BUILD ON CACHE BOOL "Parallel build with as many threads as possible!")
if(MULTITHREADED_BUILD)
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
            file(COPY ${ApproxMVBB_ROOT_DIR}/cmake/parallelmake.sh DESTINATION ${PROJECT_BINARY_DIR}
                FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
                NO_SOURCE_PERMISSIONS
            )
            SET(CMAKE_MAKE_PROGRAM "${PROJECT_BINARY_DIR}/parallelmake.sh")
            MESSAGE(STATUS "Set make program to ${PROJECT_BINARY_DIR}/parallelmake.sh")
    elseif(MSVC)
      SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" "/MP")
      MESSAGE(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    endif()
endif()
# ========================================================================================================================================
于 2015-06-30T11:29:27.710 に答える