インターセプション インターフェイス
インターセプション インターフェイスの一般的な使用方法は次の通りです。
-
分散したいプロセスを管理するツールが並列実行に対応していることを確認します。
-
リモートで実行するツールとそれらを呼び出すツールを記述した Profile XML ファイルを作成します。
-
Incredibuild で処理したいタスク (呼び出し元のタスクやリモートで実行したいタスクなど) ごとに設定用の Profile XML ファイルを作成しますIncredibuildに処理させたくないタスクは、XMLプロファイル ファイルで宣言する必要はありません。それぞれの呼び出し元タスクに対してAllowIntercept=true を設定します。ソフトウェアの主要実行ファイルは、プロファイル XML で AllowIntercept 属性を 「True」 に設定して定義する必要があります。リモートで実行されるプロセスがメイン実行ファイルの子プロセスによって生成される場合、メイン実行ファイルを起点とするプロセス階層全体のAllowIntercept属性を 「True 」に設定する必要があります。例えば、メイン プロジェクトが 「a 」で、「b 」を実行し、「b 」が 「c」(実行を分散したいプロセス)を実行する場合、「a 」と 「b 」の両方で、AllowIntercept属性を 「True」に設定して指定する必要があります。リモート マシンに配布する各タスクについて、AllowRemote=trueを設定します。
-
IBConsole コマンドで、Profile XML ファイルの名前とジョブのコマンドライン、またはバッチ ファイル (アプリの実行コマンドを含む) の名前を指定して、高速化したいアプリまたはツールを Incredibuild を使って実行します (詳細は以下を参照)。テストのために、ローカルマシンのコア数以上のプロセスを起動するようにアプリを実行します。これで Incredibuild は一部のプロセスをリモートマシンに分散しなければならなくなります。IBConsole.exe を「/COMMAND=」構文で実行している場合、/COMMAND 引数で指定したアプリ (.bat ファイルの場合は cmd.exe) には、暗黙的に「AllowIntercept」の動作が付与されます。
-
実行可能ファイルに「AllowRemote=True」が指定されている場合、そのブランチ配下の全プロセスは、指定されたコア(リモートコアなど)内で自動的に実行されます。サブタスクごとに「AllowRemote」を指定する必要はありません。
-
「AllowRemote「を使用する場合、ワイルドカード(*.exe、cl*.exeなど)がサポートされます。「AllowIntercept」を使用する場合、ワイルドカードはサポートされないため、正確なプロセス名を使用する必要があります(例:ProcessMain.exe)。
IBConsole.exe とインターセプション インターフェイス
上記の手順が実行されると、コマンドライン文字列を使用して並列プロセス実行モードで任意のツールを実行することができます。このコマンドラインは、IBConsole.exeの入力引数として指定する必要があります(以下の例を参照してください)。プロファイルXMLファイルもコマンドライン引数で指定します。
プロセスはローカルで並列実行されますが、Profile XML ファイル内で「AllowRemote=True」で指定されたツールはリモートマシンで実行されます。
XML インターフェイスを使って XML ジョブを分散実行する際の基本的なコマンドラインは次の通りです。
IBConsole.exe /command="<TOOL COMMAND>" /profile="<PROFILE XML>" [Other Options]
コマンドの詳細:
-
<TOOL COMMAND>: 並列実行モードでツールを実行するためのコマンドライン文字列
-
<PROFILE XML>: Profile XML ファイル
-
その他のオプション-その他の IBConsole.exe コマンドラインオプションについてはIBConsole コマンドリファレンス セクションを参照してください。プロファイル XML ファイルを使用する代替策として、AllowIntercept とAllowRemote ディレクティブを IBConsole コマンドラインで明示的に指定することができます。
IBConsole.exe /command="<TOOL COMMAND>" /allowremote="<FILENAME1[,FILENAME2,...]>" /allowintercept="<FILENAME1[,FILENAME2,...]>" [Other Options]
コマンドの詳細:
-
<TOOL COMMAND>: 並列実行モードでツールを実行するためのコマンドライン文字列
-
<FILENAME1[,FILENAME2,...]>: ツール ファイル名のリスト (コンマ区切りで複数入力)
-
[Other Options]: IBConsole.exe のオプションについては「IBConsole コマンドライン オプション」をご覧ください。
コマンドの例
RenderApp.exe というアプリケーションがあるとします。このアプリケーションはRenderTask.exe の多くのタスクを並行して実行することを認識しており、それぞれのRenderTask.exe はフレームを取得して、それらのタスクをレンダリングします。このアプリを通常通りに実行する(つまり複数のコアがない) 場合は、次のように呼び出します。
RenderApp 1-1000
この場合、アプリは RenderTask.exe タスクを 1,000 回実行して、その都度フレーム (1 ~ 1,000 まで) を取得してレンダリングすることになるので、すべてのフレームを処理するのに、1 フレームを処理する 1,000 倍の時間がかかります。
ほかにもローカルマシン上のローカルコアを指定する方法もあります。この場合、RenderApp を呼び出して 4 つのコアで実行します。
RenderApp 1-1000 –cores4
アプリは 4 つのコアで 1 つのタスクを実行する代わりに、4 つのコアで 4 つの RenderTask.exe タスクを同時に実行します。この方法では 1,000 件のタスクを 250 件分の時間で処理することができます。
Incredibuild では XML 形式のプロファイルを使ってアプリのさまざまなタスク (プロセス) の処理方法を指定することができます。メイン アプリの RenderApp はローカルマシン上で実行され、サブプロセスの呼び出し元となるので Profile XML では「AllowIntercept=true」と定義でき、リモートマシンで実行される RenderTask はリモートタスクとして定義することができます。
注意: リモートマシンにソフトウェアをインストールしたり、ファイルをアップロードしたりする必要はありません。リモートマシン上のコアは、まるでローカルマシン上に存在するかのように使用されます。
RenderApp.exe AllowIntercept=true
RenderTask.exe AllowRemote=true
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename=" RenderApp" AllowIntercept="true" />
<Tool Filename=" RenderTask" AllowRemote="true" />
</Tools>
</Profile>
上のコマンドで Incredibuild は次のように動作します。
-
メイン プロセス「RenderApp.exe」を実行します。
-
「RenderApp.exe」の実行プロセスの呼び出しに関するすべてのコールが傍受し、profile.xml ファイルで「AllowRemote=true」と指定されたプロセスのリストと比較します。
-
プロセス内で「AllowRemote=true」に指定されたプロセスを検出してリモートマシンに分散します。
-
リモートマシンで生成された出力をローカルマシン (Initiator) に転送します。
RenderAppの実行をさらに高速化するために、RenderApp 1-1000 -cores4 を実行する代わりに、コマンドを実行することを推奨します。
IBConsole RenderApp.exe 1-1000 -cores1000 /profile=profile.xml
これにより1000個のタスクがIncredibuildのキューに入り、Incredibuildは利用可能なコア数に応じてタスクの実行を管理します。例えば、200 個のコアが利用可能であれば、一度に 200 件のタスクを実行するので、5 件のタスクを実行する時間で 1,000 件のタスクをすべて処理することができます。
Incredibuild のインストール フォルダ内の「Samples\Dev Tools Interfaces Usage Samples\Intercepted Interface」にサンプル プロジェクトが用意されています。「サンプル プロジェクト」で簡単なインターセプション インターフェイスを試すことができます。
このサンプルで必要なパラメーターは次の通りです。
-
実行する exe (DummyProcess.exe)
-
プロセスの実行回数
-
プロセスを強制終了するスリープ時間
-
(任意) サブプロセスが停止するまでの時間
サンプル プロジェクト
次のサンプルは「MainProcess」という名前のプロセスが複数のサブプロセス「Dummy」を実行するジョブです。
以下のサンプルのXMLファイルは「Profile.xml」として保存されます。
IBConsole /command="MainProcess.exe DummySubProcess.exe 10 2000 2000" /profile="profile.xml" /openmonitor /title="Automatic Interception Sample"
上のコマンドでは「MainProcess.exe」が「DummySubProcess.exe」の 10 個のインスタンスが 2 秒にわたって並列実行されます。このプロセスはプロファイルで「AllowRemote=true」と定義されているため、ローカルマシンとリモートマシンの両方で実行されます。