超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ......

88

Transcript of 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ......

Page 1: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互
Page 2: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

超並列計算研究会  講習会 「PCクラスタ超入門」

目 次

1並列処理入門 3

1.1はじめに . . . . . . . . . . . . . . . . . . . . 31.2超並列計算機の発達 . . . . . . . . . . . . . . . . . . . . 31.3計算の高速化と並列処理 . . . . . . . . . . . . . . . . . . . . 41.4並列計算機の分類 . . . . . . . . . . . . . . . . . . . . 61.5並列計算機の構成方式 . . . . . . . . . . . . . . . . . . . . 61.6プロセッサ間ネットワーク(相互結合網). . . . . . . . . . . . . . . . . . . . 71.7並列処理のプログラム . . . . . . . . . . . . . . . . . . . . 91.8並列処理の効率 . . . . . . . . . . . . . . . . . . . . 91.9数値計算の構造 . . . . . . . . . . . . . . . . . . . . 111.10数値計算の並列化 . . . . . . . . . . . . . . . . . . . . 121.11おわりに . . . . . . . . . . . . . . . . . . . . 131.12参考文献 . . . . . . . . . . . . . . . . . . . . 14

2AT互換機+Linux・並列ライブラリ=PCクラスタ 15

2.1はじめに . . . . . . . . . . . . . . . . . . . . 152.2 AT互換機 の組み立て . . . . . . . . . . . . . . . . . . . . 182.3 Linux のインストール . . . . . . . . . . . . . . . . . . . . 262.4 PVMと MPI のインストール . . . . . . . . . . . . . . . . . . . . 322.5おわりに(クラスタで何ができるの?) . . . . . . . . . . . . . . . . . . . . 34

3Message Passing Libraryを用いた並列プログラミング 36

3.1はじめに . . . . . . . . . . . . . . . . . . . . 363.2PVMと MPI . . . . . . . . . . . . . . . . . . . . 363.3PVMと MPIの比較 . . . . . . . . . . . . . . . . . . . . 403.4並列計算 . . . . . . . . . . . . . . . . . . . . 403.51対1通信 . . . . . . . . . . . . . . . . . . . . 453.6グループ通信 . . . . . . . . . . . . . . . . . . . . 503.7PVMと MPIのプログラムの実行 . . . . . . . . . . . . . . . . . . . . 563.8実行速度の測定 . . . . . . . . . . . . . . . . . . . . 613.9参考文献 . . . . . . . . . . . . . . . . . . . . 61

4実際の応用 634.1はじめに . . . . . . . . . . . . . . . . . . . . 634.2マンデルブロー . . . . . . . . . . . . . . . . . . . . 634.3ディスクレスクラスタ . . . . . . . . . . . . . . . . . . . . 644.4XPVM . . . . . . . . . . . . . . . . . . . . 65

1

Page 3: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

4.5 遠隔利用 . . . . . . . . . . . . . . . . . . . . 664.6まとめ . . . . . . . . . . . . . . . . . . . . 674.7参考文献 . . . . . . . . . . . . . . . . . . . . 67

5工学的な利用 685.1はじめに . . . . . . . . . . . . . . . . . . . . 685.2熱伝導方程式 [1] . . . . . . . . . . . . . . . . . . . . 685.3差分法 [1] . . . . . . . . . . . . . . . . . . . . 695.4領域分割による並列化 . . . . . . . . . . . . . . . . . . . . 725.5並列計算の結果 . . . . . . . . . . . . . . . . . . . . 745.6領域分割を用いたその他の応用 . . . . . . . . . . . . . . . . . . . . 755.7その他 (並列関係のツール) . . . . . . . . . . . . . . . . . . . . 755.8その他 (並列以外のツール) . . . . . . . . . . . . . . . . . . . . 765.9おわりに . . . . . . . . . . . . . . . . . . . . 775.10参考文献 . . . . . . . . . . . . . . . . . . . . 77

2

Page 4: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

講義1

並列処理入門

同志社大学 工学部 知識工学科

三木 光範[email protected]

■ はじめに

並列処理(Parallel Processing)とは,一般的な意味では「仕事を並列に進めること」である.「並列」だけの意味は「並び連なること」(大辞林)であるが,これでは直列との違いがわからない.一方,

「並列処理」は専門用語で,「コンピュータで,一連の処理を複数台の処理装置で同時に並行して行う

こと」(大辞林)という意味である.並列処理と同じような言葉に 並行処理がある.複数の CPUを使って複数のプログラムを(真に)同時に実行することを並列(Parallel)実行,一つの CPUで擬似的に実行することを疑似並列(Pseudo-parallel)とか並行(Concurrent)実行とよぶ.また,並行という言葉は,真の並列と疑似並列の両方を総括して示す場合にも使われる [1].一方,マルチプロセスとは複数のプログラムが同一のコンピュータを同時に活用できる機能のこと

である.通常のコンピュータには CPUは一つしかないので,二つ以上のプログラムを同時に実行することはできない.マルチプロセスを提供するコンピュータでは 1/60秒程度の短い間隔で複数のプログラムを順に実行し,同時に実行されているかのような錯覚をユーザに与えているのである.ただし,

こうした環境下でもあるプログラムが入力待ちなどがあるので,システム全体の処理効率が期待でき

る [1].ここでは,並列処理,すなわちひとまとまりの処理を複数の CPUを用いて行う方法について述べる.並列処理の背景には並列計算機やPCクラスタなどのハードウエアの発達と並列化コンパイラや

プロセッサ間通信のためのドライバなどソフトウエアの発達がある.このため,並列処理を考える場

合には,「そもそも仕事を並列に進めるとはどういうことか」という観点と「並列処理のためのハード

ウエアとソフトウエアはどうなっているのか」という観点が不可欠である.本講習会では特にPCク

ラスタに焦点を当て,こうしたことが初心者にも分かるように構成されている.本稿ではその最初の

導入として,並列処理のための概要を述べるとともに,「そもそも仕事を並列に進めるとはどういうこ

とか」という点について考える.

■ 超並列計算機の発達

1997年 5月 11日,ロシア人のチェス世界チャンピオン,ガルリ・カスパロフは IBM社のコンピュータ”Deep Blue”とシリーズ第6戦を行い,2勝1敗3引き分けで Deep Blue が勝った [2].これは,チェスという「頭を使う」ゲームにおいてコンピュータが人間のチャンピオンを負かしたという画期

3

Page 5: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

Rank Manufact-urer Computer Rmax Installation Site Country Year Area of

Installati # Proc Rpeak Nmax N1/2

1 Intel ASCI Red 2121.3 Sandia National LabsAlbuquerque

USA 1999 Research 9472 3154 251904 66000

2 SGI ASCI BlueMountain

1608 Los Alamos NationalLaboratory Los Alamos

USA 1998 Research 6144 3072 374400 138000

3 SGI T3E1200 891.5 Government USA 1998 Classified 1084 1300.8 259200 26400

4 Hitachi SR8000/128 873.6 University of Tokyo Tokyo Japan 1999 Academic 128 1024 120000 16000

5 SGI T3E900 815.1 Government USA 1997 Classified 1324 1191.6 134400 26880

6 SGI ORIGIN2000 250

690.9 Los Alamos NationalLaboratory/ACL Los Alamos

USA 1999 Research 2048 1024 229248 80640

7 SGI T3E900 552.92 United KingdomMeteorological Office

UK 1997 ResearchWeather

876 788.4 - -

8 IBM SP Silver 547 IBM Poughkeepsie USA 1998 VendorEnergy

1952 1296 244000 58000

9 SGI T3E900 515.1 Naval Oceanographic Office(NAVOCEANO) Bay Saint

USA 1999 ResearchWeather

812 730.8 - -

10 SGI T3E1200 509.9 UK Centre for ScienceManchester

UK 1998 Academic 612 734.4 - -

図 1.1: 99年 6月時点での高性能コンピュータの世界ランキング(10位まで)[3]

的な出来事である.この Deep Blueは過去 100年の序盤戦と,数十億の終盤戦シナリオのデータベースを搭載し,256個のプロセッサーを持つ超並列スーパーコンピュータであり,1秒間に数億通りの局面を読むことのできる能力を持っており,気の遠くなるような膨大な計算を行ってチャンピオンに

対抗した.いわばしらみつぶしに近い力業で勝利した.

このようなコンピュータの力業は近年ますます重要になってきている.科学・工学におけるシミュ

レーションは取り扱う現象のレベルがミクロのスケールに近づくようになり,できるだけ普遍的で,近

似の少ない,原理的な法則を基にコンピュータの力業で複雑な現象を解析するアプロ-チが注目を集

めている.これは明らかにコンピュータの驚異的な発達に依存している.力業が行える驚異的な力が

得られるようになったからであり,その驚異的な力が半導体技術の高度化とプロセッサの並列化とい

う二つの技術によって支えられている.

プロセッサ単独の計算速度は次第に限界に近づいてきた.プロセッサの計算速度はクロック周波数に

依存している.このクロック周波数が 1GHz になると周期は 1nsとなり,電気信号はその間に 30cmしか進まず,集積回路の大きさや配線基盤の寸法を考えるとこれ以上クロック周波数を大幅に上げる

ことは原理的に困難になってくる.一方,1ns より早いスイッチング速度を持つ半導体材料についても極めて限られてくる.材料の面から言っても限界は近い.さらに,いくらプロセッサが高速に動作

してもメモリーからのデータの供給がなければ必要な演算を行うことはできず,メモリーのアクセス

速度の高速化が困難な現状では単独のプロセッサの演算速度はかなり限界に近づいたと言える.こう

して,大規模シミュレーションなどの力業を行うコンピュータは必然的に超並列計算機となり,並列

処理技術の高度化が次の時代を開く.

■ 計算の高速化と並列処理

計算機の高速化の要求には終わりがない.この進歩を可能にする計算機技術が演算パイプライン方

式であり,さらにそれを多重にした多重パイプラインであり,こうした方式の計算機は スーパーコン

ピュータ と呼ばれる.一方,CPU を極めて多数並列化した計算機が パラレルコンピュータ である.現在の高性能計算機のランキングを図 1.1に示す.これはドイツのマンハイム大学スーパーコンピュー

タセンターが毎年2回調査して発表しているもので,世界最大の能力を持つ 500のコンピュータシステムのランキングであり,性能は LINPACK ベンチマーク [3]で比較している.この表で Rmax が

4

Page 6: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

達成された最高の LINPACK 性能であり,#Procはプロセッサの数である.この表より,高性能のコンピュータシステムはすべて超並列システムであり,この流れは今後一層加速し,多くの高性能コン

ピュータは数千から数万のプロセッサを持たざるを得なくなることがわかる.

プロセッサの並列化はメモリーから考えても必然である.たとえば典型的な DRAMはメモリーアクセス時間が 80 nsであり,この時間で1 wordのデータを読むことができるから1秒間では 12.5 MWのデータが読める.この数字は典型的な SRAMになると メモリーアクセス時間が 10 nsであり,この場合は 100MW のデータが読める.ここで1 wordを 32bit,すなわち 4B(バイト)とすると,それぞれ 50 および 400 MB/s のデータ読みだし速度となる.これを メモリーのバンド幅 という(図1.2).

図 1.2: メモリーのバンド幅

ここでたとえば単精度(4 B/W)の演算を 20 GFLOPS の速度で行おうとすると 40 GW/s のデータ読みだしが必要になり,必要なメモリーバンド幅は 160 GB/s となる.これだけのバンド幅を確保するためには高速の SRAM を用いても 400 個のメモリーバンクから並列に読みだしを行わなければならない.もし,低速の DRAM を用いるなら 3200 個のメモリーバンクから並列に読みだしを行わなければならない.結局,どれだけ高速のメモリーを用いてもメモリーの並列化は不可避であり,こ

の並列化に適合するアーキテクチャはプロセッサの並列化であると言える.図 1.3にバンド幅を上げる方法を示す.

こうして,超高速演算を可能にするコンピュータは,光の速度の有限性の点からも,半導体材料の

面からも,そしてメモリーバンド幅の点からも超並列となることがわかる.

CPUCPUCPU

0 1 3 4

図 1.3: バンド幅を上げる方法 [4]

5

Page 7: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ 並列計算機の分類

並列計算機の分類には Flynnの分類が広く用いられている.これは命令の流れとデータの流れが単一か複数かで計算機を図 1.4の4種類に分類するものである [1].並列計算機のアーキテクチャはまず次の二つに大別される.それらは SIMD (Single Instruction

Multiple Data)と MIMD (Multiple Instruction Multiple Data)である.前者では多くのプロセッサが局所的なメモリーを有し,すべてのプロセッサは完全な同期の下でコントローラーから送られる

単一の命令を同時に実行する.そしてその結果が集約されて一つの結果となる.たとえば ThinkingMachines 社の CM-2 では 2048個の 32ビット浮動小数点演算プロセッサが演算対象データを分割して同じ処理を行う負荷分散に用いられる.この方式は同期をとるためのオーバーヘッドがないこと,単

純なプロセッサで良いのでプロセッサ数を多くできること,負荷分散に対する要求は多いので利用価

値が高いこと,などの利点があるが,同期をとるためのハードウエアとブロードキャストおよび演算

結果の集約を効率化する仕組みが重要になること,そして多くの応用においては負荷を一様に分散さ

せることが困難で,プロセッサのロードバランスが悪くなることが避けられないことなどの欠点があ

る.一方,後者では各プロセッサは異なった処理を行うことができる.すなわち,プロセッサごとに

コントローラーが独立して配置されており, SIMD アーキテクチャよりも柔軟な利用が可能となる.

CPU

Instruction

Data CPU

Instruction

Data

CPUCPU

CPU

Instruction

Data CPU

CPU

Instruction

Data

CPU

SISD (single instruction streamsingle data stream)

SIMD (single instruction streammultiple data stream)

MISD (multiple instructionstream single data stream)

MIMD (multiple instructionstream multiple data stream)

図 1.4: 並列計算機の分類

■ 並列計算機の構成方式

並列計算機全体のアーキテクチャを決定する最も大きな要因は,プロセッサ間通信モデル として何

を採用するかである.すなわち,プロセッサ間でデータ授受をどのように行うか,および,メモリー

をどのように構成するかである.プロセッサ間通信 は以下の観点から分類する.

1) 共有メモリモデル :論理的にメモリを共有する.複数のプロセッサが通常のアドレス指定で直接的に読み書きができる共有メモリが存在する.

6

Page 8: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

(a) 集中共有メモリ (centralized shared memory):プロセッサとメモリが対称的になることから 対称型マルチプロセッサ( SMP : symmetric multiprocessor)とよぶ.

(b) 分散共有メモリ(distributed shared memory):ローカルメモリとして分散配置する.

2) メッセージ交換モデル :論理的にせよメモリは共有しない. メッセージの交換 という形でデータ授受を行う. NORA(no remote access)モデルともいう.

(a) メッセージの送信と受信は同期するか,非同期か.

(b) メッセージの送受信においてブロック(封鎖:完了するまで処理を止める)するかどうか.

これらの分類を図示したものが図 1.5である.なお,送受信のブロッキングはソフトウエアの問題であり,ハードウエアには現れない.このほかに,キャッシュの配置,コヒーレンスなどの観点から分

類が可能であるが,専門的であるのでここでは割愛する.

P1 P2 P3 P1 P2 P3

MM MMMM P1 P2 P3

M M M

a b c

図 1.5: 並列計算機の構成法式

メッセージ交換モデルではネットワークのアーキテクチャや性能を除けば,慣用的なコンピュータ

をネットワークで結合したものと本質的には同じである.一方,共有型では対象問題を一括して一つ

のメモリーに展開することが容易で使いやすいが,その反面,共有メモリーのバンド幅は一定である

から,プロセッサ数はそれほど多くできない.普通は 4~20ぐらいである.1990年前後には TCP/IPベースのネットワークで接続された複数のコンピュータの集合体を,仮想的

に1台の大きな並列計算機として見せるためのソフトウエアである PVM (Parallel Virtual Machine)が開発された.これにより「計算機クラスタ」と呼ぶべき物理的な計算機群が登場した.1995年前後には,イーサネットスイッチや 100Mbit Ethernetなどの技術が一般にも普及し,比較的安価に高性能なネットワークの構築が可能となった.さらには計算機クラスタを指向した専用の高速ネットワーク

が登場し,一方ではPCの高性能化と低廉化により,コストパフォーマンスの優れた計算機クラスタ

の実現が可能となった.図 1.6は計算機クラスタへの道程を示したものである.

■ プロセッサ間ネットワーク(相互結合網)

相互結合網( interconnection network)は並列計算機を構成する複数のプロセッサやメモリを相互に結合し,その間における交信路を提供する.目標は 通信遅延( レイテンシ :latency)を最小にし,スループット(throughput:処理能力)を最大にすることである.相互結合網のトポロジ(topology:幾何学的位相形状)の分類を図 1.7に示す.ここで直接網とは入

出力ノード(相互結合網に結合されるプロセッサやメモリなど)間の結合がはじめから固定されてい

るものであり,間接網では結合が接続要求に応じて決まる.代表的な直接網を図 1.8に示す.

7

Page 9: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

1980 1985 1990 1995 2000 ?

PC/WS

SMP

MPP

HW HW

MIPSR2000

SUNSPARC

PVMEthernetSwitch

MPI, SCI100BaseTX(IEEE802,3U)

Windows95Myrinet

Memory Chanel

1000BaseTX(IEEE802, 3z)

SMP

図 1.6: 計算機クラスタへの道程 [5]

上で述べた相互結合網は主として専用並列計算機のためのものである.すなわち,各相互結合網に

はそれぞれの長所と短所があり,その専用並列計算機の目的に応じて相互結合網を設計することにな

る.一方,PCクラスタではコストパフォーマンスをあげるために汎用のネットワークハードウエア

を用いるか,もしくはクラスタ用に設計された汎用のネットワークハードウエアを用いることになる.

このため,相互結合網の種類は用いるネットワークハードウエアに依存する.

たとえば,TCP/IPベースの通常のハブを用いた場合では相互結合網はバス型となり,二つのプロセッサが通信しているときには他のプロセッサは通信が行えない.一方,レベルの高いスイッチング

ハブを用いれば独立したプロセッサ間通信が同時に行えることになる.

De BruijnStar Graph

Fat-Tree

図 1.7: 相互結合網の分類 [1]De Bruijn Star Graph

図 1.8: 代表的な直接網 [1]

8

Page 10: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ 並列処理のプログラム

並列計算機を用いるには並列処理のためのプログラムを作成しなければならない.これは用いる並

列計算機の環境によって異なったアプロ-チとなる.たとえば,専用並列計算機でもっとも一般的な

方法は HPF (High-Performance Fortran) などの並列プログラミング言語を用いて配列に関わる演算を中心に並列化を行う.こうした言語を用いればコンパイラが自動的に並列処理のコードを生成す

るため,複数のプロセッサを使っているという意識なしに並列計算が行える.

しかしながら,こうした言語では大規模な配列やマトリックスに関わる演算では極めて有効である

が,それ以外の利用では柔軟性が少ない.そうした場合には通常の逐次処理プログラミング言語とプ

ロセッサ間通信用の関数を用いてメッセージパッシング型のプログラムを利用者が作成しなければな

らない.これには PVM (Parallel Virtual Machine) や MPI (Message Passing Interface)を用いる方法,あるいは各社仕様の C 言語や FORTRAN 言語を用いる.PCクラスタでは PVMや MPIを用いてプログラム開発を行う.

■ 並列処理の効率

並列処理において最も重要な観点は複数のプロセッサを効率的に動作させることであり,このため

には対象問題,アルゴリズム,実装などの種々の局面で内在する並列性を抽出しなければならない.図

1.9は問題領域からハードウエアに至るまでにおける並列性の度合いを示したものである.縦軸は並列して行える独立なオペレーションの数を示している.OSとハードウエアでのギャップは,たとえば

プロセッサの処理速度とプロセッサネットワークのバンド幅の相違による.

Degree ofparallelism

Problem Algorithm Languageand

compiler

Operatingsystem

Hardware From problemto solution

図 1.9: 各レベルにおける並列性 [6]

マトリックス演算 C = AB を考える.各マトリックスのサイズを n× nとすると,並列計算の複雑

度は O(log n)である.すべての要素の乗算は並列で行うことができるが,n 回の加算に時間 lognが必要となる.しかし,n 回の加算を逐次的に行うとこのアルゴリズムの複雑度は O(n) となる.ここに問題とアルゴリズムとの並列度のギャップが生じる.

種々の問題を並列計算機に写像し,プロセッサ間のロードバランスをとるのは極めて難しい問題で

ある.さらに,これがうまくできてもどこかの段階に修正が生じると全体を見直す必要が生じる.す

なわち,並列計算は図 1.9のすべての段階が密に関連している.

9

Page 11: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

Ep =T1

pTp(1.1)

並列処理の効率 は簡単には式 1.1で表される.すなわち,p個のプロセッサを用いたときの効率は

1個のプロセッサで行ったときの逐次処理計算時間 T1を並列処理したときの計算時間 Tpと pの積で

除したものである.ここで,逐次処理では最良のアルゴリズムを用いる必要がある.

R(f) =1

(1− f) + f/Rp(1.2)

並列処理の数学的な効率としては Amdahlの法則がある.これは並列処理の部分とそうでない部分の比率の関数として全体としての処理速度を表したもので,全体の処理速度が低速部分に大きく影

響されることをよく理解することができる.

BJHGI

1 2 5 10 20 50

100

200

500

1000

2000

5000

1000

00

5

10

15

20

Spe

edup

No. of processors

図 1.10: 並列化の速度向上

ここで,f は全体の処理における並列化可能な処理の割合であり,R(f)は総合的な速度向上率,Rp

は並列処理の 速度向上率 である.これを図示すると図 1.10となる.たとえば逐次部分の割合がたとえ 5%と少なくても,逆に言えば並列処理部分が 95%でも,1万台のプロセッサで得られるスピードアップはわずか 20倍にしかならない.いかに逐次処理部分の割合が全体の効率を下げているかが分かる.

並列処理における効率に重大な影響を及ぼすもう一つのファクターはプロセッサ間通信の速度であ

る.この速度が遅く,しかもプロセッサ間通信が多い場合には並列処理の効率は著しく悪くなる.

プロセッサ間通信の頻度は処理の 粒度(grain size or granularity)に関係している.粒度とは複数のプロセッサに与えられるタスクの大きさのことである.一つのステートメントあるいはそれ以下の

タスクを 細粒度(fine grain),ループまたはサブルーチンレベルのタスクを粗粒度(coarse grain),それらの中間的な大きさのタスクを 中粒度(medium grain)とよぶ.粒度が小さくなればプロセッサ間通信が多くなり,反対に粒度が大きくなればプロセッサ間通信は少なくなる.このため,プロセッ

サ間通信の速度が遅く,細粒度の場合は並列処理の効率が著しく悪くなる.特に,PCクラスタの場

合,一般にはプロセッサ間通信の速度が遅く,このため,細粒度での並列処理を行わせると複数台の

プロセッサを用いているにも拘わらず,1台のプロセッサを用いたときより遅くなることもある.こ

のため,特にPCクラスタを用いる場合には,できるだけ粒度を大きくしなければならない.

並列処理の効率に大きな影響を与えるもう一つのファクターは ロードバランス である.ロードバ

ランスとは並列計算機の各プロセッサに与えられる計算負荷の均等性のことであり,並列処理の効率

を高めるには,できるだけロードをバランスさせなければならない.

10

Page 12: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

各プロセッサに与えられる負荷が不均一であると,処理に不可避な同期待ちが多くなり,処理効率

は著しく悪化する.たとえば,負荷が2倍異なれば計算時間が2倍異なり,同期をとるために遅いプ

ロセッサを待つことになり,いくら他のすべてのプロセッサが早く処理を済ませても一番遅いプロセッ

サに律速される.このため,処理効率はこのことだけで 50%程度に悪化する.こうした問題を克服するため,各プロセッサに与える負荷は出来るだけ均一になるようにしなけれ

ばならない.しかしながら,これは難しい問題である.なぜなら,画像処理などのようにデータの量

に応じて負荷が決まる場合はデータを分散させればロードバランスはとれるが,連立一次方程式の

Gauss-Seidel 法に基づく解法や傾斜法に基づく最適化計算など,多くの繰り返し計算手法ではデータの質(内容)によって収束までの時間が異なるからである.

そのために,最初から静的に負荷を分割するのではなく,その時々の各プロセッサの負荷を測定し,

負荷を動的に均一化させる方法も有用である.しかし,この方法では負荷を管理するプロセッサが別

に必要となり,しかも,負荷の測定のためにプロセッサ間通信が必要となり,別のオーバーヘッドが

大きくなる.

■ 数値計算の構造

次に考えなければならない点は,数値計算に用いる概念モデルと計算モデルの組み合わせを数値計

算の構造と呼ぶことにすると,数値計算の構造と並列処理の適合性はどうか,ということである.

図 1.11はこの関係を示している.最初に特定のドメインでの問題があり,それを解くための概念モデルが作られる.このモデルの種類によってこの図でいう 数値ソルバー を用いるか, 自然ソルバー

を用いるかが決まる.そしていずれも場合にも分割と写像が重要なポイントとなる.このブレークダ

ウンができれば仮想的な計算機モデルを作ることができ,そのモデルに依存してどのようなアーキテ

クチャの計算機を用いるかが決まる.たとえば固体解析に有限要素法を用いるとして,それを並列化

する場合には粗粒度の分割,すなわち領域分割により計算の並列化を行うこともでき,一方,細粒度

の分割,すなわち内部でのベクトル計算のループを並列化することもできる.最近ではシミュレーテッ

ドアニーリング,遺伝的アルゴリズム,あるいはニューラルネットワークなどの,この図でいうとこ

ろの自然ソルバーを用いる場合も多く,この場合にも異なった並列化の計算モデルが考えられる.た

とえば,遺伝的アルゴリズムで,全体的母集団における個体を複数プロセッサに割り当てて進化を進

める方法や島モデルで個体群を分散させて独立して進化させ,ときどき移民させるというモデルもあ

る.いずれにせよ,シミュレーションで重要な点は最初の概念モデルであり,そして次の計算モデル

であり,これらの組み合わせで多くのタイプの並列処理が可能となる.

11

Page 13: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

Virtual Machine Model

Vectorand Parrallel

Machines

EmbeddedSystems

PC sWorkstation

Decompositionand Mapping

NumericalSolvers

(FE/FV/CG )

NaturalSolvers

(SA, GA, NN)

Conceptual Model

Domain Spec. Probl.

図 1.11: 数値計算の構造 [7]

■ 数値計算の並列化

□ 差分法の並列化

ラプラスの方程式やポアソン方程式で表される種々の物理現象(重力場,静電場,静磁場,定常熱伝

導,定常物質拡散,渦なし非圧縮性流れ,弾性体の平衡,結晶の成長など)のシミュレーション は差

分法に基づいて行われることが多い.この場合,並列化は細粒度では Red-Black 法などによって色分けされた並列化可能な格子点をグループ化したものをプロセッサに割り当てるか,あるいは中粒度で

は複数の格子点を格子状にグループ化した領域を並列可能性に基づいてプロセッサに割り当てる.も

しくは大粒度では全体をプロセッサ数だけの領域に分割して行う.いずれの方法でも Jacobi 型の緩和法を用いるのか Gauss-Seidel 型の緩和法を用いるのかによって計算モデルが異なり,計算速度と並列化効率のバランスが変わる.

□ 有限要素法における並列化

有限要素法で定式化されたシミュレーションモデルでは細粒度ではベクトル計算の並列化となり,こ

れは HPF などの並列プログラミング言語で比較的容易に並列化できる.大粒度での並列化では領域分割法(Domain Decomposition)が中心となっている.領域分割法 は有限要素法におけるデータ分割あるいは負荷分散である.この方法では対象を幾何学的に複数の領域に分割し,それらを対応する

プロセッサに割り当てる.そして,領域内の計算が終了すれば互いに境界条件を交換し,再度,領域内

の計算を行う.これを反復することで全領域の計算を行う.領域分割法では領域の分割の方法によっ

てプロセッサのロードバランスが大幅に異なるため,並列化効率を上げるにはこの点に注意する必要

がある.

□ 粒子法による物質の挙動シミュレーション

多数の粒子の相互作用を基本として各粒子の位置や速度を求め,粒子全体からなるシステムの挙動

を計算するアプロ-チを 粒子法(particle method)[8]という.相互作用が重力のときは天体力学にお

12

Page 14: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ける N 体問題となる.一方,相互作用がクーロン力の場合には分子動力学などのアプロ-チを用いて原子あるいは分子の配置を決定する解析が行える.

N 体問題の場合,重力は長距離力であり,N 個の粒子の計算には N(N − 1)回の相互作用を求める必要がある.これは Nが大きくなると膨大な計算となる.これを回避するには空間を複数のセルに分

割し,そのセルに含まれる粒子の平均的挙動をセルの状態として考え,ある一定の距離以上のセル内

の粒子についてはセルとしての代表的な状態で近似する高速粒子法が必要となる.これによって計算

回数は N logNぐらいまで減少させることができる.ただし,この場合には空間に固定されたセル内の粒子の出入りを監視することが必要になる.

一方,分子動力学では原子間のクーロンポテンシャルが長距離で減衰が激しいことを利用し,ある

一定の距離以上では他の粒子を考えなくても良い.これによって膨大な数の原子を取り扱うことがで

きる.この場合に原子間距離の計算回数はやはりN(N − 1)回となるため,たとえポテンシャルを計算しなくても距離計算の負荷が大きく,これを避けるには着目している原子の近傍粒子とそうでない粒

子を分類し,その分類自体は時折行うことで毎回の距離計算自体を無くす 粒子登録法(Bookkeepingmethod)が用いられる.このような粒子法の並列化は大粒度では空間でのセルあるいはクラスター化した粒子群を一つのプ

ロセッサに割り当てる方法であり,細粒度での並列化はベクトル計算における inner loop の並列化である.ただし,後者においてもプロセッサのロードバランスを良好にするために単一プロセッサの場

合とは異なるアルゴリズムが必要となる.

■ おわりに

現在の自動並列化プログラミング言語は基本的に DO-LOOP の並列化が中心である.特に innerloop の並列化には効果的である.しかしながら,大規模シミュレーションの多くが最終的には膨大なベクトル計算に帰着するのはあくまでも図 1.9でいうところの数値ソルバーを用いる場合である.しかしながら,同図でいう自然ソルバーにはまだまだ大きな発展の可能性があり,それらのアプロ-チ

では種々の並列化の方法が可能となる.しかも,そうした自然ソルバーは本質的に並列処理を内在し

ている場合が多い.このため,そうした自然な並列性を抽出して並列処理モデルを構築することはこ

れからの並列処理の可能性を大きく広げるものと考えられる.

13

Page 15: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ 参考文献

[1] 情報処理学会編. 情報処理ハンドブック. オーム社.

[2] IBM. Kasparov vs. deep blue, 1999. http://www.research.ibm.com/deepblue/.

[3] Mannheim University and Netlib. Top500 supercomputing sites, 1999.http://www.netlib.org/benchmark/top500.html.

[4] パターソン, ヘネシー, 成田訳. コンピュータの構成と設計. 日経 BP社.

[5] 森真一郎, 富田真治. 並列計算機アーキテクトからみた計算機クラスタ. 情報処理, Vol. 39, No. 11,pp. 1073–, Nov. 1998.

[6] D.I. Moldovan. Parallel Processing from Applications to Systems. Morgan Kaufmann.

[7] P.M.A. Sloot. Modelling for Parallel Simulation: Possibilities and Pitfalls. EUROSIM.

[8] E.F. Van de Velde. Concurrent Scientific Computing. Springer-Verlag.

14

Page 16: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

講義2

AT互換機+Linux・並列ライブラリ=PCクラスタ同志社大学  工学部  知識工学科

廣安  知之[email protected]

■ はじめに

 Linuxのマスコットはペンギンである.なんでも Linuxの生みの親の Linus氏がペンギンは強いからと言ったとか言わないとか...

□ 世の中どうなってんでしょうか?

 現在の驚くべき状況,3点.

 一つは AT互換機をはじめとする PCの性能の飛躍的な向上とその PCを構成するパーツの価格の劇的な低下である.一般に市販で購入可能なハードウエアをコモディティハードウエア (CommodityHardware)と呼んでいるが,CPUの例を出すまでもなくこのコモディティハードウエアの性能は近年飛躍的に向上している.しかも,例えばハードディスクは IDEならば 20G程度で 3万円弱,メモリは SD-RAM 128Mbで 1.5万円程度といったように,5年前では想像できなかったような性能と価格である.

 二つ目の驚くべき点はオープンソースと呼ばれるソフトウエアの急速な浸透である.コンピュータ

にはそれを動かす基本ソフト (OS)が必要となるが,これまで性能が高かったり,安定性のあるOSは商品として売られているものがほとんどであった.それが,現在では,Free BSDや Linuxといったオープンソースでかつフリーな OSがインターネットの発展と相まって性能を劇的に向上させた.また,FSF(Free Software Fundation)から開発されたアプリケーション群の性能も非常に高く,最近では,特定のユーザーが使用するだけでなく,一般のユーザーも使用するようになってきている.この

オープンソースのソフトウエアの良い点は,その仕組みがうまく行っている場合には,多数のユーザー

が望んでいる性能を持つソフトウエアが短期間で開発されたり修正されたりする点である.

 三つ目は一つ目と重なる部分もあるがネットワーク関連のコモディティハードウエアの性能の向上

と価格の劇的な低下である.市販で手に入るハードウエアをコモディティハードウエアと呼ぶ.最近

15

Page 17: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

では,何かしらのネットワークに繋がっていない PCを見つけるのが困難なほど,一般のユーザーでさえ,ネットワークを利用している.また,例えば8ポートの 100Base TXスイッチングハブは2万円弱といったようにネットワーク関連製品の価格が暴落した.

 このような驚くべき状況であれば,PCがすでにネットワーク結合されているのだから,なんとか協力して素早く計算や各種の処理ができないものかと考えるのは普通のことであろう.また,目まぐる

しくハードウエアの性能が向上するために,打ち捨てられている PCを数多く目の当たりにするとなんとか有効利用はできないものかと考えるのも普通であろう.さらに,文書1枚書くのにコンピュー

タが必要な時代になったが,コンピュータパワーがほとんど使用されていない状況をみるとどうにか

これが活用できないものかと考えるのも普通なことであろう.

 これらを解決するのが PCクラスタシステムである.そこで,本講習会では,数種考えられるクラスタシステムの中でも「AT互換機+Linux OS+Freeの並列ライブラリ」で構築する PCクラスタシステムを紹介し,その構築方法の概略を説明する.

□ PCクラスタシステム って何?

 クラスタ (cluster)とはもともとの単語の意味はブドウなどの房のことで,ネットワークに複数のコンピュータが接続されそれを集合として利用する状態がその房に似ていることから名付けられてい

る.均一なマシンからなるクラスタをホモジニアスクラスタ,異機種混合なマシンからなるクラスタ

を ヘテロ クラスタと呼んでいる.

図 2.1: クラスタシステム(ヘテロ)

 これらのネットワークで接続されたコンピュータがデータ交換をすることにより並列もしくは分

散に処理ができるようになる.この方法をメッセージパッシング方式と読んでいる.よって PCクラスタシステムを構築するには以下の構成要素が必要となる.

• ネットワーク接続可能なコンピュータ

• 基本システム(OS)

• コンパイラ

• 並列ライブラリ

• ネットワーク(ケーブルやハブ)

 PC(パーソナルコンピュータ)はアップルのスティーブジョブズが初めて使用した言葉であるが大型の汎用機や専用機に対する一般のユーザーが使用可能なコンピュータという意味であろう.PCクラスタシステムはこの PCを複数台接続したクラスタシステムである.本章ではこの PCクラスタシステムにおける上記の項目について解説を行う.

16

Page 18: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ 世界で有名なPCクラスタシステムってどんなのがあるの?

 最後に世界でも有名な PCクラスタシステムを紹介しておく.これらのクラスタシステムは非常に高性能であり,並列専用機と比べても遜色の無い性能を持っている.しかしながら,そのノード数

は 100を超え CPUやネットワークも通常のものではなく高速のものを使用している.よって,コモディティハードウエアを使用しているので並列専用機と比較するとコストは押さえられているが,個

人が所有できるようなレベルのものではないと言えよう.

• Avalon クラスタ

 図 2.1.3に示すのは Los Alamos National Laboratoryの Avalonと呼ばれる PCクラスタシステムである.

図 2.2: Avalon クラスタ

 これはアルファマシンを 140台,Myrinetと呼ばれる Giga bit ネットワークで接続した PCクラスタシステムである.これが非常に有名になったのは世界の Super Computer Top 500(http://www.top500.com)に PCクラスタシステムがランキングしたからである.これが PCクラスタシステムはコストパフォーマンスだけでなく,性能も超並列機と肩を並べることができる

ことを証明したのである.しかしながら,このシステムを構成する PCは Pentiumと比べると高価で FastEthernetと比べると更に高価なデバイスを使用している.

 また,この研究プロジェクトは Beowulfプロジェクトと呼ばれコモディティハードウエアによる PCとフリーのソフトウエアを走らせることの利点を研究している.つまり,コンピュータパワーよりも価格性能比やプロセッサ性能比に興味を持っているのである.さらに Linuxを使った場合の性能について大まかな指標を与えるのが目的ある Beowolfクラスと呼ばれるシステムの概念も提唱している.

17

Page 19: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

• CPlant クラスタ

 図 2.3は先に紹介した世界の Super Computer Top 500に現在(1999年 9月現在)129位にランキングされている Sandia National Laboratoryの Cplant PCクラスタシステムである.

図 2.3: Cplant クラスタ

 このシステムも CPUとしてアルファをネットワークも高速なものを使用している.

• RWCPクラスタ

 日本で代表的な PCクラスタは新情報開発機構 (RWCP)の PC Clusterシステムである.ここでは高性能なネットワークドライバなどを開発し公開するなどの活動を行っている.

図 2.4: RWC クラスタ

 このシステムにはアルファを CPUと採用したものと Pentium Proを採用したものがあり,それらはMyrinetでネットワーク接続されている.

■ AT互換機 の組み立て

 IBM PC/AT互換パソコン(以下,AT互換機)は一般に汎用パソコンとして使用されているもので 1984年に IBMより発表された PC/ATを元祖としている.IBMはこの機器のデバイスを全て自社で開発するのではなく,基本使用を公開し,拡張ボードを使用することによって製品化した.この特

徴により,各デバイスを様々な会社が開発し,拡張ボードを利用して様々な周辺機器を開発すること

により,AT互換機の性能は向上し,かつ,価格は下がり,かつ,応用範囲も広がるという特徴を持つにいたった.そのため,現在では,AT互換機は価格は安くても性能的には十分満足でき,かつ,安定性にも優れているのである.

 本講習会ではこの AT互換機を部品から組み立て PCクラスタシステムを構築する.

18

Page 20: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ 自分で組み立てないとだめなの?

 現在,AT互換機の入手方法には様々なものが考えられる.ポイントは後で説明するインストールするOSである Linuxが正常に稼動し,求める性能ができるだけ安く手に入ることである.また,クラスタなどを構築する場合には多くの PCを購入するわけだから,初期不良などのトラブルの発生も多くなる可能性があり,そのトラブルに対するアフターケアーが一番に問われる点であるかもしれない.

その1 一般の組み立てられた製品を購入

大手のコンピュータメーカが製造している AT互換機を購入する方法がまずあげられる.ショップブランドと称してこれまで部品を販売していた店などが構築している AT互換機もある.さらに最近では通信販売などで売り上げをあげている会社も多く存在する.セット商品の場合には比

較的お買い得なものが多い.Windows用のアプリケーションが多く添付されている場合がある.しかしながら,部品が決定されているため,特定の部品を使用したい場合(得にネットワーク関

係)には問題がある.

その2 一般の組み立てられた製品を購入(1部の部品をグレードアップおよび交換)

ショップブランドの場合,上記の製品は実は部品をユーザーが指定し,差額を払えば購入できる

システムを導入している場合が多い.この場合には使用したい部品や性能を満たす部品を注文

すればよい.ただし,選択が限られている場合もある.もちろん,部品に関する知識が必要であ

る.また,大手のショップブランドの場合,部品に関する細かい問い合わせや指定を行うと途端

に対応や納期が悪くなる場合がある.

その3 Linux対応の組み立てられた製品を購入本講習会では OSとして Linuxをインストールするが,すべての製品が Linux上で正常に稼動するとは限らない.ここが Linuxを使用する際の大きな壁となる.Linuxを使用する際の鉄則としては,Linuxで稼動する部品を揃えるということであろう.しかしながら,この情報を常に入手することは非常に大変なことである.最も簡単な方法は,Linuxが稼動することを謳っているAT互換機を購入することである.これらを扱っているメーカやショップもいくつか見られる.しかし,やはり価格は一般には割高となっている.

その4 上記その2およびその3の部品を購入して自作

少しでも価格を押さえるためには上記の購入方法で自作する方法があげられる.しかしながら,

価格調整を人件費で行っているような場合には,ユーザーが自作したからと言って安くならない

場合もある.また,最大の問題は部品は購入先にて保証されるであろうが,全体のシステムとし

ては保証されない点である.この方法の最大のメリットは実は価格ではなくて PCの組み立てが楽しいというところにあるかもしれない.

その5 部品も自分で購入し自作

部品に対する知識も豊富で部品選びが面倒と感じず逆に楽しいと思える人であれば,部品から

購入し自作する方法もある.部品から選択しているので,各パーツに関しては最も満足なものが

手に入れられる方法である.しかしながら,部品に関する知識は必要であり,部品単体以外は全

て自分の責任となる.

19

Page 21: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ どんな部品を買えばいいの?

 クラスタシステムを構築する際に必要な AT互換機の最低構成部品は

• CPU

• マザーボード

• メモリ

• ケース

• ネットワークカード

• ハブ

である.さらに,

• フロッピードライブ

• ハードディスクドライブ

• CD-Romドライブ

• ビデオカード

• キーボード

• マウス

はインストールおよび運用を容易にする.

 それらの選択ポイントは以下の通りである.ここでも問題となるのが,性能と価格,そして Linuxが稼動するかどうかという点であろう.

1. CPU CPUはパソコンの中心部であるが,一般的にはそれほど選択枝がない.大まかに言えば Intelなどの x86系のプロセッサとコンパックのアルファプロセッサである.Power PCや Sparcなどもあるが数値計算の PCの分野ではそれほど注目を浴びていない. 先に説明したように,性能の高い世界のクラスタはほとんどアルファプロセッサである.こ

のようにこのプロセッサは数値計算に適した優れたプロセッサであると言える.しかしながら

やはり価格は高めである.また,x86系のプロセッサと比較すると使用しているユーザーの数が大きく異なる.このことは,ハードウエアだけでなく,OSやアプリケーションにも影響していて,ユーザーが巨大な OSやアプリケーションは早いサイクルで性能が向上し,かつ,使用できる種類も多くなる.

 x86系のプロセッサも最近では事実上 Intelと AMDのものしかない.最も難しい選択はこの中でどのプロセッサを選択するかということである.例えば,Intelでは Pnetium IIIと Cerelonがあり,AMDには Athelonと K3があるが,これらをクラスタの性能を考慮して決定することは極めて難しい.現在,Pentium IIIはシステムクロックが 100MHzで2次キャッシュが大きなものが用意されているが,同一チップ上にはない.一方,Cerelonはシステムクロックが 66Mhzではあり Pentium IIIと比較するとキャッシュの大きさは小さいが同一チップ上にある.さらにコストパフォーマンスが著しく違うという点も選択を難しくしている.

 最近の話題はマザーボードに CPUを2台搭載して Dual CPUマシンとして使用することで

20

Page 22: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ある.もちろん Pentium IIIでは Dual CPUに対応しているのだが,Cerelonは Intelが使用できないように設定している,実は暗黙のうちに認めているなどと諸説がある.

 Intel,AMDのプロセッサであれば Linuxにはほとんど対応する.コンパックも Linuxに対応することを明確にしているのでアルファプロセッサも問題ない.実は Ultra Sparcも Power PCでも Linuxは稼動するので,CPUのレベルで言えば Linuxに関する問題無いと言えよう.

2. マザーボード CPUが決定したらそれに対するソケットを持ったマザーボードが必要となる.Pentium IIIでは Slot 1,最近の Cerelonでは Socket370,AMDでは Slot 7などがそれである.本講習会では Socket 370に対応した Cerelonにゲタと呼ばれるアダプタを接続して Slot 1に対応している. 次に問題となるのが,必要なスロット数である.メモリや拡張ボード用の PCIなどの数が重要である.非常に多くのメモリを搭載させたりする場合にはメモリスロットの数は特に重要であ

る.本講習会ではビデオ用とネットワーク用の2種類の拡張ボードを設置するので PCIスロットは最低2つは必要であった.

 Linuxにおいて問題となるのは,マザーボードのチップセットである.新しいチップセットを使用しているようなマザーボードでは問題が生じる場合がある.長く使用されている 440BXという Intelのチップセットであればまず問題は無い.

3. ケース ケースによって Linuxが動かなかったり動いたりする場合はない.ただし,稼動させている時間が長かったり,CPUなどの発熱が多い場合が考えられるので,冷却の十分行われるケースが必要である.

 大きさは,マザーボードの形式と拡張性によって決定される.拡張性がほとんど必要無い場合

には,最近では非常に小さいものも存在している.

 その他には電気容量や防音の問題がある.また,実はデザインが大きな問題であるかもしれな

い.というのも苦労してクラスタを構築してもケースが悪くて大したものに感じられない場合

もある.

4. ネットワークカード (Ethernet 100 Base TX) 現在広く使用されているのが Ethernet 100 Base TXであろう.Linuxによりクラスタシステムを構築する際に最も問題となるのが,このネットワークカードである.製造会社の問題ではな

く,そのカードに使用されているチップセットの種類によって安定的に使用できるかできないか

が問題となる.DECの 21140というチップは安定性で有名であるがそのため在庫の問題もある.インテルのチップのものも最近は多く使用されているが,マイナーなバージョンの違いによって

安定性が多少異なるという報告もある.

 ネットワークはハードウエアと OSの間にあるドライバの性能が大きく影響する.性能の良いネットワークドライバを使用したいところである. Linux OKと表示されているネットワークカードでもこのドライバの性能のために不安定になる場合もあるので要注意である.

 さらに Ethernetにも最近,Giga bit級の製品が見られるようになってきた.もちろん,特別なドライバが必要である.

 Myricom社が開発している Myrinetは多くのクラスタシステムで使用されているGiga bitネットワークとスイッチングハブのシステムである.これは Ethernetとは異なるものである.特別なドライバを用意することで極めて高速に通信ができるようになる.

21

Page 23: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

5. ハブ 複数台の AT互換機をネットワークで接続するためにはハブが必要となる.ここ数年で最も値段が下がったものの一つにスイッチングハブがある.ここはできれば スイッチングハブ を導入

したいところである.

 TCP/IPでは1対1通信のためにコリジョンが発生すると通信速度が著しく低下する.それに対してスイッチングハブを使用するとコリジョンが発生しにくくなる.

Normal HUB Switching HUB

図 2.5: HUB

 スイッチングハブにはストアアンドフォワード方式とカットスルー方式とがあり,さらに構造

的には高速バススイッチング方式とマトリックス方式とがある.

Silicon SwitchFast Speed Bus

CPU CPU

Bus switching Matrix

図 2.6: HUB アーキテクチャー

 低額のスイッチングハブはストアアンドフォワード方式の高速バススイッチング方式である.

6. ハードディスク ハードディスクはここ数年で最も値段の激減したものの一つである.また,そのアクセス速度

や容量も増大した.10Gや 20Gのハードディスクが標準となっていて数年前では想像もつかないことである.

 AT互換機で現在利用されているハードディスクには大きく分けて2種類がある.IDEと呼ばれるものと SCSIち呼ばれるものである.それぞれの規格での理論性能を次表にまとめる.

表 2.1: データ転送理論性能

StandardTransfer Speed[MB/sec]

Fast SCSI (SCSI 2)Ultra SCSI (SCSI-3)

Ultra Wide SCSI

Ultra 2 SCSI

Ultra ATA/33

Ultra ATA/66

SCSI/IDE

SCSISCSIIDESCSIIDESCSI

1020

3340

6680

 データはメモリとハードディスクの間をいったりきたりしているわけである.このデータ転送

には2種類あり,CPUがデータ転送を制御する方法である PIO転送と CPUの代わりにデータ転送を制御する特別なバスマスタと呼ばれるものを利用して行う DMA転送である.もちろんDMA転送の方が CPUパワーを損なうことなく高速に転送できる.これまで SCSIは DMA転

22

Page 24: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

送で IDEは PIO転送であったので,データ転送速度には差があり,そのため多少高額でもサーバー機では SCSIが使用されていたのである. それに対して最近,IDEでもDMA転送を行う技術が開発されてきており,それがUltra ATA/33や Ultra ATA/66である.もちろんこれを使用するにはそれに対応したマザーボードもしくは拡張ボードが必要となる.

 現在のところコストパフォーマンスは IDEの方が比較にならないほどに良い. SCSIや Ultra ATAで拡張ボードを使用する際には Linuxを使用する際には対応するドライバが必要となる.Linuxに対応しているボードであるかどうかの知識が必要となる.また,今のところ,Linuxのカーネルをそれに対応したものに変更する必要がある. その他に考慮することとしては回転数やキャッシュサイズがあるがここでは省略する.

 また,最近の話題では RAIDと呼ばれる複数台のハードディスクを分散書き込みを行うことにより,高速にアクセスしたり,障害に強くしたりする手法がある.これはハードウエア的な処

理とソフトウエア的な処理がある.

7. ビデオカード Linuxではウインドウシステムとして Xが動作する.Xでは X serverとハードウエアが問題となる.フリーの XF86や商品の AccelarateXがビデオカード上のチップに対応しているかが問題となる.また,最近話題の3 Dには Linuxでは対応しているサーバーが存在しないため高価なビデオカードは必要無い.さらにクラスタでは,telnetや sshでの操作で行うことが多くウインドウシステムが必要ない場合が多く,そのような場合にはビデオカードは何を選んでも問題

ない.

8. マウスとキーボード Linuxで Xを使用する場合にはマウスは PS/2の 3ボタンマウスを用意したいところである.2ボタンでも 3ボタンとしてエミュレートして使用することが可能である. キーボードは日本語版や英語版,大きさの違い,キーバインディングの違いなど様々なものが

あるが,ユーザーが好みで選択すればよい.

□ どうやって組み立てるの?

 本講習会では以下の手順で AT互換機を組み立てる.

1. ケースをあける

図 2.7: ケース 図 2.8: ケースを開けた状態

23

Page 25: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

2. CPUの設定の用意本講習会では Cerelon(Socket370)にアダプタを付加して Slot 1に設置する.

図 2.9: CPU(cerelon)図 2.10: アダプタ

図 2.11: CPUを組み立てた状態

3. マザーボードに CPU,メモリを設置

図 2.12: マザーボード

(ATX,slot1)

図 2.13: メモリ 図 2.14: マザーボードにメモリと CPUを設置

4. マザーボードをケースに設置

マザーボードの下にはスペーサーをつける.マザーボードによってはアクセス周波数をジャン

パーピンで設定するものもある.本講習会で使用するものは BIOSによって設定する.

図 2.15: マザーボードとケース

24

Page 26: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

5. フロッピディスクドライブ,CD-Romドライブの設置

図 2.16: フロッピードライブ

図 2.17: CD-Romドライブ図 2.18: フロッピと CD-Romドライブを装着した状態

6. ビデオカード,ネットワークカードの設置

図 2.19: ビデオカード図 2.20: ネットワークカード

図 2.21: ネットワークとビデオカードを装着した状態

7. BIOSの設定BIOSにより基本周波数や CPUの動作周波数,メモリの種類,起動ディスクの選択などを行う.

図 2.22: BIOS設定画面

8. ネットワークへの接続Ethernetをネットワークカードとハブに接続しクラスタを構築する.

25

Page 27: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

図 2.23: スイッチングハブ

図 2.24: 完成したクラスタ

■ Linux のインストール

 ハードウエアの組み立てが終わったら,次は OSのインストールである.本講習会では OSとして Linuxを採用している. Linuxはオープンソースなフリーウエアの Unix互換 OSである.そもそもはフィンランドの大学院生が開発したものが,インターネットを通じて改良され,さらに,GNUなどの優れたフリーウエアアプリケーションの存在により急速に発展し,多くのユーザーを獲得した.現在では個人だけでな

く企業でもネットワークサーバー機の OSとして広く利用されている.その特徴は,Unix互換のためネットワークの利用に特に適していること,フリーであるために必要なコストがほとんどかからない

こと,サポートするユーザーが多数,強力でありかつインターネットなどで繋がっているためバグな

どが発見されてもすぐに改善され,かつ,すぐに公開されることなどがあげられる.

 本講習会では,先に解説した AT互換機に Linuxを OSとして採用し,本節ではその解説,インストール方法などの概要について説明する.

□ 何故Linuxなの?

 本講習会ではクラスタシステムの OSとして Linuxを採用している.その理由は以下のようなものである.

• 価格が安い そもそもオープンソースでフリーであるので,コストの点では商用のOSとは比較にならない.

• 安定性 フリーであるからと言って安定性に欠けるわけではない.メモリプロテクトな OSであるので,ユーザーが作成したアプリケーションによってシステムがフリーズすることはない.これは

プログラムの開発段階では必須事項である.さらに,オープンソースであり情報交換がインター

ネットを通じて行われているため,開発が迅速である.とくにセキュリティホールが見つかった

場合や多くのユーザーが希望しているような改善に対しては非常に敏速に対応される仕組みと

なっている.

• 性能 Linux のカーネルも十分高性能であると言えるが,Linux の性能を大きく支えているのが

26

Page 28: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

FSF(Free Software Fundation)のいわゆるGNUのアプリケーション群であろう.GNU Cコンパイラや GNU Emacsといった Editorは Linuxだけでなく UNIXそのものを支えていると言っても過言ではない.さらに最近では Gtk+という X Windowのライブラリが作成され,デスクトップ環境や高度なマルチメディアアプリケーションが作成されている.

• プロセスの管理が可能 システムの性能を把握し向上させるためには,どのようなプロセスが起動していて不必要な

プロセスが起動していないことが重要であろう.特にプログラムの開発段階では不必要なプロセ

スが発生しがちであり正確にプロセスを終了させることが望まれる.

• 多数の利用者 Linuxには非常に多くのユーザーがいる.特にクラスタシステムを構築している関係者であればなんらかの形で Linuxに興味があるはずである.これはクラスタに関連する技術がまず Linux対応として出現するであろうことを示しているし,また,ユーザーが多いためにインターネット

を通じて協力ができる.最近,LinuxとWindows NTとのWebのサービスに関するベンチマーク実験が行われ,Linuxは NTに対して一部の動作が遅いことが報告されたが,これらの問題に対しても迅速に対応し次期のカーネルバージョンでは改善されているとのことである.このよう

に問題に対するオープンで迅速な対応は非常に望ましいことであろう.

• その他 UNIX互換であるためにそもそもネットワークに適した OSである.これはネットワークを利用したメッセージ通信を行うクラスタシステムとしては大きな長所である.

 このような理由で Linuxを採用している.この Linuxに対抗するのがWindwos NTであろうか.しかしながら,Linuxは UNIX互換であり,技術的にはいわゆる枯れた OSである.一方,WindowsNTは比較的新しいOSであり,特に近々リリースされるといわれる次期バージョンのWindows 2000はさらに新しい OSであるので,今後問題が噴出してくるものと考えられる.そもそもWindowsの長所としては統一的な GUIにあるわけだが,クラスタにより数値計算を行うような場合にはそれがあまり有効とならない.

 このような Linuxにも欠点がないわけではない.これまであまりユーザーが着目していなかったネットワーク面では弱い点がいくつかある.MPSでの処理の問題や NFSなどの性能などがそれである.よって同じフリーな OSでも Net BSDなどを好む開発者もいるがこれだけユーザーが多数となってくると今後飛躍的にこの方面の解決も行われることであろう.

□ ディストリビューション ってなんなの?

 Linuxは近年非常に有名になり広く使用されるようになってきた.しかしながら,厳密に言えばLinuxとはカーネルのことを指す.カーネルだけではいろいろなサービスができず,インストールも難しい.そのため,いろいろなグループが「カーネル+アプリケーション群+インストーラー +パッ

ケージ管理方法」をセットにして提案している.これがディストリビューションである.よって,ディ

ストリビューションが異なるとほとんど異なった OSであるといっていいくらいに異なっている.特に初心者が印象を大きくするのはやはりインストーラの出来であろう.実際の性能よりもインストー

ルの容易さによって評価を決めてしまう場合が多い.

 ディストリビューションは大きくわけて 3種類にわけられる.Slackware系と RedHat系,そしてGNU/Linux Debian系である.

27

Page 29: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

1. Slackware 系

 Slackwareは Linuxが普及し始めた初期のディストリビューションである.バイナリパッケージなどの方式を初めて普及させたディストリビューションでもある.非常に自由度の高いディス

トリビューションで歴史的な経緯からバイナリパッケージの管理方式は RedHatや GNU/LinuxDebianと比較すると依存関係などのチェックなどが行われないといったように初心者には難しいディストリビューションである.一方,これを基にした Plamo Linuxという日本語ディストリビューションもあるが筆者にはアプリケーションなど余分なものを詰め込み過ぎの感がある.

2. RedHat 系

 RedHatは現在最も普及しているディストリビューションであろう.多くの商用のアプリケーションはまず RedHatに対応したものを発表している.rpmは使いやすいパッケージ管理方式である.これを基にした日本語ディストリビューションも数多くあり,日本語 RedHat,TurboLinux,Vine Linuxなどがある.Vine Linuxなどは安定しており,Windowsユーザーがとっつきやすいディストリビューションであろう.

 また RedHat系でクラスタシステムにとって重要なのは Extreme Linuxと呼ばれるディストリビューションである (http://www.extremelinux.org/).これにはカーネルと各種ネットワークドライバ,MPIや PVMなどが納められている.しかしながらバージョンが少々古いため,次期バージョンの発表が待ち望まれるところである.このディストリビューションに含まれるよう

なアプリケーションは実は次の GNU/Linux Debianにはほとんど含まれているというのが面白いところである.

3. GNU/Linux Debian 系 GNU/Linux Debianは非常に強力なパッケージ管理方式を持つディストリビューションである.本講習会では GNU/Linux Debianをパッケージと選択している.日本語が設定しにくいとか,dselectというパッケージ管理ユーティリティが使いづらいとかが問題とされているが,下記のような長所がそれらの欠点を上回っていると考えられる.

• 非常に強力な依存性などをチェックするパッケージ管理• 一度インストールしたらバージョンアップすればよいだけという扱いの良さ• 非常に多数のパッケージの存在• パッケージの一元管理 (http://www.debian.org, http://www.debian.or.jp)

• dselectに代わるパッケージ管理ユーティリティー aptの存在

• RedHat用のバイナリがあれば容易に Debian用のパッケージに変換可能

 さらに最近ではRedHatにおけるVineのような存在であるDiceやでびまるといったGNU/LinuxDebianを元にしたサブセットやディストリビューションも存在する.

 インストールや設定の容易さとユーザーの変更の容易さとはトレードオフの関係にある.確かに,

日本語などがはじめから設定されているディストリビューションでは何もしなくても最初から基本的

なソフトが使用できるようになっているが,逆に,入らないアプリケーションが知らない間に起動し

ていたり,思うように設定できづらい場合も多々ある.設定の多くがユーザーにまかされているディ

ストリビューションでは初心者には導入が難しい面もあるが,ユーザーの自由度が大きい.

 OSやディストリビューションの選択の幅は広く採用の決定はユーザーの趣味的にどうしてもなってしまう.クラスタシステムは数値計算を行う者にとっては大工のかなづちやノコギリにあたるもの

28

Page 30: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

であろう.それゆえに,身に覚えのないアプリケーションがインストールされているシステムではな

く,一つ一つ,ユーザーが必要なものだけをインストールするようなシステムが筆者の趣味である.

 また,ディストリビューションの選択の際に大きな基準となるのがライブラリのバージョンであ

る.実は最近大きな変動があり,ライブラリのバージョンは libc5から libc6へと変わっている.libc6は GNUの開発した glibc2のことなのであるが,これがほとんど別物といって良いくらいな変更である.特に日本語に関連する localeの変更がされているために libc5で開発されたアプリケーションは開発しなおさなければならない状態となっている.Slackwareが急速に使われなくなったのはこの理由にもよる.さらに,glibcは 2.0から 2.1へとバージョンを上げているのだが,このバージョン変更がまたまた大きな変更であり,ある JAVAの開発環境ではこの glibc2.1を指定している場合もある.よってこのライブラリのバージョンは重要であろう.主要 Linuxディストリビューションのライブラリなどのバージョンをまとめて表 2.2に示す.

表 2.2: Libralyなどのバージョン

RedHat 6.0

Package name Kernel Library XFree86

2.2.5 glibc2.1 3.3.3.1TurboLinux 4.0 2.2.9 glibc2.0 3.3.3.1

Gnu/Linux Debian Potato 2.2.10 glibc2.1 3.3.3.1

SlackWare 4.0 2.2.6 glibc2.0 3.3.3.1Plamo Linux 1.3.0 2.0.35 libc5 3.3.2

Vine Linux 1.1 2.0.36 glibc2.0 3.3.3.1

□ どうやってインストールするの?

 一般に Linuxのインストールは CD-Romによって行われる.それぞれのディストリビューションを購入することもできるし,雑誌に付録として付いていることもあるし,インターネットなどを通じ

てダウンロードすることもできる.

 本講習会で使用する GNU/Linux Debian Slink 2.1も ftp.debian.or.jpからダウンロードして CD-Romに焼いたものである. CD-Romによってのインストールの長所は非常に高速にインストールが可能であるという点である.本講習会でもこの方法を紹介する.しかしながら,ハードディスクの容量が巨大化し同時に価格

がやすくなっている現在,ローカルにミラーサイトを構築してそこから ftpにてインストールをする方法をお勧めしたい.これは例えば1日に1度,夜中などに各ディストリビューションのバイナリや

ソースをサイトより入手しローカルのバイナリやソースを常に新しいバージョンのものにしておくの

である.こうすることにより,最新のものがかつ必要なアプリケーションが常に手に入ることとなる.

これは実際に試してみると非常に便利である.

 基本的なディストリビューションのインストールは各ディストリビューションによって多少はこと

なるが大まかに言えば以下の流れで行われる.CD-Romから起動させ,質問に答えていけばよい.

1. キーボードの選択

2. ハードディスクのパーティションの設定と初期化

3. 基本アプリケーションのインストール

4. ネットワークの設定

5. 時刻など基本的な設定

6. Rootのパスワードの設定

29

Page 31: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

7. ユーザーアカウントの作成

 詳しいインストール方法は各種見られる入門書を参考にして欲しい.

 このインストールの際に知っておかなければならない事項としてはハードディスクのパーティショ

ンとネットワーク関連の事項であろう.

• ハードディスク関連 Linuxでは通常のファイル領域と swapと呼ばれるファイル領域が必要である.よってハードディスクを少なくとも2つに分割しなければならない.スワップは実メモリが足りなくなった場

合に仮想記憶として使われるのであるが,メモリが大量に載っているマシンではあまり問題とな

らない.また,スワップを頻繁に使用するとその処理速度は低下すると言われている.

 さらにスワップ領域以外の領域を複数に分割して利用しても良いし,その分割した領域に複数

の OSをインストールすることも可能である. ハードディスクには MBR(Master Boot Record)というブート領域がある.ここではハードディスクの領域管理も行っている.この MBRが管理できる領域は Primary(物理)パーティションが4つまでで,それ以上に使用するためには Logical(論理)パーティションを使用しなければならない(16個まで).

bootsector

MBR Partion 1 Partion 2 Partion 3 Partion 4

Primary

header Partion 1 Partion 2

Logic

図 2.25: ハードディスクのパーティション

 ハードディスクでは起動時には BIOSからローダーを呼び出し,そのローダーが Linuxカーネル本体を呼び出すという多段階の仕組みになっている.Linuxの標準ローダーが LILO(LInuxLOader)である.

Linux

LILO(first stage)BIOS

LinuxKernelLILOBoot

SectorMBR

Harddisc

LILO(second stage)

図 2.26: 起動の流れ

• ネットワーク関連 Ethernet上で通常行う通信では,TCP/IPと呼ばれるプロトコル(約束ごと)に従って通信が行われている.まず,各通信機器には世界で一意に定まる名前が付けられている.これが IPアドレスで,192.168.1.2といったような形で記されるのである.このアドレスでユニークな点は名前だけでなく所属するネットワークも同時に付記されている点であろう.このネットワーク

はネットマスクと呼ばれるマスクで知ることができる.例えば上記のアドレスが 255.255.255.0というサブネットマスクを持っている場合,192.168.1.*というアドレスは同一のネットワークにあることを示している.さらに他のネットワークへ情報を伝えたい場合には外のネットワークと

繋がっている機器を知っておかなければならない.これがデフォルトゲートウエイである.デ

フォルトゲートウエイとなっている機器が自身のネットワーク以外の相手に情報を伝えたいとい

30

Page 32: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

う情報を得た場合,そのデータは外のネットワークに渡す仕組みとなっている.しかしながら,

この IPアドレスは人間にはなかなか覚えにくいものである.一方でニックネームであれば覚えやすい.そこで通信機器に tigerであるとか dogといったようなニックネームをつける.そしてそのニックネームと IPアドレスとの対応表をある機器が持っていて,その機器に対して問い合わせることでそのニックネームを持つ機器の IPアドレスを知るのである.この対応表を持つ機器を DNS(Domain Name Server)と呼ぶ.しかし,一つのマシンが世界中のすべての対応を知る仕組みでは対応表が巨大になり,かつ,ネットワークも渋滞してしまうので,これに対しては

分散してデータを持つ仕組みになっている.例えば同志社大学の Aというサーバーは同志社内の対応表を持っている.同志社以外のアドレスの問い合わせがあった場合には,Bという日本の大学のサーバーのリストを持ったサーバに問い合わせる.これは同志社という領域が大学という

領域の下位に設定しているからである.これがドメインシステムである.同志社内のマシンはす

べて*.doshisha.ac.jpという名前が正式名であり,A.doshisha.ac.jpというサーバーが対応表を保持している.doshisha.ac.jpは上位のドメイン,ac.jpのサーバーである Bに問い合わせることができる.例えば,早稲田大学のサーバーは Cであるとする.同志社から早稲田大学のマシンDのアドレスが問い合わされた場合,まず,A.doshisha.ac.jpに尋ねられ,上位の B.ac.jpへ渡される.Bは C.waseda.ac.jpを紹介し,C.waseda.ac.jpでは D.waseda.ac.jpの情報を持っているのでそれを答えとして返す.という仕組みになっている.

 さらに詳しい解説はネットワーク関連図書に譲る.

 その他のインストール関連事項にはバイナリパッケージのインストールとカーネルの再構築がある.

• バイナリパッケージのインストール RedHatや GNU/Linux Debianの場合にはバイナリパッケージを入手すると非常に簡単にアプリケーションがインストールできる.

RedHatの場合

ftp.riken.go.jp などからバイナリパッケージを取得する.� ✏# rpm -ivh pvm.rpm

✒ ✑GNU/Linux Debianの場合

ftp://ftp.debian.or.jp などからバイナリパッケージを取得する.� ✏#dpkg -i pvm.deb

✒ ✑ さらに GNU/Linux Debianの場合には aptという dpkgのフロントエンドとなっているユーティリティを利用すると非常に便利である.例えば,ftpや cd-romにおけるパッケージの所在位置を指定してやれば,インストールしたいパッケージ名を記すだけで,最新のバイナリパッケー

ジをインストールするだけでなく,インストールする際にそのアプリケーションがさらに必要と

するアプリケーションが存在する場合(これを依存性と呼ぶ),自動的にバイナリパッケージを

入手してインストールしてくれるのである.

 例えば pvm-devというパッケージには pvmが必要であるのだが� ✏# apt-get install pvm-dev

✒ ✑とすることで pvmもインストールしてくれるという極めて優れたツールである.

31

Page 33: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

 その他,細かいオプションなどやインストールする際の技術は数多くあるが,それに関連した

図書や雑誌での記事も多く見られる.

• カーネルの再構築 今回は超入門ということで,触れないが,カーネルの再構築は必須事項である.必要なモジュー

ルのみでカーネルを作成することで必要メモリの少ないカーネルを作成することが可能である.

 また,ネットワーク関連のカーネルの改良が頻繁に行われているためカーネルのバージョンを

上げることはクラスタシステムの性能向上につながるものと思われる.特に秋に予定されてい

る大きなバージョンアップでは飛躍的な性能向上が期待されている.

■ PVM と MPI のインストール

□ 並列ライブラリって何?

 並列処理のプログラムについては別章で詳しく述べられるが,クラスタシステムにおいては,あ

る PCからある PCへとメッセージと呼ばれるデータをやり取りするメッセージパッシングと呼ばれる方法で並列処理が行われる.

 この通信を最初からプログラムを作成することも可能ではあるがそれでは非効率であるので通常は

メッセージパッシングライブラリと呼ばれる予め用意されたライブラリを使用する.メッセージパッ

シングライブラリとして代表的なものが PVM(Parallrel Virtual Machine)と MPI(Messgae PassingInterface)である. PVMのバージョンは現在 Ver. 3.4.2が最新で Netlibから配布されている.それに対して MPIはメッセージパッシングの仕様でありMPIの実装は各ベンダーが担っている.フリーなもので代表的なものが mpichであり Ver. 2.2.1が最新である. これらの通信ライブラリは Cや Fortranといった言語が使用できるようになっている.

□ どうやってインストールするの?

バイナリパッケージによるインストール

 PVMや mpichをインストール方法で最も簡単な方法は各 Linuxのパッケージに対応したバイナリファイルを探してインストールする方法である.例えば GNU/Linux Debianではftp://ftp.debian.or.jp/pub/debian/dists/unstable/main/binary-i386/devel/に比較的新しいPVM(Ver.3.4.0)や mpich(Ver. 2.2.1)がありそれを利用すれば非常に簡単にインストールが可能である.GNU/Linux Debianの場合� ✏# dpkg -i pvm_3.4.0-6.deb

# dpkg -i pvm-dev_3.4.0-6.deb

# dpkg -i mpich_1.1.2-6.deb✒ ✑ RedHatの場合には PVMや最新の rpmファイルがどのサイトにおいて収集されているかは今の

ところ不明である.

ソースファイルからコンパイルしてインストール

 目的のバージョンのバイナリが見つからない場合や特定のパッチを当ててからインストールした

い場合にはソースからコンパイルしてインストールすることとなる.

32

Page 34: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

 PVMは http://www.netlib.org/pvm3/から,mpichは http://www-unix.mcs.anl.gov/mpi/mpich/からソースを取ってくることができる.

PVMのインストール

1. PVMをインストールディレクトリを決定する.(例えば/usr/local)

2. そのディレクトリにてソースファイルを展開する.pvm3ができる.

3. pvm3のディレクトリ内で makeをする.

mpichのインストール

1. ソースファイルを展開する.mpichができる.

2. mpichに移動し,configure,makeをする.

3. make PREFIX=/usr/local/mpich install  を実行しインストールする.(これは/usr/local/mpichにインストールする例)

□ それでもWindowsでプログラミングしたいんですけど?

 先にも述べたとおり,クラスタにて数値計算を行わせる場合にはWindowsで計算を行わせなければならない理由がこれといって見当たらない.しかしながら,日頃使い慣れたWindows上でどうしても PVMやMPIを利用したい人のためにいくつかライブラリが開発されている.残念ながら筆者は全くWindowsに疎く,クラスタにおける並列計算をWindos上で行う実験が間に合わなかった.ここでは,その情報源を紹介する.ほとんどの場合がバイナリをダウンロードすればインストール可能な

ようになっており,これらは VC++を利用することが前提となっている場合が多い.

• PVM PVMはバージョン 3.4からはWindows 95および NT版も用意されている.

http://www.netlib.org/pvm3からバイナリファイルを取得できる.

• MPI関連

– WMPI

 WMPIはポルトガルの Coimbra大学のグループが MPICHをWin32へ移植したものである.最大の特徴は mpichのバージョンに対して開発維持が現在もされていてmpichが稼動しているWindows以外のマシンとも共存ができる点である.現在バージョンが 1.3でhttp://dsg.dei.uc.pt/wmpi/intro.html からダウンロードできる

– MPICH/NT

 MPICH/NTはMississippi州立大学のHigh Performance Conputing Labが開発しているNT上のmpichである.http://WWW.ERC.MsState.Edu/labs/hpcl/projects/mpi/mpiNT-download.html にて情報とダウンロードができるようになっている.現在,バージョンが0.92であるが開発は中止されているようである.

– MPI Pro

 MPI ProはMPI Software Technologyによって開発されているMPIの実装でWindowsNT用や Linux用など幅広く開発している.情報源は http://www.mpi-softtech.com/ である.

33

Page 35: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ おわりに(クラスタで何ができるの?)

 本章では AT互換機の構築,Linux OSのインストール,並列ライブラリのインストールなどの解説を行った.

 安価に比較的簡単に並列計算システムが構築できることが理解していただけたものと思う.図 2.27は表 2.3に示すようなスペックを持つ我々の GAクラスタである.これにより最適化などの計算を行っている.

図 2.27: GA Cluster

表 2.3: GA Cluster spec

CPUMemory

OS

Network

Communica-tion library

128MBLinux2.2.10

FastEthernetTCP/IP

MPICH1.1.2

Pentium III (400MHz) × 2

 これに対して NAS Parallel Benchmarkの LU Aと Bを行った結果が次の通りである. ここで比較している他の計算機はノードの数こそ違え表 2.4に示すような http://www.top500.com/

にも顔を出すような現在も現役の計算機である.

0

500

1000

1500

LU

Bench

mar

k A

0 10 20 30

Number of processor

GA Cluster

Hitachi SR2201

Cray T3E-1200

Cray T3E-900

図 2.28: NAS Parallel Benchmark LU A 図 2.29: NAS Parallel Benchmark LU B

34

Page 36: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

表 2.4: HPC TOP500Rank Manufacturer Computer Rmax Installation Site # ProcYear

1 Intel ASCI Red 21 21 .3 Sandia NationalLabs Albuquerque 1999 9472

3 SGI T3E1200 891 .5 Government 1998 1084

SGI T3E900 552.92United KingdomMeteorologicalOffice Bracknell

1997 8767

67 IBM SP P2SC160 MHz 1 06.1 1 5

Maui High-Performance Comput-ing Center (MHPCC)

1998 243

1 09 Hitachi SR2201/256 58.68Hitachi Mechani-cal EngineeringRes. Lab.

1998 256

1 29 Self-made CPlantCluster 54.24

Sandia NationalLaboratories Albu-querque

1998 150

1 60 Self-madeAvalonCluster 48.6

Los Alamos NationalLaboratory /CNLSLos Alamos 1998 140

 ところで,本講習会にご参加のみなさんはどのような計算機でどのような計算を行っていらっしゃ

り,どのような計算速度を希望されているのであろうか.常に最新の超並列計算機での計算速度を期

待されるのであれば PCクラスタはその期待には答えられないであろう.しかしながら,次のような希望をお持ちのユーザーであれば PCクラスタは十分期待に添えられるであろう.すなわち,

• コストパフォーマンスの良い並列計算機が欲しい

• 格闘しがいのある計算機が欲しい

• これから広く発展していくであろう形態の計算機が欲しい

• 古くなって使わなくなったコンピュータをなんとか利用したい

• 昼間は Officeなどのアプリケーションが稼動している PCを夜中に計算させたい

• その他

である.

 さらに性能の向上を望む方は

• CPUを Alphaにする(その際には,もちろんボードやメモリなどの変更が必要).

• ネットワークをより高速なものにする(例えば Myinetなど).

などといった投資が必要である.

 最後に,本章がこれから PCクラスタを構築しようとされている方のお役に立てば幸いである.

35

Page 37: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

講義3

Message Passing Libraryを用いた並列プログラミング

同志社大学大学院

谷村 勇輔[email protected]

■ はじめに

分散メモリ型の並列計算機においては,各プロセッサに(通常は)1つのプロセスが起動される.

UNIXではプロセス とは,独立して動くプログラムのことをいう.よってプログラムを動かすことを

プロセスの起動,動いているプログラムのことをプロセスと呼ぶ場合がある.しかしこれでは,各プロ

セッサで実行中のプロセスはローカルなデータしか参照できない.そのために各プロセス間でデータ

の交換を行い,必要なデータを共有するためのメッセージ・パッシングの仕組みが必要となる. メッ

セージ・パッシング は,あるプロセスのメモリ空間から別のプロセスのメモリ空間へのデータ転送の

ことである.もちろん,このメッセージのやりとりは,1対1で行われる場合もあるし,もっと多く

のプロセスが関与する場合もある. 分散メモリ型の並列プログラムでは,メッセージ・パッシング・

ライブラリを用いてハードウェアの構成に即したパフォーマンスの良い並列プログラムを記述する.

メッセージ・パッシング・ライブラリは,プロセス間でメッセージを送受信するためのメッセージング

環境を構築するルーチンからなる.現在,科学技術アプリケーション用のメッセージ・パッシング・ライ

ブラリとしては, PVM(Parallel Virtual Machine)と MPI(Message Passing Interface)の2つが代表的である.本章では,これら PVMとMPIの概要から述べ,メッセージ・パッシングを用いたプログラムの記述の仕方,そしてその並列プログラムを分散メモリ型の並列計算機である PC-Clusterにおいて実行する方法を説明する.図 3.1 に本章の構成を示す.

PVM MPIPVM MPI

PVMPVM

MPIMPI

PVMPVM

MPIMPI

図 3.1: 本章の構成

36

Page 38: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ PVMとMPI

□ PVMの概要

PVMは,TCP/IPネットワークで接続された何台ものコンピュータを仮想的に1台のマシンととらえて,並列プログラムを走らせることのできるメッセージ・パッシングの環境とライブラリを提供す

る.これは 1991年にオークリッジ国立研究所とテネシー大学で開発されたのが始まりである.PVMプロジェクトはその実験的性質から,副産物として科学者のコミュニティあるいはその他の分野の研

究者に役立つようなソフトウェアをこれまで作り出してきている.PVMは現在も開発が続けられており,配布が自由なために先端科学分野における大規模計算のためのソフトウェアとして世界中で利

用されている.また元々は,ワークステーション・クラスタのための TCP/IPベースの通信ライブラリであったが,現在では多くの並列計算機にも移植されている.

しかし,PVMを使用するには問題点がある.それはいくつかの並列計算機のベンダが,独自にチューニングを施した PVMを開発していることである.これによる独自仕様の PVMでは,オークリッジで配布されている PVMのルーチンが全て利用できるわけでなく,さらに標準にはない独自のルーチンが追加されている場合がある.これらの多くはアーキテクチャに即したパフォーマンスの向上を目

的としているけれども,PVMで書かれた並列プログラムの移植性を著しく損なうのものとなっているのである.

PVMの本家サイトは http://www.epm.ornl.gov/pvm/pvm home.htmlである.ここで PVMの本体やチュートリアル,その他の様々な情報を得ることができる.PVMのソースコードは Netlibから取得可能である. Netlib は数値計算を中心とする科学技術計算に関するフリーソフトやドキュメントをアーカイブしているプロジェクトで,情報は http://www.netlib.org/から得ることができる.PVMのソースコードは http://www.netlib.org/pvm3/index.htmlから得ることができる.ここには,ソースコード以外にもドキュメントや仮想コンソールの GUIである XPVM,テストユーティリティ,論文,ユーザグループの活動報告など PVMに関するあらゆるアーカイブが置かれている.

□ MPIの概要

MPIはMessage Passing Interfaceを意味し,メッセージ通信のプログラムを記述するために広く使われる「標準」を目指して作られた,メッセージ通信の API仕様である.MPIを使用することの利点としては,以下の3つが挙げられる.

・標準であるために異機種間での移植が容易

・それぞれのベンダが納得できるMPIライブラリを作る責任を負っている

・MPIの実装にはフリーのものがいくつかある

次に MPIの経緯について説明する.MPIの標準化への取り組みは Supercomputing’92会議において,後に MPIフォーラム として知られることになる委員会が結成され,メッセージ・パッシング

の標準を作り始めたことで具体化した.これには主としてアメリカ、ヨーロッパの 40の組織から 60人の人間が関わっており,産官学の研究者,主要な並列計算機ベンダのほとんどが参加した.そして

Supercomputing’93会議において草案MPI標準が示され,1994年に初めてリリースされた.MPIの成功を受けて,MPIフォーラムはオリジナルのMPI標準文書の改定と拡張を検討し始めた.

このMPI-2フォーラムにおける最初の成果物として,1995年6月にMPI1.1がリリースされた.1997年7月には,MPI1.1に対する追加訂正と説明がなされた MPI1.2と,MPI-1の機能の拡張を行った

37

Page 39: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

MPI-2がリリースされた.MPI-2の仕様は基本的にMPI-1の改定ではなく,新たな機能の追加であるために,MPI-1で書かれたプログラムが MPI-2をサポートするプラットフォームで実行できなくなるということはない.これらのMPI文書は,MPIフォーラムのサイト(http://www.mpi-forum.org/)から入手可能である.またMPI-1,MPI-2の日本語訳が MPI-Jプロジェクトにより公開されており,http://www.ppc.nec.co.jp/mpi-j/から入手可能である.MPI-2への主な取り組みとしては,

・入出力(I/O)

・ Fortrun90,C++言語向けの枠組み

・動的プロセス制御

・片側通信

・グラフィック

・実時間対応

などが挙げられる.

MPIにはいくつかの実装が存在する.実装によっては一部のMPIの関数が使えないものもあるが,ほとんどの主要なMPI関数は利用することができる.ただし、現在はまだ MPI-2を完全にサポートした実装はない.MPIがサポートされているシステムは,専用の並列計算機からワークステーション,PCに至るまでと幅広い.次に示す表に,フリーに提供されているものとベンダによって提供されている主な実装を紹介する.

38

Page 40: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

[Freeware MPI Implementation]

実装名 提供元

ホームページ

サポートされているシステム

CHIMP/MPI Edinburgh Parallel Computing Centre(EPCC)ftp://ftp.epcc.ed.ac.uk/pub/chimp/release/Sun SPARC(SunOS 4,Solaris 5),SGI(IRIX 4,IRIX 5), DEC Al-pha(Digital UNIX),HP PA-RISC(HP-UX),IBM RS/6000(AIX),Sequent Symmetry(DYNIX),Meiko T800,i860,SPARC,Meiko CS-2

MPICH Argonne National Laboratoryhttp://www-unix.mcs.anl.gov/mpi/mpich/MPP では IBM SP,Intel ParagonSGI Onyx, Challenge andPower Challenge,Convex(HP) Exemplar,NCUBE, Meiko CS-2,TMC CM-5,Cray T3D, TCPで接続されたネットワーク上では,SUN(SunOS,Solaris),SGI, HP,RS/6000,DEC Alpha,Cray C-90,その他多数のマシン

LAM Laboratory for Scientific Computing,University of Notre Damehttp://www.mpi.nd.edu/lam/Sun(Solaris 2.6.1,2.6),SGI(IRIX 6.2-6.5), IBM RS/6000(AIX4.1.x-4.2.x),DEC Alpha(OSF/1 V4.0), HPPA-RISC(HP-UXB.10.20,B.11.00), Intel x86(LINUX v2.0,v2.2.x)

WMPI Universidade de Coimbra - Portugalhttp://dsg.dei.uc.pt/wmpi/intro.htmlWindows 95,Windows NT

[Vendar MPI Implementation]

IBM Parallel Environ-ment for AIX-MPI Li-brary

IBM Corporation

http://www.ibm.com/Risc System/6000,RS/6000 SP

MPI/PRO MPI Software Technologyhttp://www.mpi-softtech.com/Redhat Linux,Alphaアーキテクチャ,Yello Dog PPC(MachintoshG3 box), Windows NT,Mercury RACE

Sun MPI Sun Microsystems,Inc.http://www.sun.com/software/hpc/すべての Solaris/UltraSPARCシステム,またそのクラスタ

39

Page 41: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ PVMとMPIの比較

PVM vs MPIに関する議論は,これまでにも様々に行われている.ここではできるだけ先入観のないように,それぞれの特徴を述べる.

PVMは,ワークステーションをクラスタにすることで再利用するという世界で育ってきたものである.そのために不均質ないくつものマシンやオペレーティング・システムを直接に管理する.そし

てダイナミックに仮想マシンを形成することができる.PVMのプロセス管理の機能では,アプリケーションの中から動的にプロセスを生成したり,停止したりすることができる.この機能はMPI-1にはなく,MPI-2で採り入れられている.さらに利用可能なノードのグループを管理する機能では,ノード数を動的に増減したり調べたりすることができる.これは,MPIではまだ採り入れられていない.PVMの利用における問題点は,先にも述べた移植性とパフォーマンスである.それに対してMPIは,その実装が MPP(Massively Parallel Processors)やほとんど同一な特定のワークステーション・クラスタを対象としている.MPIは PVMの後に設計されたために,明らかにPVMにおける問題点を学んでいる.つまりMPIの方が PVMに比べて,高レベルのバッファ操作が可能であり,高速にメッセージを受け渡すことができる.そして,オープンなフォーラムによって達

成された「標準」であるために,MPIで作成されたプログラムは非常に移植性が高い.ただし MPIの実装は数多くあるが,MPI-2を完全にサポートしたものはまだない.このように PVMとMPIでは,それぞれに利点・欠点を抱えている.どちらを選ぶかは,各ユーザ

の環境や好みによるところが大きい.ここで重要なことは,PVMのアプリケーションをMPIを用いて書き直したり,その逆を行うことはそれほど難しい作業ではないということである.

■ 並列計算

□ 概要

以降の節では PVMと MPIを用いて,並列プログラムを作成する.PVMと MPIでデータ交換をするための通信関数には,ある2つのプロセス同士だけが関わる 1対1通信 と,あるグループに属

しているプロセスが全て関わるグループ通信 が用意されている.そこで1対1通信を行うプログラ

ムと,グループ通信を行うプログラムを作成する.

並列プログラムの実行方法についてはさらに後の節で説明するが,プログラムを書くにあたって並

列プログラムの実行の様子について概念的に理解しておく必要がある.手順を述べると,まずユーザ

はクラスタの1つのマシン,あるいは専用の並列計算機のホストとなっているマシンにログインを行

う.そこでユーザはクラスタ,あるいは専用の並列計算機に対してジョブの投入を行う.ジョブの投

入のために MPIではスクリプト,専用の並列計算機では専用のコマンドが用意されている.ただし,PVMの場合には自ホスト内で起動したプロセスから,他ホストのプロセスが呼び起こされたりする.プログラムが無事終了すると,ファイル,あるいはユーザのモニタに結果が出力される.このように

実際に並列に走る個々のプロセスの起動は,実行環境に任されている.プログラマはプログラムの中

で,最初に通信ライブラリを利用するための簡単な手続きを記述し,その後で実際の並列処理の部分

を書いていけばよいことになる.

40

Page 42: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ PVMを用いたプログラミング

PVMの並列実行モデルでは,アプリケーションの実行に参加するプロセス数を動的に変更することができる.これにより非常に柔軟なプログラムを書くことができる.ここでは,プロセスにマスター

とスレーブの関係が生じる マスター・スレーブ 型のプログラムと,全てのプロセスが同等の関係を

もつ形のプログラムについて説明する.前者の場合の実行は,ユーザが1つのプロセスを起動し,そ

のプロセスから必要な数の並列プロセスが起動される.後者の場合は,MPIと同じようにユーザが全てのプロセスを一斉に起動することになる.

[マスター・スレーブモデルのプログラムの枠組み]� ✏#include "pvm.h" // ヘッダファイルの読み込み

#define NPROC 4 // プロセス数

int main(int argc, char **argv)

{

int *tids;

int mytid,iproc;

mytid = pvm_mytid();

// タスク IDの取得,全ての PVM関数に先だって呼び出す必要がある

iproc = pvm_joingroup(GROUPID); // 自プロセスをプロセスグループへ登録

if(iproc == 0){

tids[0]=pvm_mytid(); // タスク IDを配列に格納しておく

pvm_spawn("a.out",&argv[1],0,NULL,NPROC-1,&tids[1]);

// 自プロセスと同じプロセスを NPROC-1数だけ呼び起こす

}

/* 並列処理の記述 */

pvm_lvgroup(GROUPID); // プロセスグループから脱退

pvm_exit(); // pvmプロセスの終了処理

return 0;

}✒ ✑

タスク ID :PVMには,OSが管理しているプロセス IDとは別に,PVMデーモンが管理しているタスク IDと呼ばれるプロセスを識別する番号がある.PVMではタスク IDで,通信の送信元や受信先を指定する.そこでプログラムの中でタスク IDを管理する配列を作っておくとよい.またプロセスグループに登録すると与えられるインスタンス番号は,0から始まる小さな正数が割り当てられる

ので,グループ内でのプロセスの役割分担を行う時にはこちらを用いる.

プロセスグループ :グループ通信を行うプログラムでは,各プロセスをプロセスグループに登録

する必要がある.プロセスグループへの登録は pvm joingroup()関数を用いる.この関数は,呼び出したプロセスのグループにおけるインスタンス番号を返す.

41

Page 43: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

先に挙げた図 3.2プログラムの枠組みでは1つのプロセスを起動し,その中でプロセスを指定された数だけ順に呼び起こしている.プロセスを呼び起こすのには pvm spawn()という関数を用いている.この pvm spawn()は,マスター・プロセスにおいて呼び出される.プロセスが必要な数だけ起動された後は,マスター・スレーブの形でプログラムを書いてもよいし,全プロセスを同等に扱うよ

うなプログラムを書いてもよい.

USER

PP PP PP

PP

Spawn

Processor

Process

Start

図 3.2: マスター・スレーブモデル

次に,最初に全プロセスを同時に起動する方法を説明する.全プロセスを同時に起動する方法は後

の節で述べるが,この方法においても,起動するプロセス数を実行時に自由に変更できるようにプロ

グラムを書くことができる.このプログラムモデルではまず最初に,pvm siblings()関数を用いて起動されたタスク数やタスク IDのリストの情報を得る.そして.メインの処理を行う前に全プロセスが起動され,さらにグループへの登録を完了するのを待つといった同期処理を記述する必要がある.

[全プロセスを一斉に起動するプログラムの枠組み]� ✏#include "pvm.h"

int main(int argc, char **argv)

{

int *tids;

int mytid,numtids;

mytid = pvm_mytid(); // タスク IDの取得

numtids = pvm_siblings($& tids);

// 起動されたタスク数とタスク IDのリストを取得

pvm_joingroup(GROUPID); // 自プロセスをプロセスグループへ登録

while ((gsize = pvm_gsize(GROUPID)) < numtids){}

// グループサイズが numtidsになるまで待つ

/* 並列処理の記述 */

pvm_lvgroup(); // プロセスグループから脱退

pvm_exit(); // pvmプロセスの終了処理

return 0;

}✒ ✑

42

Page 44: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ MPIを用いたプログラミング

MPI-1には 127個の通信関数が用意されている.しかし,20程度の関数を知っていれば,通信をかなり細かく制御することができる.MPIでは全てのプロセスを一斉に起動する.そして各プロセスは,他のほとんどのMPI関数よりも先にMPI Init()を呼ばなければならない.MPIを用いた並列プログラムの枠組みは次のようになる.

[プログラムの枠組み]� ✏#include "mpi.h" // ヘッダファイルの読み込み

int main(int argc, char **argv)

{

int numprocs, myid;

MPI_init(argc,argv); // MPIライブラリを利用するための準備(初期化)

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

// コミュニケータ内のプロセスの数を取得

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

// コミュニケータ内の各プロセスが自分の rankを取得

/* 並列処理の記述 */

MPI_Finalize(); // MPIライブラリの利用の終了処理

return 0;

}✒ ✑

rank :コミュニケータ内の全てのプロセスは,プロセスが初期化されたときにシステムによって

示された IDをもっている.これは 0から始まる連続した正数が割り当てられる.プログラマはこれを用いて,処理の分岐,あるいはメッセージの送信元や受信先を指定することができる.

コミュニケータ :お互いに通信を行うプロセスの集合である.ほとんどのMPIルーチンは引数としてコミュニケータを取る.変数 MPI COMM WORLDは,あるアプリケーションを一緒に実行している全プロセスからなるグループを表しており,これは最初から用意されている.また新しいコ

ミュニケータを作成することも可能である.

以下に,よく用いられていると思われるMPI関数の主なものを簡単に紹介する.それ以外にも有用なものは存在するが,それは各実装に付属のドキュメントやMPIの仕様書などを参照されたい.

MPI Init():MPIの実行環境の初期化MPI Comm rank():コミュニケータ内のランクを取得MPI Comm size():コミュニケータ内のプロセス数を取得MPI Finalize():MPIの実行環境の終了

MPI Send():ブロック送信MPI Recv():ブロック受信

43

Page 45: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

MPI Sendrecv():ブロック送受信MPI Probe():メッセージのブロック・テストを行う

MPI Isend():非ブロック送信MPI Irecv():非ブロック受信MPI Wait():特定の非ブロック送受信の完了を待つMPI Waitall():全ての非ブロック送受信の完了を待つ

MPI Barrier():コミュニケータ内でバリア同期をとるMPI Bcast():メッセージのブロードキャストMPI Reduce():コミュニケータ内で通信と同時に指定された演算を行う

MPI Type extent():特定のデータタイプのサイズを取得MPI Type struct():新しいデータタイプを作成MPI Type commit():システムに新しいデータタイプを委ねるMPI Type free():データタイプの削除

44

Page 46: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ 1対1通信

□ PVMの1対1通信

ここでは PVMの基本的な1対1通信の関数について説明する.PVMではデータの送信の際に,バッファの初期化,データのパック(バッファにデータを格納),バッファのデータの送信の3つのス

テップで行われる.データの受信にはこれと逆の操作,つまりデータを受信しアンパックしてデータ

を得る.

[1対1通信関数]

次に示すプログラムは,1対1通信を行うプログラムである.これは hello pvmというプログラムと hello other pvmというプログラムの2つからなる.これらは別々にコンパイルされ,それぞれ別々の実行ファイルとなる.そして hello pvmプログラムを実行すると,その中で hello other pvmプログラムが呼び起こされ,hello other pvmから hello pvmに対して通信が行われる.以下に,主にこのプログラム中で用いられている1対1通信の関数を紹介する.また,ここで取り上げた以外の

関数については man page,あるいは「PVM3ユーザーズガイド& リファレンスマニュアル(日本語版)(http://www.cs.takushoku-u.ac.jp/dcl/PVM/jpvmug-950205.tar.gz)等を参照されたい.

int bufid = pvm initsend( int encoding )

送信バッファを初期化する.

int encoding:送信バッファにデータを蓄積する時のエンコード方式を指定.PvmDataDe-fault,PvmDataRaw,PvmDataInPlace,(PvmDataFoo)を選択できる.PvmDataDefaultは XDR(External Data Representation)によるエンコードを行い,PvmDataRawはエンコードを行わない.ただし異機種間で仮想マシンが構築されているならば,エンコード

は必要である.それ以外については,ここでは説明を省略する.

int bufid:メッセージ・バッファの識別子.負であればエラー

int info = pvm pkstr( char *sp )

送信バッファにデータを格納する.(データ型が STRINGの場合)

char *sp:送信バッファに蓄積するデータの開始アドレスint info:ステータス・コード.負であればエラー

int info = pvm pkint( int *ip, int nitem, int stride )送信バッファにデータを格納する.(データ型が INTの場合)

int *ip:送信バッファに蓄積するデータの開始アドレスint nitem:送信バッファに蓄積するデータ数int stride:stride個ごとのデータを送信バッファに蓄積する.連続しているデータを蓄積するときは 1となる.int info:ステータス・コード.負であればエラー

int info = pvm send( int tid, int tag )送信バッファのデータを特定のタスクに送信する.

int tid:受信先のタスク IDint tag:メッセージ・タグint info:ステータス・コード.負であればエラー

45

Page 47: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

int info = pvm upkstr( char *sp )

受信バッファからデータを取り出す.(データ型が STRINGの場合)

char *sp:受信バッファから取り出すデータの開始アドレスint info:ステータス・コード.負であればエラー

int info = pvm upkint( int *ip, int nitem, int stride )

受信バッファからデータを取り出す.(データ型が INTの場合)

char *ip:受信バッファから取り出すデータの開始アドレスint info:ステータス・コード.負であればエラー

int bufid = pvm recv( int tid, int tag )メッセージの到着を待つ.

int tid:送信元のタスク ID( -1は送信元を特定しない)int tag:メッセージ・タグ ( -1はメッセージ・タグを特定しない)int bufid:新しいアクティブ受信バッファの識別子.負であればエラー

メッセージ・タグ :メッセージ送信の際に送信メッセージに整数の識別番号を付けることができ

る.それがメッセージ・タグである.これにより受信の際にタグを指定することで,非同期的に到着

しているメッセージから特定のものを選択することができる.

[hello pvm.c]� ✏#include <stdio.h>

#include "pvm3.h"

main()

{

int cc, tid;

char buf[100];

printf("i’m t%x\n", pvm_mytid());

cc = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid);

if (cc == 1) {

cc = pvm_recv(-1, -1);

pvm_bufinfo(cc, (int*)0, (int*)0, &tid);

pvm_upkstr(buf);

printf("from t%x: %s\n", tid, buf);

} else

printf("can’t start hello_other\n");

pvm_exit();

exit(0);

}✒ ✑

46

Page 48: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

[hello other pvm.c]� ✏#include "pvm3.h"

main()

{

int ptid;

char buf[100];

ptid = pvm_parent();

strcpy(buf, "hello, world from ");

gethostname(buf + strlen(buf), 64);

pvm_initsend(PvmDataDefault);

pvm_pkstr(buf);

pvm_send(ptid, 1);

pvm_exit();

exit(0);

}✒ ✑

47

Page 49: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ MPIの1対1通信

MPIの1対1通信には,PVMよりも数多くの関数が用意されている.これにより,より細かく通信を制御することが可能である.しかしここでの説明は,基本的な送受信関数の紹介にとどめておく.

ほとんどのMPI関数のプロトタイプでは,成功した場合の戻り値はMPI SUCCSESSになる.失敗した場合の戻り値は実装によって異なる.

[1対1通信関数]

次に示すプログラムは,rank0と rank1のプロセスがお互いに ”hello”というメッセージを送り合うプログラムである.用いる関数は,送信関数MPI Send()と受信関数MPI Recv()の2つである.

int MPI Send( void *buf, int count, MPI Datatype datatype, int dest, int tag, MPIComm comm )

基本的なブロックキング送信の操作を行う.送信バッファのデータを特定の受信先に送信する.

void *buf:送信バッファの開始アドレス(送るべきデータの所在)int count:データの要素数MPI Datatype datatype:データタイプint dest:受信先int tag:メッセージ・タグMPI Comm comm:コミュニケータ

int MPI Recv( void *buf, int count, MPI Datatype datatype, int source, int tag,

MPI Comm comm, MPI Status status )要求されたデータを受信バッファから取り出す.またそれが可能になるまで待つ.

void *buf:受信バッファの開始アドレス(受け取ったデータの格納場所)int source:送信元(MPI ANY SOURCEで送信元を特定しない)int tag:メッセージ・タグ (MPI ANY TAGでメッセージ・タグを特定しない)MPI Status *status:ステータス(送信元のランクや送信時に指定されたタグの値を格納する構造体へのポインタ)

データタイプ:ポータビリティを高めるために,MPIによって前もって定義されたデータ型である.例えば,int型であれば MPI INTというハンドルを用いることになる.プログラマは,新たなデータ型を定義することが可能である.

メッセージ・タグ:メッセージを識別するためにプログラマによって割り当てられた任意の整数で

ある.用い方は PVMの場合とほぼ同じである.

48

Page 50: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

[hello mpi.c]� ✏#include <stdio.h>

#include "mpi.h"

int main(int argc,char *argv[])

{

int myid,procs,src,dest,tag=1000,count;

char inmsg[10],outmsg[]="hello";

MPI_Status stat;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

count=sizeof(outmsg)/sizeof(char);

if(myid == 0){

src = 1;

dest = 1;

MPI_Send(&outmsg,count,MPI_CHAR,dest,tag,MPI_COMM_WORLD);

MPI_Recv(&inmsg,count,MPI_CHAR,src,tag,MPI_COMM_WORLD,&stat);

printf("%s from rank %d\n",&inmsg,src);

}else{

src = 0;

dest = 0;

MPI_Recv(&inmsg,count,MPI_CHAR,src,tag,MPI_COMM_WORLD,&stat);

MPI_Send(&outmsg,count,MPI_CHAR,dest,tag,MPI_COMM_WORLD);

printf("%s from rank %d\n",&inmsg,src);

}

MPI_Finalize();

return 0;

}

✒ ✑

49

Page 51: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ グループ通信

□ π計算のアルゴリズム

次にグループ通信について説明する.並列化を行う対象は πを近似的に求めるプログラムである.

πは式 3.1 に示す計算式で求めることができる.またこれを逐次的に計算するプログラムは,積分計算が図 3.3に示すように近似的に行われるので,0から loop-1個の区間の積分計算に置き換えられる.つまり.この積分計算のループ部分を並列化する.プログラム例では,複数のプロセッサで loop個の区間の計算を分担するようなアルゴリズムを採用する.

π =∫ 1

0

41 + x2

dx (3.1)

図 3.3: y = 41+x2

[逐次プログラム]� ✏#include <stdio.h>

int main(int argc, char **argv)

{

int i,loop;

double width,x,pai=0.0;

loop = atoi(argv[1]);

width = 1.0 / loop;

for(i=0;i<loop;i++){

x = (i + 0.5) * width;

pai += 4.0 / (1.0 + x * x);

}

pai = pai / loop;

printf("PAI = %f\n",pai);

return 0;

}✒ ✑

50

Page 52: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ PVMのグループ通信

[グループ通信の関数]

PVMではグループ通信を行うためには,各プロセスをプロセスグループにあらかじめ登録しておく必要がある.次に示す π計算のプログラムでは,pvm barrier()と pvm reduce()の2つの関数が用いられている.このプログラムは図 3.4 に示されているように,全てのプロセスが起動された後に一度同期をとり,それから各プロセス毎に担当区分の積分計算を行っている.そして最後に,計算結

果をインスタンス番号が 0のプロセスに集め,πの近似値を求めている.

int info = pvm barrier( char *group, int count )

グループの全プロセスがこれを呼び出すまで,呼び出しプロセスをブロックする.

char *group:グループ名int count:グループに属しているプロセス数int info:ステータス・コード,負であればエラー

int info = pvm reduce( void (*func)(), void *buf, int count, int datatype, int tag,char *group, int root )

グループ内の全プロセスのデータをある1つのプロセスに集める.また同時に各データを足し合わ

せるなどの演算を行う.

void (*func)():通信と同時に行う演算を定義しておく.前もって定義されたPvmSum(データの総和をとる)などを用いることもできる.

void *buf:送信バッファの開始アドレスint count:データの要素数int datatype:データタイプ.int型ならば PVM INTというようになる.int tag:メッセージ・タグchar *group:グループ名int root:演算結果を得るプロセスのインスタンス番号int info:ステータス・コード,負であればエラー

P0P0 P1P1 PnPn

Sum

pvm_barrier

pvm_reduce

図 3.4: πの計算における通信

51

Page 53: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

[cpi pvm.c]� ✏#include <stdio.h>

#include "pvm3.h"

#define NPROC 4

int main(int argc, char **argv)

{

register double lsum,width;

register int intervals,i;

double sum;

int mytid,iproc,msgtag=4;

int tids[NPROC];

mytid=pvm_mytid();

iproc=pvm_joingroup("pi");

if(iproc == 0){

tids[0]=pvm_mytid();

pvm_spawn("pvmpi",&argv[1],0,NULL,NPROC-1,&tids[1]);

}

pvm_barrier("pi",NPROC);

intervals = atoi(argv[1]);

width = 1.0 / intervals;

lsum = 0.0;

for(i=iproc;i<intervals;i+=NPROC){

register double x = (i + 0.5) * width;

lsum += 4.0 / (1.0 + x * x);

}

sum = lsum * width;

pvm_reduce(PvmSum,&sum,1,PVM_DOUBLE,msgtag,"pi",0);

if(iproc == 0)

printf("Estimation of pi is %f\n",sum);

pvm_barrier("pi",NPROC);

pvm_lvgroup("pi");

pvm_exit();

return 0;

}✒ ✑

52

Page 54: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ MPIのグループ通信

[グループ通信関数]

MPIには1対1通信の他にコミュニケータ内の全てのプロセスが参加するグループ通信が用意されている.MPIでは 16個のグループ通信のための通信関数が用意されているが,ここでは π計算のプ

ログラムで用いられているMPI Bcast()と MPI Reduce()について説明する.π 計算のプログラム

はこの2つの関数を用いて,図 3.5 に示されるような通信が行われる.まず最初に rank0のプロセスにおいて,あらかじめ定義された,あるいはユーザによって入力された分割数を他の全プロセスに送

信する.次に,それぞれのプロセスは自分の rankと分割数を照らし合わせて,各自が積分計算を行う区間を求め積分計算を行う.最後に計算結果を rank0に送る.この通信においては,rank0に各プロセスの計算結果を集めると同時にその総和をとり,πの近似値を求めている.

int MPI Bcast ( void *buf, int count, MPI Datatype datatype, int root, MPIComm comm )

1つのプロセスからコミュニケータ内の他の全プロセスにメッセージを一斉に送信する.

void *buf:送信元では送信バッファ,受信先では受信バッファの開始アドレスint count:データの要素数MPI Datatype datatype:データタイプint root:送信元の rankMPI Comm comm:コミュニケータ

int MPI Reduce ( void *sendbuf, void *recvbuf, int count, MPI Datatype datatype,MPI op op, int dest, MPI Comm comm )

コミュニケータ内の全プロセスのデータをある1つのプロセスに集める.また同時に各データを足

し合わせるなどの演算を行う.

void *sendbuf:送信先(コミュニケータ内の全プロセス)の送信バッファの開始アドレスvoid *recvbuf:受信先(destで指定された rank)の受信バッファの開始アドレスMPI Op op:演算のハンドル

演算のハンドル :MPIによって前もって定義された演算を指定することで,通信と同時にどのような演算を行うかを指定する.例えば,各データの合計をとる場合にはMPI SUMと指定する.またプログラマは,MPI Op create()関数によって独自の演算を定義することができる.

53

Page 55: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

P0P0 P1P1 PnPn

Sum

MPI_Bcast

MPI_Reduce

図 3.5: πの計算における通信

[cpi mpi.c]� ✏#include "mpi.h"

#include <stdio.h>

#include <math.h>

double f( double a ){ return (4.0 / (1.0 + a * a)); }

int main( int argc, char *argv[])

{

int done = 0, n, myid, numprocs, i;

double PI25DT = 3.141592653589793238462643;

double mypi, pi, h, sum, x;

double startwtime, endwtime;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Get_processor_name(processor_name,&namelen);

fprintf(stderr,"Process %d on %s\n",myid, processor_name);

n = 0;

while (!done){

if (myid == 0){

/*

printf("Enter the number of intervals: (0 quits) ");

scanf("%d",&n);

*/✒ ✑

54

Page 56: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

� ✏if (n==0) n=100; else n=0;

startwtime = MPI_Wtime();

}

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

if (n == 0)

done = 1;

else{

h = 1.0 / (double) n;

sum = 0.0;

for (i = myid + 1; i <= n; i += numprocs){

x = h * ((double)i - 0.5);

sum += f(x);

}

mypi = h * sum;

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0){

printf("pi is approximately %.16f, Error is %.16f\n",

pi, fabs(pi - PI25DT));

endwtime = MPI_Wtime();

printf("wall clock time = %f\n",endwtime-startwtime);

}

}

}

MPI_Finalize();

return 0;

}✒ ✑

55

Page 57: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ PVMとMPIのプログラムの実行

□ PVMのプログラムの実行

本節では PVMを用いたプログラムをコンパイルし,実行するまでの一連の手順について説明する.コンパイル,及び実行環境は Debian/GNU Linuxがインストールされた PC/AT互換機4台からなるクラスタで,Cコンパイラとして gcc,通信ライブラリとして PVM3.4を利用する.PVMはDebian/GNU Linuxのパッケージ・インストーラによって,デフォルトの場所にインストールされている.以降はこのシステムに基づいて説明を行うが,大筋はどのシステムにおいてもあまり変わらな

いので,設定ファイルの書き方などは適宜読みかえて頂きたい.

環境設定

まず最初に,各ユーザごとに仮想マシンを構成する個々のホストにおいて環境設定を行う.環境変

数$ PVM ROOTに PVMがインストールされているディレクトリを設定し,$ PVM ARCHにシステムのアーキテクチャを設定する.本システムの場合は,bashを利用しているとして.bash profileに以下の行を加えればよい.また Red Hat Linuxの場合において,Extreme Linuxによって配布されている RPMでは,PVMがインストールされるディレクトリは,Debian/GNU Linuxの場合と同じである.

� ✏PVM_ROOT = /usr/lib/pvm3/

PVM_ARCH = LINUX

export PVM_ROOT PVM_ARCH✒ ✑

プログラムのコンパイル

次に PVMを用いたプログラムのコンパイル方法について説明する.PVMを用いたプログラムは,コンパイルの際には「ヘッダファイルの所在を示すパスの指定」,「PVMライブラリのリンク,またはその所在を示すパスの指定」が必要となる.先ほどの環境変数の設定ができていれば,PVMのヘッダファイル,ライブラリの位置はどのホストにおいても以下の通りとなる.

ヘッダファイルの場所:$ PVM ROOT/include/ライブラリの場所:$ PVM ROOT/lib/$ PVM ARCH

そしてコンパイルは以下のように実行する.

� ✏$ gcc sample.c -o sample -I$PVM_ROOT/include -L$PVM_ROOT/lib/LINUX -lpvm3

✒ ✑

また pvmのグループ関数を用いる場合には,「-lgpvm3」とグループ関数用のライブラリを別にリンクする必要がある.この他に PVMには,makeコマンドの支援ツール aimk が用意されているの

で,それを利用することもできる.aimkは,異なるプラットホームの実行形式を支援するmakeコマンドのフロントエンドであり,Makefile.aimkを参照してコンパイルを行う.つまり先ほどのヘッダやライブラリの所在を示すパス指定などを Makefile.aimkの中に記述しておくことにより,異機種混合

56

Page 58: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

のクラスタにおいても,簡単なコマンドでそれぞれのホスト上にバイナリを作成することができる.

Makefile.aimkのプロトタイプは,付属の exampleに含まれているので詳しくはそちらを参照されたい.

仮想マシンの構築

次に PVMの実行環境( 仮想マシン )を構築する.PVMのインストールされたホストでは,”pvm”コマンドにより pvmd(PVMデーモン)を起動し, 仮想コンソール に移ることができる. PVM

デーモン は,仮想マシンを構成する全てのコンピュータ上に常駐し,タスク間の通信やタスクの制

御を行う.あるマシンで PVMデーモンを起動すると,他ホストの PVMデーモンを起動して仮想マシンに追加したり,削除することができる.仮想コンソール上で用いることのできる主なコマンドを

以下に示す.

add:他ホストを仮想マシンに追加するdelete:他ホストを仮想マシンから削除するconf:現在動いているホストの環境を表示するkill:タスク IDを指定してプロセスを終了させるps:現在動いているタスクの状態を示すquit:仮想コンソールから抜ける(各ホストのデーモンは動いたまま)halt:全てのデーモンを終了させて,仮想コンソールから抜けるhelp:コマンドの helpを参照する

PVMデーモンの起動� ✏$ pvm

pvm> conf

1 host, 1 data format

HOST DTID ARCH SPEED DSIG

p0pvm 40000 LINUX 1000 0x00408841

pvm> quit

Console: exit handler called

pvmd still running.✒ ✑

そして仮想コンソール上で,他ホストを仮想マシンに追加するわけであるが,通常は仮想マシンの

構成を記述したホストファイルなどをあらかじめ用意しておく. ホストファイル は

� ✏pvm [ホストファイル名]

✒ ✑

のように ”pvm”コマンドの引数とすることで,このファイル中に記述されているホストにおいてPVMデーモンを一斉に起動し,仮想マシンを構築すことができる.ホストファイルの形式は,次に示すように1行に1つホスト名を記述した一覧表である.各行のホスト名の後にはいくつかのオプショ

ンを指定することが可能で,パスワードの入力を促したり,実行ファイルの検索パスなどを記述でき

る.オプションの設定については,以前の章で紹介した「PVM3ユーザーズガイド& リファレンスマニュアル」などを参照されたい.

57

Page 59: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ホストファイル(hostslist)の設定� ✏p0pvm

p1pvm

p2pvm

p3pvm✒ ✑

PVMではデフォルトでは,rshを利用して仮想コンソールにおいて他ホストを操作する.そのため,対象ホストが自ホストからの rloginを許可していなければならない.もし rloginが許可されていないならば,上記のホストファイルを引数として”pvm”コマンドを実行しても失敗する.そこで,対象ホストの$ HOME/.rhostsファイルに rloginを許可する設定を記述しておくなどの準備が必要である..rhostsファイルは次のように記述する.

$ HOME/.rhostsの設定� ✏# 許可するホスト名 ユーザ名

p0pvm foo✒ ✑

ホストファイルを用いて実際に仮想マシンを構築する.ここでホストファイルの名前を hostslistとすると,hostslistを引数にして”pvm hostslist”とコマンドを実行する.次に仮想コンソールで”conf”コマンドを実行し,デーモンが起動されているかどうかを確認する.次に ”quit”コマンドでデーモンを起動したまま仮想コンソールを抜ける.成功すれば,「pvmd still running」というメッセージが出力される.あとはプログラムの実行を実行するだけである.この手順の実行の様子を示す.

PVMデーモンの一斉起動� ✏$ pvm hostlist

pvm> conf

4 hosts, 1 data format

HOST DTID ARCH SPEED DSIG

p0pvm 40000 LINUX 1000 0x00408841

p1pvm 80000 LINUX 1000 0x00408841

p2pvm c0000 LINUX 1000 0x00408841

p3pvm 100000 LINUX 1000 0x00408841

pvm> quit

Console: exit handler called

pvmd still running.✒ ✑

ただし Debian/GNU Linuxにおいては,グループ関数を用いる時には PVMグループ・サーバ を

手動で立ち上げておく必要がある.グループ・サーバは,グループ名とそのグループに所属している

タスクを管理するデーモンであり,仮想マシン内のどれか1つのホスト上で起動されている必要があ

る.グループ・サーバの起動は,仮想コンソールを抜ける前に以下のように実行すればよい.

58

Page 60: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

� ✏pvm> spawn /usr/bin/pvmgs

1 successful

t100001✒ ✑

プログラムの実行

ここまで問題なく行えれば,仮想マシンが構築されているはずである.それでは最後に,プログラ

ムを実行する.helloプログラムと π計算のプログラムを実行した結果を示す.PVMの π計算の実行

では,引数として積分区間の分割数を与えている.

helloプログラムの実行� ✏$ hello_pvm

i’m t40002

from t80001: hello, world from p1pvm✒ ✑

π計算の実行� ✏$ cpi_pvm 1000

Estimation of pi is 3.141593✒ ✑

ただし,上記の方法は起動するアプリケーションがその中でプロセスを呼び起こすように設定され

ている場合である.以前に,PVMでもMPIと同じように複数のプロセスを一斉に起動することもできると述べた.そのような場合には,仮想コンソール上で次のように実行すればよい.これは,a.outという実行ファイルのプロセスを4つ起動するという意味である.

� ✏pvm> spawn -4 -> a.out

✒ ✑

59

Page 61: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ MPIのプログラムの実行

プログラムのコンパイル

初めに MPIを用いたプログラムのコンパイル方法について説明する.プログラムのコンパイルには,PVMの場合と同様にMPIのヘッダファイルとライブラリのパス指定と,MPIライブラリのリンクを行わなければならない.MPICHでは mpicc や mpif77などのコンパイル用スクリプトが用意されているので,それを用いても良い.コンパイル,及び実行環境は,Debian/GNU Linuxのインストールされた4台の PCからなるクラスタである.Debianの場合,デフォルトでインストールされるMPICH1.1.2のヘッダファイル,ライブラリの位置は以下の通りとなる.

ヘッダファイルの場所:/usr/lib/mpich/include,/usr/lib/mpich/build/LINUX/ch p4/include/ライブラリの場所:/usr/lib/mpich/build/LINUX/ch p4/lib/

つまり以下に示すようなMakefileを作成し,makeを実行する.

� ✏CC = gcc

INCLUDES = -I/usr/lib/mpich/include -I/usr/lib/mpich/build/LINUX/ch_p4/include

LIBS = $(LIB_PATH) $(LIB_LIST)

LIB_PATH = -L/usr/lib/mpich/build/LINUX/ch_p4/lib

LIB_LIST = -lmpi

OPTFLAGS = -O2

CFLAGS = $(INCLUDES) $(OPTFLAGS)

sample: sample

$(CC) $(CFLAGS) sample.c -o sample $(LIB_PATH) $(LIB_LIST)

clean:

/bin/rm -f *.o PI* cpi✒ ✑

また mpiccを利用する場合には,次のように実行を行う.

� ✏$ mpicc sample.c -o sample

✒ ✑

プログラムの実行

管理者は,ジョブの投入を行うホストにおいて,/etc/mpich/machines.LINUXに並列計算に利用するホストを登録しておく.MPICHには mpirun という MPIプログラム実行用のスクリプトが用意されている.mpirunはこのファイルの先頭に記載されているホストから順に並列計算に参加させる.mpirunでは,rlogin(MPICHのコンパイル時の指定によって sloginも可)によって各マシンにログインを行いプロセスを生成する.つまり各ユーザは,PVMの場合と同様に$ HOME/.rhostsに/etc/mpich/machines.LINUXに記載されているホストを記述しておかねばならない.mpirunは以下のように実行する.

60

Page 62: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

� ✏mpirun -np [プロセス数] [プログラム名]

✒ ✑

mpirunはいくつかのオプションを指定することができる.これらについては,「mpirun -h」や「manmpirun」を参照されたい.以下に,helloプログラムと π計算のプログラムを実行した結果を示す.

helloプログラムの実行� ✏m0:~$ mpirun -np 2 hello_mpi

hello from rank 1

hello from rank 0✒ ✑

π計算の実行� ✏m0:~$ mpirun -np 4 -nolocal cpi_mpi

Process 0 on m0.myrinet.hexa.isl.doshisha.ac.jp

Process 1 on m1.myrinet.hexa.isl.doshisha.ac.jp

Process 2 on m2.myrinet.hexa.isl.doshisha.ac.jp

Process 3 on m3.myrinet.hexa.isl.doshisha.ac.jp

pi is approximately 3.1416009869231245, Error is 0.0000083333333314

wall clock time = 0.002457✒ ✑

■ 実行速度の測定

最後に PVMとMPIにおいて,π計算の実行速度を検証する.使用したシステムは,表 3.1に示すような8台の PCから構成されるクラスタである.πの計算は積分計算をの分割数を大きくすればす

るほど,高負荷の処理となる.そこで実験では,loop=1e+8と loop=1e+6の場合をを計測した.プログラムは,先ほど紹介したプログラムに時間計測用の関数を加えたものである.計測結果を図 3.6に示す.

表 3.1: 各 PCのスペックプロセッサ Pentium3 500MHzメモリ 256MBOS Linux2.2.10

ネットワーク 10BASE Ethernet通信ライブラリ PVM3.4.0,MPICH1.1.2

図 3.6 の結果より,分割数が小さい場合には各プロセッサにかかる負荷が小さいために,通信時間の占める割合が大きくなり,速度向上が得られないということがわかる.それに対して,分割数が大

きい場合には通信時間の全体に占める割合が小さくなり,かなり良い速度向上比が得られた.また,

PVMとMPIでは PVMのプログラムの方がパフォーマンスが得られている.これは今回用いた π計

算のプログラムが,PVMとMPIで微妙に処理手順などが異なっているためであると考えられ,一般には MPIの方が PVMよりも高いパフォーマンスが得られる.

61

Page 63: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

図 3.6: πの計算の実行結果の検証

■ 参考文献

[1] 1998年並列処理講習会テキスト,「並列処理の基礎と実習」,(日本機械学会,1998.8)

[2] 湯淺太一,安村通晃,中田登志之,「はじめての並列プログラミング」,(共立出版,1998.6)

[3] Linux Japan特集2,「並列処理とクラスタリング」,(レーザー5出版局,1998.7)

[4] Rajikumar Buyya,「High Performance Cluster Computing」,(Prentice Hall PTR,1999)

[5] 「PVM - A User’s Guide and Tutorial for Networked Parallel Computing -」

[6] Al Geistほか 著,村田英明 訳,「PVM3ユーザーズガイド &リファレンスマニュアル」,(1995.2)

[7] 「MPI Standard(日本語訳ドラフト),(MPI-J ML,1996.5)

[8] 「MPI-2:Extensions to the Message-Passing Interface(日本語訳ドラフト)」,(MPI-J ML,1999.7)

[9] 青山幸也,「虎の巻シリーズ」,(日本アイ・ビー・エム株式会社,1998)

[10] Blaise M.Barney,「The Message Passing Interface,ISHPC 97 Tutorial」,(Maui High Perfor-mance Computing Center,1997.11)

[11] G.A.Geist,J.A.Kohl,P.M.Papadopoulos,「PVM and MPI:a Comparison of Features」,(1996.3)

62

Page 64: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

並列処理実演 I

実際の応用

大阪産業大学 工学部 情報システム工学科

小板 隆浩[email protected]

■ はじめに

PVM を使って並列処理を “遊ぶ”ことは簡単です.しかし,実際に並列処理を “ 使おう”とする場合,様々な問題に直面します.ここでは,実際に並列処理を使おうとする場合に考えられる問題を

とりあげ,それらの問題に対する解決策として,ディスクレスクラスタ,XPVM,遠隔地利用などについて実演を通して紹介していきます.

■ マンデルブロー

まず本題に入る前に,本実演で用いるプログラム (図 4.1) について簡単に説明します.ここで用いるプログラムは,フラクタル図形の中で最も良く知られているマンデルブロー集合を,並列処理で複

数の計算機によって計算させるものです. マンデルブロー集合 とは、複素二次式 z = z2 + 1 を反復して計算させた時,いくら反復させても発散しない点の集合の中に自己相似性 (フラクタル)がある集合を持つもので,今まで反復計算による単なる誤差程度にしか思われていなかったことの中に美しい

規則性がある事を示した集合です.並列処理の進み具合が文字ではなくウィンドウ上にリアルタイム

に表示されるので,直観的に並列処理の様子を知ることができます.

コンパイル,実行方法は,PVMがインストールされている状態で,

cd $PVM_ROOT/xep/

aimk xep mtile

xep

にて簡単に実行することができます.aimkにより,xepと mtileという2つの実行ファイルが作成されます.xep を実行すると,xep はワーカー (mtile) にデータを与え,ワーカーがそれぞれ自分の担当データを計算し,結果を xep に戻し,xep はウィンドウ上に表示します.xep を実行すると1つのxep と複数の mtileが起動され,ウィンドウにマンデルブロー集合を表示していきます.マウスの左ボタンで範囲を指定し,中ボタンを押すと指定範囲を計算してウィンドウに表示していきます.

63

Page 65: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

図 4.1: サンプルプログラム (マンデルブロー)

■ ディスクレスクラスタ

PVM を1台,2台の PC で使う場合,自分が好きな OS をインストールし,好きな環境を構築して,簡単に並列処理を行うことができます.しかし,10台,20台,あるいはそれ以上の PCを使おうとする場合,自分が自由に使える環境の構築というのは難しくなってきます.例えば,Windowsがインストールされた演習室にある PC,管理者が厳しいとなりの研究室にある PC,事務用に使っているハードディスク容量の小さい PC など,こうした PC 達は普段はほとんど CPUが使われていない1にもかかわらず,勝手に OS を入れ換えて,PVM を入れたら多分クレームがつくことでしょう.しかし,こうした PC 達をうまく全部使うことはできないのでしょうか?こうした環境構築の問題に対する1つの解決策に,ディスクレスクラスタの構築というものが考え

られます.ディスクレスクラスタ とは,何もディスクのない PC クラスタという意味ですが,ここでは起動時にフロッピーディスクを用い,サーバ用の PC にはハードディスクを用います.つまりサーバ以外の PC はハードディスクを用いずに,ただフロッピーディスク1枚で PC クラスタが構築されます.ディスクレスクラスタの構築の長所としては (1)他人の環境を汚すことなく PC クラスタを構築できる,(2)耐故障性を高めることができる,ということがあげられます.逆に短所としては,(1)ファイルアクセスやスワップが多いプログラムの実行は遅くなる,(2) いちいちフロッピーディスクを差して再起動しなければならない,ということがあげられます.しかし,短所はあくまで自分に対す

る問題で,基本的には誰にも迷惑をかけずに容易に PC クラスタを構築することができます.具体的にどのようなことができるかというと,例えば自分の持ってるノート PCをサーバにして,夜

中に演習室に忍び込み,すべての PC にフロッピーを差し込んで起動し,思いっきり計算をさせ,朝になったらすべてのマシンの電源を落して,何事もなかったように去っていく,というようなことが

可能になります.また,サーバのファイルだけをきちんと管理しておけば,他の PC に関してはディスクの破損や既存環境の変更ということは一切考えなくても済みます.

ただし,ディスクレスクラスタの構築は第1段階の “お試し並列処理”であり,たくさんの PC を使って並列処理を使用とした時,本当に高速処理ができるのか?ということを “確認”するために有効であり,実際に使えるようにするためにはまだまだ考えなくてならないことがあります.例えば,前

1とあるレポートによると,一般的な PC のアイドル率は 69 % で CPU のアイドル率は 93 % とほとんど使われていない.[1]

64

Page 66: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

述の短所についても考えなくてはならないし,夜や休日以外に使う場合他ユーザとの PC 競合なども工夫が必要です.

実際のディスクレスクラスタの構築方法については文献 [3, 4, 2]を御覧頂くとして,ここでは,実際にディスクレスクラスタがどのようなものか,そしてどのように使えるのか,ということについて

の実演を行います.

■ XPVM

図 4.2: XPVM

並列プログラムを書いて実行した時,そのプログラムは良いのか?悪いのか?悪いとしたらどんな

ところが悪いのか?一体どんな風に実行されているのか?誰もが素朴にもつ疑問です.もちろん,1つ

1つ丁寧に実行時間を計測して,通信状況のログをファイルに出力して,いろいろなコードを埋め込

んでプログラムを評価するのも一つの方法です.しかし,実際に PVM を使う場合には,コード自体は正しく書かれていても,実行時には通信や同期など様々な予測不可能な要素があります.また,並

列処理では同時に複数のプログラムが実行されるので,逐次処理の評価に比べて複雑になります2.

しかし,プログラムがどんな風に実行されたか視覚的に知りたい,正確でなくても通信状況やプロ

セッサの利用率など大まかな実行状況を知りたい,そんな要求に応えるのが XPVM (図 4.2) です.XPVM は PVM のためのグラフィカルなコンソールとモニタであり,PVMで書かれたプログラムの実行状況を簡単に確認することができます.

XPVMは http://phase.etl.go.jp/netlib/pvm3/xpvm/から入手可能で,現在のバージョンは version1.2.5 です.PVM 程インストールのドキュメントが多くないのでここで簡単に説明します3.

2なにかコードを埋め込む通信がずれて実行結果が変わることもある.3TurboLinux 3.0 では$PVM ROOT/xpvm/tracer/trcutil.c でエラーが出たので,trcutil.c の 498 行目の free 文をコ

メントアウトしました.これで,実行は可能になりますが,システム的にはメモリをどんどん食い潰してしまいます

65

Page 67: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

まず,上記サイトより XPVM を入手後,$PVM ROOT で展開すると xpvm というディレクトリが作られます.$PVM ROOT/xpvm/src/Makefile.aimkを自分の環境に応じて適当に編集した後4 に

移動して,makeを実行することにより,$PVM ROOT/bin/$PVM ARCHの下に xpvmという実行ファイルが作成されます.

cd $PVM_ROOT

tar xzvf XPVM.src.1.2.5.tgz

cd xpvm

make

.bashrc などで以下の環境変数を設定して下さい.

export XPVM_ROOT=$HOME/pvm3/xpvm

コマンドラインで xpvm と入力すると

[koita@virgo koita]$ xpvm

Connecting to PVMD already running... XPVM 1.2.5 connected as TID=0x403f0.

[globs.tcl][procs.tcl][util.tcl]

Initializing XPVM.............................................. done.

と表示され XPVMが起動します.ここでは,どのように XPVM が使えるのか,またどのようにして並列プログラムを評価するのか,についての実演を行います.詳細な使い方については,XPVMのドキュメント (http://phase.etl.go.jp/netlib/pvm3/xpvm/XPVM.ug.ps.gz)を御覧下さい.

■ 遠隔利用

PVMは TCP/IPで接続された PCがあれば,基本的にはどこでもプログラムを実行することが可能です.うまく遠隔利用ができるならば,seti@home [5] や RC5 Cracking [6] のような,地球規模の大規模な並列処理を実現するという可能性もあります.

ここでは,実際に講習会場である同志社大学のディスクレスクラスタと大阪産業大学にある PCを利用して PVM を使った場合に,どのようなことができるのか,またその時に考えなくてはいけない問題点について XPVM を用いながら実演を行います.さらに,もっと PVM を活用するための方法についても簡単に説明を行います.

[もっと PVM (応用編)]

pvm for windows :http://phase.etl.go.jp/netlib/pvm3/win32/http://www.markus-fischer.de/getservice.htm(Win* でも PVM)

Migratable PVM :http://www.cse.ogi.edu/DISC/projects/mist/(実行途中でプロセス移動)

4XPVM には Tcl 7.5 以上,Tk 4.1 以上が必要です.

66

Page 68: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

Dream(Distributed Region And Shared Memory) :http://www.lifl.fr/ dumoulin/dream/dream.html(分散共有メモリ)

ParaDyn(Paradyn Parallel Performance Tools) :http://www.cs.wisc.edu/paradyn/(XPVM より詳細にデバッグなど)

■ まとめ

ここで紹介した,ディスクレスクラスタ,XPVM,遠隔地利用などを活用すれば,これまで以上の“遊び”でない並列処理ができるようになるはずです.また,最後に紹介した応用編の技術を取り入れれば,誰にも迷惑かけずに,たくさんの PCを使って,大規模な並列処理の実現も夢ではありません.真面目に並列処理をしようとすると考えなくてはいけないことが山程ありますが,この講習で少しで

も並列処理に興味をもって,実際に “使って”頂けたら嬉しく思います.

■ 参考文献

[1] Bertil Follit and Pierre Sens. : “Load Sharing and Fault Manager” , High PerformanceCluster Computing Vol.1, Chapter 22, Prentice Hall PTR(ISBN 0-13-013784-7), (1999).

[2] Linux Seminar Diskless Cluster Linux , Linux Magazine 3 月号, pp.177–184 (1999).

[3] Diskless Linux Mini Howto, http://www.linux.or.jp/JF/JFdocs/Diskless.html

[4] NFS-Root Mini-Howto, http://www.linux.or.jp/JF/JFdocs/NFS-Root.html

[5] Search for Extraterrestrial Intelligence (SETI), http://setiathome.ssl.berkeley.edu/

[6] Project RC5, http://www.distributed.net/rc5/

67

Page 69: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

並列処理実演 II

工学的な利用

大分大学 工学部 生産システム工学科

三村泰成[email protected]

■ はじめに

「並列処理」と一口に言っても,実際の応用となるとピンとこない方もいるかもしれません.特に実

際の工学的な問題に適用しようとすると,どのようにアプローチしていいかが分からないことがよく

あります.ここでは,効率などはとりあえず後回しにして,とにかく解析領域を分割して,「えいや!」

と並列化することを考えます.

実際には熱伝導問題を差分法を使って解析しますので,ます,熱伝導方程式,差分法の基礎につい

て簡単に述べ,それをいかにして並列化するかを考えていきます.

■ 熱伝導方程式 [1]

熱伝導 は基礎的な物理現象の一つであり, 熱伝導方程式 は,数値解析技術の上からも比較的取扱

が容易なので,数値解析の入門として一般的に用いられています.

簡単のため,まず,1次元問題を考えてみます.個体内に温度分布が存在すると熱の流れが生じま

す.単位時間 (s),単位面積 (m2)に流れる熱量を熱流束 q (J/m2s あるいは W/m2)と呼びます.熱流束は,個体内の温度勾配 (dT/dx)に比例し

q = −λ∂T∂x

(5.1)

の関係があります.ここで λは熱伝導率 (W/mK)と呼ばれる物性値です.通常,温度が減少する熱流の方向を正とすることから,式 (5.1)のように負号を付けます.また,微小体積についての熱の流入および流出を考慮した熱バランスは,

[蓄熱による温度上昇] = [流入熱量] - [流出熱量]

となり,

ρc∂T

∂t= − ∂q

∂x(5.2)

68

Page 70: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

が得られます.ここで,ρは個体の密度 (kg/m3),cは比熱 (J/kgK)です.式 (5.3)に式 (5.1)を代入すると,

ρc∂T

∂t=

∂x

(λ∂T

∂x

)(5.3)

となり,さらに λを一定とすれば

∂T

∂t= a

∂2T

∂x2 (5.4)

が得られます.これが1次元での熱伝導方程式です.ここで a = λ/(ρc)は,個体の温度伝導率 (m2/s)と呼ばれます.同様に,2次元の場合は,

∂T

∂t= a

(∂2T

∂x2 +∂2T

∂y2

)(5.5)

と表されます.式 (5.4),式 (5.5)の偏微分方程式を解くことで,物体の温度分布を求めることができます.

■ 差分法 [1]

□ 差分化方程式の導出

解を求めようとする領域を格子で分割し,かつ偏導関数を差分式で近似することにより偏微分方程

式の数値解を求める方法を,一般的に「 差分法 (Finite Difference Method)」と呼んでいます.時間方向にも差分化を行うことによって,非定常解を求めることもできます.典型的な格子の例を図 5.1に示します.

∆y

∆x

∆x∆t

i i +1i -1

i , j

i , j-1

i , j+1

i +1, ji -1, j

図 5.1: 差分格子の例

差分近似には3種類あり,図 5.2中の点 P における微分値を考えると,以下のようになります.

• 前進差分 点 P と xの増加 (前進)方向の点 Eとを結んだ直線の傾きを求める方法

TE − TP

∆x(5.6)

69

Page 71: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

• 後退差分 点 P と xの減少 (後退)方向の点W とを結んだ直線の傾きを求める方法

TP − TW

∆x(5.7)

• 中心差分 点 P を中心として,点W と点 Eとを結んだ直線の傾きを求める方法

TE − TW

2∆x(5.8)

∆x ∆x

P

T

T E

T P

T W

x

T = f(x)

E

W

図 5.2: 差分近似の種類

簡単のため,1次元の熱伝導方程式の差分表示を考えてみます.点 iにおける空間座標に関する2

階微分(

∂2Ti

∂x2

)を求めるのに,図 5.3を考えてみます.図中で点Aから点Bの区間をコントロールボ

リュームと呼び,これを用いて差分表示式を求める方法を「コントロールボリューム法」と呼びます.

i-1 i i+1

A B

∆x

∆x ∆x

図 5.3: コントロールボリューム (1次元)

まず,図 5.3中の点 A,点 Bにおける一階微分は,中心差分を用いると(∂T

∂x

)A

=Ti − Ti−1

∆x,

(∂T

∂x

)B

=Ti+1 − Ti

∆x(5.9)

のようになります.2階微分は,(

∂T∂x

)Aと(

∂T∂x

)Bの中心差分より,

∂2T

∂x2 =

(∂T∂x

)B− (∂T

∂x

)A

∆x=

Ti+1 + Ti−1 − 2Ti

∆x2 (5.10)

となります.したがって,式 (5.4)の1次元の熱伝導方程式は,

∂T

∂t= a

Ti+1 + Ti−1 − 2Ti

∆x2 (5.11)

70

Page 72: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

となります.さらに,時間に関する前進差分を考慮し,時刻 nにおける点 iの温度を T(n)i ,∆t秒後

(時刻 n+ 1)の温度を T(n+1)i とすれば,

T(n+1)i − T

(n)i

∆t= a

T(n)i+1 + T

(n)i−1 − 2T (n)

i

∆x2 (5.12)

となり,最終的に,

T(n+1)i = γ

(T

(n)i+1 + T

(n)i−1 − 2T (n)

i

)+ T

(n)i (5.13)

が得られ,これが1次元熱伝導方程式の差分化方程式となります.ここで γは,γ = a∆t/∆x2と定義

します.同様に,2次元の場合を考えると,式 (5.5)は,

T(n+1)i,j − T

(n)i,j

∆t= a

(T

(n)i+1,j + T

(n)i−1,j − 2T (n)

i,j

∆x2 +T

(n)i,j+1 + T

(n)i,j−1 − 2T (n)

i,j

∆y2

)(5.14)

となり,∆x = ∆y = hと置くと,

T(n+1)i = γ

(T

(n)i+1,j + T

(n)i−1,j + T

(n)i,j+1 + T

(n)i,j−1 − 4T (n)

i,j

)+ T

(n)i,j (5.15)

という,2次元熱伝導方程式の差分化方程式が得られます.ここで γ は γ = ∆t/h2 と定義します.

この方法は,時刻 nの温度分布から直ちに時刻 n + 1の温度分布が得られることから「陽解法」と呼ばれ,簡便なことから,多くの工学分野で用いられています.しかしながら,安定な解を得るには

0 ≤ γ ≤ 1/2という制限があり,h2に比例して ∆tを小さく取る必要があります.偏微分方程式を解くための定式化を行ってきましたが,図 5.4に示す計算過程を見れば,自身の状

態量 (温度)と近傍点の状態量から,次の時刻の状態量が簡単に計算できることが分かります.これらの計算手順は,セルオートマトンなどとほとんど同様であり,技術計算に詳しくない人でも比較的容

易に理解できます.それゆえ,並列計算入門の例として適当なものの一つと言ってもよいでしょう.

i i+1i-11 2 ..... .....

T i∆x∆t T i-1 T i+1

i i+1i-11 2 ..... .....

T iT i-1 T i+1

t = ∆t

i i+1i-11 2 ..... .....

γ ( T i-1 + T i+1 - 2 T i ) + T i

t = n ∆t

t = n ∆t

t = (n+1) ∆ti i+1i-11 2 ..... .....

T iT i-1 T i+1

∆t

T i

図 5.4: 差分法の計算手順 (1次元)

71

Page 73: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

□ 境界条件

ここでは,境界条件として以下の2種を扱います.

• 断熱境界 熱の出入りが存在しない境界.(∂T

∂n

)= 0 (5.16)

• 表面温度指定 温度が常に一定に保たれる境界.

TB = T0 (const.) (5.17)

ここで,境界面に垂直な座標を n,境界面を Bとします.差分法における境界条件の指定方法を図 5.5に示します.

W E

S

N

PW E

S

N

P

P

N

S

E

P

S

E

T P = T N = T S = const.

T P = T E = T S = const.

T W = T E

T N = T ST W = T E

図 5.5: 境界条件

□ 簡単な計算例

境界条件を温度指定のみを扱った解析対象と計算結果を図 5.6に示し,ソースリスト1に解析プログラムを載せます.このような例では,120行程度の簡単なものになっているのが分かります.

■ 領域分割による並列化

□ 領域分割 の種類

解析対象の分割方法は,簡単に考えると,1次元,2次元,3次元的な分割の3種類に分類できま

す.これらは,コンピュータのアーキテクチャや解析対象の複雑さなどを考慮して選択されるべきで

すが,今回は簡単のため解析対象の次元数にかかわらず,図 5.7のように,1次元的に分割する例を考えます.また,並列化ライブラリとして PVMを用いています.

72

Page 74: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

300K300K

300K

300K

500K

t = 0

?????300K

300K

300K

500K

t = n ∆t

図 5.6: 温度指定のみを用いた解析例

図 5.7: 1次元的な領域分割

□ 1次元熱伝導問題

並列化の説明のため,まず,図 5.8のような1次元熱伝導問題を考えます.計算の流れを図 5.9に示し,ソースリスト2にプログラムを示します.プログラムの簡単な説明を以下に示します.

• 65行目:自分のタスク IDの取得.

• 70行目:タスクのグループ化.

• 72~75行目:もし,最初のタスクなら,他のタスクを立ち上げる.

• 76行目:同期待ち.

• 78~93行目:タスク IDの情報を全てのタスクに通知する.

• 95~98行目:自分の受け持ちの計算幅の決定.

• 100~113行目:初期温度の設定.

73

Page 75: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

• 115~194行目:差分計算のループ.

– 118~131行目:左右の境界温度の差分計算.

– 132~137行目:内部の差分計算.

– 139~161行目:隣の CPUとの通信.

– 163~178行目:流入熱量と流出熱量の計算.

– 187行目:1ステップごとに同期をとるところ.

– 189~192行目:温度の更新.

• 196~200行目:PVMの後処理.

500K 300K300K

t = 0

t = n ∆t 500K 300K

図 5.8: 解析対象 (1次元)

□ 2次元熱伝導問題

図 5.10のような2次元熱伝導問題を考えます.ここでは境界条件として,断熱も扱っています.1次元問題と同様に,解析対象を1次元的に分割することで,並列計算を実現します.それゆえ,計算手

順は,図 5.9と同様になります.逐次型のプログラムをソースリスト3,並列化のプログラムをソースリスト4に示します.ソースリスト2と4を比較すれば,2次元問題も1次元問題と同じ手順で並

列計算が行われているのが分かります.また,ソースリスト5は,1次元配列,2次元配列のメモリ

確保のためのユーティリティ関数です.

■ 並列計算の結果

並列計算の計測には,「Pentium-III 500MHz(dual)メモリ 256MB」というスペックのコンピュータを8台接続した PCクラスタを用いました.また,各ノードは,HUB(スイッチングなし)を通じて,10BASEの Ethernetで接続されています.上述の2次元熱伝導問題を,格子サイズ「5001× 2501」として計算した場合の加速率のグラフを図 5.11に示します.4タスクの所までは,理想的な加速を得ています.しかしながら,それよりも多いタスクを使っての計算は,あまりいい加速は得られている

とはいえません.16タスクで良好な加速率を得るためには,解析対象がもっと大きい必要がありそうです.

74

Page 76: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ 領域分割を用いたその他の応用

解析領域を分割して並列化する手法は,差分法以外にも用いられています.以下にその例を示します.

□ 分子動力学

分子動力学 とは,分子間になんらかのポテンシャルが存在すると定義し (通常は分子間距離や角度の関数として定義されます),そのポテンシャルから,分子に作用する力を計算し,その力から,運動方程式 (F = ma)を解くことで,時々刻々の分子の位置や速度を求める手法です [2].ポテンシャルは大きく分けて,長距離力MD,と短距離力MDの2種に分けることがでます.長距離力MDの場合,1個の分子に作用力を求めるのに,解析領域全体を考慮する必要がありますが,短距離力MDの場合,近傍の分子のみを考慮すれば,作用力を求めることができます.それゆえ,差分法と同様な領域分割法を用いることができます [3][4].分子動力学に限らず,以下の

• 近傍のデータの交換

• 陽解法

という性質を満たすだけでよい手法であれば,領域分割法をすみやかに適用することができると言え

ます.

□ 有限要素法

有限要素法 を並列化する手法としても,領域分割法が使われています [5][6].しかしながら,構造解析などの定常問題を解く場合は,陽解法と同じ手法を使うわけには行いきません.領域境界の物理

量 (例えば力と変位)は,初期の計算では,各領域ごとに異なったものとなります.それゆえ,解が収束するまで反復計算する必要があります.

■ その他 (並列関係のツール)

並列/分散処理を実現するのに,PVM,MPI以外にも,いろいろなツールがあります.ここでは,それらのうちのいくつかを簡単に紹介します.

□ 分散オブジェクト

分散オブジェクト とは,ネットワーク,分散アプリケーションを簡単に構築するためのフレームワー

クのような環境の総称です. OMG [14]による標準規格 CORBA [15]も存在し,今後,いろんな分野で使われる技術だと考えられます.

CORBA準拠ではありませんが,私 (三村)は, Horb [16]というソフトを好んで使います.Javaから簡単に使える分散オブジェクトシステムなので,結構,便利です.お勧めの逸品です.

□ thread

プロセスの子プロセス (ライトウェイトプロセス)のことで,同じメモリ空間を,複数の threadで

共有できます.共有メモリ型並列計算機のプログラミングには,便利な仕組みです.プログラミング

75

Page 77: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

環境としては,C言語から使う pthread [17],Javaの thread [18]などがあります.Dual Pentiumなどが一般的になりつつある現状を考えると,知っていて損のないツールかもしれません.

□ 分散共有メモリ

物理的には分散メモリ型な並列計算機を,あたかも共有メモリ型並列計算機に見せかける仕組みの

総称を 分散共有メモリ (DSM: Distributed Shared Memory) [19]といいます.共有メモリ型の方がプログラミングモデルが簡便なことが多いので,使えれば便利なツールでしょう.

□ 並列コンパイラ

ユーザーが逐次的に構築したプログラムを自動的に並列部分を検出し,最適化してくれるコンパイ

ラのことです.実際には,自動認識は困難を究めることから,ユーザが,プログラム中で細かに指定

する必要がある場合が多いです.

■ その他 (並列以外のツール)

PCクラスタは,日頃から使っている「普通」のコンピュータを並列に接続しています.それゆえ,超並列計算機などの特殊なハードウェアと異なり,日頃から使っている便利なツール群をそのまま利

用することができます.それゆえ,結果の表示なども安価で簡単に実現できます.以下に紹介するツー

ルは,Debian Linuxなどのパッケージから容易にインストール可能なものばかりですので,もし,興味がある方は使ってみて下さい.ちなみに,今回は,GTK+とMPEGENCODEを結果の表示に用いました.

• GTK+ [7]X-Window上の GUI構築ライブラリです.現時点で以下の言語から利用できます.Ada95, C++, Dylan, Eiffel, Guile, Haskell, JavaScript, Objective-C, Objective-Caml, Pascal,Perl, Pike, Python, Tom.

• GULT [8],MESA [9]OpenGL [10]仕様の3次元表示用ライブラリです.C,C++などのプログラミング言語から使うことができます.

• VRweb, VRwave [11]VRML (the Virtual Reality Modeling Language)のブラウザです.VRMLで解析モデルを記述しておけば,簡単な表示に使えます.

• POV-Ray [12]3次元レイトレーシングソフトです.並列計算の実装も施されており,綺麗な3次元画像を比較

的簡単に作ることができます.

• MPEGENCODE [13]GIF,PPM,JPEGなどの画像から,簡単にパラパラアニメーションを作ることができるソフトです.

76

Page 78: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

■ おわりに

領域分割を用いた並列計算は,必ずしも効率がよいものとは言えないかもしれません.しかしなが

ら,並列計算を「とりあえず」始めるには,よい方法であると考えられます.

今回の講習が,皆さんのお役に立てば幸いです.

■ 参考文献

[1] 河村洋, 差分法と熱伝導, 日本機械学会講習会 伝熱工学数値計算入門 教材, No.900-68, pp.1-10(1990).

[2] 方平洋右,分子動力学法とモンテカルロ法,講談社サイエンティフィク (1994).

[3] 三村泰成,赤星保浩,原田昭治,並列計算機 AP1000を用いた分子動力学シミュレーション,日本機械学会 平成8年度材料力学部門講演会講演論文集,pp.199-200 (1996).

[4] 松原正純,板倉憲一,朴泰佑,超並列計算機 CP-PACSにおける大規模分子動力学法シミュレーション,並列処理シンポジウム’98 論文集,pp.215-222(1998).

[5] Yagawaq, G., Soneda, N., and Yoshimura, S. A large scale finite element analysisusing domain decomposition method using parallel computer, Computational Plasity Models,Software and Applications, pp.177-197 (1989).

[6] 吉岡顕,大規模有限要素法のためのネットワークコンピューティング,東京大学大学院博士論文(1990).

[7] 田中ひろゆき,GTK+入門 基礎からはじめる Xプログラミング,ソフトバンク (1999).

[8] http://reality.sgi.com/mjk asd/glut3/glut3.html

[9] http://www.mesa3d.org/

[10] http://www.sgi.com/software/opengl/

[11] http://www.iicm.edu/vrwave

[12] 小室日出樹, POV-Rayではじめるレイトレーシング,アスキー (1998).

[13] http://bmrc.berkeley.edu/frame/research/mpeg/index.html

[14] http://www.omg.org/

[15] http://www.corba.org/

[16] http://openlab.etl.go.jp/horb/index.html

[17] Bradford Nicbols他,Pthreadsプログラミング, オラリージャパン (1998).

[18] Scott Oaks and Henry Wong,JAVA スレッドプログラミング, オラリージャパン (1997).

[19] Protic, J., Tomasevic, M. and Milutinovic, V., Distributed shared memory: conceptsand systems, IEEE Parallel Distrib. Technol., Syst. Appl. (USA), vol.4, no.2, 63-71 (1996).

77

Page 79: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

図 5.9: 並列計算の流れ

78

Page 80: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

300K

500K300Kt = 0

t = n ∆t300K

500K

図 5.10: 解析対象 (2次元)

0

2

4

6

8

10

12

14

16

0 2 4 6 8 10 12 14 16

Spe

ed u

p

No. of Tasks

Ideal linear type5001x2501

図 5.11: 加速率

79

Page 81: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ソースリスト1 (efdm.c)

1: /*

2: Filename: efdm.c

3: Description: Simple example of 2D FDM.

4: Writer: Yasunari Mimura

5: Date: 1999.9.10

6: */

7:

8: #include <stdlib.h>

9: #include <stdio.h>

10: #include <math.h>

11:

12: #define NW 11

13: #define NH 11

14:

15: int nlimit = 180;

16:

17: double width = 10.0; /* m */

18: double height = 10.0; /* m */

19: double h = 1.0; /* dx = dy = h */

20: double dt = 10000.0; /* sec */

21:

22: double T[NW][NH]; /* K */

23: double T new[NW][NH]; /* K */

24:

25: double temp high = 500.0;

26: double temp low = 300.0;

27:

28: /* property (carbon steel) */

29: double rou = 7.8e3; /* kg / (m^3) */

30: double c = 420.0; /* J/(kg K) */

31: double k = 50.0; /* W/(m K) */

32:

33: void print temp(FILE *fp, double t)

34: {

35: int i, j;

36:

37: fprintf(fp, "time\t%15.7e\n", t);

38: for(i=0 ; i<NW ; i++){

39: for(j=0 ; j<NH ; j++){

40: fprintf(fp, "%15.7e\t", T new[i][j]);

41: }

42: fprintf(fp, "\n");

43: }

44: }

45:

46: int main(){

47: int nprint;

48: int i, j;

49: int count;

50: double a, t;

51: double Te, Tw, Ts, Tn;

52: double gamma;

53: FILE *fp;

54:

55: a = k / rou / c;

56: gamma = a * dt / (h*h);

57:

58: if( gamma > 0.5 ){

59: printf("gamma = %e\n", gamma);

60: exit(0);

61: }

62:

63: /* Init. Temp. */

64: for(i=0 ; i<NW ; i++){

65: for(j=0 ; j<NH ; j++){

66: T[i][j] = temp low;

67: T new[i][j] = temp low;

68: }

69: }

70: for(i=0 ; i<NW ; i++){

71: T[i][0] = temp high;

72: T new[i][0] = temp high;

73: }

74:

75: fp = fopen("temp.dat", "w");

76: fprintf(fp, "nw\t%d\nnh\t%d\nW\t%e\nH\t%e\n",

77: NW, NH, width, height);

78: fprintf(fp, "T max\t%e\nT min\t%e\n\n",

79: temp high, temp low);

80:

81: nprint = 0;

82: t = 0.0;

83: print temp(fp, t);

84: nprint++;

85:

86: for(count=1 ; count <= nlimit ; count++){

87: t += dt;

88:

89: /* Calc. inner temp. */

90: for(i=1 ; i<NW-1 ; i++){

91: for(j=1 ; j<NH-1 ; j++){

92: Tw = T[i-1][j];

93: Te = T[i+1][j];

94: Ts = T[i][j-1];

95: Tn = T[i][j+1];

96: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

97: }

98: }

99:

100: /* write data */

101: if( (count%1) == 0){

102: printf("t = %f\n", t);

103: print temp(fp, t);

104: nprint++;

105: }

106:

107: /* Update temp. */

108: for(i=1 ; i<NW-1 ; i++){

109: for(j=1 ; j<NH-1 ; j++){

110: T[i][j] = T new[i][j];

111: }

112: }

113: }

114:

115: fclose(fp);

116: fp = fopen("nprint.dat", "w");

117: fprintf(fp, "%d\n", nprint);

118: fclose(fp);

119: return 0;

120: }

80

Page 82: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ソースリスト2 (pfdm1d.c)

1: /*

2: Filename: pfdm1d.c

3: Description: 1D Finite difference method for Multi-CPU.

4: Writer: Yasunari Mimura

5: Date: 1999.9.10

6: */

7:

8: #include <stdlib.h>

9: #include <stdio.h>

10: #include <math.h>

11: #include <pvm3.h>

12:

13: #define TID MSG 0

14: #define T LR MSG 1

15: #define T RL MSG 2

16: #define Q MSG 3

17:

18: #define NW 101

19: int nlimit = 40000;

20:

21: int my nw;

22: double dx = 0.1; /* width / (NW-1) */

23: double dt = 100.0; /* sec */

24:

25: double width = 10.0; /* m */

26:

27: double T[NW]; /* K */

28: double T new[NW]; /* K */

29: double T left;

30: double T right;

31: double temp high = 500.0;

32: double temp low = 300.0;

33:

34: /* property (carbon steel) */

35: double rou = 7.8e3; /* kg / (m^3) */

36: double c = 420.0; /* J/(kg K) */

37: double k = 50.0; /* W/(m K) */

38:

39: /* for parallel variables*/

40: int mytid;

41: int my i;

42: int iproc;

43: int nproc = 4;

44: int tids[4]; /* array of task IDs */

45:

46: int main(int argc, char **argv){

47:

48: int i, j;

49: int count;

50: double a, t;

51: double Te, Tw, Ts, Tn;

52: double gamma;

53: double q in, q out;

54: double dq = DBL MAX;

55:

56: a = k / rou / c;

57: gamma = a * dt / (dx*dx);

58:

59: if( gamma > 0.5 ){

60: printf("gamma = %e\n", gamma);

61: exit(1);

62: }

63:

64: /* enroll in pvm */

65: mytid = pvm mytid();

66:

67: /* Join a group and, if I am the first instance,

68: iproc=0, spawn more copies of myself

69: */

70: iproc = pvm joingroup("FDM");

71:

72: if (iproc == 0) {

73: tids[0] = pvm mytid();

74: pvm spawn("pfdm1d", &argv[1], 0, NULL, nproc-1, &tids[1]);

75: }

76: pvm barrier("FDM", nproc);

77:

78: /* get task IDs */

79: if( iproc == 0 ){

80: pvm initsend(PvmDataRaw);

81: pvm pkint(&tids[0], nproc, 1);

82: pvm bcast("FDM", TID MSG);

83: my i = 0;

84: }else{

85: pvm recv( -1, TID MSG);

86: pvm upkint(&tids[0], nproc, 1);

87: for(i=1 ; i<nproc ; i++){

88: if(tids[i] == mytid){

89: my i = i;

90: break;

91: }

92: }

93: }

94:

95: my nw = NW / nproc;

96: i = NW % nproc;

97: if(my i < i)

98: my nw++;

99:

100: /* Init. Temp. */

101: for(i=0 ; i<my nw ; i++){

102: T[i] = temp low;

103: T new[i] = temp low;

104: }

105:

106: T left = temp low;

107: T right = temp low;

108: t = 0.0;

109:

110: if( my i == 0 ){

111: T[0] = temp high;

112: T new[0] = temp high;

113: }

114:

115: for(count=1 ; count<=nlimit ; count++){

116: t += dt;

117:

118: /* Left boundary */

119: if( my i != 0 ){

120: i = 0;

121: Tw = T left; /* left side data */

122: Te = T[i+1];

123: T new[i] = gamma*(Tw + Te - 2.0*T[i]) + T[i];

124: }

125: /* Right boundary */

126: if( my i != (nproc-1) ){

127: i = my nw-1;

128: Tw = T[i-1];

129: Te = T right; /* right side data */

130: T new[i] = gamma*(Tw + Te - 2.0*T[i]) + T[i];

131: }

132: /* Calc. inner temp. */

133: for(i=1 ; i<my nw-1 ; i++){

134: Tw = T[i-1];

135: Te = T[i+1];

136: T new[i] = gamma*(Tw + Te - 2.0*T[i]) + T[i];

137: }

138:

139: /*--- Exchange data ---*/

140: if( my i != nproc - 1){

141: /* send to right side */

142: pvm initsend(PvmDataRaw);

143: pvm pkdouble( &T[my nw-1], 1, 1);

144: pvm send( tids[my i+1], T LR MSG);

145: }

146: if( my i != 0 ){

147: /* receive form left side */

148: pvm recv( tids[my i-1], T LR MSG);

149: pvm upkdouble( &T left, 1, 1);

150: }

151: if( my i != 0 ){

152: /* send to left side */

153: pvm initsend(PvmDataRaw);

154: pvm pkdouble( &T[0], 1, 1);

155: pvm send( tids[my i-1], T RL MSG);

156: }

157: if( my i != nproc - 1 ){

158: /* receive from right side */

159: pvm recv( tids[my i+1], T RL MSG);

160: pvm upkdouble( &T right, 1, 1);

161: }

162:

163: if( (count%100) == 0 ){

164: if( my i == 0 ){

165: q in = T[0] - T[1];

166: pvm recv( tids[nproc-1], Q MSG);

167: pvm upkdouble( &q out, 1, 1);

168: dq = q in - q out;

169: printf("t = %e\n", t);

170: printf("Q in = %e, Q out = %e, dQ = %e\n",

171: q in, q out, dq );

172: }else if( my i == nproc - 1){

173: q out = T[my nw - 2] - T[my nw - 1];

174: pvm initsend(PvmDataRaw);

175: pvm pkdouble( &q out, 1, 1);

176: pvm send( tids[0], Q MSG);

177: }

178: }

179:

180: /* write data */

181: /*

182: if( (count%100) == 0){

183: --- print Temp.!! ---

184: }

185: */

186:

187: pvm barrier("FDM", nproc);

188:

189: /* Update temp. */

190: for(i=0 ; i<my nw ; i++){

191: T[i] = T new[i];

192: }

193:

194: }

195:

196: /* Check program finished, leave group, exit pvm */

197: pvm barrier("FDM", nproc);

198: pvm lvgroup("FDM");

199: pvm exit();

200: return(0);

201: }

81

Page 83: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ソースリスト3 (sfdm2d.c)

1: /*

2: Filename: sfdm2d.c

3: Description: 2D FDM for single CPU.

4: Writer: Yasunari Mimura

5: Date: 1999.9.10

6: */

7:

8: #include <stdlib.h>

9: #include <stdio.h>

10: #include <math.h>

11:

12: int nlimit = 10000;

13: #define NW 21

14: #define NH 11

15: double h = 1.0; /* dx = dy = h */

16: double dt = 10000.0; /* sec */

17: double width = 20.0; /* m */

18: double height = 10.0; /* m */

19: double dd = 1.0; /* m */

20: double T[NW][NH]; /* K */

21: double T new[NW][NH]; /* K */

22: double temp high = 500.0;

23: double temp low = 300.0;

24:

25: /* property (carbon steel) */

26: double rou = 7.8e3; /* kg / (m^3) */

27: double c = 420.0; /* J/(kg K) */

28: double k = 50.0; /* W/(m K) */

29:

30: double q in, q out;

31: int h mid;

32:

33: void print temp(FILE *fp, double t)

34: {

35: int i, j;

36: fprintf(fp, "time\t%15.7e\n", t);

37: for(i=0 ; i<NW ; i++){

38: for(j=0 ; j<NH ; j++){

39: fprintf(fp, "%15.7e\t", T new[i][j]);

40: }

41: fprintf(fp, "\n");

42: }

43: }

44:

45: void calc q()

46: {

47: int j;

48: q in = 0.0;

49: for(j=0 ; j<h mid+1 ; j++){

50: q in += k * (T new[0][j] - T new[1][j]) * dd;

51: }

52: q out = 0.0;

53: for(j=h mid ; j<NH ; j++){

54: q out += k * (T new[NW-2][j] - T new[NW-1][j]) * dd;

55: }

56: }

57:

58: int main(){

59: int i, j;

60: int count;

61: int nprint;

62: double a, t;

63: double Te, Tw, Ts, Tn;

64: double gamma;

65: double dq = DBL MAX;

66: FILE *fp;

67:

68: a = k / rou / c;

69: gamma = a * dt / (h*h);

70: h mid = NH / 2;

71:

72: printf("gamma = %e\n", gamma);

73: if( gamma > 0.5 ){

74: exit(0);

75: }

76:

77: /* Init. Temp. */

78: for(i=0 ; i<NW ; i++){

79: for(j=0 ; j<NH ; j++){

80: T[i][j] = temp low;

81: T new[i][j] = temp low;

82: }

83: }

84: for(j=0 ; j<h mid+1 ; j++){

85: T[0][j] = temp high;

86: T new[0][j] = temp high;

87: }

88:

89: fp = fopen("temp.dat", "w");

90: fprintf(fp, "nw\t%d\nnh\t%d\nW\t%e\nH\t%e\n",

91: NW, NH, width, height);

92: fprintf(fp, "T max\t%e\nT min\t%e\n\n",

93: temp high, temp low);

94: t = 0.0;

95: nprint = 0;

96: calc q();

97: dq = q in - q out;

98: printf("t = %f\n", t);

99: printf("Q in = %e, Q out = %e, dQ = %e\n",

100: q in, q out, dq );

101: print temp(fp, t);

102: nprint++;

103:

104: for(count=1 ; count<=nlimit ; count++){

105: t += dt;

106: /* Left boundary */

107: i = 0;

108: for(j=h mid+1 ; j<NH-1 ; j++){

109: Tw = T[i+1][j]; /* insulation */

110: Te = T[i+1][j];

111: Ts = T[i][j-1];

112: Tn = T[i][j+1];

113: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

114: }

115: /* Right boundary */

116: i = NW-1;

117: for(j=1 ; j<h mid ; j++){

118: Tw = T[i-1][j];

119: Te = T[i-1][j]; /* insulation */

120: Ts = T[i][j-1];

121: Tn = T[i][j+1];

122: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

123: }

124: /* Upper boundary */

125: j = NH-1;

126: for(i=1 ; i<NW-1 ; i++){

127: Tw = T[i-1][j];

128: Te = T[i+1][j];

129: Ts = T[i][j-1];

130: Tn = T[i][j-1]; /* insulation */

131: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

132: }

133: /* Lower boundary */

134: j = 0;

135: for(i=1 ; i<NW-1 ; i++){

136: Tw = T[i-1][j];

137: Te = T[i+1][j];

138: Ts = T[i][j+1]; /* insulation */

139: Tn = T[i][j+1];

140: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

141: }

142: /* corner */

143: i = 0;

144: j = NH-1;

145: Tw = T[i+1][j]; /* insulation */

146: Te = T[i+1][j];

147: Ts = T[i][j-1];

148: Tn = T[i][j-1]; /* insulation */

149: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

150:

151: i = NW-1;

152: j = 0;

153: Tw = T[i-1][j];

154: Te = T[i-1][j]; /* insulation */

155: Ts = T[i][j+1]; /* insulation */

156: Tn = T[i][j+1];

157: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

158:

159: /* Calc. inner temp. */

160: for(i=1 ; i<NW-1 ; i++){

161: for(j=1 ; j<NH-1 ; j++){

162: Tw = T[i-1][j];

163: Te = T[i+1][j];

164: Ts = T[i][j-1];

165: Tn = T[i][j+1];

166: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

167: }

168: }

169:

170: calc q();

171: dq = q in - q out;

172:

173: /* write data */

174: if( (count%100) == 0){

175: printf("t = %f\n", t);

176: printf("Q in = %e, Q out = %e, dQ = %e\n",

177: q in, q out, dq );

178: print temp(fp, t);

179: nprint++;

180: }

181:

182: if( dq < 1.0e-3 )

183: break;

184:

185: /* Update temp. */

186: for(i=0 ; i<NW ; i++){

187: for(j=0 ; j<NH ; j++){

188: T[i][j] = T new[i][j];

189: }

190: }

191: }

192:

193: printf("t = %f\n", t);

194: printf("Q in = %e, Q out = %e, dQ = %e\n",

195: q in, q out, dq );

196: print temp(fp, t);

197: nprint++;

198: fclose(fp);

199: fp = fopen("nprint.dat", "w");

200: fprintf(fp, "%d\n", nprint);

201: fclose(fp);

202: return 0;

203: }

82

Page 84: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ソースリスト4 (pfdm2d.c)

1: /*

2: Filename: pfdm2d.c

3: Description: 2D FDM for Multi-CPU.

4: Writer: Yasunari Mimura

5: Date: 1999.9.10

6: */

7:

8: #include <stdlib.h>

9: #include <stdio.h>

10: #include <math.h>

11: #include <pvm3.h>

12:

13: extern int *alloc int(size t n);

14: extern double *alloc double(size t n);

15: extern double **alloc darray2(size t nrow, size t ncol);

16: extern void free darray2(double **m);

17:

18: #define TID MSG 0

19: #define T LR MSG 1

20: #define T RL MSG 2

21: #define Q MSG 3

22:

23: int nlimit = 65000;

24:

25: #define NW 81

26: #define NH 41

27:

28: int my nw;

29: double h = 0.25; /* dx = dy = h */

30: double dt = 1000.0; /* sec */

31:

32: double width = 20.0; /* m */

33: double height = 10.0; /* m */

34:

35: double dd = 1.0; /* m */

36:

37: double **T; /* K */

38: double **T new; /* K */

39:

40: double *T left;

41: double *T right;

42:

43: double temp high = 500.0;

44: double temp low = 300.0;

45:

46: /* property (carbon steel) */

47: double rou = 7.8e3; /* kg / (m^3) */

48: double c = 420.0; /* J/(kg K) */

49: double k = 50.0; /* W/(m K) */

50:

51: double q in, q out;

52: int h mid;

53:

54: void calc Qin()

55: {

56: int j;

57:

58: q in = 0.0;

59: for(j=0 ; j<h mid+1 ; j++){

60: q in += k * (T new[0][j] - T new[1][j]) * dd * h;

61: }

62: }

63:

64: void calc Qout()

65: {

66: int j;

67:

68: q out = 0.0;

69: for(j=h mid ; j<NH ; j++){

70: q out += k * (T new[my nw-2][j] - T new[my nw-1][j]) * dd * h;

71: }

72:

73: }

74:

75:

76: int main(int argc, char **argv){

77: int mytid;

78: int my i;

79: int iproc;

80: int nproc;

81: int *tids; /* array of task IDs */

82: double *buf;

83:

84: int i, j;

85: int count;

86: double a, t;

87: double Te, Tw, Ts, Tn;

88: double gamma;

89: double dq = DBL MAX;

90:

91: a = k / rou / c;

92: gamma = a * dt / (h*h);

93: h mid = NH / 2;

94:

95: if( gamma > 0.5 ){

96: printf("gamma = %e\n", gamma);

97: exit(1);

98: }

99:

100: if( argc != 2 ){

101: fprintf(stderr, "Usage: %s [n tasks]\n", argv[0]);

102: pvm exit();

103: exit(1);

104: }

105: nproc = atoi(argv[1]);

106: tids = alloc int(nproc);

107:

108: /* enroll in pvm */

109: mytid = pvm mytid();

110:

111: /* Join a group and, if I am the first instance,

112: iproc=0, spawn more copies of myself

113: */

114: iproc = pvm joingroup("FDM2D");

115:

116: if (iproc == 0) {

117: tids[0] = pvm mytid();

118: pvm spawn("pfdm2d", &argv[1], 0, NULL, nproc-1, &tids[1]);

119: }

120: pvm barrier("FDM2D", nproc);

121:

122: /* get task IDs */

123: if( iproc == 0 ){

124: pvm initsend(PvmDataRaw);

125: pvm pkint(&tids[0], nproc, 1);

126: pvm bcast("FDM2D", TID MSG);

127: my i = 0;

128: }else{

129: pvm recv( -1, TID MSG);

130: pvm upkint(&tids[0], nproc, 1);

131: for(i=1 ; i<nproc ; i++){

132: if(tids[i] == mytid){

133: my i = i;

134: break;

135: }

136: }

137: }

138:

139: my nw = NW / nproc;

140: i = NW % nproc;

141: if(my i < i)

142: my nw++;

143:

144: T = alloc darray2(my nw, NH);

145: T new = alloc darray2(my nw, NH);

146: T left = alloc double(NH);

147: T right = alloc double(NH);

148: buf = alloc double(NH);

149:

150: /* Init. Temp. */

151: for(i=0 ; i<my nw ; i++){

152: for(j=0 ; j<NH ; j++){

153: T[i][j] = temp low;

154: T new[i][j] = temp low;

155: }

156: }

157: for(j=0 ; j<NH ; j++){

158: T left[j] = temp low;

159: T right[j] = temp low;

160: }

161:

162: t = 0.0;

163:

164: if( my i == 0 ){

165:

166: for(j=0 ; j<h mid+1 ; j++){

167: T[0][j] = temp high;

168: T new[0][j] = temp high;

169: }

170:

171: calc Qin();

172: q out = 0.0;

173: dq = q in - q out;

174: printf("t = %f\n", t);

175: printf("Q in = %e, Q out = %e, dQ = %e\n",

176: q in, q out, dq );

177: }

178:

179: for(count=1 ; count<=nlimit ; count++){

180: t += dt;

181:

182: /* Left boundary */

183: if( my i == 0 ){

184: i = 0;

185: for(j=h mid+1 ; j<NH-1 ; j++){

186: Tw = T[i+1][j]; /* insulation */

187: Te = T[i+1][j];

188: Ts = T[i][j-1];

189: Tn = T[i][j+1];

190: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

191: }

192:

193: /* corner */

194: i = 0;

195: j = NH-1;

196: Tw = T[i+1][j]; /* insulation */

197: Te = T[i+1][j];

198: Ts = T[i][j-1];

199: Tn = T[i][j-1]; /* insulation */

200: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

201:

202: } else {

203: i = 0;

204:

205: /* Lower boundary */

206: j = 0;

207: Tw = T left[j]; /* left side data */

208: Te = T[i+1][j];

209: Ts = T[i][j+1]; /* insulation */

210: Tn = T[i][j+1];

211: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

212:

213: for(j=1 ; j<NH-1 ; j++){

214: Tw = T left[j]; /* left side data */

215: Te = T[i+1][j];

216: Ts = T[i][j-1];

217: Tn = T[i][j+1];

218: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

219: }

220:

221: /* Upper boundary */

83

Page 85: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

222: j = NH-1;

223: Tw = T left[j]; /* left side data */

224: Te = T[i+1][j];

225: Ts = T[i][j-1];

226: Tn = T[i][j-1]; /* insulation */

227: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

228:

229: }

230:

231: /* Right boundary */

232: if( my i == (nproc-1) ){

233: i = my nw-1;

234: for(j=1 ; j<h mid ; j++){

235: Tw = T[i-1][j];

236: Te = T[i-1][j]; /* insulation */

237: Ts = T[i][j-1];

238: Tn = T[i][j+1];

239: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

240: }

241:

242: /* corner */

243: i = my nw-1;

244: j = 0;

245: Tw = T[i-1][j];

246: Te = T[i-1][j]; /* insulation */

247: Ts = T[i][j+1]; /* insulation */

248: Tn = T[i][j+1];

249: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

250:

251: }else{

252: i = my nw-1;

253:

254: /* Lower boundary */

255: j = 0;

256: Tw = T[i-1][j];

257: Te = T right[j]; /* right side data */

258: Ts = T[i][j+1]; /* insulation */

259: Tn = T[i][j+1];

260: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

261:

262: for(j=1 ; j<NH-1 ; j++){

263: Tw = T[i-1][j];

264: Te = T right[j]; /* right side data */

265: Ts = T[i][j-1];

266: Tn = T[i][j+1];

267: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

268: }

269:

270: /* Upper boundary */

271: j = NH-1;

272: Tw = T[i-1][j];

273: Te = T right[j]; /* right side data */

274: Ts = T[i][j-1];

275: Tn = T[i][j-1]; /* insulation */

276: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

277: }

278:

279: /* Upper boundary */

280: j = NH-1;

281: for(i=1 ; i<my nw-1 ; i++){

282: Tw = T[i-1][j];

283: Te = T[i+1][j];

284: Ts = T[i][j-1];

285: Tn = T[i][j-1]; /* insulation */

286: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

287: }

288:

289: /* Lower boundary */

290: j = 0;

291: for(i=1 ; i<my nw-1 ; i++){

292: Tw = T[i-1][j];

293: Te = T[i+1][j];

294: Ts = T[i][j+1]; /* insulation */

295: Tn = T[i][j+1];

296: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

297: }

298:

299:

300: /* Calc. inner temp. */

301: for(i=1 ; i<my nw-1 ; i++){

302: for(j=1 ; j<NH-1 ; j++){

303: Tw = T[i-1][j];

304: Te = T[i+1][j];

305: Ts = T[i][j-1];

306: Tn = T[i][j+1];

307: T new[i][j] = gamma*(Tw + Te + Ts + Tn - 4.0*T[i][j]) + T[i][j];

308:

309: }

310: }

311:

312: /*--- Exchange data ---*/

313: if( my i != nproc - 1){

314: /* send to right side */

315: for(j=0 ; j<NH ; j++)

316: buf[j] = T[my nw-1][j];

317: pvm initsend(PvmDataRaw);

318: pvm pkdouble( buf, NH, 1);

319: pvm send( tids[my i+1], T LR MSG);

320: }

321: if( my i != 0 ){

322: /* receive form left side */

323: pvm recv( tids[my i-1], T LR MSG);

324: pvm upkdouble( T left, NH, 1);

325: }

326: if( my i != 0 ){

327: /* send to left side */

328: pvm initsend(PvmDataRaw);

329: for(j=0 ; j<NH ; j++)

330: buf[j] = T[0][j];

331: pvm pkdouble( buf, NH, 1);

332: pvm send( tids[my i-1], T RL MSG);

333: }

334: if( my i != nproc - 1 ){

335: /* receive from right side */

336: pvm recv( tids[my i+1], T RL MSG);

337: pvm upkdouble( T right, NH, 1);

338: }

339:

340: if( (count%100) == 0 ){

341: if( my i == 0 ){

342: calc Qin();

343: pvm recv( tids[nproc-1], Q MSG);

344: pvm upkdouble( &q out, 1, 1);

345: dq = q in - q out;

346: printf("t = %e\n", t);

347: printf("Q in = %e, Q out = %e, dQ = %e\n",

348: q in, q out, dq );

349: }else if( my i == nproc - 1){

350: calc Qout();

351: pvm initsend(PvmDataRaw);

352: pvm pkdouble( &q out, 1, 1);

353: pvm send( tids[0], Q MSG);

354: }

355: }

356:

357: /* write data */

358: /*-----------------------------

359: if( (count%100) == 0){

360: ---- Print Temp. !! ----

361: }

362: -----------------------------*/

363:

364: pvm barrier("FDM2D", nproc);

365:

366: /* Update temp. */

367: for(i=0 ; i<my nw ; i++){

368: for(j=0 ; j<NH ; j++){

369: T[i][j] = T new[i][j];

370: }

371: }

372:

373: }

374:

375: free darray2(T);

376: free darray2(T new);

377: free(T right);

378: free(T left);

379: free(buf);

380: free(tids);

381:

382: /* Check program finished, leave group, exit pvm */

383: pvm barrier("FDM2D", nproc);

384: pvm lvgroup("FDM2D");

385: pvm exit();

386: return(0);

387: }

84

Page 86: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ソースリスト5 (alloc f.c)

1: /*

2: Filename: alloc f.c

3: Description: Functions for memory allocation.

4: Writer: Yasunari Mimura

5: Date: 1999.9.10

6: */

7:

8: #include <stdlib.h>

9: #include <stdio.h>

10:

11: int *alloc int(size t n)

12: {

13: int *pt;

14: size t n1, i;

15:

16: n1 = n*sizeof(int);

17: if(( pt = (int *)malloc(n1) ) == NULL ){

18: fprintf(stderr, " error malloc at alloc int. ");

19: exit(1);

20: }

21:

22: for( i=0 ; i<n ; i++)

23: *(pt + i) = 0;

24:

25: return pt;

26: }

27:

28: double *alloc double(size t n)

29: {

30: double *pt;

31: size t n1, i;

32:

33: n1 = n*sizeof(double);

34: if(( pt = (double *)malloc(n1) ) == NULL ){

35: fprintf(stderr, " error malloc at alloc dbl. ");

36: exit(1);

37: }

38:

39: for( i=0 ; i<n ; i++)

40: *(pt + i) = 0.0;

41:

42: return pt;

43: }

44:

45:

46: double **alloc darray2(size t nrow, size t ncol)

47: {

48: size t i;

49: double **m;

50:

51: m = (double**)malloc( sizeof(double*) * nrow );

52: if( m == NULL){

53: fprintf(stderr, " error malloc at alloc darray2. ");

54: exit(1);

55: }

56:

57: m[0]= (double*)malloc( sizeof(double) * nrow * ncol );

58: if(m[0] == NULL){

59: fprintf(stderr, " error malloc at alloc darray2. ");

60: exit(1);

61: }

62:

63: for( i=1 ; i<nrow ; i++)

64: m[i] = m[i-1] + ncol;

65:

66: for( i=0 ; i < (nrow*ncol) ; i++)

67: *(m[0] + i) = 0.0;

68:

69: return m;

70: }

71:

72:

73: void free darray2(double **m)

74: {

75: if( m[0] ) free(m[0]);

76: if( m ) free(m);

77: }

78:

85

Page 87: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

超並列計算研究会  講習会 「PCクラスタ超入門」

索 引

aimk, 56Amdahlの法則, 10AT互換機, 18Avalon クラスタ, 17

CPlant クラスタ, 18

GNU/Linux Debian, 28

Flynnの分類, 6

HPF, 9

Linux, 26

MIMD, 6MPI, 9, 32, 36mpicc, 60mpirun, 60MPIフォーラム, 37Myrinet, 21

Netlib, 37NORA, 7

PCクラスタシステム, 16PVM, 7, 32, 36, 63

—グループ・サーバ, 58—デーモン, 57

rank, 43RedHat, 28RWCPクラスタ, 18

SIMD, 6Slackware, 28SMP, 7

WMPI, 33

XPVM, 65

1対1通信, 40

遠隔利用, 66演算のハンドル, 53

OMG, 75OpenGL, 76

仮想コンソール, 57仮想マシン, 57

共有メモリモデル, 6

グループ通信, 40

CORBA, 75コミュニケータ, 43

細粒度, 10差分法, 69

GTK+, 76自然ソルバー, 11シミュレーション, 12集中共有メモリ, 7

スイッチングハブ , 22数値ソルバー, 11スーパーコンピュータ, 4thread, 75

相互結合網, 7速度向上率, 10

対称型マルチプロセッサ, 7タスク ID, 41

中粒度, 10

通信遅延, 7

ディスクレスクラスタ, 64

87

Page 88: 超並列計算研究会 講習会「 - Doshisha · 超並列計算研究会 講習会「pc ... 1.5並列計算機の構成方式.....6 1.6プロセッサ間ネットワーク (相互

ディストリビューション, 27

熱伝導, 68—方程式, 68

ネットワークカード , 21

パラレルコンピュータ, 4

VRML, 76プロセス, 36

—グループ , 41プロセッサ間通信, 6

—モデル, 6分散オブジェクト, 75分散共有メモリ, 7, 76分子動力学, 75

並行処理, 3並列処理, 3

—の効率, 10ヘテロ, 16

Horb, 75ホストファイル, 57POV-Ray, 76

マスター・スレーブ , 41マンデルブロー集合, 63

メッセージ・タグ, 46メッセージ・パッシング, 36メッセージの交換, 7メッセージ交換モデル, 7メモリーアクセス時間, 5メモリーのバンド幅, 5

有限要素法, 75

粒子登録法, 13粒子法, 12粒度, 10領域分割, 72領域分割法, 12

レイテンシ, 7

ロードバランス, 10

88