レベル: 初級 梶 信也 (skaji@jp.ibm.com), Editor, Multicore acceleration, IBM Systems & Technology Group, AKD48
2008年 9月 05日 Cell Broadband Engine (Cell/B.E.) が持つ高い演算能力には魅力があるが、その演算能力を必要とするアプリケーションがWindowsプラットフォームでしか動作しないために、諦めたりしていませんか。IBM Dynamic Application Virtualization (IBM DAV) は、そんな悩みを解決してくれるツールです。
IBM Dynamic Application Virtualizationとは
IBM Dynamic Application Virtualization (IBM DAV) は、ネットワーク越しに存在するコンピュータノード上で動作するプログラムを、クライアントアプリケーションから簡単に呼び出すことができる仕組みを提供するツールです。例えば Windows 上で動作するアプリケーション内で演算時間を要する部分があるとします。この時間のかかる部分を非常に高速に実行することができるコンピュータノードが存在していれば、そのコンピュータノード上で実行するようにすれば Windows アプリケーションのパフォーマンスはおそらく向上するでしょう。しかし、ネットワーク越しのコンピュータノード上のプログラムを Windows アプリケーションから呼び出すようにするには、少々手間がかかってしまいます。IBM DAV はそんな開発者にとって朗報ともいえる存在になるでしょう。Windows アプリケーション開発者が Remote Procedure Call (RPC) を行うように Windows アプリケーションを開発する手間を、IBM DAV が補ってくれます。
IBM DAV の構成
IBM DAV はリモートに存在するコンピュータノードへの関数呼び出しを行う仕組みを提供するツールです。そのため IBM DAV はクライアントソフトウェア、サーバソフトウェア、そしてスタブライブラリを生成する Virtualizer ソフトウェアから構成されます。
アプリケーションと IBM DAV がどのように構成されるかを示したものが下の図です。この概念図は IBM DAV の構成を簡略化したものですが、IBM DAV がどのような仕組みを提供するものかを直感的に理解するのに役立つでしょう。
図中のクライアントアプリケーション内に func1() と func2() の関数呼び出しがあります。この関数 func1() および func2() が実装されたものがサーバライブラリになります。IBM DAV は func1() および func2() をスタブライブラリとしてクライアントアプリケーションに提供します。そのためクライアントアプリケーションにはネットワーク越しにサーバライブラリの関数を呼び出していることが見事に隠蔽されているのです。
クライアントアプリケーションからある処理部分を抜き出して、高速な演算が可能なコンピュータノード上にサーバライブラリとして実装すれば、あとの仕組みは IBM DAV が提供してくれます。クライアントアプリケーションの開発者に要求されることは、IBM DAV が提供するスタブライブラリとリンクすることです。ソースコードを修整する必要はありません。
動作環境
IBM DAV はクライアントおよびサーバで動作するツールです。異なるプラットフォームをまたいで動作するアプリケーションシステムの設計はこれからますます重要になりますが、IBM DAV はこれを強力にサポートします。
クライアント側でサポートされている OS は現在2種類です。
- Microsoft Windows XP SP2
- Red Hat Enterprise Linux Client 5.1
サーバ側でサポートされている OS を以下に示します。
- Red Hat Enterprise Linux 5.1 もしくは 5.2 (x86ノード)
- Red Hat Enterprise Linux 5.1 もしくは 5.2 (IBM BladeCenter QS21)
- Red Hat Enterprise Linux 5.2 (IBM BladeCenter QS22)
さらに IBM DAV は C/C++、Java、VBA といった複数のプログラム言語をサポートしており、これらの言語で開発されたアプリケーションに適用することができます。
IBM DAVを導入してみよう
本記事では、2008年8月26日にリリースされたバージョンを前提に、クライアントが Windows XP SP2 、サーバが Red Hat Enterprise Linux 5.1 on x86 として解説します。
IBM DAV クライアントのインストール
クライアントには、IBM DAV Client ソフトウェアと IBM DAV Virtualizer ソフトウェアをインストールします。
IBM DAV Client ソフトウェアは、IBM DAV を使うための Runtime 環境です。そのため IBM DAV を使ってクライアントアプリケーションが動作する環境には必ずインストールする必要があります。
IBM DAV Virtualizer ソフトウェアは、クライアント側およびサーバ側の IBM DAV ライブラリを生成するためのツールです。そのため開発者が使用する開発環境にインストールする必要はありますが、Runtime 環境には必須ではありません。
それぞれインストーラを実行し、ウィザードに従うだけで、容易に導入することができます。
IBM DAV サーバのインストール
サーバには、IBM DAV Server ソフトウェアをインストールします。
IBM DAV Server ソフトウェアのインストールするには、次のコマンドを実行して下さい。
$ rpm -ivh dav-server.i386.rpm
|
IBM DAV を使うための設定
クライアント側の設定
IBM DAV Client ソフトウェアをインストールしたディレクトリ (デフォルトではC:\Program Files\IBM\IBM DAV\Client) にある IBM_DAV.conf を使用環境に合わせて編集する必要があります。変更するのは、サーバのホスト名、IP アドレス、ポート番号です。例えば次のように編集します。
ホスト名や IP アドレスは、サーバ側で確認してから変更すれば問題ないでしょう。ここで気をつけたいのは、ポート番号です。ここで指定するポート番号は、サーバ側の IBM DAV Server ソフトウェアをインストールしたディレクトリ (デフォルトでは/usr/ibmdav/server) にある IBM_DAV.conf 内の記述と合っていなければなりません。具体的には以下に示す箇所です。
...
#Port on which the broker will accept client requests
dav.broker.listen.clients.port=4320
...
|
サーバ側の設定
IBM_DAV_PATH という環境変数を設定する必要があります。この環境変数に設定する値は、IBM DAV がインストールされているディレクトリへのパス、すなわち /usr/ibmdav/server になります。ユーザのホームディレクトリにある .bashrc に以下の記述を加えて下さい。
...
export IBM_DAV_PATH=/usr/ibmdav/server
...
|
サーバ側では IBM DAV Server ソフトウェアをインストールしたディレクトリにある IBM_DAV.conf を必ずしも編集する必要はありません。クライアント側では使用環境に合わせて変更する必要がありましたが、サーバ側では IBM DAV の使用手順に従えば自動的に変更されるのです。
Windows アプリケーションとサーバ側のライブラリをビルドする
続いてクライアントの Windows アプリケーションとサーバのライブラリをビルドしてみましょう。
一般的な手順は、次のようになるでしょう。
- 1. Windows アプリケーションで実行時間がかかりコンピュータノードにオフロードしたい関数を抜き出す
- 2. 抜き出した関数をサーバ側で共有ライブラリ (.so) にする
- 3. サーバ側の共有ライブラリのヘッダーファイルにセマンティクスコメントを記述する
- 4. IBM DAV によりクライアントおよびサーバ側のライブラリを生成し配置する
- 5. Windows アプリケーションを実行する
ここでセマンティクスコメントについて説明しておきます。IBM DAV はクライアント側からサーバ側の関数を呼び出す仕組みを提供します。しかしこのような仕組みを自身で作ってみたことがある人はお気づきかと思いますが、関数の引数のサイズが可変 (例えば配列やポインタなど) の場合には、サイズを指定しなければ、正確に関数呼び出しを行うことができないのです。そのための情報を IBM DAV に渡すのがセマンティクスコメントです。ヘッダーファイルに関数名や引数のサイズなどを記したセマンティクスコメントを記述することで、IBM DAV は正しいデータサイズでリモートの関数呼び出しを行うことができるのです。
オフロードしたい関数を抜き出す
既存の Windows アプリケーションに IBM DAV を適用したい場合は、Windows アプリケーションの特定の部分を抜き出す作業からになりますが、本記事の解説では簡単なサーバ側のライブラリを作って、Windows アプリケーションから呼び出すようにします。
サーバ側のライブラリを用意する
サーバ側で動作する関数を共有ライブラリにまとめます。はじめは誰しも "Hello World!" を出力するプログラムから書き始めることでしょうから、リスト 1 で示す簡単なサンプルプログラムを使って、IBM DAV を試してみることにしましょう。
リスト 1. サーバ側のサンプルプログラム (DavTest.c)
#include <stdio.h>
int dav_hello_world(int num)
{
int i;
for (i = 0; i < num; i++)
{
printf("Hello World!\n");
}
return 0;
}
|
リスト 2. サーバ側のサンプルプログラムのヘッダーファイル (DavTest.h)
#ifdef __cplusplus
extern "C" {
#endif
int dav_hello_world(int num);
#ifdef __cplusplus
}
#endif
|
見て分かるとおり、このサンプルプログラムは、引数で指定された回数だけ "Hello World!" を標準出力に出力します。このプログラムをビルドして共有ライブラリ (libDavTest.so) を作りましょう。
セマンティクスコメントを記述する
サーバ側のライブラリのヘッダーファイルを IBM DAV Virtualizer ソフトウェアがインストールされたクライアントにコピーします。そして IBM DAV が正しくライブラリを生成できるようにセマンティクスコメントをヘッダーファイルに追記します。ここでセマンティクスコメントについて、少し解説します。
セマンティクスコメントは決められたフォーマットに従って記述する必要があります。フォーマットは次の通りです。
次に上記フォーマットに従って記述するタグについて説明します。
- @function タグ
- @function タグは関数名を IBM DAV に伝えるためのものです。フォーマットは次の通りです。
@function name
@function に続いて関数名を記述します。
- @param タグ
- @param タグは引数に関して IBM DAV に伝えるためのものです。ただし @param タグは引数が値渡しの場合には記述する必要はありません。引数が配列やポインタのように、サイズを指定する必要がある場合に記述します。フォーマットは次の通りです。
@param[in/out/inout] name @dimensions[size]
@param に続く in/out/inout は、データがクライアントからの入力だけに使われる、データをサーバからの出力として受け取るために使う、入出力として使うということを指定するためのものです。続いて引数の名前を記述します。@dimensions 以下は引数の配列もしくはポインタのサイズを指定するものです。例えば配列の要素数が3の場合には、@dimensions[3] となります。
- @return タグ
- @return タグは戻り値に関して IBM DAV に伝えるためのものです。@param タグと同様に、戻り値が配列もしくはポインタの場合に記述する必要があります。フォーマットは次の通りです。
@return @dimensions[size]
@return に続く @dimensions 以下は @param と同様に、戻り値の配列もしくはポインタのサイズを指定するものです。
ここでは重要なものを取り上げて説明しましたが、IBM DAV はここでは解説していないものもサポートしており、色々なケースに柔軟に対応することができます。セマンティクスコメントの詳細な文法が知りたい方は、IBM Dynamic Application Virtualization User Guide を参照して下さい。
例えば上記のサンプルプログラムのヘッダーファイルにセマンティクスコメントを追記すると、次のようになります。
リスト 3. セマンティクスコメントを追記したヘッダーファイル (DavTest.h)
#ifdef __cplusplus
extern "C" {
#endif
/**IBMDAV* @function dav_hello_world
*/
int dav_hello_world(int num);
#ifdef __cplusplus
}
#endif
|
この例では、タグ @function に関数名 dav_hello_world が追記されています。
IBM DAV によるライブラリの生成
セマンティクスコメントが追記されたヘッダーファイルを基に、IBM DAV Virtualizer がライブラリを生成します。IBM DAV Virtualizer をインストールしたディレクトリ (デフォルトではC:\Program Files\IBM\IBM DAV\Virtualizer) にある davGen\davGen.bat を使います。davGen.bat 実行時のオプションは、davGen.bat をオプションなしで実行するか、IBM Dynamic Application Virtualization User Guide を参照してみて下さい。
無事ヘッダーファイルからクライアント側の IBM DAV ライブラリとサーバ側の IBM DAV ライブラリのソースファイルが生成されたはずです。次に IBM DAV Virtualizer が生成したサーバ側のライブラリソースコードを、IBM DAV Virtualizer をインストールしたディレクトリにある deployer\deployer.bat を使って、クライアント側からビルドおよび配置します。IBM DAV は SFTP および SSH によってサーバ側にソースファイルを転送し、ビルドを実行します。そのために deployer.bat と同じディレクトリに存在する connectionDetails.txt に、リモートログインするための情報 (ユーザ名、パスワード、IP アドレス、ポート番号) を記述します。
ログイン情報を記述したら deployer.bat を使いましょう。deployer.bat 実行時のオプションは、deployer.bat をオプションなしで実行するか、IBM Dynamic Application Virtualization User Guide を参照してみて下さい。
Windows アプリケーションと IBM DAV ライブラリを組合せる
ここまでで、クライアント側とサーバ側にそれぞれ IBM DAV が提供するものが揃いました。あとはリスト 4 のWindows アプリケーションと IBM DAV ライブラリを結合して、サーバ側の関数を呼び出せることを確認するのみです。
リスト 4. Windows アプリケーション (DavTestDriver.c)
#include <stdio.h>
#include "DavTest.h"
int main(int argc, char *argv[])
{
int rc;
int num = 10;
rc = dav_hello_world(num);
return (0);
}
|
IBM DAV を使ってみる
これで準備は整いました。では早速 IBM DAV を使って、Windows アプリケーションからリモートのコンピュータノードで動作する関数を呼び出してみましょう。
まずはサーバ側の準備から
クライアントの Windows アプリケーションを起動する前に、サーバ側でデーモンを起動する必要があります。
まずは、クライアントからのリクエストの仲介を行うデーモンである davServiceBroker を起動します。
$ cd /usr/ibmdav/server/bin
$ ./davServiceBroker
|
続いて、クライアントからのリクエストを受け付け、サーバ側で実行する関数を呼び出すためのデーモンである dav を起動します。
$ cd /usr/ibmdav/server/bin
$ ./dav start
|
dav デーモンの状態を知りたいときには、次のコマンドを実行します。
dav デーモンを終了するときには、次のコマンドを実行します。
Windows アプリケーションからの"Hello World!"
ではいよいよクライアントの Windows アプリケーションを起動してみましょう。IBM DAV Virtualizer が生成したライブラリ (DavTest_oai.dll) を、Windows アプリケーションと同じディレクトリに置くか、パスの通ったところに置いて、Windows アプリケーションを実行して下さい。サーバ側の dav デーモンを起動したコンソール上に "Hello World!" が表示されたら成功です。
まとめ
IBM DAV を使って、Windows アプリケーションの一部をリモートのコンピュータノードに簡単にオフロードすることが出来ることを示しました。IBM DAV を適切に活用すれば、Windows アプリケーションへの変更を最小限に抑えつつ、リモートのコンピュータノードの演算能力を活用することができるのです。今回の記事で紹介したのは、IBM DAV の極めて基本的な機能ですが、IBM DAV の持つ機能をさらに活用すれば、より実用的な Windows アプリケーションを開発することができます。
次回「IBM Dynamic Application Virtualizatioin を使った Windows アプリケーション開発 : 第 2 回」では、IBM DAV を使って Windows アプリケーションから Cell/B.E. 上で動作するプログラムを呼び出す、より実践的なアプリケーション開発の解説を行う予定です。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | 梶 信也 (Shinya KAJI) は、日本IBMのソフトウェアエンジニアとして、Cell/B.E. 向けソフトウェアの開発や、組み込みの世界でドライバやミドルウェアの設計/開発を行ってきました。現在は主にソフトウェアアーキテクトとしてソフトウェアのあるべき姿を日々探求しています。 |
記事の評価
|