[Go to BBS]
All articles in a thread
Subject64bit hack
Article No504
Date: 2007/12/08(Sat) 18:35:09
ContributorAKio Morita
SADを 64bit環境で実行するのは難しいので、
PIC(Particle in Cell)などによる Space Charge計算で
大量のメモリーを消費する機能を実装するのは困難です
(32bitだとプロセス辺り 2GBないし 3GBの割り当てが限界)

が、最近の 64bitマシンでは 超4GBのメモリを実装するのも
困難ではなくなったので、これを活用するために、64bit OS上で
32bitコードが走る場合の抜け道を考えてみました

仮定するのは、内部計算に大量のメモリーを必要とするが、
入出力するべき情報量は少ないサブルーチンの導入です

SAD内部のサブルーチンの初期化手順
1. mkstemp(3)で、一時ファイルのファイル記述子を得る
(ファイルシステムの選択に注意、スワップ時は確保した
巨大なメモリがこのファイルに書き戻される)
2. 一時ファイルを unlink(2)する
(ファイルシステムのネームスペースから削除)
3. write(2)で、通信用に必要な長さだけ一時ファイルに 0を書き込む
(backing store用のブロックを確保、ftruncate(2)を使うを
スワップアウト時にbacking storeが fragmentationする危険有り)
4. fork(2)する

親プロセス側(32bit mode SAD)
5p. 一時ファイルを MAP_SHAREDかつ MAP_NOSYNCで mmap(2)
(必要ならMAP_HASSEMAPHOREも指定)
6p. マップしたメモリ空間を初期化
(必要ならセマフォを初期化する)

7p. マップしたメモリ空間へ計算エンジンへのパラメータを書き込み
シグナルかセマフォで子プロセスに合図する
8p. 子プロセスからの合図を待って、計算結果をマップしたメモリ空間から
受け取る
---以降、7p-8pの繰り返し

子プロセス側(まだ SADのコピーで稼働中)
5s. サブルーチンの駆動プログラム(64bit)を execve(2)する
この際、fork(2)で複製されている一時ファイルのファイル記述子番号を
argumentに潜り込ませる
子プロセス側(64bit mode サブルーチン)
6s. argumentから一時ファイルのファイル記述子番号取得し
一時ファイルを MAP_SHAREDかつ MAP_NOSYNCで mmap(2)
(必要ならMAP_HASSEMAPHOREも指定)
7s. 親プロセスからのメモリ空間の初期化完了を待つ

8s. 親プロセスからの合図を待って、マップしたメモリ空間から
計算エンジンへの入力パラメータを得る。
9s. 計算エンジンを駆動して、結果をマップしたメモリ空間へ書き込み
シグナルかセマフォで親プロセスに合図する
---以降、8s-9sの繰り返し

(5s)の execve(2)がポイントです
ここで、ファイル記述子を継承したままで 新しいプロセスに
生まれ変わります(32bitコード -> 64bitコード)
継承したファイル記述子に結びつけられたバッファキャッシュを
mmap(2)することで共有メモリを作って、32bitプロセスと
64bitプロセス間で内緒話をするわけです

mmap(2)が MAP_NOSYNCをサポートする場合は、VMは必要に迫られない限り
マップしたメモリ空間をファイルに書き戻さないので、共有メモリのパフォーマンスが
確保されます