【初心者向け】CMakeでProcessorCountモジュールを使いこなす! プロセッサコアを活かして爆速ビルドを実現


使い方

ProcessorCount モジュールを使用するには、以下の手順を実行します。

  1. CMakeLists.txt ファイルに次の行を追加します。
cmake_minimum_required(VERSION 3.10)
project(myproject)

include(ProcessorCount)

# ビルド設定

add_executable(myprogram main.cpp)
  1. ProcessorCount モジュールは、CMAKE_PROCESSOR_COUNT 変数にプロセッサコア数を設定します。この変数は、ビルドシステムで使用して、並列処理タスクの数を設定することができます。

以下の例では、ProcessorCount モジュールを使用して、並列処理を有効にして myprogram をビルドします。

cmake_minimum_required(VERSION 3.10)
project(myproject)

include(ProcessorCount)

# ビルド設定

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -std=c++11")

add_executable(myprogram main.cpp)

target_link_libraries(myprogram ${LIBS})
  • ビルドシステムが並列処理をサポートしていることを確認する必要があります。
  • ProcessorCount モジュールは、CMake 3.10 以降でのみ使用できます。


cmake_minimum_required(VERSION 3.10)
project(myproject)

include(ProcessorCount)

# ビルド設定

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -std=c++11")

add_executable(myprogram main.cpp)

target_link_libraries(myprogram ${LIBS})

説明

  • target_link_libraries(myprogram ${LIBS}): myprogram に必要なライブラリをリンクします。
  • add_executable(myprogram main.cpp): main.cpp ファイルから myprogram という名前の実行可能ファイルを作成します。
  • set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -std=c++11"): C++ コンパイラフラグを設定します。
  • include(ProcessorCount): ProcessorCount モジュールをインクルードします。
  • project(myproject): プロジェクトの名前を myproject に設定します。
  • cmake_minimum_required(VERSION 3.10): CMake の最小バージョンを 3.10 に設定します。

例 2: カスタム並列処理設定

この例では、ProcessorCount モジュールを使用して、カスタム並列処理設定で myprogram をビルドします。

cmake_minimum_required(VERSION 3.10)
project(myproject)

include(ProcessorCount)

# ビルド設定

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -std=c++11")

# 並列処理設定

set(CMAKE_CXX_COMPILER_LAUNCHER "ccache ${CMAKE_CXX_COMPILER} -j ${CMAKE_PROCESSOR_COUNT}")

add_executable(myprogram main.cpp)

target_link_libraries(myprogram ${LIBS})
  • set(CMAKE_CXX_COMPILER_LAUNCHER "ccache ${CMAKE_CXX_COMPILER} -j ${CMAKE_PROCESSOR_COUNT}"): C++ コンパイラランチャーを設定します。これは、ccache を使用してコンパイルをキャッシュし、CMAKE_PROCESSOR_COUNT 変数を使用して並列処理タスクの数を設定します。
  • 例 1 のコードと同じです。


以下、ProcessorCountの代替方法として考えられる選択肢と、それぞれの利点と欠点をご紹介します。

手動設定

  • 欠点:
    • 煩雑さ: ビルドシステムに依存した手動設定が必要
    • 移植性: 異なるビルドシステム間で設定を統一するのが難しい
  • 利点:
    • 柔軟性: プロセッサコア数だけでなく、並列処理タスク数などの詳細な設定が可能
    • シンプルさ: 複雑なモジュールを導入する必要がない


set(CMAKE_CXX_COMPILER_LAUNCHER "ccache ${CMAKE_CXX_COMPILER} -j 4")

環境変数

  • 欠点:
    • 柔軟性の低さ: プロセッサコア数以外の設定は難しい
    • 信頼性の低さ: 環境変数が常に正確であるとは限らない
  • 利点:
    • シンプルさ: 設定が簡単で、CMakeLists.txtファイルを変更する必要がない
    • 移植性: 異なるビルドシステム間で設定を共有しやすい


export CMAKE_CXX_COMPILER_LAUNCHER="ccache ${CMAKE_CXX_COMPILER} -j $(nproc)"

サードパーティ製モジュール

  • 欠点:
    • 導入と設定が複雑になる場合がある
    • すべてのCMake環境で利用可能とは限らない
  • 利点:
    • ProcessorCountよりも高度な機能を提供するものがある
    • 特定のプラットフォームやコンパイラに特化した機能を提供するものがある


カスタムスクリプト

  • 欠点:
    • 開発と保守が難しい
    • バグが発生しやすい
  • 利点:
    • ProcessorCountや他の代替方法では実現できない高度な処理が可能


import subprocess

num_cores = subprocess.check_output(["nproc"]).decode().strip()
print(f"Number of cores: {num_cores}")

cmake_args = ["cmake", "-DCMAKE_CXX_COMPILER_LAUNCHER=ccache ${CMAKE_CXX_COMPILER} -j {num_cores}"]
subprocess.run(cmake_args)

最適な代替方法の選択

最適な代替方法は、個々のニーズと要件によって異なります。

  • プロセッサコア数以外の詳細な設定が必要な場合は、手動設定がおすすめです。
  • より高度な機能が必要な場合は、サードパーティ製モジュールまたはカスタムスクリプトを検討してください。
  • シンプルで移植性の高い方法が必要な場合は、手動設定または環境変数がおすすめです。