29
Title PVM(Parallel Virtual Machine)とPCA(Power C Analyzer)によるOnyx上の並列処理システムの構築 : 実例とプログラミングガイド Author(s) 東田, 学 Citation 大阪大学大型計算機センターニュース. 91 P.61-P.88 Issue Date 1994-02 Text Version publisher URL http://hdl.handle.net/11094/66045 DOI rights Note Osaka University Knowledge Archive : OUKA Osaka University Knowledge Archive : OUKA https://ir.library.osaka-u.ac.jp/ Osaka University

Osaka University Knowledge Archive : OUKA...cce口s01 cce11s03 cconyx01 133.1.4.125 133.1.102.10 のように登録しておきます砂 1.1.3 PVMデーモンの起動 まず,ローカル・ホスト上にPVMデーモンpvmdを起動します.pvmdは直接起動することもでき

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • TitlePVM(Parallel Virtual Machine)とPCA(Power CAnalyzer)によるOnyx上の並列処理システムの構築 :実例とプログラミングガイド

    Author(s) 東田, 学

    Citation 大阪大学大型計算機センターニュース. 91 P.61-P.88

    Issue Date 1994-02

    Text Version publisher

    URL http://hdl.handle.net/11094/66045

    DOI

    rights

    Note

    Osaka University Knowledge Archive : OUKAOsaka University Knowledge Archive : OUKA

    https://ir.library.osaka-u.ac.jp/

    Osaka University

  • PVM (Parallel Virtual Machine)とPCA

    (Power C Analyzer) による Onyx上の

    並列処理システムの構築

    一実例とプログラミングガイドー

    東田学

    大阪大学基礎工学部数理教室

    Abstract

    第1部では, PVMの使い方とその応用例を紹介します.PVMによるプログラミングの技巧は,第 2部の前半で紹介します.

    第 2部の後半では,大型計算機センターに新しく導入されたグラフィクス・スーバーコンビュータOnyx (MIPS R4400/150MHz CPUを8つ搭載)での並列処理について紹介します.

    第 1部: PVMによる並列処理の実例

    X Window Systemは, Unixワークステーション上のウィンドウ・システムの標準として広く利用され

    ていますが,その謳文句のひとつにネットワーク透過性 (NetworkTransparency)があります.

    ネットワーク透過性とは,ネットワークを隔てた遠隔地のホストも,ネットワークを意識することなく,

    手元のホストと同じようにアクセスできることです.X Window Systemでは,この特徴により,遠隔地の

    ホストのプログラム(クライアント)が表示するウィンドウを手元のホストの Xサーバ上へ表示させ,ロー

    カル・ホスト上のクライアントと区別することなく操作することができるわけですl.

    ここで図 1を見て下さい.この図では, Mandelbrot集合の一部を複数のウィンドウに分割して合成表示

    していますが,上で紹介したネットワーク透過性を利用して,これらのウィンドウを各々異なるホスト上の

    クライアントによって表示することができます.こうすると,ひとつのホスト上ですべての領域を計算し表

    示するよりも負化が分散し,より高速に描画できるはずです.

    これが今回紹介する PYM(Parallel Virtual Machine)のアイデアです.

    図2は, PVMによる Mandelbrot集合の描画システムの例です.描画中2の様子を見てもわかる通り,こ

    のシステムでは与えられた領域を横方向に分割し,それぞれを自動的に異なるホストヘ割り振って計算さ

    せ丸その結果を受けとって描画しています.もちろんローカル・ホストだけでも描画できますし,計算を割

    り振るホストを追加すれば,その操作以外にネットワークを意識することなく計サ年を分散することができま

    す.PVMを使うと,このようなネットワーク透過性を手軽に実現し,ネットワーク上の並列処理システム

    を構築できるわけです.

    ところで, Unix上でこのようなネットワーク透過性を実現する上で鍵となる技術は,ソケット・ライプ

    ラリによる TCP/IPネットワーク通信と, selectシステム・コールによる非同期通信です.両者とも,使

    I操作の詳細は xho"tや xonコマンドのオンライン・マニュアルを参照して下さい.2斜線の部分.

    3左端のバターンで割り振ったホストが識別できます.

    大阪大学大型計算機センターニュース -61- Vol. 23 Nn 4 1994 -2

  • 図 1:領域をリモート・ホストに分散して描画

    図 2:PVMに附属するサンプル xepによる描固

    大阪大学大型計算機センタ ーニュー ス -62- Vol. 23 Nu4 1994 ~ 2

  • Q UDPSocket

    □ TCP Socket

    図 TCPSocket Listening

    □ Unix File

    Host: ccews03

    Parallel Virtual Machine

    -'

    宇‘•••••••• 甲〗f

    ロ/tmp/pvmd, UID

    sockaddr and port number file for呼 toget pvmd's local address ロ/tmp/pvml.UID error log file for pvmd

    Host: ccews01 y

    凸.. .、

    三己/ ¥ Host: cconyx01

    slave slave・・・

    図 3:PYM概念図

    いこなすにはそれぞれなかなか大変なものです.とりわけ,システムによって微妙に異なる部分を吸収する

    手間が大きいのですが, PYMを使えば,移植性という最大のハードルすら楽々クリアすることができます.

    すなわち異なるアーキテクチャのホストヘも簡単に並列システムを拡張できるわけです.

    もちろん, XWindow Systemや PYMのようなネットワーク分散システムには,それ故のオーバヘッド

    も生じます.ローカル・ホスト上の通信(システム・バスによる転送)に比べ,ネットワーク通信には大き

    なコストがかかるからです.ネットワーク的に遠い4場所にあるホストからの情報は滞って到着しますから,

    レスポンスが悪かったり,ウィンドウの描画が遅かったりするわけです回

    しかし, ODINSによって学内ネットワークが整備されれば,大型計算機センターのマシンを「隣の部屋

    のマシン」のように利用できるようになるでしょう .PYMの普及でネットワークがより有効に利用される

    ことを期待してこの記事を始めることにします.

    4実際に距離的に遠かったり,多くのネットワークを経由したり,通信回線が細かったりと理由は様々です.

    5例えば, xepは下から描画を始めますが,図 2の中ほどで黒く抜けているのは速隔地のホストに割り振られた領域です.

    大阪大学大型計算機センターニュース -63- Vol. 23 No.4 1994-2

  • 1.1 PVM; 仮想並列マシンの起動

    PYMでは,図 3のような構成で,ネットワーク上の既存のワークステーションを仮想的な並列処理シス

    テムに仕立てることができます.

    各ホスト上に起動される PYMデーモン pvmdの相互通信により,仮想並列マシン (ParallelVirtual

    Machine) 6が構成されます.ユーザは,マスター (master)プログラムから,従属する (slave)プログラム

    を仮想並列マシン上に複数起動し,並列動作させることができます.仮想並列マシンは制御コンソール pvm

    によって制御を行ないます.ここでは,仮想並列マシンの起動の仕方と制御コンソールの使い方を紹介し

    ます.

    1.1.1 環境変数の設定

    必要なプログラムを起動する前に,まず,次の 2つの環境変数を設定しておく必要があります:

    PVM..ROOT : PYMのインストールされているデイレクトリを設定する

    PVM..ARCH : ホストのアーキテクチャを次の PYMnameで設定する

    大計センターで PYMを利用する場合は, PV>LROOTは/usr/local/pvm3を設定します.PVM_ARCHは

    次のリストから指定します7:

    PYM name Machine and OS PVM name Machine and OS

    AFX8 Alliant FX/8 !860 Intel RX Hypercube

    ALPHA DEC Alpha/OSF-1 IPSC2 Intel IPSC/2

    BAL Sequent Balance LINUX 80(34)86 running Linux

    BFLY BBN Butterfly TC2000 MIPS Mips

    BSD386 80(34]86 running BSDI or NEXT NeXT

    BSD386 PGON Intel Paragon

    CNVX Convex using IEEE floating- PMAX DEC/Mips arch (3100, 5000,

    point etc.) running Ultrix

    CNVXN Convex using native f.p. RS6K IBM/RS6000

    CM2 Thinking Machines CM-2 Sun RT IBM/RT

    front-end SGI Silicon Graphics IRIS

    CM5 Thinking Maclunes CMふ SUN3 Sun 3

    CRAY Cray SUN4 Sun 4, 4c, spare, etc.

    CRAY2 Cray-2 SUN4SOL2 Sun 4 running Solaris 2.x

    CRAYSMP Cray S-MP SY血 Sequent Symmetry

    DGAV Data General Aviion TITN Stardent Titan

    E88K Encore 88000 UVAX DEC/Microvax

    HP300 HP 9000 68000 cpu VCM2 Thinking Maclunes CM-2 Vax

    HPPA HP 9000 PA-Rise front-end

    KSRl Kendall Square

    ${PVM..ROOT}/lib/pvmgetarchというプログラムを実行すると,そのホストに対する PVMnameが得

    られますので,".cshrc"に

    setenv PVM_ROOT /usr/local/lib/pvm3

    setenv PVM_ARCH'$PVM_ROOT/lib/p四 getarch'

    set path=($path $PVM_ROOT/lib $HOME/p四 3/bin/$PVM_ARCH)

    のように追加しておくと,ログインしたときに自動的に PVM_ROOTとPVM_ARCHが設定されます.ログイ

    ン・シェルが /bin/shの方は ".profile"に

    鰈ットワーク上で結合された並列処理システムをクラスタ (Cluster)と呼ぷ場合もあります.7PVMではデフォルトでこれだけのマシンと OSに対応していますが,大計センターの持つ NECのスパーコンビュータ SX-3

    とワークステーション EWS-4800にも移植してみました.大計センターにインストールされている PVMシステムでは,それぞれSX3とEIISUXという PVMnameで利用できます.

    大阪大学大型計算機センターニュース -64- Vol. 23 Nu4 1994 -2

  • set P四ーROOT=/usr/local/lib/p四 3

    set P四ーARCH='$P四ーROOT/lib/p四 getarch'

    set PATH=$PATH:$PVM_ROOT/lib:$PHOME/p四 e/bin/$PVM_ARCH

    export PVJ, しROOTPVM_ARCH PATH

    と記述します.

    1.1.2 リモート・ログインのための設定

    仮想マシンの一部として利用したいホスト間は相互にリモート・ログインできるように設定しておく必

    要がありますg

    この原稿を書いている 1994年 1月末日現在)大計センターで PVMシステムが使えるホストは, ccews01,

    ccews03, cconyx01とccsx39です.ホーム・ディレクトリの".rhos ts"で

    cce口s01

    cce11s03

    cconyx01

    133.1.4.125

    133.1.102.10

    のように登録しておきます砂

    1.1.3 PVMデーモンの起動

    まず,ローカル・ホスト上に PVMデーモン pvmdを起動します.pvmdは直接起動することもできます

    が, pvmdを制御するための仮想コンソール pvmから起動する方が良いでしょう.pvmを起動すると,自動

    的に pvmdが起動されて,その制御コンソールとなります且

    1.1.4 PVMデーモンの制御

    では,以上の準備が出来たところで,環境変数 PV~LARCH と PVM..ROOT が正しく設定されていることを確

    認して,制御コンソールを起動してみましょう:

    cce1Js031, printenv PVM_ROOT

    /usr/local/pvm3

    cce1Js031, printenv PVM_ARCH

    E¥ISUX

    cce1Js031, set path=($path $PV凡ROOT/lib$HOME/pvm3/bin/$PVM_ARCH)

    cceTJs03t, pvm

    pvm>

    8リモート・ホスト上で pvmdを起動するとき, rexec(3)を使っているため.9 ccsx3はホームデイレクトリの管理が異なるので,幸いながら,ここでは除外しておきます.10cconyx01はEthernetインターフェイスと FDDIインターフェイスを持つので, IPアドレス (133.1.4.126,133.1.102.10)

    で双方を設定しておきます.11pvmdがあらかじめ起動されていれば, pvmは起動されている pvmdと接続し,制御コンソールとなります.

    大阪大学大型計算機センターニュース -65- Vol. 23 No.4 1994 -2

  • プロンプトが ''pvm>" に変わりますので,まず helpコマンドで使えるコマンドの一覧を表示してみま

    しょう:

    p四 >help

    HELP -Print helpful information about a command

    Syntax: help [ command ]

    Commands are:

    ADD -Add hosts to virtual machine

    ALIAS -Define/list command aliases

    CONF -List virtual machine configuration

    DELETE -Delete hosts from virtual machine

    ECHO -Echo arguments

    HALT -Stop pvmds

    HELP -Print helpful inf ormation about a command

    ID -Print console task id

    JOBS -Display list of running jobs

    KILL -Terminate tasks

    MSTAT -Sho口 statusof hosts

    PS -List tasks

    PSTAT -Sholl status of tasks

    QUIT -Exit console

    RESET -Kill all tasks

    SETENV -Display or set envirorunent variables

    SIG -Send signal to task

    SPAWN -Spa口ntask

    UNALIAS -Undefine co皿mandalias

    VERSION -Shoロ libpvmversion

    p四>

    この中で普段使うものは, add,conf, ps, reset, quitとhaltです.以下,通常利用する手順にそって

    これらのコマンドについて解説します.

    仮想並列マシンにホストを登録する: add, conf

    addコマンドで,リモート・ホストが仮想並列マシンに登録され利用できるようになります.confコマ

    ンドは,クラスターに登録されているホストの一覧を表示します:

    p四 >conf

    1 host, 1 data format

    HOST DTID ARCH SPEED

    ccevs03 40000 EIISUX 1000

    p四 >add cceTJs01

    1 successful

    HOST DTID

    ccews01 cOOOO

    p匹 >add cconyx01

    1 successful

    HOST DTID

    cconyxOl 100000

    pvm> conf

    3 hosts, 1 data format

    HOST DTID ARCH SPEED

    ccevs03 40000 EWSUX 1000

    ccewsOl cOOOO EWSUX 1000

    cconyxOl 100000 SGI 1000

    pvm>

    大阪大学大型計算機センターニュース -66 Vol. 23 Nn4 1994-2

  • タスクの状況を表示する: ps

    psコマンドは仮想並列マシンで実行されているタスクの一覧を表示します:

    p四>ps -a

    HOST A.OUT TIO PTID FLAG

    cce11s03 40002 -Ox04/c

    ccews03 mtile 40003 40002 Ox04/c

    cconyx01 mtile 100001 40002 Ox04/c

    cce口s01 mtile c0001 40002 Ox04/c

    タスクや仮想並列マシンを終了する: reset, halt

    プログラムの書き方によっては,タスクが未終了のまま残ってしまうことがあります.このようなタスク

    を一掃するコマンドが resetです:

    p四>reset

    quitコマンドで,仮想並列マシンをそのままにして,制御コンソールだけ終了させることが出来ます.マ

    ルチ・ウィンドウ・システムを使っていないときは便利です:

    pvm> quit

    pvmd still running.

    ccews03¼p匹

    p四 dalready running. p四>

    仮想並列マシンを終了する場合は haltコマンドを使います.仮想並列マシンに登録されているすべて

    の pvmdが終了します:

    p匹>halt

    libpvm [t40001]: 訟 fer() EDF on pvmd sock

    ccews03¼

    1.1.5 トラブルシュート

    PYMを利用していると

    clarke¼p四

    pvmd already running.

    libpvm [pid11864] : mksocs () connect: Connection refused

    libpvm [pid11864]: pvm_mytid(): Can't contact local daemon

    または

    chobi¼pvm pvm> add clarke

    0 successful

    pvm>

    HOST DTID

    clarke Can't start p匹 d

    というように,突然 pvmdが起動できなくなることがあります.

    もっとも多くの場合は, PVMデーモンを起動したときに作成される/tmp/pvmd.umというファイル12が,pvmdの予期しない終了により消去されず,再起動の障害になっています.このときは,このファイルを消し

    てから起動して下さい ([9]参照).

    12pvmdの持つ netidや hostid,port番号といった情報が菩かれます.

    -67- Vol. 23 No.4 1994-2

  • 実例その 1:Mandelbrot集合を分散描画してみる

    以上で仮想並列マシン構築のために必要な操作を一通り説明しました.次に, PYMに附属しているサ

    ンプル・プログラム xepを使って,並列化の威力を試してみましょう .

    その前にもうひとつ準備がいるのですが, xepはmtileという slaveプログラムを利用して並列計算を

    行ないます.両者とも $PVM_ROOT/bin/$PVM_ARCHにインストールしてありますが,ホームディレクトリ

    の下の pvm3/bin/$PVM_ARCHディレクトリのみがslaveプログラムの実行バスとして有効です.ですから

    mtileをあらかじめそのディレクトリににコピーしておく必要があります.

    では) pvmdが起動されていること) xepバスが通っていること) mtileがインストールされていることを

    確認してから xepを起動してみましょう:

    cce口s03t,pvm

    pvm> conf

    1 host, 1 data format

    HOST DTID ARCH SPEED cce11s03 40000 EWSUX 1000

    pvm> quit

    pvmd still running.

    cce11s031, 11hich xep

    /usr/local/pvm3/bin/EWSUX/xep

    cce口s03t,ls -F $HOME/pvm3/bi/EWSUX

    mtile• cce口s031,xep k

    図 4のようなウインドウが表示され Mandelbrot集合を描画します13:

    図 4:xepを起動

    13xepの使い方に関するマニュアルは,残念ながら用意されていません.描画ウィンドウの上にあるアイコンは,左から,‘‘終了",噺しいホストの追加認識","指定領域の再描画',"ズームアウト","左端のビット列の表示/非表示切替え"です.

    大阪大学大型計豆機センターニュ ース -68- Vol. 23 Nu4 1994 -2

  • では次に,仮想並列マシンにホストを加えて並列描画させてみましょう:

    cce四 037.pvm

    pvmd already running.

    pvm> cont

    1 host, 1 data format

    HOST DTID ARCH SPEED

    ccells03 40000 EWSUX 1000

    pvm> add ccells01

    1 successful

    HOST DTID

    ccells01 100000

    pvm>

    この操作だけでは, xepは仮想並列マシンに追加されたホストを認識しません.さらに, xepウィンドウ

    の左から 2番目のポタンをクリックすることにより,追加したホストが xepに認識されます.これで,描

    画領域で範囲を指定し庄左から 3番目のボタンを押します(図 5).

    層]国回ロロ

    固 5:仮想並列マシンにホストを追加して再描画

    今度は,左の桝目に変化がありますが,バターンによって描画しているホストを識別表示しています.

    Mandelbrot集合は,与えられた点に対して,その点が集合に含まれるか含まれないかを, 他の点に依存す

    ることなく計算することができます ([1],[2] p.189). これがこのシステムの並列性の衷付けですが,他にも

    このような例は数多く存在します.

    次節では,現在私が取り組んでいる数式演算システムにおける連立一次方程式の解法の並列性について

    述べ,並列動作させたときのバフォーマンスを紹介します.

    H マウスの左ボタンで押すードラッグ—雌すという操作をする

    大阪大学大型計鉢機センターニュース -69 - Vol 23 No.4 1994-2

  • 実例その 2:連立一次方程式の解を求める並列処理システム

    連立一次方程式の解を求めるための次の公式を元に,並列処理システムを構築することができます:

    Cramerの公式を使うと,連立一次方程式

    XIXllx

    1

    1

    ,

    1

    ,

    2

    ,

    m

    a

    a

    a

    、.ーー

    i_し

    (n > m)の一般解 zは

    a1 =

    a1,2む2

    a2,2エ2

    am,2X2

    a1,nXn

    a2,nXn

    am,nXn

    = =

    0 0

    0

    △ ,,,,,,!,,,~, △

    △ '""""'~'''' △

    ゜゚

    △ ,, 叶 l

    △n叶 l△

    1 '...'anーr=

    ゜゜

    の一次結合

    x=入r十 心l+ ... 十入nOn-r

    で与えられる.ここで,a1 I ・・・ air

    △ : = : . : # 0 ar,l . . . ar,r

    を仮定し(すなわち,与えられた連立一次方程式の系数の作る行列の階数を rとする),

    i-th

    a1,1

    △ i,j :=ー:ar,1

    a1,j

    arJ

    r

    r

    9

    9

    1

    :

    r

    a

    a

    と定義する ([3]p.80).

    ここで△iJは iとjに関して独立して計算を行なうことができますので,この性質を元に並列処理シス

    テムを構築することができるわけです.

    例えば,連立一次方程式の係数行列が 1890X 1554次元で階数は 1554となるデータがありますこの場合,

    △ i,j (1554次元行列の行列式)を 1s; i s; 1554, 1555 s; j s; 1890について,すなわち 1554X 336 = 522, 144 個計算すればこの方程式の解は求まります.このデータは疎行列なのですが,疎行列を対象に演算を行な

    う独自の処理系上で PVMによる並列タスク分散を行なうように変更を加えてみました.

    PYMでは)ネットワーク上に限らず)ひとつのホスト上でも疑似的な並列処理環境を構築することがで

    きますので, Onyxと,その比較として SunSP ARCserver 630MPで SuperSPARC/40MHzCPUが 2個

    搭載されているマシンを土俵に上げ実験してみた結果)貫樗年に要した時間は次の通りです:

    大阪大学大型計算機センターニュース -70- Vol. 23 No.4 1994

  • #task Onyx SCPU Sun 630MP 2CPU

    1 1540 (35 + 1505) 2132 (32 + 2100)

    2 787 (41 + 746) 1136 (37 + 1099)

    3 545 (47 + 498) 1138 (53 + 1085)

    4 427 (54 + 373) 1154 (58 + 1096)

    5 368 (62 + 306)

    6 316 (68 + 248)

    7 287 (74 + 213)

    8 273 (82 + 191) , 281 (91 + 190) 10 283 (96 + 187)

    トータルで計算に要した秒数に対し,括弧内の左が初期化に要した秒数,右が実際に並列動作をしていた

    時間です.

    1,600

    1,400 ビ.四叫elywo,king1,200

    ● initializing

    1,000

    ~ VJ 800

    600

    400

    200

    ゜ 2

    3

    4

    5

    6

    7

    8 ,

    10

    #task

    並列動作している時間を比較してみると, PYMを利用することにより, Onyx上で実に奇麗に 8つの

    CPUを使えることがわかりました.PYMにより, Onyxのようなマルチプロセッサ・マシンを有効に活用

    できるわけです.

    ただし,初期化部分以外ではタスク間の通信はほとんど行なっていません.タスク間通信を行なった場合

    のバフォーマンスについては,初期化に要した時間が参考になりますが,タスク間で頻繁に相互参照を行な

    うと,まったくパフォーマンスが上がらないこともわかっています.

    大阪大学大型計算機センターニュース -71- Vol. 23 No. 4 1994 -2

  • 第 2部:並列処理のためのプログラミング・ガイド

    この度,大型計算機センターに導入された Onyxには 8つの CPUが搭載されていますが,同時に導入さ

    れた PowerCというコンバイラを使うことにより,複雑なコーデイングを行なうことなく自動的に並列化

    を行うことができます.しかし,まったくの全自動というわけではなく

    o自動並列化の対象は forループに限られる

    を筆頭に,様々な制約があります.また,タスク間の通信はシェアード・メモリで行なわれるため非常に高

    速で,特殊なコーデイングを必要としませんが

    o強引な並列化は予期せぬデッドロックを招く

    ことがあります.

    というように,並列化したい部分は PowerCが気に入るようにスタイルに合わせるための試行錯誤が必

    要になりますし,メモリの参照について特に注意してコーディングする必要もあるわけです.

    一方, PVMはある意味「貧乏人のための並列処理環境」です.第 1部で,対象によっては線形的な並列

    効果があることを紹介しましたが, PVMで並列化を行なう場合は

    o タスク割当や,タスク間の通信は,プログラマがコーデイングしなくてはならない

    o ネットワーク通信によりタスク間通信を行なうため,頻繁なデータ交換を行なわないように注意する

    というように PowerCなどの「自動並列化」に比べて格段の努力が必要になります.しかし, PVMでは

    単純なループ以外も並列化の候補とできるため,より多様なアイデアを実装することができます.けっして

    「貧乏人…」というわけではないのです.

    第 2部では,まず前半で PVMでのコーデイング・スタイルについて解説し,後半では PowerCでのコー

    ディング・スタイルについて解説します.後半は独立していますので, PVMには興味がないけど, Onyxに

    は興味があるという方は,こちらだけでも目を通してみて下さい.

    2.1 Programing around Network with Parallel Virtual Machine

    ここでは,第 1部で紹介した PYMに附属のサンプル・プログラム xep/mtileを元に, Mandelbrot集

    合を並列計算するプログラムを示します豆

    領域を分割しタスクを分配するプログラムを,ここでは元締め (master)と呼ぶことにします.一方,元締めからタスクを受けとり,ひたすら処理を行なうプログラムを下請け (slave)と呼ぶことにします.下請

    けは計算が終ったら結果を元締めに返し,元締めはそれを統合しユーザに結果を返します.

    それぞれ PYMでコーディングする際のスケルトンになるようにコーディングしましたので,プログラ

    ミングの際に参考になるでしょう.

    なお,より詳細はユーザーズ・ガイド [6)16やクイック・リファレンス・ガイド (7]丸オンライン・マニュアル18を参照して下さい.

    2.1.1 元締め: "master.c"

    元締め ''master.c" 19では,下請けへの仕事の割り振りを行ない,下請けから上がってくる計算:結果をま

    とめます

    lbオリジナルのソースは /usr/local/pvm3/xopに匿いてあります.16/usr/local/pvm3/docに PostScript形式で匿いておきます.ファイル名は ug.ps,全 103ページです.17 /usr/local/pvm3/doc/rofcard. psです.18環境変数 KAllPATI!に /usr/local/pvm3/manを登録すると参照できます.19PVMに附属のサンプル・プログラム "xep/mmain.c"を変更したものです.元のプログラムの使用許諾は最後に記します.

    大阪大学大型計算機センターニュース -72 Vol. 23 No.4 1994-2

  • まず,PYMを利用するために必要な初期化と終了処理を次のようにおこないます:

    1 #include 2 #include 3 #include 4 #include "pvm3.h" s 6 char *mandelbrot () ; 7

    8 int nprocessors = 1; 9 int *prtids = 0; 10 11 exit_handler () 12 { 13 int i; 14

    /• number of processors to use•/ /• procensor task ids•/

    15 for (i = O; i < nprocessors; i++) 16 pvm_kill (prtids[i]); 17 pvm_exit (); 18 exit (1); 19 }

    20 21 main() 22 { 23 int i;

    24 int mytid; I* my task id *I 25 char *pix; I* image data *I 26 27 if ((mytid = pvm_mytid ()) < O) 28 exit (1);

    29 30 pvm_config (血processors, (int *) 0, (struct hostinfo **) 0); 31 fprintf (stderr, "using¼d tile servers in calculation¥n", nprocessors); 32 33 signal (SIGHlT, exi t_handler); 34 signal (SIGTE昭, exit_handler);35 36 prtids = (int*) malloc (nprocessors * sizeof (int)); 37 pvm_spaim ("slave", (char **) 0, O, 1111, nprocessors, prtids); 38 39 pix = mandelbrot (-0.1, -0.8, 0.1, -0.6, 512, 512); 40 41 I*なんらかの出カルーチン*/42 43 for (1• O・ ,J. < nprocessors; ュ++)44 pvm_kill (prtids[i)); 45 pvm_exit (); 46 exit (O); 47 } 48

    27行目は PYMを利用するための準備です.PVMを利用するときは必ず pv皿 mytidを実行し,割り当

    てられたタスク IDを覚えておく必要があります.

    次に 30行目のように,下請けを依頼できるホスト 20を探します.nprocessorsに仕事を引き受けてくれ

    るホストの数が入ります.

    36, 37行目で, "slave"という次に紹介する下請けプログラム(タスク)を上で返事のあったホスト上で

    起動します.prtidsという配列に下請けのタスクの IDが入ります.

    元締めは,終了時に下請けに対して,もはや仕事がないことを知らせなくてはなりません.その処理を行

    なうために, 33,34行目で, INTとTERMシグナルに対して 11行からのハンドラを登録し,また終了直

    前には 43行目から 46行目までを実行します.

    20仮想並列マシンに登録されているホスト.

    大阪大学大型計算機センターニュース 73 - Vol. 23 No.4 1994 -2

  • このプログラムの本体は 39行目で,ここでは次の関数として独立させてあります.下請けに仕事を割り

    振り,結果をまとめる部分です:

    49 char* so mandelbrot (xi, yl, x2, y2, 11d, ht) 61 double xl, yl, x2, y2; I* image corner coordinates *I 52 int口d,ht; . f* size of image to calculate *I 53 { 64 int i: 55 char *pix; /• calculated image *I 66 int np = nprocessors; 57 int tid = prtids[--np]; 58 59 pix = (char *) malloc (11d * ht); 60 61 for (i = O; i < ht; i++) { 62 63 fprintf (stderr, "sending 11ork to processor : ¼d\n", tid, i); 64 { 65 pvm_packf ("¼+¼lf¼lf¼lf¼lf¼d¼d¼d叫66 PvmDataDefaul t, 67 xl, ((y2 -yl) / ht) * i + yl, 68 x2, ((y2 -yl) / ht) * (i + 1) + yl, 69 11d, 1, i); 70 } 71 pvm_send (tid, 1); 72 73 if (np) { 74 tid = prtids[--np];

    75 continue; 76 } 77 78 vhile (1) { 79 if (pvm_recv (-1, 2) > 0) { 80 int slavetid; I* processor id responding *I 81 { 82 int j; 83 84 pvm_bufinfo (pvm_getrbuf (), (int *) 0, (int *) 0, &slavetid); 85 fprintf (stderr, "processors responding: \n", slavetid); 86 pvm_upkint (f.j, 1, 1); 87 pvm_upkbyte (pix + j * 11d, 11d, 1): 88 } 89 tid = slavetid; 90 break; 91 } 92 } 93 } 94 95 return pix: 96 }

    この関数は与えられた領域を行方向へ分割し,下請けへ計算を依頼しl返ってくる結果をまとめます.

    PYMでは通信が計算のボトルネックになりますから,依頼は少ない方がいい21のですが,ここでは簡単

    のためlーライン毎に分割し仕事を割り振ることにしました.

    63行目から 71行目までで仕事を下請けに依頼し, 73行目から 92行目までで,結果を受けとります.

    ここではまずl仕事を受けてくれるホストに対して依頼を行ないlその後は仕事が終ったらまた仕事を依

    頼する l という戦略をとっています.

    21この例では,下請けの数だけ領域を分割すればよいのですが,下請けの処理能力に大きな差がある場合は,一番遅い下請けの処理能力がポトルネックとなるので,細かく分割した方がよいことがあります.

    大阪大学大型計算機センターニュース 74- Vol. 23 Nu 4 1994 -2

  • 64行目から 70行目までのブロックと, 81行目から 88行目までのプロックを変更すれば元締めを書く

    ことができるでしょう.

    2.1.2 下請け: "slave.c"

    下請け "slave.c"22は,元締めから起動されて,その下請けとしてひたすら言惇年を行ないます:

    1 #include 2 #include 3 #include "p四 3.h"4

    s signal_handler () 6 {

    7 pvm_exit O; 8 exit (0); 9 }

    10 11 char• calc_tile(); 12 13 mal.ll () 14 { 15 int mytid; 16 int mastertid; 17 double x1, y1, x2, y2; 18 int i;,d, ht; 19 char *pix; 20 int mid, i; 21 22 mytid = pvm_mytid (); 23

    I* my task id *I I* 11ho sent us this tile *I I* tile corner coordinates *I I* size of tile *I I* calculated image *I

    24 signal (SIGTERM, signal_handler); 25 26 while ((mid = pvm_recv (-1, 1)) > 0) { 27 p匹 ーbufinfo(mid, (int•) 0, (int *) O, 如 astertid);28 {

    29 pvm_unpackf ("¼lf¼lf¼lf¼lf¼d¼d¼d", l'lxl, &:yl, 訟 2, &:y2, 匹 d, &:ht, &:i); 30 pix = calc_tile (xl, yl, x2, y2, vd, ht); 31 pvm_packf ("¼+¼d¼*c", PvmDataDefault, i, vd * ht, pix); 32 free (pix); 33 } 34 pvm_send (mastertid, 2); 35 p匹 _setsbuf(O); 36 } 37 p四 _exit (); 38 exit (1); 39 }

    元締めであるマスター・プログラムが終了するとき,下請けに TERMシグナルが送られます.24行目

    では,そのシグナルを受けとったときに中断処理を行なうためのハンドラを登録しています.

    5から 9行目までがハンドラですが,ここでは PVMの終了処理と exitを実行します匹

    26行目から 36行目までが本体です(元締めとの通信に失敗した場合のみ, 37,38行を実行し異常終了し

    ます) • 26行目の pv皿 recvで元締めから仕事する範囲をもらい, 28行目から 33行目までのプロックで仕事を行ない, 34行目でその結果を返します.

    このコードを元に, 28行目から 33行目までと, 42行目以降を変更すれば, PVMの下請けプログラムを

    書くことができるでしょう.

    22PVMに附属のサンプル・プログラム xep/mtile. cを変更したものです.元のプログラムの使用許諾は最後に記します.23 exitを実行しないと,プロファイリングした統計がダンプされないなどの不都合が生じることがあります.なお, PVMでプロ

    ファイリングを行なうコツは,環境変数 PROFDIRを設定しておくことです.指定したデイレクトリに pid.prognameという形式でプロファイル・データが作成されます.

    大阪大学大型計算機センターニュース -75- Vol. 23 No. 4 1994 -2

  • Mandelbrot集合について実際計算する部分は次のようになります:

    110 char* 111 calc_tile(xl, yl, x2, y2, wd, ht) 112 double xl, yl, x2, y2; I* tile corner coords >11< size of tile >11 2048 11 htく 111 ht > 2048) { 123 fputs("insane vd/ht¥n叫 stderr);124 pvm_exi t () ; 125 exit(l); 126 } 127 pix = (char>1 O;) { 131 y = (iy * y2) / ht + yl; 132 for (ix = vd; ix--> O;) { 133 x = (ix * x2) /叫+xl; 134 ar = x; 135 ai = y; 136 for Cite = O; ite く 255; ite++) {

    137 al = (ar * ar) ; 138 a2 = (ai * ai) ; 139 if (al + a2 > 4.0) 140 break;

    141 ai = 2 * ai * ar + y; 142 ar = al -a2 + x; 143 }

    144 pix[iy * vd + ix] = -ite; 145 }

    146 } 147 return pix; 148 }

    なお,この関数は,次の節で自動並列化のためのサンプルとして再び取り上げます.

    2.1.3 PVM独自の Makefile: "Makefile. aimk"

    PYMでは,アーキテクチャの異なるホストも並列化の候補とすることができますが,そのために,当然,

    異なるバイナリを用意しておく必要があります.バイナリ作成を支援するためのツールが aimk24です.

    2, 簡単なシェルスクリプトですので,興味のある方は覗いてみて下さい.

    大阪大学大型計算機センターニュース -76- Vol. 23 No.4 1994-2

  • 次のような Makefile25をMakefile.aimkというファイル名で用意しておき

    1 #

    2 # Generic Makefile body to be concatenated to config header. 3 #

    4 # Imports: 5 # PVM_ARCH = the official pvm-name of your processor 6 # ARCHCFLAGS = special cc flags 7 # ARCHLIB = special libs needed for daemon 8 #

    9 PVMIDIR = ${PVM_ROOT}/include/ 10 PVMLDIR = ${PVM_ROOT}/lib/${PVM_ARCH}/ 11 PVMLIB = -lpvm3 12 SDIR = .. / 13 BDIR = ${HOME}/pvm3/bin/ 14 XDIR = $(BDIR)$(PVM_ARCH)/ 15 16 CFLAGS = -0 $(ARCHCFLAGS) -I$(SDIR) -I$(PVMIDIR) 17 LIBS = -L$(PVMLDIR) $(PVMLIB) $(ARCHLIB) 18

    19 all: master slave 20 21 master : $ (SDIR)master. c $ (XDIR) 22 $(CC) $(CFLAGS) -o $c$(SDIR)master.c $(LIBS) 23 cp $c$ (XDIR) 24 25 slave : $ (SDIR) slave. c $ (XDIR) 26 $(CC) $(CFLAGS) -o $c$(SDIR)slave.c $(LIBS) 27 cp $c$(XDIR) 28

    29 $(XDIR): 30 -mkdir $(BDIR) 31 -mkdir $(XDIR)

    各プラットフォーム上で次のように利用します:

    chobi1, ls Makefile. aimk master. c slave. c chobi1, Yhich aimk /usr/local/pvm3/lib/aimk chobi1, aimk making in SUN4/ for SUN4 mkdir /home/math2/manabu/pvm3/bin/ mkdir: /home/math2/manabu/pvm3/bin/: File exists *** Error code 1 (ignored) mkdir /home/math2/manabu/pvm3/bin/SUN4/ cc -0 -I../ -I/usr/local/pvm3/include/ -o master .. /master.c -L/usr/local/pvm3 /lib/SUN4/ -lpvm3 cp master /home/math2/manabu/pvm3/bin/SUN4/ cc -0 -I../ -I/usr/local/pvm3/include/ -o slave . ./slave.c -L/usr/local/pvm3/l ib/SUN4/ -lpvm3 cp slave /home/math2/manabu/pvm3/bin/SUN4/ chobi1, ls -F SUN4 master* slave* chobi1,

    このように aimkはアーキテクチャ (PYMname)に対応するデイレクトリヘバイナリを作成してくれます.

    25VPATHをサボートしている GNUmakeなどでは,もうちょっときれいに Makefileを菩くことができます.

    大阪大学大型計算機センターニュース -77- Vol. 23 NC14 1994-2

  • 2.2 Programing on Onyx Using Power C Analyzer

    次に PowerC による Onyx上での並列化について紹介します.Power C を使うと,例えば

    for (i = O; i < 800; i++)

    A (i)・, ,_.,_., • .,!,

    という forループを,次の図に示すようにタスクを 8つの CPUへ分割して並列実行することができます:

    A(O) A (100) A(200) A (300) A (400) A(500) A(600) I I I I I I I

    A(99) A(l99) A(299) A (399) A(499) A(599) A(699)

    次のプログラム26を例に,まず簡単に PowerC の使い方を紹介しておきます:

    #include

    double p[2048][2048];

    main()

    int i, j;

    for (i = O; iく 2048; i++) for (j = O; jく 2048; j++)

    #define ct (x:) (-1.0+2•((double) (x:) /2048)) p[i] [j] = sin (ct(i) + sin (ct(j)));

    printf ("知¥n",p [1][1]) ;

    このプログラムを通常にコンパイルして実行すると

    cconyx01Y. cc -02 test.c -lm

    cconyx01Y. sh -c "time ./a.out"

    -9.639919e-01

    real 10.95

    user 9.47

    sys 1. 41

    A(700) I

    A(799)

    というように 10.95秒かかる計算が,コンパイラに対して PowerC Analyzer (以下 PCA)を使うオプショ

    ンを指定することにより

    26最後の中途半端な printfによる出力は,どこかで配列 pを参照しないと,最適化アルゴリズムによって)レープ内の代入がごっ

    そりはしよられ七しまうことがあるため,付け足したものです.

    大阪大学大型計算機センターニュース -78- Vol. 23 No.4 1994--2

  • cconyx01% cc -02 -pea test.c -lm cconyx01% sh -c "time ./a.out" -9.639919e-01

    real 2.96

    user 9.80

    sys 4.31

    このように, 2.96秒で終ります⑰

    この例では, 3から 4倍の実行速度の向上が見られました.1つの CPUで動作している状況と, 8つの

    CPUが動作している状況を gr_osviewプログラムによってモニタしたのが次の図です.青い(もっとも色

    の涙い)部分が計算に使われている割合を表します:

    右側の図を見ればわかるように,この例ではあまり効率的に CPUは動いていませんが,場合によっては,

    8倍の速度が得られることもあります.

    PCAによる自動並列化の条件

    さて,非常に残念なことに,どのようなプログラムもこのような並列化の対象になるわけではありません.

    PCAによって自動的に並列化される対象となるのは,‘‘行儀の良い"forループのみです.まず,どのよ

    うな forループが行儀が良いとみなされ,並列化の対象となるのか,その条件を列挙してみましょう 28:

    1. while文や do-while文による)レープは対象外.

    X : i = O; while (iく 1000) {…, i++; }

    X : i = O; do {…, i++} while (iく 1000)29

    〇:for (i = O; iく 1000; i++) {…}

    27この植の比較は,本来 user時間ですべきものですが,並列動作したプロセスの user時間が総和されるため, user時間では並列化の効果が計れません.

    なお,スーバコンビュータ SX3で同じプログラムをベクトル化して実行すると,このような数学関数を用いた演算は測定不能な程商速に実行されます.このような演算が多いプログラムでは, PVMを使ってタスクを SX3に振ると劇的なパフォーマンスの向上が期待できます.

    28ここに上げた条件は,ベクトル化コンバイラのための条件とほぽ一致します.PCAは自動ペクトル化の技術を応用しているようです.29他の 2つとは意味が異なります.

    大阪大学大型計算機センターニュース -79- Vol. 23 No.4 1994-2

  • 2. 繰り返しを行なう変数が再初期化式30で明示されている.

    X : for (i = 1000 ; i--> O;)…

    0 : for (i = 999; i >= O; i--)…

    3. すべての繰り返しで添字変数が独立していること

    (a)実行前に繰り返しの回数が決まる31.

    △ : for (i = O; iく 1000; i += 2) ...

    X : :for (i = O; iく 1000; i += i)… X : :for (~= O; iく 1000; i++) {…; i += 3; …}

    (b)分岐 (break,goto, return文)を含まない(ただし continue文は良い).

    X : for (i = O; iく 1000; i++)

    江 (i* i > 1000) break;

    4. すべての繰り返しが独立していること

    (a)ループ内での変数の代入に繰り返しによる依存性がない.

    X : for (i = 1; iく 1000; i++)

    a[i] = a[i-1] + i;

    (b)ループ内での関数呼び出しやシステム・コールは基本的に駄目.

    X : for (i = O; i < 8; i++)

    printf ("1/.d", i);

    以下では)もう少し詳しく,これらの条件について解説しましょう.

    2.2.1 while文や do-while文によるループは対象外

    既存のソース・コードを並列化の対象とするには,まず, whileや do-whileループを等価な forループに置き換えておきます.

    2.2.2 繰り返しを行なう変数が再初期化式で明示されている

    PCAは) "for (初期化式;条件式;再初期化式)”の再初期化式から並列化のためのタスク割当を行なうための添字を決めています.どの変数を添字としたループなのかをはっきりさせないといけません.

    2.2.3 すべての繰り返しで,添字変数が独立していること

    ●繰り返しの回数が実行前に決ること

    for (i = O; iく 1000; i+=2)

    はこのままでは自動的には並列化されませんが

    301:or (... ; …;ここ)のこと.31ここに上げた例でも決まらないわけではないのですが,より正確には,定数ステップでループを回さなくてはならない,というこ

    とです.

    大阪大学大型計算機センターニュ ス -80- Vol. 23 No.4 1994

  • #pragma concurrent

    for (i = O; iく 1000; i+=2)

    と付け加えることにより,並列化が行なわれます四

    for (i = O; iく 1000; i+=i)

    のように,繰り返しの添字が定数ステップでないループの並列化は自動的に検出されないので,書き直す必

    要がありますなお

    for (i = O; iく 1000; i++) {

    •9

    3 =

    •十.

    ••

    1

    } . .

    のように,ループ本体で添字を変更することは,添字の独立性を損ない,並列化は行なわれません.

    条件式がなく,無限ループになるものも並列化は行なわれません.

    ● 分岐を含まない

    ループが途中で中断するものは,並列化に馴染みません.次のリスト

    for (i = 1; iく 1000; i++)

    for (j = 1; jく 1000; j++)

    if (j * j > 100) break;

    の外側のループは並列化できますが,このままでは PCAの並列化の対象になりません.この場合では,内

    側のループを関数にするしかありません(次節の既存のプログラムの並列化の例を参照).

    2.2.4 すべての繰り返しが独立していること

    繰り返しの独立性はループの並列化においては極めて重要です.

    ●変数の独立性

    ある繰り返しにおけるデータが,他の繰り返しでのデータに依存していると,並列化は行なわれません.

    これをチェックするには,繰り返しを逆に行なうとどうなるかを考えてみると良いでしょう.

    for (i = O; iく 100; i++)

    for (j = 0; jく 100; j++)

    a[i*100+j] = i+j;

    とすべきところを

    a[i*10+j] = i+j;

    のように間違ってしまった場合は, PCAは警告を与え,並列化を行ないません33_

    32#pragma行は,処理系に依存する指定を行なうための制御行です ([4],[5] p.294). 33ちょっと賢いですね.

    大阪大学大型計算機センターニュース 81 Vol. 23 No. 4 1994 -2

  • 次の例ように,関数に渡される引数の変数の独立性がはっきりしない場合は並列化は行なわれません:

    foo (a, b)

    int *a, *b;

    for (i = O; iく 100; i++)

    a[i] = b[i];

    しかし

    #pragma distinct (*a, *b)

    #pragma concurrent

    for (i = O; iく 100; i++)

    a[i] = b[i];

    と宣言すれば,並列化の対象とすることが出来ます砂

    次の例では,変数の独立性は失われています:

    for (i = O; iく 100; i++)

    sum += a[i];

    しかし,次のようにコンバイラ・オプションで「敷居を低くする」ことによって並列化を行なわせることが

    できます廷

    f cconyx01¼cc -pea -WK, -r=2 test. c

    ● 関数呼び出しの独立性

    関数呼び出しは,基本的に並列化の対象となりません.しかし,この節の冒頭に上げた例では, sinをルー

    プの中で使っていました. sinや cosなどの数学関数が並列化の対象になる秘密はヘッダー・ファイル

    "/usr/include/math.h"にあります.ちょっと覗いてみましょう:

    extern double sin(double);

    #pragma no side effects (sin)

    というように,プロトタイプ宣言の次に,“この関数は並列化の際に副作用を起こさないよ”という宣言が

    されているのです.

    3棧諏の PCAでは, #pragmadistinctだけでは並列化の対象にならなず,一方, #pragmaconcurrentだけでも強引に並列化できますが,プログラマの可読性のために #pragmadistinctを菩いておくと良いでしょう.

    35並列実行する枝の数だけ一時的な変数を用意し,足し合わせれば並列化可能,というわけです.

    大阪大学大型計算機センターニュース - 82 Vol. 23 No.4 1994 -2

  • これはユーザが定義する関数でも,ユーザの責任において宣言することができます:

    #pragma no side effects (sum)

    sum (i) int i; { c[i] = a[i) + b[i] };

    main ()

    ...

    for (i = O; i < 8; i++)

    sum (i);

    } . .

    または,ループの直前に

    #pragma concurrent call

    for (i = O; i < 8; i++)

    sum (i);

    という宣言を加えることによって,並列化を促すことも可能です36_

    副作用のないライプラリ関数は限られています(数学関数以外にはほとんどありません).

    #pragma concurrent call

    for (i = O; i < 8; i++)

    printf ("i = 1/,d¥n", i);

    して強引に並列化することもできるのですが,強引な並列実行は予期しない暴走を招きます37_

    36両者には微妙な違いがあります.例えば,副作用がないことを宜言した関数は un-rollingの対象になります.37一般に,ライプラリ関数はコンテキスト内の大域変数(ライプラリ変数)を参照していますが,並列化されたタスクがこれらを排

    他制御することなくアクセスする可能性があるからです.

    大阪大学大型計算機センターニュース -83- Vol. 23 No.4 1994-2

  • 既存のコードを自動並列化のために手直しする

    ここでは,前節で取り上げた "mtile.c" を例として,既存のコードをチューニングする様子を紹介しま

    す.その場合,なんといっても璽要なのが,時間のかかるループを探すことです.まず第一にプロファイリ

    ングを行なってみて,効果のある部分を探して下さい ([10]p.190). ここでは,当然 calc_tileのループ部

    分をチューニングすることになります.

    とりあえず PCAにかけてみる

    PCAに listオプションを与えると, PCAの出力するメッセージをファイルにすることができます.ファ

    イルは,ソース・ファイルのの拡張子を .Lにしたもので,次のカテゴリのメッセージが含まれます:

    Loop Table : 各々のループについて PCAが行なった最適化,または,最適化が行なわれなかった理由

    Summary Table : PCAが行なった最適化の要約

    さっそく "mtile.c" をそのまま PCAにかけてみましょう:

    cconyxOl¼ls Makefile.aimk 皿 ain.c ne1111. xbm redo. xbm zout.xbm

    bars.xbm mtile.c quit.xbm xep.c

    cconyxOl¼cc -pea list -cckr -I/usr/local/pvm3/include -c mtile.c

    cconyxOl¼ls Makefile.aimk mtile.L bars. xbm mt ile. c mmain.c cconyxOlY.

    mtile.o

    ne1111.xbm quit.xbm redo.xbm

    xep.c zout.xbm

    ''mtile. L" に関数ごとに LoopTableと SummaryTableが交互に記録されます.calc_tileに関係す

    る部分は次のようになっています:

    KAP/SGI_C

    Loop Table

    04.10 k142014 930122 calc_tilo

    24-Jan-1994 13:42:58 Page 3

    -------------------------------- Loop Table --------------------------------

    Loop Message ======= Lin● : 130

    11hilo 1. Enhanced Scalar

    Lino; 130 Lino: 132 Lino; 132 Lin● : 136

    11hilo 1. Enhanced Scalar

    Lino: 132 Lino: 136

    11hilo 1. Enhanced Scalar

    Lino:136 "L KAP/SGI_C

    Optimization Swnmary

    !lost Lovol Contains Lines

    Statomont deleted because of scalar optimization.

    130-146 ". ,/mtilo.c" 130-146 " .. /mtile. c"

    Independent index set not found for this loop. Statement deleted because of scalar optimization. Independent index sot not found for this loop. Independent index sot not found for this loop,

    2 132-146 " .. /mtilo.c" 2 132-145 ". , /mt ile, c"

    Independent index sot not found for this loop, lndopondont index set not found for this loop,

    3 136-143 " .. /mt ilo. c" 3 136-143 ", , /mt ile. c"

    Independent index sot not found for this loop.

    04.10 lc142014 930122 calc_tile

    24-Jan-1994 13:42:58 Page 4

    3 loops total

    2 11ith optimization disabled 1吐 thbranches out of/into loop

    大阪大学大型計算機センターニュース 84- Vol. 23 Nu4 1994-2

  • Loop Tableの "Loop" という項目をみると, PCAはforループを Yhileループと扱っていることがわ

    かります.メッセージを見ると,どのループにたいしても独立した添字が見つからないようです.

    チューニング:その 1

    前節の並列化の条件を思い出して,

    130 for (iy = ht; iy--> O;) { 131 y = (iy * y2) / ht + yl; 132 for (ix = Yd; ix--> O;) { 133 x = (ix * x2) / Yd + xl;

    という部分を

    130 for (iy = O; iy < ht; iy++) { 131 y = (iy * y2) I ht + yl; 132 for (ix = O; ix < 11d; ix++) { 133 x = (ix * x2) / lld + xl;

    のように書き直してみましょう.PCAにかけると,次のメッセージが出力されます:

    KAP/SGI_C

    Loop Table 24-Jan-1994 13:49:49

    04 .10 k142014 930122 ca.lc_tilo

    Pago 3

    -------------------------------- Loop Tab lo

    !lest Loop Message Level Contains Lines

    for iy 1 130-146 " . ./mt ilo. c" 1 . Scalar 1 130, 132,

    134-146 " .. /mt ilo. c" Line:136 Statement deleted because of scalar optimization. Line:136 Independent index set not found for this loop. Line:136 !lon-optimizablo statement found. Line: 136 Unrolling of this loop was not done because I/HILE loops are not unrolled.

    for ix 2 132-145 " .. /mtile.c" 1. Scalar 2 132, 134-145 " .. /mtilo.c"

    Line:136 Stat● ment deleted because of scalar optimization. Line:136 Independent index sot not found for this loop. Line:136 !lon-optimizablo statement found. Line: 136 Unrolling of this loop was not done because I/HILE loops are not unrolled.

    while 3 136-143 " . ./mtile.c" 3 136-143 " .. /mt ile, c"

    Independent index sot not found for this loop. 恥 n-optimizablostatement found.

    1. Enhanced Scalar Line: 136 Line: 136 Lino: 136 Unrolling of this loop vas not done because I/HILE loops are not unrolled.

    "L KAP/SGI_C 04.10 k142014 930122

    calc_tile Optimization Summary

    24-Jan-1994 13:49:49 Page 4

    3 loops total

    1 11ith branches out of/into loop 1 11ith unoptimizable statements in loop 1 11ith scalar inner loops

    今度は iyとixをforループの添字として並列化を試みているようですが, "Non-optimizablestatement

    found." というメッセージとともに並列化は失敗しています.その要因は, SummaryTableの "lwith

    branches out of/into loop" というメッセージに示されているように, itrに対する forループにおける

    break文にあります.

    大阪大学大型計算機センターニュース -85- Vol. 23 No. 4 1994 -2

  • この例のように,ループの入れ子のうちの最も内側のループで break文を使ってしまうと,その外側の

    ループでの並列化の可能性は見捨てられてしまうようです.この入れ子のままどうあがいても並列化は行

    なわれません,

    チューニング:その 2

    対策としては,最も内側のループを関数として切り出してしまうしかありません:

    110 char* 111 calc_tile(xl, yl, x2, y2, Yd, ht)

    112 double xl, yl, x2, y2; I* tile corner coords *I 113 int口d,ht; I* size of tile *I 114 {

    115 char *pix; 116 int ix, iy; 117 double x, y; 118

    I* calculated image *I I* pixel coords *I I* re, im coords *I

    119 if (wd < 1 I I wd > 2048 I I htく 111 ht > 2048) { 120 fputs("insane wd/ht¥n", stderr); 121 pVlll_exitO; 122 exit(l); 123 } 124 pix= (char*)tnalloc(wd * ht); 125 x2 -= xl; 126 y2 -= yl; 127 for (iy = O; iy < ht; iy++) { 12s y = (i y * y2) I ht + y 1 ; 129 for (ix = 0; ixく wd; ix++) { 130 x = (ix * x2) / wd + xl; 131 pix[iy * wd + ix] = -(iterate (x, y)); 132 } 133 }

    134 return pix; 135 }

    136 137 138 iterate (x, y) 139 double x, y; 140 { 141 int ite; 142 register double ar, ai; 143 register double al, a2; 144 145 ar = x, ai = y;

    I* nu皿berof iter until divergence *I I* accumulator *I

    146 for (ite = O; iteく 255; ite++) { 147 al = (ar * ar) ; 148 a2 = (ai * ai) ; 149 if (al + a2 > 4.0) 160 break; 151 ai = 2 ,. ai * ar + y;

    152 ar = al -a2 + x; 153 } 154 return 1te; 155 }

    しかしこのままでは並列化の対象にはなりません.ループ内に関数呼び出しが含まれてしまったからです.

    チューニング:その 3

    関数 iterateは並列化による副作用 (sideeffect)はありませんから,ループの手前で "#pragmaconcurrent

    call" と宣言するか,

    大阪大学大型計算機センターニュース -86- Vol. 23 Nn4 1994-2

  • 127 #pragma concurrent call 128 for (iy = O; iy < ht; iy++) {

    129 y = (i y * y2) / ht + y 1 ; 130 for (ix = O; ix < 11d; ix++) {

    131 x = (ix * x2) / 11d + xl; 132 pix[iy * 11d + ix] = -(iterate (x, y)); 133 } 134 }

    または,関数の宣言の後で "#pragmano side effects (iterate)"と宣言すれば並列化が行なわれます:

    110 int iterate () ; 111 #pragma no side effects (iterate)

    この Mandelbrot集合の計算例では,並列化を行なうと 8つの CPUがまんべんなく利用され, 1つの

    CPUで計算した場合よりほぼ 8倍高速に計算できます.

    並列化の落し穴

    この例のようにループが二誼になっている場合,外側のループで並列化される場合と内側のループで並

    列化される場合があります.

    後者の場合は,並列で動作しているタスクの同期を取るためのコードが入る場合があるのですが,この同

    期がバフォーマンスの低下や,予期しないデッドロックを招くことがあります⑱

    試しに

    127 #pragma serial

    128 for (iy = O; iy < ht; iy++) { 129 y = (iy * y2) / ht + yl; 130 #pragma concurrent call 131 for (ix = O; ix く口d; ix++) {

    132 x = (ix * x2) / Yd + xl; 133 pix[iy * Yd + ix] = -(iterate (x, y)); 134 } 135 }

    といように無理矢理内側のループで並列化を行なうと, PCAは

    _Kii2 = wd > 28; 書pragmaparallel if(wd > 30) byvalue(wd, x2, xl, y2, ht, yl) shared(pix) local(_Kiil, _Kddl, ix, iy)

    { for (iy = O; iy

  • PVMの使用許諾表示

    PVM 3.2: Parallel Virtual M邸 hineSystem 3.2 University of Tennessee, Knoxville TN.

    Oak Ridge National Laboratory, Oak Ridge TN. Emory Uヰversity,Atlanta. GA.

    Authors: A. L. Beguelin, J. J. Dong匹 ra,G. A. Geist, R. J. Manchek, B. K. Moore, and V. S. Sunder皿

    (C) 1992 All Rights Reserved

    NOTICE

    Permission to use, copy, modify, 皿 ddistribute this soft-W紅 ea.nd its documentation for a.ny purpose a.nd without fee is hereby gra.nted provided that the a.bove copyright notice appe四 inall copies and that both the copyright notice a.nd this penruss10n notice appe紅 msupporting documenta.tion.

    参考文献

    Neither the Institutions (Emory University, 0吐 RidgeNational Laboratory, and University of Tennessee) nor the Authors make any representations about the suitabil-ity of this software for any purpose. This software is pro-vided "as is" without express or implied warranty.

    PVM 3.2 was funded in pa.rt by the U.S. Department of Energy, the National Science Foundation and the State of Tennessee.

    [1] H.-0. Peitgen, P.H. Richter, "The Beauty of Fractals", Springer-Verlag (1986).

    (2]宇敷重広 ([1]邦訳), 「フラクタルの美—複素力学系のイメージ」,シュプリンガー・フェアラーク

    (1988).

    [3]横田一郎,佐倉直男,味木博,「ベクトルと行列」,現代数学社 (1974).

    (4] W. B. Kernighan, D. M. Ritchie, "The C programming language. Second Edition", Prentice-Hall

    (1988).

    [5]石田晴久 ((4]邦訳),「プログラミング言語 c第 2版」,共立出版 (1989).

    [6] Al Geist, Adam Beguelin, Jack Dongarra, Weicheng Jiang, Robert Manchek, Vaidy Sunderam, "PVM

    3.0 User's Guide and Reference Manual", with PVM distribution (1993).

    [7] "Parallel Virtual Machine Quick Reference Guide Release 3.2", with PVM distribution (1993).

    [8] Eugene N. Miya, "P VM version 3 Frequentrly Asked Questions", via NetNews on comp.parallel.pvm

    (1993).

    [9] "P VM version 3 Frequenty Asked Questionsー Technical",with PVM distribution (1993).

    [10]村井純,井上尚司,砂原秀樹,「プロフェッショナル UNIX」,アスキー出版局 (1986).

    [ll] "IRIS Power C User's Guide", Silicon Graphics, Inc., document number 007-0606-052 (1993).

    大阪大学大型計算機センターニュース -88- Vol. 23 No.4 1994-2