次のページ 前のページ 目次へ

6. 一般的な興味として

このセクションで扱う題材は、Linux において並列処理を行うための 4 つの モデルを扱います。

6.1 プログラミング言語とコンパイラ

私はコンパイラ研究者として世間には名が通っていますので、Linux システムで 自動的に効率的な並列コードを生成する素晴らしいコンパイラがいかに多いか ということを話したいと思っていますが、現実はそうではありません。コード の作成者がわざわざ通信方法を指示したり、GCC でコンパイルした C のコード で書かれた他の並列処理方法を打ち負かすだけのパフォーマンスはなかなか実現 できません。

下記にあげる言語やコンパイラのプロジェクトは、高級言語から効率的な コードをそれなりに書けるようにする代表的なもののいくつかです。一般的に、 それぞれがターゲットとするタイプのプログラミングに対しては効率的なの ですが、何でもこなして GCC で C のプログラムをコンパイルする必要が まったくなくなるような言語やコンパイラは存在しません…あればいいのですが。 これらの言語やコンパイラを目的に応じてつかえば、開発が短期間で済み、 デバッグやメンテナンス等もより簡単になると思います。

ここで(アルファベット順に)リストアップしたもの以外にも、言語やコンパイラ はたくさんあります。フリーで使えるコンパイラ(Linux に関連ないものが ほとんどです)は、 http://www.idiom.com/free-compilers/ に 一覧があります。

Fortran 66/77/PCF/90/HPF/95

少なくとも科学計算分野では Fortran が主流です。もちろん現在の Fortran は、 1996 年の ANSI 規格のものとは違います。Fortran 66 はかなり簡素です。 Fortran 77 は機能をたくさん追加しており、その中で最も注目すべき機能として、 キャラクタ・データのサポート、DO ループ構文の変更があります。 PCF(Parallel Computing Forum) Fortran は、77 に対して並列処理をサポート する機能をいろいろと追加しようとしました。Fortran 90 は今時の言語が備えて いる機能を完備していて、77 に対して C++ のようなオブジェクト指向 プログラミング機能と配列の要素を並列に計算する機能が追加してあります。 HPF(High-Performance Fortran、 http://www.crpc.rice.edu/HPFF/home.html)は、2 つのバージョン(HPF-1 と HPF-2)を経る過程で、基本的にこれを拡張したり、標準化を行ったりして いった結果、CM の Fortran や MasPar の Fortran そして Fortran D という 広く使われているバージョンになりました。HPF はデータ配置関係に広く注目して 様々な並列処理の強化をはかった Fortran 90 を拡張したものです。 最終的には、Fortran 95 が Fortran 90 を多少強化、改良したものとして提供 されています。

C と連係していくには、f2cg77(Linux に特化した概略 が http://linux.uni-regensburg.de/psi_linux/gcc/ html_g77/g77_91.html にあります)もありますし、Fortran 90 と 95 の製品が http://extweb.nag.co.uk/nagware/NCNJNKNM.html 【訳註:リンク切れ】にあります。これらのコンパイラすべては 結局、GCC をバックエンドに使って同じコード生成をしています。

商用の Fortran で、SMP 用に並列化したコード生成に対応するものには、 http://www.kai.com/http://www.psrv.com/vast_parallel.html があります。 これらのコンパイラが SMP Linux で動くかどうかははっきりしませんが、 SMP Linux で動く POSIX 規格のスレッド(すなわち LinuxThreads)を生成でき てもおかしくないと思います。

Portland Group( http://www.pgroup.com/)は、商用で HPF Fortran (C や C++ も)を並列化するコンパイラがあり、SMP Linux 用のコードを生成 します。別のバージョンとして、MPI や PVM を利用したクラスタをターゲット にした製品もあります。 http://www.apri.com/ で出している FORGE や spf、xHPF は、SMP や クラスタで役に立ちそうです。

下記にあげるものは、フリーに利用できる並列化 Fortran で、並列 Linux システムで動作すると思われます。

きっと様々に存在する Fortran 系において、役に立つ可能性があるコンパイラ の多くを省いてしまっていると思いますが、あまりに数が多くて追いかけるのが 困難です。その内に Linux で動くことがわかっているコンパイラだけを一覧に したいと思っています。コメントや訂正がありましたら、pplinux@ecn.purdue.edu まで電子メールをください。

GLU (Granular Lucid)

GLU(Granular Lucid)は、非常に高水準なプログラミングシステムで、データフロー 型(Lucid)と手続き型を兼ね備えたモデルです。PVM や TCP ソケットをサポート しています。Linux で動くのでしょうか? さらに情報が欲しいなら http://www.csl.sri.com/GLU.html【訳註:リンク切れ】をどうぞ。

Jade と SAM

Jade は並列プログラミング言語で、C を拡張して、粒度が粗い命令プログラム を並列に連続して実行します。分散共有メモリモデルを前提にしていて、SAM と いう PVM を使ったワークステーションで組んだクラスタによって実現して います。さらに情報が欲しい場合は、 http://suif.stanford.edu/~scales/sam.html にあります。

Mentat と Legion

Mentat はオブジェクト指向の並列処理システムで、ワークステーションで 組んだクラスタで動きます。Linux にも移植されています。 Mentat の プログラミング言語(MPL)は、オブジェクト指向プログラミング言語で、C++ をベースにしています。Mentat のランタイム・システムは、ノンブロッキング なリモート・プロシージャ・コール(RPC)とそれとなく似たものを使っています。 さらに詳しい情報は、 http://www.cs.virginia.edu/~mentat/ に あります。

Legion( http://www.cs.virginia.edu/~legion/)は、Mentat 上に 構築され、WAN に接続しているマシン群が 1 台の仮想マシンとして振る舞います。

MPL(MasPar Programming Language)

Mentat の MPL と混同しないようにしてください。もともとこの言語は、MasPar の SIMD スーパーコンピュータ用のネイティブな C 処理系のために開発された ものです。ご存知の通り、MasPar は現在もうこの分野の業務を行っていません (現在は、NeoVista Solutions( http://www.neovista.com)という 名で、データ・マイニング業務を行っています)。しかし MPL コンパイラは GCC を使って作成しているので、今でもフリーで利用できます。ハンツビルにある アラバマ大学とパーデュ大学が共同で行った作業の中で、AFAPI(セクション 3.6 を参照してください)を呼び出す C のコードを作成するのに、MasPar の MPL 見直されました。もちろん Linux の SMP、クラスタ両者とも動作します。しかし コンパイラには若干バグがあります… http://www.math.luc.edu/~laufer/mspls/papers/cohen.ps を見て ください。

PAMS(Parallel Application Management System)

Myrias は PAMS(Parallel Application Management System)というソフトウェア 製品を販売している企業です。PAMS は仮想共有メモリ並列処理に対して非常に シンプルな命令群を提供しています。ネットワーク上の Linux マシンはまだ サポートしていません。詳しくは http://www.myrias.com/ を見て ください。

Parallaxis-III

Parallaxis-III は、構造化プログラミング言語で、Modula-2 にデータの並列 化(SIMD モデルの 1 種)を実現するため、「プロセッサと通信の仮想化」を 加えました。Parallaxis のソフトウェアには、逐次、並列処理向けのコンピュータ システム用のコンパイラとデバッガ(gdb と xgdb を拡張したもの)、画像処理 をはじめとする、様々な分野から集めた膨大なサンプルアルゴリズムが付いて います。 Linux システムでは逐次処理は動いています…古いバージョンでは、 いろいろな並列化を対象にしていましたが、新しいバージョンもそうなる予定 です(例えば、PVM クラスタをターゲットにするとか)。詳しい情報は、 http://www.informatik.uni-stuttgart.de/ipvr/bv/p3/p3.html を利用 してください。

pC++/Sage++

pC++/Sage++ は、C++ においてデータを並列化するスタイルの操作を 「オブジェクトの収集」を使って、基本となる「基底」クラスのいくつか から利用できるようにしたものです。プリプロセッサが PVM 配下で動作する C++ コードを生成します。Linux で動くのかどうかはわかりません。 詳細は、 http://www.extreme.indiana.edu/sage/ を見てください。

SR (Synchronizing Resources)

SR(Synchronizing Resources)は、コンカレント・プログラミング言語で、 リソースが共有するプロセスや変数をカプセル化しています。操作として、 プロセス間の相互作用を扱う主なしくみを提供しています。SR は操作の実行と それを提供するメカニズムを新たに統合化した上で提供しています。その結果、 次の機能をサポートします。それはローカルでの呼び出し、RPC、ランデブー、 メッセージ通信、動的プロセス生成、マルチキャスト、セマフォです。

【訳註:ランデブー(rendezvous)とは、異なるタスクの同期を取るため の手法の 1 つで、Ada で使われています】

Linux にも移植されましたが、どのような並列処理を行なえるのかはっきり しません。詳細な情報は、 http://www.cs.arizona.edu/sr/www/index.html を見てください。

ZPL And IronMan

ZPL は配列操作を基本としたプログラミング言語で、工学や科学分野の アプリケーションのサポート目的としています。IronMan という簡潔な メッセージ通信のインタフェースを呼び出すことで、このインタフェースを 構成する機能のいくつかをほとんど他のメッセージ通信システムと同じような 使い方で簡単に実現できます。しかしそもそもワークステーションで組んだ クラスタ上での PVM や MPI をターゲットとしていて、Linux もサポート しています。詳細な情報は、 http://www.cs.washington.edu/research/projects/orca3/zpl/www/ を 見てください。

6.2 パフォーマンスの問題

たくさんの方々がどのマザーボードやネットワークカード等がベストなのかを 判断しようと、ベンチマークに入れ込んでいます。この解決方法では、ベンチ マークを計測できる状態になった時はすでにそれは利用できるベストなものとは 言えなくなってしまっている、という問題があります。市場で見かけなくなって いたり、まったく違った特性を持つ改良製品に置き換わったりしているかも しれないのです。

PC ハードウェアを購入するのはオレンジジュースを買うのと同じようなもの です。普通はラベルに企業名があろうがなかろうが、それなりにいいものです。 部品(もしくは濃縮オレンジ果汁)がどこのものかを知っていたり、気にしたり する人はほとんどいません。つまり、本当に注意を払わなければいけないのは、 一部のハードウェアの違いなのです。アドバイスは簡単です。Linux で動かす ハードウェアに何をやらせるのかを把握することです。把握できたら、できる だけ速やかに手に入れる方法や納得できる価格、相応な返品条件に注意を向け てください。

PC プロセッサ間の違いを大枠で把握するのに格好の場所は、 http://www.pcguide.com/ref/cpu/fam/ です。ここは WWW サイト 全体( http://www.pcguide.com/)が PC ハードウェアの技術を 一望できる素晴らしいところでもあります。特定のハードウェアの パフォーマンスを上げるのについて役に立つところもわずかですがあります。 また、Linux Benchmarking HOWTO http://sunsite.unc.edu/LDP/HOWTO/Benchmarking-HOWTO.html も 手始めに読むのにいいと思います。

Intel IA32 プロセッサには、事細かにシステムの動作性能を計測するのに 使用する特別なレジスタがいくつもあります。Intel の VTune ( http://www.intel.co.jp/jp/developer/vtune/index.htm)は、その レジスタを使って、完璧と言える程のコードチューニングをマシンにほどこし ます…が残念ながら Linux では使えません。Pentium のパフォーマンス用の レジスタにアクセスするためのローダブル・モジュールのデバイス・ドライバ やライブラリ・ルーチンは、 http://www.cs.umd.edu/users/akinlar/driver.html にあります。 注意しなければいけないのは、IA32 プロセッサであっても、パフォーマンス 用のレジスタは、同じではないということです。このコードは Pentium で だけ動き、486 や Pentium、Pentium Pro、Pentium II、K6 等では動きま せん。

【訳註:2001.3 現在、VTune は、Pentium、Pentium Pro、Pentium II、 Pentium III、Pentium IV をサポートしています。MMX や SSE の チューニングも可能です。日本での販売については、 エクセルソフト を参照してください】

大規模なクラスタをわずかなスペースで構築しようとしている方に対しては、 パフォーマンス上でさらに付け加えておきたいことがあります。 少なくとも最近のプロセッサのいくつかは、温度センサーや回路が組み込まれて いて、動作温度があまりに高くなると内部動作クロックを遅くします(熱の発生 を押さえて、信頼性を向上させる)。CPU を冷却するのにペルチェ・デバイス (ヒート・ポンプ)を購入するにはお勧めしませんが、高温での動作は部品の 寿命を短くするだけでなく、システムとしてのパフォーマンスにじかに影響を 与えることに注意してください。コンピュータを設置する場合に、空気の流れを さえぎるような置き方や熱がこもってしまう場所には置かないようにしてください。

最後になりますが、パフォーマンスとはスピードだけではなく信頼性と 可用性も含みます。高い信頼性があれば、たとえ部品がいかれても決して システムはクラッシュしません。普通こうするには、冗長化電源やホット スワップ可能なマザーボードのように特別なしかけを必要とします。これは 安いとは言えません。高い可用性というのは、ほぼいついかなる時でも利用 できるという考えです。たとえ部品が壊れてシステムがクラッシュしても、 システムはあっという間に修復されてリブートします。この件について基本的 な要件の多くを論じている High-Availability HOWTO という資料があります。 しかし特にクラスタにとっては、高い可用性はわずかな予備だけで実現でき なければいけません。私としては最低限 1 台の予備で、できればクラスタ 当たり 16 台のマシンで予備 1 台というのがいいのでは、と思います。壊れた ハードウェアを捨てて予備と交換すれば、保守契約に比べて可用性を高くし コストも低くできます。

6.3 結論―さあ、やりましょう

Linux を使って並列処理は誰でもできますか? もちろん!

並列処理用スーパーコンピュータを扱う企業が消えて行ってしまったら並列 処理も消えてしまうのか、ということをみんなで心配していたのは、そんな昔 のことではありません。私は消えてしまわなかったと思っています ( http://dynamo.ecn.purdue.edu/~hankd/Opinions/pardead.html を見てください。本当に何が起こったのかをおもしろおかしくまとめてみました)。 今やはっきりと並列処理は盛り返してきました。最近になって並列スーパー コンピュータの製造を中止した Intel でさえ、MMX や次世代の IA64 EPIC (Explicitly Parallel Instruction Computer)で、自分たちの持っている並列 処理を自慢しています。

「Linux」と「parallel」をお気に入りのサーチ・エンジンで検索してみれば、 かなりたくさんのところで Linux を使った並列処理を見つけられると思います。 特に Linux PC クラスタはあちこちでやりはじめています。Linux がうってつけ だったのは、PC のハードウェアが低いコストで高い性能を兼ね備えていて、 それで Linux を使った並列処理が、小規模で予算の制約があるグループから 大規模で資金潤沢な国立の研究機関まで広く使われることになったのです。

このドキュメントのあちこちに記載してある様々なプロジェクトは、自分たちと 似たような並列処理の構成をとっている「同種の」研究サイトの一覧を管理して います。しかし http://yara.ecn.purdue.edu/~pplinux/Sites/ では、ハイパーテキスト形式で写真や解説、連絡先を記載したドキュメントを 提供しています。Linux システムを並列処理に使っているすべてのサイトを対象 としているのです。あなた方のサイトの情報をそこに掲載するには、

現在 14 のクラスタが掲載してあります。しかし世界規模で見れば、少なくとも 数十の Linux クラスタがあることがわかっています。もちろん掲載したからと いって、何の保証があるわけではありません。ただ Linux を使った並列処理に 関連したことを共有し合って、研究、協力する機会が増えることを望んでいる だけです。


次のページ 前のページ 目次へ