MPI と OpenGL を用いた マルチスクリーンアプリケーション
高 石 武 史
*Making multi-screen applications with MPI and OpenGL
(平成20年₉月20日受理)
Takeshi TAKAISHI
(Received September 20, 2008)
A new method for making multi-screen 3D CG applications is presented. Using Message Passing Interface ︵MPI︶ for multi-cpu computing, 3D CG drawn by OpenGL API can be extended to the multi- screen with non-catch-up PCs. This method makes it easier to make 3D CG applications for multi-screen displays, and some of these are shown.
Keyword:MPI, OpenGL, Multi-screen, Visualization, Parallel Computing
3D CG用APIであるOpenGLを用いて描画した画像を,並列計算用API であるMPIを利用することによって,マルチスクリーン表示アプリケー ションを容易に作成した。この手法を用いて,いくつかのアプリケーション を実際に作成した。
1.はじめに
筆者は 3 次元データを可視化する再にOpenGLとそのツールキットglutを利用したプログラム を利用しているが,PCの画面上で 3 次元データを操作し,そこから知見を得るにはなかなか難し い場合が多い。 3 次元データを立体化しそこでデータの形状を検討したり,360度スクリーンの装 置内でデータを見回すことができればより深い構造理解を得られると考えられるが,そのためには 高額な装置やソフトウェアが必要となったり,高度なプログラミング技術を要求される。
ここでは,通常のPCをネットワークで数台接続することにより,OpenGLを用いて作成した 3
* E-mail : t.takaishi@hkg.ac.jp
実現することが可能である。また,この方法で実際にプログラム例をいくつかあげ,さらにこの方 法を利用して作成された立体視表示システムとそこで利用されるプログラムについても説明する。
2.動作原理とプログラムの構成
分散メモリ型並列数値計算において利用されているMPI(Message Passing Interface)[1]では,
マシン間でのデータの送信,受信,同期,集計等の関数が用意されている[2]。このうち,データ の送受信と同期を利用して今回はプログラムを作成した。また,今回利用したのはフリーの実装 MPICH2[3]で,linux上でコンパイルして利用している。
OpenGLは 2D/3Dグラフィックスアプリケーション開発用のAPIで,Windows, Unixを始め多 くのプラットフォームで利用可能な上に,GLUやglutといったライブラリやツールキットが提供 されていることから自作プログラムにおいても非常によく利用されている。また,マウスやキー ボードを利用した,インタラクティブなアプリケーションが作成できるのも特徴である。今回は linux上のXwindowでfreeglutツールキット等を使用した。
ここでは,OpenGLを利用して作成された 3D CGアプリケーションを複数のマシンでどのよう に同期させて動かすかについて述べる。また,実際にglutツールキットを用いて作成したプログ ラムを例にとって解説する。
一つのプログラムの中で,ⅰ)マスターマシン(以下,マスター)で必要なパラメータを計算 し,ⅱ)マシン間でのデータ通信と同期を行い,ⅲ)各マシンで 3D CGを描画することを実現す るようにする。各マシンにおける 3D CGの描画領域は,何番目のCPUであるのかという情報から それぞれあらかじめ設定しておくようにプログラムする。その際に元のOpenGLプログラムの修 正が最小限ですむように,マルチスクリーンアプリケーションを作成していく。
マルチスクリーンアプリケーションを作成するには次のことを実現しなければならない。
• 複数のマシン間での描画の同期 • 各マシンでの描画領域の指定
まず,複数のマシン間での描画の同期であるが,1)画面の再描画に必要な最小限のデータ(例 えば,画面の回転角や視点移動)をあらかじめマスターで計算しておき,2)そのデータを各マシ ンへ配布し,3)全マシンで同期を取ったのち,4)各マシンで描画することで実現できる。(表 1 )
表 1 :マシン間でのデータ送受信,同期,描画の流れ
1 PC1 PC2 …
2 データを計算 (待ち) (待ち)
3 データを送信 → 受信 → 受信 4 同期 → 同期 → 同期 5 描画 描画 描画
OpenGLを利用したプログラムでアニメーションを表示する場合には,まず画面描画用の関数
(例えばdisplay())を設定する。この関数をglutIdleFunc()で設定すると,glutMainLoop()
のメインループにおいて設定された描画関数が常時呼び出され画面更新を行う。複数のマシンでこ の描画を同期するには,必要なデータの転送とマシン間の同期を描画直前に行うことによって実現
MPIで上記のマシン間の描画同期を行うには,2)のデータ配布ではMPI_Bcast()を,3)の 同期ではMPI_Barrier()を利用すると簡単である。
描画領域は,サイズ(全プロセス数)とランク(起動したプロセスの番号)を利用して,各マシ ンで計算することができる。例えばy軸の周りに等分割して各ディスプレイで表示する場合には,
横方向の視野角Δθ(°)とi番目のマシンの視線の角度θi(°)は次のようになる。
Δθ= 360
(全プロセス数)
θi=i・Δθ ⑴
図 1 :360°の分割と,各マシンの表示範囲 これはプログラムでは次のようになる。
MPIの初期化はmain()の最初に,MPIの終了処理はmain()の最後に行なう。
従ってプログラム全体では次のような構成になる。
3.実装例
ここでは実際に作成したプログラムをいくつか紹介する。そのうち,一番シンプルな「星とその 衛星」については付録にソースを掲載した。またいくつかのソースプログラムは筆者のWebサイ ト[7]から入手可能であるので,興味のある人は試してみて欲しい。
3.1 2 面のディスプレイでの表示 3.1.1 星とその衞星
OpenGLプログラミングガイド[4]に掲載されている主星の周りを回る衛星のアニメーションプ ログラム(planet.c)をもとに,マウスで回転方向を変更できる改良版を作成し,これを 2 画面用 に変更した。画面を左右に分割するにあたり, 2 枚の画面を次のように設定した。†
† C言語を用いたプログラムでは,三角関数では角度の単位をラジアン(弧度法)で,OpenGL ではデグリー(度)で与えなければいけないことに注意。
視 野 角:θ=60°
視 点:(x,y,z)=(0,0,l0)
視線方向:(x,y,z)=(±l0 tan(πθ/360),0,0)
図はA.₁ のソースプログラムを実行したスクリーンショットである。
図 2 :星とその衛星表示プログラム(MPI-planet)実行した様子
3.2 360°マルチディスプレイでの表示 3.2.1 ローレンツボール
熱対流の縮約モデルであるローレンツモデルはカオスを発生するシステムとして有名であり,そ のストレンジアトラクターはローレンツアトラクターと呼ばれている。
カオスの特徴として,近接した初期値から出発しても軌道が指数関数的に離れていってしまう現 象が知られている。数個のボールで初期値を表し,そのボールをローレンツ方程式に従って移動さ せて軌道を観察してみる。この際に視点がアトラクターの中心になるように方程式を変更し,360 度のスクリーンの中に座って現象を観察できるようにする。
dx
dt =σ(-x+y)
dy
dt =(r-z)x-y ⑵
dz
dt =xy-bz
ここで,σ=10,b =8/3,r =28として計算する。表示にあたっては,(x*₀.₄,y*₀.₂,(z-
25)*₀.₄)として,視点がほぼアトラクターの中心で観察しやすいようにした。
︷
図 3 :ローレンツボール表示プログラム(lorenz-multi)を 5 枚のwindowで実行した様子
3.2.2 星空の描画
360度のマルチスクリーンを利用するとプラネタリウムのように星空を再現できる。また
OpenGLで 3 次元描画を行うことにより,遠近感も星の大きさとして表現できる。
ここでは星のデータとしてList of the Nearest 100 Stellar Systems@RECONS[5]を利用した。
データから 3 次元の極座標へと変換し, 3 次元空間に球を描画し,y方向(画面上方向)の軸とx 方向の軸を中心として回転させた。
図 4 :星空表示プログラム(nsphere)を 5 枚のwindowでの実行した様子
3.3 立体視システム
ここまで扱ってきた実例では,となりの画面と隣接するように次の画面を設定してきた。今回は 視点を右目と左眼で少しだけずらした画像を作成し,その 2 つの画像を向きの互いに異なる偏向 フィルタを用いたプロジェクタで投影し立体視することにする。
視 野 角:θ=30◦
視 点:(x,y,z)=(±l0/c,0,l0) 視線の方向:(x,y,z)=(0,0,0)
図 5 :立体視投影システムの構成[6]
図 6 :右眼用画像と左眼用画像,及び実際の投影の様子[6]
4.まとめ
この方法の利点は次の通りである。
1. 1 台のマシン用に製作されたOpenGLプログラムを少ない変更でマルチスクリーン対応に書 き直せる。
2.マルチスクリーンの枚数変更が容易である。
3.データ転送量が多くないので,システムへの負荷が少ない。
実装例で述べた立体視システムはこの方法を利用して学生が作成したもので,PCのマシン スペックが低い(Celeron 300MHz)にも関わらず十分な動作が確認された。また,グラフィック ボードを交換しそれに対応したXサーバを導入することで10倍近い速度の向上が見られ,低コス トで実用性の高いシステムが実現できた。その他のプログラムも高校生向け研究公開でネットワー クを利用したアプリケーションとして紹介したところ,興味を持つ高校生も多かった。
しかし,この方法にもいくつかの問題点がある。今回の実装では同期を行なった後に描画を行 なっているため,PC間の描画スピードに明白な差異が認められる場合には難しいことである。こ れはプログラム中で同期を取る場所を変更することで改善できると考えられる。もちろん,各マシ
ンにMPICH2 をインストールしておかなければならないし,再コンパイル時には実行前に各マシ
ンで実行ファイル等の同期を取る必要がある。この辺りは,インストール方法やファイル同期用ス
謝 辞
本研究の立体視装置作成は松尾武明君が卒業研究[6]として行い,研究室の多くの学生がその 評価を手伝ってくれた。また,オープンキャンパスでの展示に際し,本学情報処理センターから
NotePCを 5 台貸与していただいた。ここに感謝いたします。
参 考 文 献
[1] MPI Forum, http://www.mpi-forum.org/
[2] Peter S. Pacheco, Parallel Programing with MPI, Morgan Kaufmann Publishers (1997) P. パチェコ著秋葉博訳,MPI並列プログラミング,培風館(2001)
[3] MPICH2, http://www-unix.mcs.anl.gov/mpi/mpich/
[4] OpenGLプログラミングガイド第 2 版,ピアソン・エデュケーション(1997)
[5] List of the Nearest 100 Star Systems, RECONS, http://www.chara.gsu.edu/RECONS/TOP100.posted.htm
[6] 松尾武明,OpenGLとMPIを用いた 3Dアプリの作成,広島国際学院大学情報学部情報工学 科卒業論文(2008)(ロボット歩行プログラムについては,床井浩平,GLUTによるOpenGL入 門,工学社(2005)を参考にしている)
[7] MPIとOpenGLでマルチスクリーンアプリケーション,
http://take.ttlab.cs.hkg.ac.jp/~ttks/Lecture/OpenGL/MPI-OpenGL-J.html
MPIでの利用にあたって追加修正した箇所は,行番号の左にMと記されている。
A.2 プログラムのコンパイルと実行
コンパイル時にはMPICH2 とOpenGL,GLU,glutのライブラリをリンクする必要がある。こ こでは,Program_Name.cをコンパイルし,Num_of_Proc個のマシンで実行するとして手順を説 明する。
プログラムのコンパイルはOpenGL関連のライブラリを指定し,mpiccによって行なう。
実行に先立ち,MPI用のデーモンを各マシンで実行する必要がある。以下にmpdの起動と確認 の方法を述べる。
1.~/.mpd.confを各マシンに配布
2.mpd.hostsにマシンの順序を記入 3.mpdbootの実行
4.mpdtraceで各マシンでの起動を確認
mpdbootで起動した際には,各マシンの番号付けは指定したファイル(mpd.hosts)内のマシン 名の順ではなく応答した順になってしまう。そこで,実行時には再度ホスト名の順を指定する必要 がある。