Squeak Smalltalk 向け、マルチコア対応 VM(Hydra VM)を試す


AO bench のスコアでは Cincom Smalltalk に遠く及ばない Squeak Smalltalk ですが、この差を少しでも縮めるのに役立ちそうなので、つい先頃、最新版がリリースされた Hydra VM がどんなかんじで動くのか調べてみました。


Hydra VM についてはこちらを。


以下に Win32 向け Hydra VMSqueak システム(3.9)を動かすための簡単な手順を示します。


▼ 必要なファイルをダウンロード&展開

圧縮ファイル(Squeak3.9-win32.zip、HydraVM-bin-27.02.2009.zip)は展開し、中身をひとつのフォルダにまとめておきます。Squeak3.9-win32.zip を展開してできる Squeak3.9-win32 フォルダにまとめるのがよいでしょう。
このとき、HydraVM-bin-27.02.2009.zip 内の SqueakFFIPrims.dll については Squeak3.9-win32 フォルダ内の同名のファイルと置き換える必要があります。

HydraVM-sig.17.mcz も同じフォルダに移動しておきます。


Squeak システムを起動し、必要な機能拡張をロード

Squeak3.9-final-7067.image を Croquet.exe(= Hydra VM)にドロップインして Squeak システムを起動します。起動後、新しいプロジェクト(仮想デスクトップ)を作って切り替えておくとよいと思います(デスクトップクリック → open... → morphic project → 開いたプロジェクトウインドウ内をクリック)。

次に、ファイルリストを起動(デスクトップクリック → open... → file list)して、 上段右手のペインのファイルの一覧から HydraVM-sig.17.mcz をクリックして選択後、ウインドウ最上段ボタン群右端に現われる load ボタンをクリックします。読み込みが完了すると、HydraVM helpfull doits というワークスペースが自動的に開くので、扱いやすい位置と大きさに調整します。ファイルリストはもう必要ないので閉じてしまいます。

ここでいったんイメージを保存しておきます(デスクトップクリック → save as... → hydra.image と入力して Accept)


▼ Hydra VM の動作確認と第二イメージの作成、および、再起動

HydraVM helpfull doits ワークスペースにある、

HydraVM isHydra

を print it (alt + p) して true が返ってくることを確認します。これが false の場合は、何らかの理由で機能拡張がうまくいっていません。正常ならば続けてすぐあとにある、

HydraVM saveAsHeadlessImage: 'test.image'

という式を選択して do it (alt + d) します。test.image(と .changes )が作成され、自動的にシステムが終了するので、先ほど作成した hydra.image を Croquet.exe にドロップインして再起動します。


▼ 第二イメージのヘッドレス起動と並行処理

HydraVM loadAndRunNewImage: 'test.image'

を do it すると、先ほど作成した test.image をヘッドレス(GUI なし状態)で起動できます。

HydraVM interpreterInstanceCount

を print it して 2 が返ってくれば、正常動作です。この状態で、トランスクリプトを開き(デスクトップクリック → open... → transcript )、次式を do it します。

(HydraInterpreter at: 2) doIt: 'Transcript show: ''Doit Test'''

イメージ間通信チャンネルが開いていれば、トランスクリプトに Doit Test と出力されます。 ''Doit Test'' のところに適当な式に置き換えることで、第二イメージに処理させて、結果をトランスクリプトに出力させることが可能です。たとえば、

(HydraInterpreter at: 2) doIt: 'Transcript cr; show: 39 benchFib'

とすれば、操作中の第一イメージに負荷をかけずに、時間のかかる重い処理を別のネイティブスレッド(≒別のコア)で動いている第二イメージにさせることが可能です。このとき、Windows 付属のツールなどで、コア毎の CPU 使用率の変化を観察するとより効果を実感できるはずです。

なお、ここで用いた #benchFib の定義は通常のフィボナッチ数列生成メソッドとは違う次のような定義であるため、完了後、トランスクリプトには 204668309 とすこし風変わりな値が出力されますが気にしないでください。

Integer >> benchFib
    ^self < 2
        ifTrue: [1]
        ifFalse: [(self-1) benchFib + (self-2) benchFib + 1]

▼ “ベイビー”オブジェクトメモリー生成(mitosis)のデモ

ワークスペースの新しい行に、

HydraClone new cloneIdleProcess

をタイプ(あるいはここからコピペ)して入力、選択して do it すると、新しいネイティブスレッドを作成してそこで Smalltalk の簡単な処理(Squeak システム起動時に同時に開く標準出力画面に、1秒おきに文字列を出力する → #newIdleProcess に定義がある)を動かすデモを見ることができます。イメージ抜きでどう処理を走らせるかがミソのようですが、まだおぼろげにしか面白さが理解できていません。^^;

止める方法はなさそうなので、動作が確認できたら Squeak システムを終了(デスクトップクリック → quit... → No)します。



参考: