マルチコアCPUの真価を引き出す!GNU Makeの"--jobs"オプションで並列処理を極める
--jobs[=jobs]
オプションは、GNU Makeの並列実行ジョブ数を制御するために使用されます。これは、make
コマンドラインインターフェース(CLI)で最も一般的に使用されるオプションの1つです。
構文
--jobs[=jobs]
オプション
jobs
:並列実行するジョブの最大数。省略した場合、デフォルト値(通常はCPUコア数)が使用されます。
動作
--jobs
オプションを指定すると、Makeは一度に複数のジョブを並列に実行しようとします。これにより、マルチコアCPUを持つシステムでビルド時間を短縮することができます。
例
以下の例では、Makeに最大4つのジョブを並列に実行するように指示します。
make --jobs=4
注意事項
- 一部の古いMakeバージョンでは、
--jobs
オプションがサポートされていない場合があります。 - 並列ジョブ数が多いほど、メモリ使用量も増加します。
- 並列ジョブ数がシステムの処理能力を超えると、パフォーマンスが低下する可能性があります。
--jobs
オプションの詳細については、GNU Makeのマニュアルページを参照してください。
- Makeの並列実行機能は、
make
コマンドの-m
オプションと組み合わせて使用することができます。-m
オプションは、使用可能なジョブスロット数を制限します。 -j
オプションは--jobs
オプションの省略形です。
例1:並列ジョブ数の指定
#Makefile
all: program1 program2 program3
program1:
$(CC) program1.c -o program1
program2:
$(CC) program2.c -o program2
program3:
$(CC) program3.c -o program3
make --jobs=4
例2:-j
オプションの使用
この例は、例1と同じですが、-j
オプションを使用して並列ジョブ数を指定しています。
#Makefile
all: program1 program2 program3
program1:
$(CC) program1.c -o program1
program2:
$(CC) program2.c -o program2
program3:
$(CC) program3.c -o program3
make -j4
例3:make
コマンドと-m
オプションの組み合わせ
この例では、make
コマンドと-m
オプションを組み合わせて、使用可能なジョブスロット数を制限し、並列ジョブ数を制御します。
#Makefile
all: program1 program2 program3
program1:
$(CC) program1.c -o program1
program2:
$(CC) program2.c -o program2
program3:
$(CC) program3.c -o program3
make -m 2 -j 4
この例では、make
コマンドに-m 2
オプションを指定して、使用可能なジョブスロット数を2つに制限しています。その後、-j 4
オプションを指定して、Makeに最大4つのジョブを並列に実行するように指示します。
- 並列ジョブ数がシステムの処理能力を超えると、パフォーマンスが低下する可能性があることに注意してください。
- 上記の例はあくまで一例であり、実際のMakefileはプロジェクトの要件に応じて異なる場合があります。
-j[n]オプション
-j[n]
オプションは、--jobs[=jobs]
オプションの省略形です。構文と動作は--jobs[=jobs]
オプションと同じですが、より簡潔に記述できます。
長所
- 簡潔で分かりやすい
短所
--jobs[=jobs]
オプションよりも知名度が低い
例
make -j4
make -m [n]コマンド
make -m [n]
コマンドは、使用可能なジョブスロット数を制限することで、並列ジョブ数を間接的に制御します。[n]
は使用可能なジョブスロット数です。
長所
- ジョブスロット数を直接制御できるので、より細かい制御が可能
短所
--jobs[=jobs]
オプションよりも複雑
例
make -m 2 -j 4
Makefile内の変数
Makefile内にNJOBS
という変数を定義し、その値を並列ジョブ数として使用することができます。
長所
- Makefile内で並列ジョブ数を設定できるので、プロジェクトごとに設定を変更しやすい
短所
- Makefileを編集する必要がある
例
NJOBS = 4
all: program1 program2 program3
program1:
$(CC) program1.c -o program1
program2:
$(CC) program2.c -o program2
program3:
$(CC) program3.c -o program3
.PHONY: all
この例では、Makefile内にNJOBS
という変数を定義し、その値を4に設定しています。その後、all
ターゲットのレシピ内で、$(NJOBS)
変数を使用して並列ジョブ数を指定しています。
サードパーティ製のツール
jobber
やparallel
などのサードパーティ製のツールを使用して、並列ジョブ数を制御することもできます。これらのツールは、より高度な機能を提供する場合があります。
長所
- より高度な機能を提供する場合がある
短所
- 追加のツールをインストールする必要がある
例
jobber -n 4 make
この例では、jobber
というツールを使用して、Makeを4つのジョブで並列実行します。
GNU Makeで並列ジョブ数を制御するには、--jobs[=jobs]
オプション以外にもいくつかの方法があります。どの方法を使用するかは、プロジェクトの要件や個人の好みによって異なります。
- 一部の古いMakeバージョンでは、すべての代替方法がサポートされていない場合があります。
- 並列ジョブ数が多いほど、メモリ使用量も増加します。
- 並列ジョブ数がシステムの処理能力を超えると、パフォーマンスが低下する可能性があることに注意してください。