• 検索結果がありません。

SX-7C FORTRAN90/SX の自動ベクトル化機能

N/A
N/A
Protected

Academic year: 2021

シェア "SX-7C FORTRAN90/SX の自動ベクトル化機能"

Copied!
18
0
0

読み込み中.... (全文を見る)

全文

(1)

SX-7C FORTRAN90/SX の自動ベクトル化機能

横谷 雄司 1

1 日本電気株式会社 第一コンピュータソフトウェア事業部

概 要

SX-7C システムは豊 富 なベクトル演 算 命 令 を有 しており,そのハードウェア性 能 を十 分 に引 き出 すためには,コンパイラの自 動 ベクトル化 機 能 によりプログラムのベクトル化 を行 い,ベクトル命 令 によって処 理 される時 間 の割 合 (ベクトル化 率 )をできるだけ高 くする必 要 がある.本 文 では,SX-7C システムの FORTRAN90/SX コンパイラがもつ自 動 ベクトル化 機 能 について,その特 長 と性 能 向 上 の観 点 を紹 介 する.

1. はじめに

SX-7C システムは 8 個 の CPU をもつノードを複 数 結 合 した「スケーラブル・パラレル・ス ーパーコンピュータ」であり,そのハードウェア性 能 を十 分 に引 き出 すためには,

・ 複 数 の CPU を効 率 的 に使 用 する,並 列 化 と共 に,

・個 々の CPU の中 で効 率 的 に計 算 を行 う,ベクトル化 が大 変 重 要 となります.

並 列 化 につきましては別 稿 に譲 り,本 稿 では,FORTRAN90/SX コンパイラがもつ自 動 ベクトル化 機 能 についてご紹 介 致 します.

2. 自 動ベクトル化 機能

SX-7C システムでのベクトル化 技 法 は,SX-7 システムの場 合 と基 本 的 には同 じですが,

今 回 はスーパーコンピュータを初 めて使 われる方 にもご理 解 いただけるよう,ベクトル化 の 基 本 概 念 からご紹 介 させていただきたいと思 います.

2. 1 ベクトル化 の基 本 概 念

通 常 の演 算 命 令 は,一 度 に一 組 のデータに対 する演 算 処 理 を行 います.(これを,ベ クトル命 令 と対 比 させるためにスカラ命 令 と呼 びます.)

(2)

A1+B1

A2+B2

A3+B3

・・・・・

An+Bn

n 個 の演 算 の実 行 時 間

図 1 スカラ命 令 (スカラ加 算 )の実 行 イメージ

これに対 して,ベクトル命 令 は,複 数 の組 のデータに対 する演 算 処 理 を一 つの命 令 で 一 度 に行 うことができます.

A1 + B1 A2 + B2 A3 + B3

: An + Bn

ベクトル命 令 の実 行 時 間

図 2 ベクトル命 令 (ベクトル加 算 )の実 行 イメージ

ループ中 で計 算 される行 列 の要 素 など,規 則 的 に並 んだ配 列 データ(ベクトルデータ) に対 してベクトル命 令 を適 用 することを自 動 ベクトル化 と呼 び,ベクトル化 することによって 高 速 な演 算 が可 能 となります.

2.2 自 動 ベクトル化 の例

例 えば,次 の DO ループは,2 つの配 列 からのデータのロード,ベクトル加 算 ,メモリへの ストアの 4 つのベクトル命 令 で実 行 されます.

例 1 配 列 代 入 文 と,ベクトル化 されて生 成 される命 令 の概 念 DO I=1,100

C(I) = A(I) + B(I) END DO

VR1 ← 配 列 A (配 列 Aからベクトルレジスタにデータをロード)

(3)

VR2 ← 配 列 B (配 列 Bからベクトルレジスタにデータをロード) VR3 ← VR1 + VR2 (ベクトル加 算 )

配 列 C ← VR3 (配 列 C に結 果 をストア)

VRn:ベクトルレジスタ

2.3 ベクトル化 の対 象 範 囲

FORTRAN90/SX コンパイラは,Fortran プログラムの以 下 の範 囲 を対 象 として自 動 ベク トル化 を行 います.

表 1 FORTRAN90/SX 自 動 ベクトル化 対 象

ベクトル化 の対 象 となるループ 配 列 式 ,DO ループ,DO WHILE ループ,

FORALL ループ,IF 文 と GOTO 文 によるループ ベクトル化 の対 象 となる文

代 入 文 ,CONTINUE 文 ,GOTO 文 , CYCLE 文 ,EXIT 文 ,IF 文 ,SELECT 構 文 (CALL 文 ,入 出 力 文 等 は不 可 )

ベクトル化 の対 象 となるデータの型

4 バイト/8 バイトの整 数 型 ・論 理 型 単 精 度 /倍 精 度 の実 数 型 ・複 素 数 型

(文 字 型 ,4 倍 精 度 ,2 バイト整 数 型 等 は不 可 ) ベクトル化 の対 象 となる演 算

加 減 乗 除 算 ,べき算 ,論 理 演 算 ,関 係 演 算 , 型 変 換 ,組 込 み関 数

(利 用 者 定 義 演 算 ,ポインタ代 入 等 は不 可 )

詳 細 につきましては,「FORTRAN90/SX プログラミングの手 引 5.1 ベクトル化 の条 件 およびベクトル化 の例 」を参 照 してください.

2.4 ベクトル化 可 能 な条 件

しかし,上 記 の範 囲 内 であれば,どんなプログラムでもベクトル化 できる訳 ではありませ ん.次 の例 を見 てください.

例 2 DO I=1,99

A(I) = 2.0 ! 代 入 文 2-1 B(I) = A(I+1) ! 代 入 文 2-2 END DO

図 3 に,このプログラムをベクトル化 しない場 合 ,ベクトル化 した場 合 の演 算 の実 行 順 序 を示 します.

(4)

ベクトル化 しない場 合 の実 行 順 序

ベクトル化 した場 合 の実 行 順 序

A(1)=2.0 ! 代 入 文 2-1 B(1)=A(2) ! 代 入 文 2-2 A(2)=2.0 ! 代 入 文 2-1 B(2)=A(3) ! 代 入 文 2-2

A(99)=2.0 ! 代 入 文 2-1 B(99)=A(100)! 代 入 文 2-2

A(1)=2.0 ! 代 入 文 2-1 A(2)=2.0 ! 代 入 文 2-1

A(99)=2.0 ! 代 入 文 2-1 B(1)=A(2) ! 代 入 文 2-2 B(2)=A(3) ! 代 入 文 2-2

B(99)=A(100)! 代 入 文 2-2 図 3 ベクトル化 の有 無 による実 行 順 序 の相 違

例 2 のループをベクトル化 して実 行 すると,全 ての要 素 に対 して 2-1 の代 入 がベクトル 命 令 で実 行 され,次 に 2-2 の代 入 がやはり全 ての要 素 に対 して実 行 されます.このため,

配 列 B(1)~B(98)の値 は全 て 2.0 となり,プログラムの意 図 と異 なる結 果 となってしまいま す.

また,N 回 目 の繰 り返 しで定 義 したスカラ変 数 を N+1 回 目 の繰 り返 しで引 用 する,例 3 のようなプログラムも,全 ての要 素 に対 して 3-1 の代 入 が先 に実 行 されるため,ベクトル化 すると配 列 A(1)~A(100)の値 が全 てゼロとなってしまいます.

例 3 S=0.0 DO I=1,100

A(I) = S ! 代 入 文 3-1 (スカラ変 数 S の引 用 ) S = B(I)+C(I) ! 代 入 文 3-2 (スカラ変 数 S の定 義 ) END DO

これらのプログラムのように,ベクトル化 によって配 列 の定 義 ・引 用 関 係 に変 化 が生 じて しまう場 合 には,ベクトル化 することができません.

FORTRAN90/SX の自 動 ベクトル化 機 能 は,コンパイラがソースプログラムを解 析 して,

ベクトル命 令 で実 行 できる部 分 を自 動 的 に検 出 するとともに,必 要 ならベクトル化 に適 合 するようにプログラムを変 形 して,その部 分 に対 してベクトル命 令 を生 成 します.

(5)

2.5 Fortran95 配 列 構 文 のベクトル化

例 2 のプログラムは,FORTRAN77 と同 じ DO ループでしたが,Fortran95 配 列 構 文 で はどうでしょうか.

例 4 A(1:99)=2.0 ! 代 入 文 2-1 B(1:99)=A(2:100) ! 代 入 文 2-2

配 列 構 文 は DO ループと異 なり,それぞれの文 毎 に全 ての要 素 を演 算 することが,規 格 で定 められています.即 ち例 4 では,まず代 入 文 2-1 によって A(1:99)=2.0 を全 て実 行 してから,代 入 文 2-2 を実 行 します.これはすなわち図 3 に示 した「ベクトル化 した場 合 の 実 行 順 序 」と同 じです.従 って Fortan95 配 列 構 文 では,例 2 の様 に複 数 の文 の前 後 関 係 によってベクトル化 が阻 害 されることはありません.(もちろん他 の要 因 でベクトル化 でき ないことはあります.) なお,Fortran95 配 列 構 文 については「FORTRAN90/SX 言 語 説 明 書 」を参 照 してください.

2.6 ベクトル長

個 々のベクトル命 令 は,演 算 処 理 に入 る前 にある程 度 の準 備 処 理 が必 要 となります.こ の準 備 処 理 に要 する時 間 を立 ち上 がり時 間 と呼 びます.即 ち,実 際 のベクトル演 算 に要 する時 間 が余 りにも小 さいと,立 ち上 がり時 間 の影 響 が大 きくなり,ベクトル化 による高 速 化 が行 えません.

ベクトル化 した場 合 とベクトル化 しない場 合 とで実 行 時 間 が等 しくなるループの繰 り返 し 数 (ループ長 )を交 叉 ループ長 と呼 び,立 ち上 がり時 間 と交 叉 ループ長 には,図 4に示 す 関 係 があります.

実 行 時 間 ベクトル化 しない場 合

ベクトル化 した場 合

立上 がり時 間 ループ長 交 叉ループ長

図 4 立 上 がり時 間 と交 叉 ループ長

(6)

この図 を見 ると,ループ長 をできるだけ長 くした方 が,ベクトル化 による高 速 化 の効 果 が 大 きいことが,おわかりいただけると思 います.

FORTRAN90/SX コンパイラの自 動 ベクトル化 では,ループの繰 り返 し回 数 が 5 未 満 の 場 合 には,ベクトル化 による効 果 が少 ないと判 断 し,ベクトル化 していません.

3. 拡 張ベクトル化 機能

前 述 の通 り,FORTRAN90/SX の自 動 ベクトル化 機 能 は,ベクトル命 令 で実 行 可 能 な部 分 を検 出 しますが,そのままではベクトル化 できない場 合 にプログラムを変 形 してベクトル 化 したり,プログラムを変 形 することによってベクトル化 の効 果 をさらに高 めたりします.これ を拡 張 ベクトル化 機 能 と呼 びます.ここでは,FORTRAN90/SX が持 つ種 々の拡 張 ベクト ル化 機 能 のうち主 なものを紹 介 します.

3.1 文 の入 れ換 え

先 ほどの例 2 は,「ベクトル化 できない」と書 きましたが,二 つの文 を入 れ換 えるとベクト ル化 できることに気 づかれたでしょうか?

例 5 ソ ー ス プ ロ グ ラ ム コ ン パ イ ラ に よ る 変 形

DO I=1,99 DO I=1,99

A(I)=2.0 ! 代 入 文 5-1 B(I)=A(I+1) ! 代 入 文 5-2 B(I)=A(I+1) ! 代 入 文 5-2 A(I)=2.0 ! 代 入 文 5-1

END DO END DO

このプログラムを右 のように変 形 すると,ベクトル化 した場 合 でも配 列 の定 義 ・引 用 関 係 が保 存 されますので,FORTRAN90/SX コンパイラは自 動 的 に 5-1 と 5-2 の文 を入 れ換 え てベクトル化 を行 います.

3.2 ループの一 重 化

ループ長 が長 いほどベクトル化 の効 果 が高 いとご説 明 しましたが,例 6 のように多 次 元 配 列 を 1 次 元 配 列 と見 なすことができる場 合 には,多 重 ループを一 重 ループに変 形 する ことでループ長 を拡 大 すると同 時 に,外 側 ループの繰 り返 し制 御 の時 間 を削 減 します.

例 6 DIMENSION A(M,N), B(M,N), C(M,N) DO I=1,M

(7)

DO J=1,N

A(J,I) = B(J,I) + C(J,I) END DO

END DO

↓ コンパイラによる変 形 のイメージ DO IJ=1,M*N

A(IJ,1) = B(IJ,1) + C(IJ,1) END DO

3.3 ループの入 れ換 え

多 重 ループの場 合 には,通 常 は最 も内 側 のループをベクトル化 します.しかし,ループ を入 れ換 えることにより定 義 ・引 用 関 係 の矛 盾 が解 消 されてベクトル化 できるようになった り,内 側 のループよりも外 側 のループの方 がループ長 が長 く,入 れ換 えた方 が速 いと判 断 した場 合 には,コンパイラがループを入 れ換 えてベクトル化 を行 います.

例 7 配 列 A に依 存 関 係 がありベクトル化 できない

DO J=1,M ! 外 側 ループ

DO I=1,N ! 内 側 ループ

A(I+1,J) = A(I,J) + B(I,J) END DO

END DO

依 存 関 係 がなくなりベクトル化 できる

DO I=1,N ! 元 の内 側 ループ

DO J=1,M ! 元 の外 側 ループ

A(I+1,J) = A(I,J) + B(I,J) END DO

END DO

3.4 部 分 ベクトル化

ループ構 造 や配 列 式 に,ベクトル化 できる部 分 とベクトル化 できない部 分 が含 まれてい る場 合 ,ベクトル化 可 能 な部 分 と不 可 能 な部 分 に分 割 し,可 能 な部 分 だけをベクトル化 します.

(8)

例 8 4 倍 精 度 の式 が含 まれているため,ベクトル化 できない

REAL, DIMENSION (M) :: A, B, C REAL(KIND=16), DIMENSION (M) :: Q A(1:M) = B(1:M) * REAL(C(1:M) * Q(1:M))

二 つの配 列 式 に分 割 することで,ベクトル化 する.

作 業 用 の配 列 WK は,コンパイラが用 意 する.

WK(1:M) = REAL(C(1:M) * Q(1:M)) ! この配 列 代 入 文 はベクトル化 できない A(1:M) = B(1:M)*WK(1:M) ! この配 列 代 入 文 をベクトル化 する

3.5 条 件 ベクトル化

配 列 の依 存 関 係 がベクトル化 に適 合 しているかどうかコンパイル時 に不 明 であったり,

ループ長 がコンパイル時 に不 明 で,ベクトル化 したほうが速 いかどうかわからない場 合 に,

ベクトル化 したコードとベクトル化 しないコードの両 方 を生 成 しておき,プログラムを実 行 す るとき,そのどちらかを選 択 して実 行 するものです.

例 9 K が 0 以 上 であるか,または K が-10 未 満 ならばベクトル化 しても配 列 A の各 要 素 の定 義 参 照 順 序 が変 わらないのでベクトル化 できる

DO I=N, N+10

A(I) = A(I+K) + B(I) END DO

↓ コンパイラによる変 形 のイメージ IF (K .GE.0 .OR. K.LT.-10) THEN

A(N:N+10) = A(N+K:N+10+K)+B(N:N+10) ! ベクトル化 する ELSE

DO I=N, N+10 ! ベクトル化 しない A(I) = A(I+K) + B(I)

END DO END IF

(9)

例 10 繰 り返 し回 数 がコンパイル時 に不 明 なため,ベクトル化 したほうが速 いかどう か判 断 できない場 合

A(1:N) = B(1:N) + C(1:N)

↓ コンパイラによる変 形 のイメージ IF (N .GE. 5) THEN

A(1:N) = B(1:N) + C(1:N) ! ベクトル化 する ELSE

A(1:N) = B(1:N) + C(1:N) ! ベクトル化 しない END IF

3.6 マクロ演 算 の認 識

次 のようなパターンは,変 数 や配 列 要 素 が繰 り返 しにまたがって定 義 ・引 用 されるため,

本 来 はベクトル化 できませんが,コンパイラが特 別 なパターンであることを認 識 し,専 用 の ベクトル命 令 を用 いることで,ベクトル化 を行 います.

例 11 総 和 : ひとつ前 の繰 り返 しで定 義 したスカラ変 数 S の値 を,次 の繰 り返 しで 引 用 するため,通 常 はベクトル化 できないが,配 列 A の総 和 を求 めるパター ンであるとコンパイラが認 識 して,総 和 ベクトル命 令 を用 いることでベクトル化 する

DO I=1, N S = S + A(I)

END DO

例 12 漸 化 式 : 配 列 Aのひとつ前 の繰 り返 しで定 義 された値 を次 の繰 り返 しで参 照 するので,専 用 のベクトル命 令 を用 いてベクトル化 する

DO I=1, N

A(I) = A(I-1) * B(I) + C(I) END DO

備 考 :もし A(I-1)=A(I)*B(I)+C(I)であれば,前 の繰 り返 しで定 義 した値 を後 の繰 り返

(10)

しでは参 照 しないため,そのままベクトル化 できる.

例 13 最 大 値 ,最 小 値 を求 める DO I=1, N

IF (XMAX .LT. X(I)) THEN XMAX = X(I)

END IF END DO

3.7 ループ融 合

拡 張 ベクトル化 機 能 ではありませんが,コンパイラは同 じ形 状 (次 元 数 と各 次 元 のサイ ズ)を持 つ複 数 の配 列 式 ,同 じ繰 り返 し回 数 を持 つ複 数 のループ構 造 を一 つにまとめて ベクトル化 します.これをループ融 合 と呼 びます.

例 14 次 の二 つの配 列 代 入 文 は形 状 が一 致 しているので,下 の二 重 ループと同 じように解 釈 ,最 適 化 されてベクトル化 されます.

A(1:M, 1:N) = B(1:M, 1:N) + C(1:M, 1:N) D(1:M, 1:N) = E(1:M, 1:N) * F(1:M, 1:N) + S

コンパイラによる変 形 のイメージ

DO J=1,N DO I=1,M

A(I, J) = B(I, J) + C(I, J) D(I, J) = E (I, J) * F(I, J) + S END DO

END DO

コンパイラは,同 じ形 状 の配 列 式 ・ループ構 造 が連 続 していれば融 合 しますが,間 に形 状 の異 なる配 列 式 ・ループ構 造 や,他 の文 があると融 合 できません.

高 速 化 のためには,出 来 るだけ同 じ形 状 の配 列 式 ・ループ構 造 を連 続 させるようにして ください.

例 15 二 つの配 列 代 入 文 の間 に,形 状 の異 なる配 列 代 入 文 があるために,二 つ

(11)

の配 列 式 は融 合 されません.このような場 合 には,文 の順 序 を入 れ換 えて,

同 じ形 状 の配 列 代 入 が連 続 するように書 き換 えてください.

下 のように書 き換 えることにより,ループ融 合 される

A(1:M, 1:N) = B(1:M, 1:N) + C(1:M, 1:N) X(1:L) = 0.0

D(1:M, 1:N) = E(1:M, 1:N) * F(1:M, 1:N) + S

A(1:M, 1:N) = B(1:M, 1:N) + C(1:M, 1:N) D(1:M, 1:N) = E(1:M, 1:N) * F(1:M, 1:N) + S X(1:L) = 0.0

4. ベクトル化率 向 上のための手 法 4.1 ベクトル化 率

プログラムをスカラ命 令 だけで実 行 させた場 合 の実 行 時 間 に占 める,ベクトル命 令 で実 行 可 能 な部 分 の時 間 の割 合 をベクトル化 率 と呼 びます.

スカラ部 分 ベクトル命 令 で実 行 可 能 な部 分

スカラ部 分 ベクトル化 部 分

Ts×α Ts

Tv スカラ実 行 した場 合

ベクトル実 行 した場 合

α:ベクトル化 率

Ts:スカラ実 行 したときの実 行 時 間 Tv:ベクトル実 行 したときの実 行 時 間

図 5 ベクトル化 率

プログラムをベクトル化 することにより実 行 性 能 が向 上 しますが,プログラムの一 部 だけ をベクトル化 しても,ベクトル化 の効 果 はあまり期 待 できません.ベクトル化 部 分 の実 行 時

(12)

間 が非 常 に小 さくても,ベクトル化 率 が 50%程 度 では,高 々2 倍 の性 能 にしかならないこと は,図 5 からもわかると思 います.一 般 にはベクトル化 率 が 90~95%以 上 ないと,ベクトル 化 による大 きな効 果 は期 待 できません.

すなわち,ベクトル化 による高 速 化 技 法 の一 つは,ベクトル化 率 を高 め,100%に近 づけ ることにあります.

しかし,一 般 にベクトル化 率 を正 確 に求 めることは困 難 であるため,SX-7C では,ベクト ル化 率 に近 い値 として,プログラム特 性 情 報 (proginf)に表 示 されるベクトル演 算 率 を用 い ています(5.1 proginf 情 報 参 照 ).ベクトル演 算 率 は,実 行 された命 令 の数 をハードウェア がカウントすることで,プログラムで処 理 された全 演 算 数 に占 める,ベクトル演 算 命 令 で処 理 された数 の割 合 を求 めたものです.

SX-7C では,このベクトル演 算 率 を高 くすることを目 標 に,チューニングを行 ってくださ い.

ここでは,ベクトル化 率 (ベクトル演 算 率 )を向 上 させる手 法 の一 つとして,コンパイラ指 示 行 についてご紹 介 します.

4.2 コンパイラ指 示 行 の挿 入 による高 速 化

コンパイラは,プログラムに対 して自 動 的 に最 適 なベクトル命 令 を生 成 しますが,例 えば 変 数 のもつ値 のように,コンパイラがプログラムを解 析 してもわからない情 報 があると,必 ず しも十 分 なベクトル化 が行 われるとは限 りません.

このような場 合 に,コンパイラが知 り得 ない情 報 を利 用 者 が与 えることにより,ベクトル化 の効 果 を一 層 促 進 させるものが,コンパイラ指 示 行 です.

コンパイラ指 示 行 は,

!CDIR オプション[,オプション]

*CDIR オプション[,オプション](ソースが固 定 形 式 の場 合 のみ)

のいずれかの形 式 で, !CDIR, *CDIR は,1 桁 から 5 桁 に書 かなければなりません.

詳 しくは「FORTRAN90/SX プログラミングの手 引 3.2 コンパイラ指 示 行 」を参 照 してく ださい.

以 下 に,主 な指 示 行 のオプションとその使 い方 について説 明 します.

a)VECTOR/NOVECTOR

直 後 の配 列 式 または DO ループを自 動 ベクトル化 の対 象 とする(VECTOR)か,対 象 と

(13)

しない(NOVECTOR)ことを指 定 します.

一 般 に VECTOR を指 定 する必 要 はありませんが,ベクトル長 が小 さく,ベクトル化 しな い方 が効 率 の良 いことがわかっていような場 合 に,NOVECTOR を指 定 します.

例 16 例 えば「M は,1 又 は 2 にしかなり得 ない」ことを利 用 者 が知 っている場 合 , 以 下 の様 に NOVECTOR を指 定 して,ベクトル化 を抑 止 したほうが効 率 がよ い

!CDIR NOVECTOR

A(1:M) = B(1:M) * C(1:M) + D(1:M) * E(1:M) - F(1:M) * G(1:M)

b) NODEP

配 列 の定 義 ・引 用 関 係 がコンパイル時 に不 明 で,自 動 ベクトル化 できない場 合 に,利 用 者 が「定 義 ・引 用 関 係 に矛 盾 が無 いから,ベクトル化 するように」指 示 するものです.

例 17 NK の値 が正 であればベクトル化 できる.条 件 ベクトル化 で NK の値 を判 断 す るコードが出 力 されるが,「NK の値 が常 に正 である」ことを利 用 者 が知 ってい る場 合 ,NODEP を指 定 することにより無 条 件 にベクトル化 される.

!CDIR NODEP DO I=1, N

A(I) = A(I + NK) END DO

例 18 IP(I)の値 に重 複 するものが無 ければベクトル化 できるが,もし重 複 するものが ある場 合 にはベクトル化 できない.通 常 コンパイラにはどちらか判 断 できず,

またこの場 合 には条 件 を判 断 する条 件 ベクトル化 もできない.

もし利 用 者 が,「IP(I)の値 に重 複 するものがない」ことを知 っている場 合 には,

NODEP を指 定 することによってベクトル化 することができる.

!CDIR NODEP DO I=1, N

(14)

A( IP( I ) ) = A( IP( I )) + B( I ) END DO

c) SELECT(VECTOR)

指 定 した DO ループをベクトル化 することを指 示 します.

例 19 ループの一 重 化 ができない場 合 ,コンパイラには変 数 L,M,N の値 がわからな いので,通 常 最 内 側 ループでベクトル化 する.

しかし,例 えば L の値 がとても大 きく,M や N の値 がごく小 さいことを利 用 者 が知 っているならば,次 のように SELECT(VECTOR)指 示 行 を挿 入 すること により,右 のように変 形 されて,ループ長 の長 い DO I=1,L のループでベクト ル化 される.

!CDIR SELECT(VECTOR) DO I = 1, L DO J =1, M

DO K=1,N

A(K, J, I)=B(K, J, I)+C(K, J, I) END DO

END DO END DO

↓ コンパイラによる変 形 のイメージ DO J = 1, M

DO K =1, N

DO I = 1,L ! このループがベクトル化 される A(K, J, I)=B(K, J, I)+C(K, J, I)

END DO END DO END DO

上 の例 で,もし,M の値 がとても大 きく,L や N の値 が小 さいならば,DO J=1, M の直 前 に

!CDIR SELECT(VECTOR)

(15)

の指 示 行 を挿 入 すればよいことは,もうおわかりのことと思 います.

d) SHORTLOOP

SX システムのベクトル演 算 命 令 では,一 つの命 令 で一 度 に最 大 256 要 素 のデータを処 理 することができます.それでは,処 理 したいデータの要 素 数 が 256 個 を超 える場 合 には どうでしょうか?この場 合 には次 のように 256 回 ずつの繰 り返 しを持 つループ(例 21 では配 列 式 )に分 割 してベクトル化 を行 います.

例 20 繰 り返 し回 数 が 256 を超 える配 列 式 のベクトル化 の概 念 C(1:1000) = A(1:1000) + B(1:1000)

DO I = 1,1000,256 ! コンパイラが生 成 するループ

C(I:MIN(I+255,1000)) = A(I:MIN(I+255,1000) ) +B(I:MIN(I+255,1000)) ! この配 列 代 入 文 は常 にベクトル化 される

END DO

このようにコンパイラが生 成 するループを,ストリップマイニングループと呼 びます.

しかし,ループ長 が常 に 256 以 下 であることがわかっていれば,このストリップマイニング ループの処 理 が不 要 となりますので,このための処 理 時 間 を削 減 できると同 時 に,レジス タを効 率 的 に使 用 することができます.

SHORTLOOP は,ループ長 が必 ず 256 以 下 であることを指 示 します.

例 21 変 数 M の値 が,常 に 256 以 下 であることがわかっているならば,次 の指 示 行 を挿 入 することで,ストリップマイニングループを作 成 しないようにします.

!CDIR SHORTLOOP

A(1:M) = B(1:M) + C(1:M)

FORTRAN90/SX コンパイラのコンパイラ指 示 行 には,ここで紹 介 した他 にもいろいろな オプションが指 定 でき,ベクトル化 を制 御 することができます.詳 細 につきましては,

「FORTRAN90/SX プログラミングの手 引 3.2 コンパイラ指 示 行 」をご参 照 ください.

(16)

5. 性 能解 析のツール 5.1 proginf 情 報

先 に述 べた,ベクトル演 算 率 を始 め,プログラムの実 行 性 能 を調 べる最 も簡 単 で有 効 な 情 報 がプログラム特 性 情 報 (proginf 情 報 )です.

proginf 情 報 は,プログラムの実 行 時 に,

setenv F_PROGINF YES

または

setenv F_PROGINF DETAIL

を指 定 することで,表 示 されます(東 北 大 学 では規 定 値 として DETAIL が設 定 されていま す).

図 6 は,setenv F_PROGINF DETAIL で採 取 した proginf 情 報 の例 ですが,ベクトル演 算 率 (図 6 の②),ベクトル長 (図 6 の①)ともに非 常 に大 きく,とても効 率 よくベクトル化 され たプログラムでの例 を示 しています.

もしベクトル演 算 率 が低 ければ,コンパイラや後 述 の簡 易 性 能 解 析 機 能 の出 力 情 報 を もとに,ベクトル化 できていないループ構 造 を抽 出 し,ベクトル化 できるように変 形 したり,

指 示 行 を挿 入 するなどして,ベクトル演 算 率 の向 上 を図 ります.

次 に , 平 均 ベ ク ト ル 長 が 短 い 場 合 に は , 2 重 以 上 の ル ー プ 構 造 を 抽 出 し , SELECT(VECTOR)指 示 行 を挿 入 してループ長 の一 番 長 いループがベクトル化 されるよう にすることで,ベクトル長 を拡 大 します.また,ループ長 が極 端 に短 いループ構 造 がベクト ル化 されている場 合 には,NOVECTOR 指 示 行 を挿 入 して,ベクトル化 を行 わないことも 検 討 します.

(17)

****** Program Information ******

Real Time (sec) : 23.579208 経 過 時 間 User Time (sec) : 22.588967 ユーザ時 間 Sys Time (sec) : 0.227827 システム時 間

Vector Time (sec) : 22.044968 ベクトル命 令 実 行 時 間 Inst. Count : 1680849884. 全 命 令 実 行 数 V. Inst. Count : 964802200. ベクトル命 令 実 行 数 V. Element Count : 215295433316. ベクトル命 令 実 行 要 素 数 FLOP Count : 95763953865. 浮 動 小 数 点 データ実 行 要 素 数 MOPS : 9562.698298 MOPS 値

MFLOPS : 4239.412620 MFLOPS 値

①→VLEN : 223.149816 平 均 ベクトル長

②→V. Op. Ratio (%) : 99.668514 ベクトル演 算 率 Memory Size (MB) : 240.031250 メモリ使 用 量 MIPS : 74.410213 MIPS 値 I-Cache (sec) : 0.057218 命 令 キャッシュミス O-Cache (sec) : 0.043932 オペランドキャッシュミス Bank (sec) : 0.006768 バンクコンフリクト時 間 Start Time (date) : 2002/08/28 16:42:34 プログラムの開 始 日 時 End Time (date) : 2002/08/28 16:42:57 プログラムの終 了 日 時

図 6 proginf 情 報 の出 力 例

5.2 簡 易 性 能 解 析 機 能 (ftrace)

proginf 情 報 では,プログラム全 体 のベクトル化 率 (ベクトル演 算 率 )等 を知 ることができま すが,手 続 き単 位 の性 能 を知 ることはできません.

これに対 して,簡 易 性 能 解 析 機 能 (ftrace 機 能 )を使 用 すれば,手 続 き単 位 や指 定 した 範 囲 の性 能 情 報 を表 示 することができ,この情 報 を元 にプログラムの性 能 上 の問 題 点 を 調 べることができます.

簡 易 性 能 解 析 機 能 の使 い方 を以 下 に示 します.

1) プログラムを –ftrace オプションをつけてコンパイル・リンク % sxf90 –ftrace test.f90

2) できた実 行 ファイルを実 行

% a.out

3) ftrace コマンドを実 行

% ftrace

このようにするだけで,第 7 図 に示 すように手 続 き単 位 の平 均 ベクトル長 ,ベクトル演 算 率 などの性 能 情 報 が出 力 されます.

な お , 3) の ftrace コ マ ン ド を 実 行 す る 代 わ り に , 2) の 実 行 の 前 に 環 境 変 数 F_FTRACE に YES を設 定 しておくと,プログラムの実 行 が終 了 したときに,性 能 情 報

(18)

が自 動 的 に表 示 されます(東 北 大 学 では規 定 値 として YES が設 定 されています).

*---*

FLOW TRACE ANALYSIS LIST

*---*

Execution : Wed Aug 28 16:42:57 2002 Total CPU : 0:00'22"569

ベクトル 演 算 率 平 均 ベクトル長 手 続 き名 CALL 回 数 実 行 時 間

PROG.UNIT FREQUENCY EXCLUSIVE AVER.TIME MOPS MFLOPS V.OP AVER BANK TIME[sec]( % ) [msec] RATIO V.LEN CONF

calc2 800 7.594( 33.6) 9.492 9778.0 4874.4 99.72 222.3 0.0000 calc1 800 7.053( 31.2) 8.816 10119.8 4642.8 99.76 222.3 0.0000 calc3 798 5.565( 24.7) 6.973 9212.8 3827.9 99.77 222.3 0.0000 shallow 1 2.346( 10.4) 2346.201 8122.2 1998.5 98.87 232.1 0.0067 initial 1 0.007( 0.0) 6.979 6084.6 2188.4 98.93 222.4 0.0000 calc3z 1 0.005( 0.0) 5.479 3930.8 0.0 99.31 222.5 0.0000 ---tota l 2401 22.570(100.0) 9.400 9570.7 4243.0 99.67 223.2 0.0067

図 7 ftrace コマンドの出 力 例

より詳 しい使 い方 については,「FORTRAN90/SX プログラミングの手 引 10.3 簡 易 性 能 解 析 機 能 」をご参 照 ください.

6.おわりに

以 上 ,FORTRAN90/SX コンパイラの自 動 ベクトル化 機 能 を中 心 にご紹 介 させていた だきました.FORTRAN90/SX コンパイラは,他 にも本 稿 でご紹 介 できなかった種 々のベク トル化 機 能 を持 っています.詳 細 につきましては,「FORTRAN90/SX プログラミングの手 引 」を参 照 してくださるようお願 い致 します.

皆 様 が SX-7C と FORTRAN90/SX を使 っていただくうえで,本 稿 が,多 少 なりともお役 に立 てれば幸 いです.

参考 文 献

[1]FORTRAN90/SX 言 語 説 明 書 日 本 電 気 株 式 会 社 G1AF06 [2]FORTRAN90/SX プログラミングの手 引 日 本 電 気 株 式 会 社 G1AF07

図 6  proginf 情 報 の出 力 例   5.2  簡 易 性 能 解 析 機 能 (ftrace)    proginf 情 報 では,プログラム全 体 のベクトル化 率 (ベクトル演 算 率 )等 を知 ることができま すが,手 続 き単 位 の性 能 を知 ることはできません.    これに対 して,簡 易 性 能 解 析 機 能 (ftrace 機 能 )を使 用 すれば,手 続 き単 位 や指 定 した 範 囲 の性 能 情 報 を表 示 することができ,この情 報 を元 にプログラムの

参照

関連したドキュメント

概要:科学技術計算や画像処理,機械学習の分野をはじめとして,アプリケーションの高速化が求められ

58 STEMスループット向上のためのFIB自動化機能活用 解析技術

概要:科学技術計算や画像処理,機械学習の分野をはじめとして,アプリケーションの高速化が求められ

概要:科学技術計算や画像処理,機械学習の分野をはじめとして,アプリケーションの高速化が求められ

参考文献 石井 利昭 1989 年日立製作所入社,日立研究所 材料研究センタ 有機材料研究

配電自動化計算機システムデータベース 1.配電バンク ●許容電流 ●負荷実績 2.配電線 ●許容電流 ●負荷実績

おき,切り抱えて他用する必要があり、バケットのどliり御も含 めると睦めて隆雄となる欠ノ,lJ二がある。: (5)演

[r]