マルチコア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)変数を使用して並列ジョブ数を指定しています。

サードパーティ製のツール

jobberparallelなどのサードパーティ製のツールを使用して、並列ジョブ数を制御することもできます。これらのツールは、より高度な機能を提供する場合があります。

長所

  • より高度な機能を提供する場合がある

短所

  • 追加のツールをインストールする必要がある

jobber -n 4 make

この例では、jobberというツールを使用して、Makeを4つのジョブで並列実行します。

GNU Makeで並列ジョブ数を制御するには、--jobs[=jobs]オプション以外にもいくつかの方法があります。どの方法を使用するかは、プロジェクトの要件や個人の好みによって異なります。

  • 一部の古いMakeバージョンでは、すべての代替方法がサポートされていない場合があります。
  • 並列ジョブ数が多いほど、メモリ使用量も増加します。
  • 並列ジョブ数がシステムの処理能力を超えると、パフォーマンスが低下する可能性があることに注意してください。