PGI compiler TIPS
ネイティブ POSIX スレッドライブラリ

PGI コンパイラによる並列処理での NPTL スレッドライブラリ

(2005年 3 月 9 日 初稿)
ユーザの方から、自動並列化された実行モジュールをバージョンの異なる Linux distribution 下で実行すると、以下のような違いが出てくるが、どのような理由かと言う質問がありました。いわゆる、 Linux に実装されたスレッド・ライブラリの違いにより、以下のような現象が現れるのですが、これに関して説明します。

【質問内容】

machine 1 :SuSE Linux 9.0, PGI 6.0
machine 2 :SuSE Linux 9.1, PGI 6.0

自動並列化オプション -Mconcur を付加してコンパイルしたプログラムを実行させる

(例)
 $ pgf95 -fastsse -Mconcur test.f

  並列実行のための環境変数をセットする(SMP 4CPU のマシン)
 $ NCPUS=4 ; export NCPUS  

 $ ./a.out (並列実行)

 $ top コマンド等でスレッドの実行状況を見る

machine 1 では、環境変数 NCPUS に登録したものと同数のプロセスが実行されます。
各プロセスの消費メモリは 1CPU と同じだけ消費するので、並列実行すると NCPUS 倍
だけメモリを消費します。

machine 2 では、実行されるプロセスが一つだけで実行され、NCPUS を増やすごとに
実行時の CPU 占有率が上昇します。消費メモリは並列実行しても 1CPU で実行した場合
とほとんど変わりません。

なぜ、このような動作の違いが出てくるのでしょうか?

これは、SuSE 9.0 と 9.1 の OS が実装・利用しているスレッドライブラリの違いから生じる現象です。コンパイラの問題ではありません。 Linux(UNIX) のスレッドライブラリは、従来、総称名 " Linux Threads " と言うスレッドライブラリを利用してきました。これが、2004年から SuSE であれば 9.1 から、 RedHat であれば 9.0 から、総称名 " NPTL=Native Posix Threads Library " と言う、新しい POSIX スレッド・ ライブラリを 実装するようになりました。今回の現象は、Linux 上に実装されたスレッド・ライブラリ機能の違いによって生じるものです。そこで、SuSE であればバージョンにより以下の違いがあります。

  SuSE 9.0 = Linux Threads を使用するディストリビューション
  SuSE 9.1 = NPTL を使用するディストリビューション

PGI コンパイラは、各 Linux で搭載された Threads library をデフォルトで使用するようになっております。この詳細は、以下の URL ページの表中で、NPTL を使用している Linux distribution を見ることができます。

  https://hpcworld.jp/archive/SPG/Pgi/TIPS/support-os.html

それでは、二つのスレッド・モデルがどのような違いがあるかを簡単に説明します。

Linux Threads :
スレッドを同一メモリ空間を共有する複数のプロセスとして実装されている。 従って、ユーザが ps or top コマンドで実行プロセスを確認すると並列スレッドの実行モジュールであっても、複数のプロセスとして見えてしまう。また、管理スレッドを必要とするため、多数のスレッド操作においては、NPTL よりもオーバヘッドがある。多数のスレッドを扱う場合は、性能のスケーラビリティに影響する。

NPTL=Native Posix Threads Library :
カーネルレベルでのスレッドをサポートし、同一プロセスのスレッドが同じプロセス ID を持つようになったため、本来のスレッドモデルのアクティビティとして見える。従って ps or top コマンドでは、並列スレッド・モジュールは一個のプロセスとして見える。このスレッドモデルは、管理スレッドを必要としないため、性能的なスケーラビリティも良い。メモリに代表される資源的にも、light-weight となります。

各スレッドライブラリの機能性の違いにより、質問内容のような現象となることが理解できるかと思います。

最近の Linux は、全てこの新しい NPTL が実装されておりますので、OS を新しいものにバージョンアップすることにより、より性能改善されたマルチスレッドの環境をご利用できます。

● 2CPU搭載システムでの並列実行モジュールの動作状況の見え方( NPTL を使用した場合)
2CPU 搭載システムでの並列実行モジュールの動作状況の見え方(NPTLを使用した場合)

$ pgf90 -fastsse -Mconcur -Minfo  matmul.F -o matmul_f90mp -V wallclock.c

【1CPU 実行の場合の top コマンドによるプロセス状況】======================

$ export OMP_NUM_THREADS=1
$ ./matmul_f90mp
$ top -d1

top - 03:28:53 up  1:18,  2 users,  load average: 0.56, 0.25, 0.09
Cpu(s): 50.0% us,  0.0% sy,  0.0% ni, 49.8% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   2061780k total,   253876k used,  1807904k free,    16288k buffers
Swap: 11679204k total,        0k used, 11679204k free,   153236k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3921 taro      25   0 28556  23m 4884 R 99.9  1.2   0:04.95 matmul_f90mp2CPU 実行の場合の top コマンドによるプロセス状況】======================

$ export OMP_NUM_THREADS=2
$ ./matmul_f90mp
$ top -d1

top - 03:31:56 up  1:21,  2 users,  load average: 0.76, 0.39, 0.17
Cpu(s): 92.0% us,  8.0% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   2061780k total,   254012k used,  1807768k free,    16580k buffers
Swap: 11679204k total,        0k used, 11679204k free,   153284k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3942 taro      25   0 30604  23m 4884 R 99.5  1.2   0:04.79 matmul_f90mp

(NPTL では実行プロセスは一つとして表示される。昔の Linux Threads を使用している
場合は、二つのプロセスとして表示される)

<< 戻る



Copyright (C) HPC WORLD (Prometech Software, Inc. and GDEP Solutions, Inc.)