• 検索結果がありません。

2.16 高速プロセス起動

2.16.7 計算の再開・終了関数 (Fortran)

2192

書式

2193

subroutine QL CLIENT(ierr)

2194

説明

2195

ql client()を呼び、その戻り値をierrに格納して戻る。

2196

2.16.8 初期化関数

2197

書式

2198

int ql init(int argc, char **argv)

2199

説明

2200

MPI Init()から呼びされ、高速プロセス起動の初期化を行う。

2201

処理ステップは以下の通り。

2202

1 環境変数QL NAMEからMPIプログラムIDを取得する。取得できなかった場合、ql mpiexec start

2203

から起動されていないと判断し、QL NORMALを返す。

2204

3 MPIプログラムIDから、パラメタファイルのパスを作成する。

2205

4 QL SUCCESSを返す。

2206

戻り値

2207

戻り値 説明

QL SUCCESS 高速プロセス起動の初期化成功

QL NORMAL 当該プロセスがql mpiexec startから起動されていない

2208

2.16.9 計算ノードの管理サーバ

2209

書式

2210

ql server

2211

説明

2212

ql serverは、ql mpiexec startによりRANK#0が存在する計算ノード上に起動され、以

2213

下の処理を行う。

2214

1 既にql serverが起動されている場合は、-1を返して終了する。

2215

2 mcexecql talkerとの通信に用いるユニックスドメインソケットをオープンする。

2216

3 select()で当該ソケットを監視する。

2217

4 電文を読み込み、コマンドとデータを取得する。

2218

5 ql talkerからNコマンドを受け取った際は、対応するMPIプログラムを管理表に登

2219

録する。また、MPIプロセスIDをインデックスとしql serverに接続しているプロセ

2220

スを返すマップ(接続マップと呼ぶ)にql talkerを登録する。

2221

接続マップはstruct client fdで実装される。struct client fdは以下のように定

2222

義される。

2223

struct client_fd {

2224

int fd; // 接続元プロセスのファイルディスクリプタ

2225

int client; // 接続元プロセスの種別

2226

char *name; // MPIプログラムID

2227

int status; // 現在実行中の通信コマンド

2228

};

2229

6 mcexecからEコマンドを受けとった際は、ql mpiexec {start,finalize}の指示が

2230

あるまで待たせる。また、mcexecを接続マップに登録する。さらに、接続マップを用

2231

いて対応するql talkerを見つけ、それに対してEコマンドを送信する。

2232

7 ql talkerからRコマンドを受けとった際は、ql talkerを接続マップに登録する。ま

2233

た、接続マップを用いて対応するmcexecプロセスを見つけ、それに対してRコマンド

2234

を送信することでmcexecを起床する。

2235

8 mpiexec監視プロセスからFコマンドを受け取った際は、対応するMPIプログラムを

2236

管理表から削除する。管理表が空になった場合はql server自身も終了する。

2237

ql talkermcexecql serverと通信するために使用するソケットファイルは、環

2238

境変数QL SOCKET PATH が定義されている場合は${QL SOCKET PATH}/ql sock 下に、定義

2239

されていない場合は/run/user/ユーザID/ql sock下に作成される。当該ディレクトリは

2240

ql mpiexec startコマンドが実行されるノードとランク#0が実行されるノードからアクセ

2241

スできる必要がある。

2242

2.16.10 指示中継コマンド

2243

書式

2244

ql talker <send command> <receive command> <MPI Program ID>

2245

引数

2246

2247

引数 説明

<send command> ql serverへ送信するコマンド(1文字)を指定する。

<receive command> ql serverからの受信を期待するコマンド(1文字)を指定する。受信を待たずに終 了する場合は、”-n”を指定する。

<MPI Program ID> MPIプログラムIDを指定する。

説明

2248

ql mpiexec {start,finalize}からql serverが動作するノード上に起動され、ql server

2249

に<send command>で指定されたコマンドを送り、<receive command>で指定された応答を待

2250

つ。ql serverとはユニックスドメインソケットを用いて通信する。

2251

処理ステップは以下の通り。

2252

1 argcの数をチェックし、4未満の場合は終了コード-1で終了する。

2253

2 環境変数を参照してql serverとの接続に用いるユニックスドメインソケットを見つ

2254

け、ql serverに接続する。

2255

3 <send command><MPI Program ID>より電文を作成し、ql serverへ電文を送信する。

2256

失敗した場合は終了コード-1で終了する。

2257

4 <receive command>”-n”が指定されていた場合、終了コード0で終了する。

2258

5 <receive command>を受信した場合、終了コード0で終了する。<receive command>

2259

外の文字列を受信した場合終了コード-2で終了する。

2260

戻り値

2261

戻り値 説明

0 正常終了

-1 ソケット通信エラー

-2 <receive command>以外の文字列を受信

2262

2.16.11 swapoutシステムコール

2263

書式

2264

int swapout(char *filename, void *workarea, size t size, int flag)

2265

引数

2266

引数 説明

filename スワップファイル名へのポインタ

workarea 作業領域へのポインタ

size 作業領域のサイズ

flag swapoutの動作制御用フラグ

2267

説明

2268

2269

A. スワップアウト処理

2270

2271

udata_buf

struct swap_areainfo (swap_info[0])

start endpos flag struct

areaent (swap_arealist(1))

*next count struct addrpair [0]

start endflag

struct addrpair [128]

start endflag

struct Areaent (mlock_arealist(1))

*next=0 count struct addrpair [0]

start endflag

struct addrpair [m]

start endflag

struct Areaent (swap_arealist(n))

*next=0 count struct addrpair [0]

start endflag

struct addrpair [128]

start endflag

struct swap_areainfo (swap_info[n])

start endpos flag

.........

...

struct swap_areainfo (mlock_info[0])

start endpos flag struct

swap_areainfo (mlock_info[m])

start endpos flag

...

char magic[16]

char version[16]

int count_sarea int count_marea struct

swap_header

カーネル空間 (swap_info)

filename

struct swap_header *swphdr struct swap_areainfo *swap_info struct swap_areainfo *mlock_info

char *swapfname struct

arealist swap_area

*head

*tail count(n) struct

arealist mlock_area

*head

*tail count(m) struct

mlockcntnr mlock_container

*from ccount

*cur char *udata_buf size_t ubuf_size size_t ubuf_alloced

buffer

swap_area[0]

mlock_area[0]

mlock_area[m]

swap_area[n]

ユーザ空間

struct swap_areainfo (swap_info[0])

start endpos flag struct

swap_areainfo (swap_info[n])

start endpos flag

...

struct swap_areainfo (mlock_info[0])

start endpos flag struct

swap_areainfo (mlock_info[m])

start endpos flag

...

char magic[16]

char version[16]

int count_sarea int count_marea struct

swap_header

swap_area[0]

swap_area[n]

...

swapファイル

(1) 作業領域

(2)

(3) (4)

(4)

(6) (7)

(8)

(9)

(10) (11)

(14)

(15)

(16) (17)

(19)

(17) (16) (19)

(5)(18)

(12)

(13)

ポインタファイル出⼒

データコピー 凡例

Figure 2.24: スワップアウトの処理フロー

2272

スワップアウトの処理フローを図??を用いて説明する。

2273

1. McKernelのユーザから渡された作業領域をmlock()によりロックする。swapout情報

2274

を管理するswap info構造体のudata bufメンバに作業領域の先頭アドレスを記録す

2275

る。 (図の(1))

2276

2. 引数で指定されたファイル名をcopy from userでカーネル空間にコピーする。swap info

2277

構造体のswapfnameメンバにファイル名のアドレスを記録する。 (図の(2))

2278

3. 作業領域に汎用バッファudata bufを割り当てる。(図の(3))

2279

4. 作業領域にスワップエリア管理用リストswap arealistmlockエリア管理用リスト

2280

mlock arealistの領域を割り当てる。 (図の(4))

2281

5. swapファイルをopen()でオープンする。(図の(5))

2282

6. lookup process memory rangeおよびnext process memory rangeを用いて、ユーザ

2283

プロセスのメモリ領域を検索し、それぞれについて以下を行う。

2284

(a) mlock()されている領域の開始アドレス、終了アドレス、flagを作業領域のmlock_

2285

arealistに記録する。 (図の(6))

2286

(b) mlock()されていない領域の開始アドレス、終了アドレス、flag を作業領域の

2287

swap arealistに記録する。 (図の(7))

2288

7. 作業領域のswap arealistのエントリ数と同数のエントリを持つswap info配列を作

2289

業領域に割り当てる。カーネル領域のswap info構造体のswap infoメンバに作業領

2290

域のswap info配列の先頭アドレスを記録する。 (図の(8))

2291

8. 作業領域のmlock arealistのエントリ数と同数のエントリを持つmlock info配列を

2292

作業領域に割り当てる。カーネル領域のswap info構造体のmlock infoメンバに作業

2293

領域のmlock info配列の先頭アドレスを記録する。 (図の(9))

2294

9. 作業領域にswap headerを割り当てる。カーネル領域のswap info構造体のswphdr

2295

ンバに先頭アドレスを記録する。 (図の(10))

2296

10. 作業領域のswap headermagicメンバに”McKernel swap”、versionメンバに”0.9.0”、

2297

count sareaメンバにswap arealistのエントリ数、count mareaメンバにmlock_

2298

arealistのエントリ数を記録する。

2299

11. 作業領域のswap headerwrite()を用いてスワップファイルへ書き出す。(図の(11))

2300

12. 作業領域のswap arealistのリスト形式データを作業領域のswap info配列へコピー

2301

する。 (図の(12))

2302

13. 作業領域のmlock arealistのリスト形式データを作業領域のmlock info配列へコ

2303

ピーする。(図の(13))

2304

14. 作業領域のswap info配列をwrite()を用いてスワップファイルへ書き出す。 (図の

2305

(14))

2306

15. 作業領域のmlock info配列をwrite()を用いてスワップファイルへ書き出す。(図の

2307

(15))

2308

16. 作業領域のswap infoの情報を用いて、ユーザプロセスのメモリ領域のうち、スワップ

2309

アウト対象となっているものをwrite()を用いてスワップファイルへ出力する。(図の

2310

(16))

2311

17. スワップアウト対象となっているメモリ領域のうち、McKernel側でマップされている

2312

ものをihk mc pt free range()でアンマップする。(図の(17))

2313

18. スワップファイルをclose()を用いてクローズする。 (図の(18))

2314

19. スワップアウト対象となっているメモリ領域のうち、Linux側でマップされているもの

2315

をmcexecに依頼することでアンマップする。 (図の(19))

2316

B. スワップイン処理

2317

2318 2319

カーネル空間 (swap_info)

filename

struct swap_header *swphdr struct swap_areainfo *swap_info struct swap_areainfo *mlock_info

char *swapfname struct

arealist swap_area

*head

*tail count(n) struct

arealist mlock_area

*head

*tail count(m) struct

mlockcntnr mlock_container

*from ccount

*cur char *udata_buf size_t ubuf_size size_t ubuf_alloced

buffer

swap_area[0]

mlock_area[0]

mlock_area[m]

swap_area[n]

ユーザ空間

struct swap_areainfo (swap_info[0])

start endpos flag struct

swap_areainfo (swap_info[n])

start endpos flag

...

struct swap_areainfo (mlock_info[0])

start endpos flag struct

swap_areainfo (mlock_info[m])

start endpos flag

...

char magic[16]

char version[16]

int count_sarea int count_marea struct

swap_header

swap_area[0]

swap_area[n]

...

swapファイル

udata_buf

struct swap_areainfo (swap_info[0])

start endpos flag struct

swap_areainfo (swap_info[n])

start endpos flag

...

struct swap_areainfo (mlock_info[0])

start endpos flag struct

swap_areainfo (mlock_info[m])

start endpos flag

...

char magic[16]

char version[16]

int count_sarea int count_marea struct

swap_header

作業領域

(1)

(2)

(3)

(3) (4)

ポインタファイル⼊⼒

データコピー 凡例

Figure 2.25: スワップインの処理フロー スワップインの処理フローを図??を用いて説明する。

2320

1. スワップファイルをopen()を用いてオープンする。 (図の(1))

2321

2. スワップイン対象アドレス範囲を記録しているswap info配列の各エントリに対して

2322

以下を行う。なお、ユーザ空間の作業領域はスワップアウトを経ても残っているため、

2323

swap info配列をファイルから取得する必要はない。

2324

(a) read()を用いてスワップファイルから作業領域のudata bufへスワップイン対象

2325

のメモリ内容をコピーする。(図の(2))

2326

(b) copy to userを用いて、作業領域のudata bufからユーザプロセスのメモリ領域

2327

へ、スワップイン対象のメモリ内容をコピーする。 (図の(3))

2328

3. スワップファイルをclose()を用いてクローズする。 (図の(4))

2329