インターフェイスの選び方
目的に合ったインターフェイスの見つけ方
Incredibuild インターフェイスはソフトウェアやスクリプト ファイルとの統合方法を Incredibuild に伝える手段です。Incredibuild はネットワーク上の Agent がインストールされたマシンで待機するコアを活用して、複数のタスクを並列に実行し、ソフトウェアのパフォーマンスを向上させることができます。
Incredibuild のインターフェイスは以下を目的としています。
-
(必須) カスタム ソフトウェアとの統合(Dev ツール向けソリューション)。この場合、Incredibuild のインターフェイスの使用は必須です。
-
(任意) Visual Studio ソリューションや Make & Build ツール ソリューションのさらなる拡張 高速化(詳しくはこちらをご覧ください)。例: ビルドの一部として Make & Build ツール ソリューションで大量のファイルのレンダリングを行う場合、レンダリング処理も高速化することができます。
インターフェイスを選ぶ際には、Incredibuild で高速化したいタスクを明確にしておくことが重要です。
-
高速化したいのは逐次タスク? 並列タスク? またはその両方?
-
複数のローカルコアを使用する機能がある?
-
複数のプロセスを実行する機能がある?
-
コマンドライン インターフェイスを搭載している?
それぞれのインターフェイスについての理解を深め、それらがアプリケーションにどのように使用されるかが分かれば、自分が書いたスクリプトやツールに少しの変更を加えるだけでタスクを並列実行することができます。
サードパーティ製ツールの場合、Incredibuild を使用して、そのタスクの多くをネットワーク上のすべてのコアで強制的に並列実行させることでパフォーマンスを大幅に向上できます。これは、サードパーティ製ツールのコマンドラインからコマンドを並列に実行できる場合にも当てはまります
。
注意: Incredibuildにはスレッドを分配する機能はありません。スレッドを分散することはできません。一般的にマルチスレッドのアプリはマルチプロセスに変換できます(自社アプリの場合)。
以下ではインターフェイスについて詳しく解説しています。自分に最適なインターフェイスを選ぶ際のガイドラインとしてご利用ください。
インターセプション インターフェイス
近年、ローカルマシン上の複数のコア / プロセッサで複数のプロセスを並列実行する動作モードをサポートするアプリが増えています。このようなアプリの並列処理を高速化したい場合は、ソースコードの変更が不要なインターセプション インターフェイスが適しています。Incredibuild はプロセスのタイプ (名前) のリストと、タイプごとのプロセスの実行方法の詳細を受け取ります。
例:「MyApp.exe」アプリはマシンのコア数に応じて「DoSomething.exe」プロセスを並列に実行します(4 コアのマシンの場合、Myapp は DoSomething.exe のインスタンスを 4 つ実行します)。Incredibuild でこのアプリの実行を高速化するには MyApp にマシンに大きなコア数を伝え (例: 200 コア)、200 個の Dosomething.exe タスクを Incredibuild のキューに送ります。この場合、インターセプション インターフェイスはローカルコアだけでなく、残り 196 個の DoSomething.exe タスクをネットワーク上のコアに自動的に分散します。
Incredibuild は以下の手順を行うことで実行時間が大幅に短縮します。
-
リモートで実行するプロセス タイプ名とサブプロセスを実行する呼び出し元が記述された XML ファイルを生成します(この例では、MyApp.exe が呼び出し元のプロセス、DoSomething.exe が Incredibuild がリモートコアで実行するプロセスです)。
-
ローカルコアに応じた数だけでなく、多数の DoSomething.exe タスクを並行して実行するように MyApp.exe に指示します。並列実行できるタスク数は、ネットワーク上のコアで並列実行できるタスク数の上限と同じでなければなりません。ネットワーク上にそれほど多くのコアがない場合でも、例えば「1,000 件のタスク」というように、並列実行できるタスク数よりも (はるかに) 大きな数値を指定することができます。この場合、Incredibuild は 1,000 件のリクエストをすべて受け取り、利用可能なコア数に応じてキューを管理することができます。
-
Incredibuild IBConsole コマンドを使用して MyApp.exe を実行します。このコマンドでは許可する並列プロセスを定義している必要があります。この IBConsole コマンドはジョブ全体で有効です。MyApp.exe が並列実行するタスク数が多いほど、Incredibuild による高速化の効果は大きくなります。
Incredibuild は XML ファイルを参照してタスクごとの実行方法を確認します。Incredibuild で MyApp (「呼び出し元」として定義) が実行されると、Incredibuild は MyApp が OS 対して行うすべての呼び出しをリッスンし、MyApp がプロセスを呼び出すたびに、(上の手順で作成した) XML ファイルでそのプロセスがどのように定義されているかを確認します (リモートで実行するプロセス、またはプロセスを生成する呼び出し元プロセス)。リモートで実行するように定義されている場合、そのプロセスはローカルマシンではなく、リモートマシンで処理されます。ローカルコアが利用できる場合、Incredibuild は XML ファイルで定義されたタスクをローカルマシン上でリモート実行できます。
サブプロセスを生成する呼び出し元プロセスには「AllowIntercept」関数を使います。例えば、プロセス A がプロセス B を実行し、プロセス B がプロセス C を実行する場合、プロセス A と B の両方を「AllowIntercept」として宣言し、プロセス C は「AllowRemote」として宣言します。
-
すべてのプロセスを Profile.xml ファイルで定義する必要はありません。Profile.xml に定義されていないプロセスはローカルで実行されます。
-
Profile.xml ファイル (上の手順を参照) で必要な「AllowIntercept」(呼び出し元) と「Allow Remote」(リモート実行) のオプション以外のオプションをプロセスに追加することができます。詳しくはこちらをご覧ください。
-
リモートに分散されたタスクは、開始マシンの環境とファイル システムが完全にエミュレートされた環境で実行されるため、リモートマシンにファイルをコピーしたり、アプリケーションをインストールする必要はありません。MyApp にとっては、リモートで動作するプロセスとローカルで動作するプロセスには違いが全くありません。
利点と欠点
インターセプション インターフェイスの利点は次の通りです。
-
簡単な統合。高速化したいアプリ (自社アプリまたはサードパーティ製アプリなど) がすでに多数のプロセスを並列実行できる場合は、アプリのソースコードを変更することなく高速化できます。
-
最適な並列実行。Incredibuild が実行キューを管理しながら、ネットワークやローカルマシンで利用できるコアに応じてプロセスを分散するので、アプリで可能な限りたくさんのプロセスを並列実行できます。
欠点はサードパーティ製アプリがマルチプロセスに対応していない場合、プロセスは逐次実行されることです。Incredibuild でこれらのプロセスを並列実行するには手間がかかります。ソースコードを変更できるアプリであれば、プロセスの並列実行を認識するようにソースコードを修正できます。
注意: サードパーティーのアプリケーションが、タスクの順次実行のみ認識しており、ソースコードを変更することができない場合、そのアプリケーションにコマンドラインがあるかどうかを確認することができます。コマンドラインで並列実行することができますが、たくさんのコマンドを記述する必要があります。このような場合は、サブミッション インターフェイスをお勧めします。
このインターフェイスに最適な状況:
-
複数のプロセスを並列実行できるサードパーティ製ツールやアプリを実行している場合。
-
並列実行に対応した (または修正することで対応可能な) カスタム ツールを実行しており、ネットワーク上で処理を分散して高速化したい場合。
サブミッション インターフェイス
サブミッション インターフェイスは Incredibuild に直接タスクを送信して、分散実行させることができます。バッチ ファイル、スクリプト、カスタム ツールだけでなく、すべてのコマンドラインやプロセスをリモートマシン上で並列実行するような高度な分散も可能です。このインターフェイスは元のコマンドラインの呼び出しを入力として受け取り、xgSubmit.exe の呼び出しに置き換えます。xgSubmit.exe を呼び出すたびに指定されたコマンドラインが分散 並列実行のためにキューに入れられます。xgWait.exe をスクリプトから呼び出せば、指定したタスク グループが完了するまで実行を一時停止できます (並列タスク グループ間の依存関係が可能)。最後に、IBConsole.exe を使ってスクリプト / ツール自体を呼び出します。リモートにされたタスクは、開始マシンの環境とファイル システムが完全にエミュレートされた環境で実行されるため、リモートマシンにファイルをコピーしたり、アプリケーションをインストールする必要はありません。
利点と欠点
サブミッション インターフェイスは、バッチ ファイルなどのスクリプト内からタスクを実行する場合や(既存のコードを大幅に変更する必要がないため) 同種のプロセスをシナリオに応じて、ローカルまたはリモートで完全に制御したい場合に適しています。とはいえ、多少の修正は必要で、アプリケーションやスクリプトに何千ものタスクがある場合はかなり手間がかかります。Incredibuild がどのプロセスをローカルまたはリモートで実行するかを気にしないのであれば、インターセプション インターフェイスの使用を見当してください。
サブミッション インターフェイスの利点は次の通りです。
-
どんなスクリプトやツールとも簡単に統合。
-
ローカルまたはリモートで実行プロセスを指定。
-
コマンド ファイルで大量のコマンド群を迅速かつ効率的に送信。
このインターフェイスに最適な状況:
-
ローカルでの並列処理をサポートしていない make ツール (NMAKE など) を高速化する場合。
-
バッチ ファイルやスクリプト経由で実行されるプロセスを分散したい場合。
-
カスタム アプリで実行されるプロセスを分散する場合。この場合は、分散するタスクを XML ファイルに記述したり、ローカルで並列処理をできるようにツールをカスタマイズしたりするよりも、サブミッション インターフェイスの使用をお勧めします。
XML インターフェイス
XML インターフェイスは、Incredibuild で実行するコマンドライン タスク群、入力ファイル、出力ファイル、依存関係を記述した XML ファイルを使用する汎用の分散インターフェイスです。
XML ファイルに複雑なプロセスを定義できるため、ソフトウェアのマスター プロセスを高速化することもできます。XML ファイルはプロセスの実行を管理するスクリプトとして、Incredibuild にプロセスの実行方法を指示します。
IBConsole はタスクの分散方法が記述された XML ファイルに基づいてプロセスを処理します。リモートにされたタスクは、開始マシンの環境とファイル システムが完全にエミュレートされた環境で実行されるため、リモートマシンにファイルをコピーしたり、アプリケーションをインストールする必要はありません。
Incredibuild の各プロジェクトの XML 構文には、プロジェクトのタスクとそれらの依存関係を記述します。
ほかのインターフェイスと同様にスクリプトの実行は IBConsole コマンドで管理しますコマンドの例:
xgConsole myjob.xml
XML インターフェイスには、Incredibuild でジョブの実行を管理しながら、実行フロー (タスクや依存関係) を完全に制御できるという利点があります。
XML インターフェイスの利点は次の通りです。
-
完全な汎用性と自律性。
-
複雑なタスクやファイルの依存関係をサポート。
-
フル リビルド、インクリメンタル ビルド、クリーン オペレーションをサポート。
-
ファイル検索やレスポンスファイルの読み込みに対応。
-
環境変数の読み取り / 書き込みをサポート。
このインターフェイスに最適な状況:
-
現在の実行スクリプト / ビルド ツールを Incredibuild の XML ベースのビルド システムに変えてプロセスを分散させたい場合。
-
カスタム アプリから逐次実行されるプロセスを分散したいと考えており、分散させるコマンド群を XML 形式で記述できる場合。
-
ワイルドカードで指定したファイル群に対して同一のコマンドラインを分散して実行させたい場合 (例:「MyFolder\*.cpp」に一致するすべてのファイルに対して「analyze.exe /out:./TargetDir」を実行する)。
注意: DevTools向けIncredibuild を使用する場合、3 つの統合インターフェイスのいずれか、またはインターフェイスの組み合わせを使用する必要があります。その前に IBConsole コマンドを使って Incredibuild を実行し、選択したインターフェイスを有効にする必要があります。詳しくはこちらをご覧ください。