河野真治 @ 琉球大学情報工学です。

In article <86u14ezlih.wl@xh6.cc.hokudai.ac.jp>, Hiroki Kashiwazaki <reo@cc.hokudai.ac.jp> writes
> 結局、数CPU/1ノード、数十ノードとかいうマシンの場合、その CPUを
> 複数使った計算を行なおうとするなら、

結構、小規模なのね。

> (1) 1CPUを使う計算を、MPIを利用して複数ノードにまたがらせて実行
> (2) 1ノードだけ使ってthreadを利用して複数のCPU資源を利用。
>     マルチプロセスで計算できるようにモデルを切り分けて実行。

これは、ま、そんなものでしょう。ちなみに、
    Multi Thread と Multi Process
は別物です。Multi Processで最初から作って、socket で通信する
ってのも悪くないです。

> (3) 効率は上がらないかもしれないけど、threadを利用した計算を
>     MPIで複数ノードにまたがらせて実行。

これは普通はないMPIの使い方です。

MPIではなく、Shared Virtual Memoryとか分散共有メモリとかいう
のがあるので、そういうのを使うみたい。えーと、なんか、彼らが
使っている変な略号があったんだけど、DSM とかNUMAとか、そんな
の。

ただ、分散共有メモリは普通に実装すると性能が上がらないので、
(当り前〜) いろいろ意味不明な制限とか機能とかを付けるのが
普通なようです。例えば、

     書いたものがすぐ読めるとは限らない (Weak consistency とかいう)
          (そんなの考えながらプログラム書くわけ?)
     とりあえずバリア同期の部分でなんとかする
          (そこでネットワークが混むのは我慢する)
     誰からでも同じように読めるわけではない (このメモリはどこにあるとか指定する)
          (そんじゃ、PVMに逆戻り...)
     ロックの機構を工夫する。(なんたらLock APIみたいなのを入れる)
          (ロックネックになるのは見えてる...)

とかするようだね。

僕の意見としては、領域分割できるようなやさしい問題を並列化す
るなら、プロセスを分離してsocketで通信するのが簡単。難しい問
題をやるなら、結局は、通信部分から凝って書かないとダメ。Thread
と通信の組合せはシロートには手におえない。というところですね。

---
Shinji KONO @ Information Engineering, University of the Ryukyus, 
河野真治 @ 琉球大学工学部情報工学科,