┌─────────────────────────────────┐ │ 東京大学物性研究所 │ │ VPP500システム FORTRAN 入出力手引書 │ │ 第1版 1995年04月13日発行 │ │ All Rights Reserved,CopyrightC 富士通株式会社 1995 │ └─────────────────────────────────┘ 本書は, VPP500システム上で実行されるFORTRAN プログラムの入出力の最適化 方法について, 記述しています. 最適化には以下のような項目があります. 最適化の概要・説明・手順等については, 各項目をご参照下さい. [VPP500入出力の最適化項目] ┌─────────────────────────────────┐ │ 1. 実行方法による最適化 │ │ 1.1 データの事前変換 --- > 1.1 │ │ 1.2 FORTRAN BUFFERの使用 --- > 1.2 │ │ 1.3 WORK領域の選択 --- > 1.3 │ │ │ │ 2. プログラムの修正による最適化 │ │ 2.1 静的結合の使用 --- > 2.1 │ │ 2.2 全配列指定/ DO型並びの使用 --- > 2.2 │ │ 2.3 書式なし入出力文の使用 --- > 2.3 │ └─────────────────────────────────┘ 項番を入力してください [終了:q] --- > 1.1 ┌──────────┐ │1.1 データの事前変換│ └──────────┘ [ 概要 ] IEEE形式とM 形式の変換を事前に行っておくと, 高速な入出力が行 えます. [ 説明 ] VPP500の浮動小数点データ形式はIEEE形式です. また,Mシリーズ/ VPシリーズ/GSPでは,M形式です. このため,Mシリーズ/ VPシリーズ/GSPで作成されたデータをVPP で 読み込む場合はデータ形式の変換が必要になります. このデータ変換を入出力時ではなく事前に行うことで入出力が高速 に行えます. 同一データを繰り返し使用する場合に有効です. [ 手順 ] M シリーズ/ VPシリーズ/GSPで, "-C"オプションを指定してIEEE形式 で計算結果を出力します. この計算結果をVPP500で使用します. (例)パラメータファイルのみを変更し同一の入力データを使用する場合 パラメータファイル param1 (キャラクタコード) param2 (キャラクタコード) 入出力データファイル data (バイナリ) ロードモジュール名 datamake.out run.out 入出力時に変換(低速) 事前に変換 (高速) Mシリーズ/ VPシリーズ/GSP Mシリーズ/ VPシリーズ/GSP ┌──────────────┐┌──────────────┐ │実行シェル ││実行シェル │ │#!/bin/sh ││#!/bin/sh │ │fu02='data'; export fu02 ││fu02='data';export fu02 │ │datamake.out ││datamake.out -Wl,-C2 │ └──────────────┘└──────────────┘ ↓ ↓ VPP500 VPP500 ┌──────────────┐┌──────────────┐ │実行シェル ││実行シェル │ │#!/bin/sh ││#!/bin/sh │ │fu01='param1';export fu01 ││fu01='param1';export fu01 │ │fu02='data' ;export fu02 ││fu02='data' ;export fu02 │ │run.out -Wl,-C2 ││run.out │ │fu01='param2';export fu01 ││fu01='param2';export fu01 │ │run.out -Wl,-C2 ││run.out │ └──────────────┘└──────────────┘ [ 注意 ] Mシリーズ/ VPシリーズ/GSPとVPP500では"-C"オプションの意味が異なります. Mシリーズ/ VPシリーズ/GSP ┌─────────────────────────────────┐ │ -Wl,-C[機番[,-C機番,...]] │ │指定された機番から入力するデータをIEEE形式からM 形式に変換します. │ │指定された機番へ出力するデータをM 形式からIEEE形式に変換します. │ │機番を省略すると全ての機番に対してIEEE〜M間変換が行われます. │ └─────────────────────────────────┘ VPP500 ┌─────────────────────────────────┐ │ -Wl,-C[機番[,-C機番,...]] │ │指定された機番から入力するデータをM 形式からIEEE形式に変換します. │ │指定された機番へ出力するデータをIEEE形式からM 形式に変換します. │ │機番を省略すると全ての機番に対してIEEE〜M間変換が行われます. │ └─────────────────────────────────┘ ┌────────────┐ │1.2 FORTRAN BUFFERの使用│ └────────────┘ [ 概要 ] FORTRAN BUFFERを使用すると, 高速な入出力が可能になります. [ 説明 ] FORTRAN BUFFERとはFORTRAN が装置参照番号毎に用意するメモリ上 の入出力BUFFERです. FORTRAN BUFFERのサイズ決定方針/ 指定方法は, アクセス方法により異な ります. ┌─────────────────────────────────┐ │ SEQUENTIALアクセス (順次入出力) │ │ OPEN(1) RECL文なし --- > seq │ │ │ │ DIRECTアクセス (直接入出力) │ │ OPEN(1,RECL=1000) RECL文あり --- > dir │ │ │ └─────────────────────────────────┘ 選択してください [ q : 初期画面 ] --- > seq ┌────────────────┐ │SEQUENTIALアクセス (順次入出力) │ └────────────────┘ [ 手順 ] ┌───────────────┐ │FORTRAN BUFFERサイズの決定方針│ └───────────────┘ (1) ファイルサイズ以上のFORTRAN BUFFERを獲得出来る場合 ファイルサイズ分のFORTRAN BUFFERを獲得する (2) ファイルサイズ以上のFORTRAN BUFFERを獲得出来ない場合 一般ワーク領域, ホームディレクトリへの出力の場合 → 可能な限り大きいサイズのFORTRAN BUFFERを獲得する 高速ワーク領域, 大容量ワーク領域への出力の場合 → 8Mbyteの整数倍で可能な限り大きいサイズのFORTRAN BUFFERを獲得する また, プログラミング上のテクニックとして, 可能であれば上のよ うに指定したFORTRAN BUFFERにFORTRAN レコードがまたがらないよ うに入出力文を工夫してください. [ FORTRAN BUFFER サイズの決定方法の例 ] 高速ワーク領域, 大容量ワーク領域への出力の場合 FORTRANレコード長 × n = FORTRAN BUFFER サイズ = 8 Mbyte × m ( n,m は任意の整数 ) ┌────────────┐ │FORTRAN BUFFERの指定方法│指定はKB単位 └────────────┘ (1) FORTRAN BUFFER の省略値は, 出力先のワーク領域によって, 大きさが異なります. 一般ワーク領域, ホームディレクトリへの出力の場合 32KB 高速ワーク領域, 大容量ワーク領域への出力の場合 8MB (2) 全ての装置参照番号に対して同一サイズを指定 実行時オプション "-g" で指定 (3) 装置参照番号毎に別々のサイズを指定 環境変数 "fu[ 装置参照番号]bf"で指定 (例) 512KBのFORTRAN BUFFERの指定 全ての装置参照番号に対して 装置参照番号毎に 同一サイズを指定 別々のサイズを指定 ┌──────────────┐┌──────────────┐ │実行シェル ││実行シェル │ │#!/bin/sh ││#!/bin/sh │ │a.out -Wl,-g512 ││fu01='data' ;export fu01 │ └──────────────┘│fu01bf=512 ;export fu01bf │ │a.out │ └──────────────┘ [ 注意1] 実行時オプションと環境変数の両方で指定した場合は, 環境変数で 指定した装置番号に対してのみ, 環境変数での指定が優先されます. [ 注意2] 実行時オプションでFORTRAN BUFFERを獲得する場合, 全ての装置参照 番号毎にFORTRAN BUFFERが獲得されるため, 無駄なメモリが消費され る場合もありますので, 注意が必要です. ┌──────────────┐ │DIRECTアクセス (直接入出力) │ └──────────────┘ [ 手順 ] ┌───────────────┐ │FORTRAN BUFFERサイズの決定方針│ └───────────────┘ (1) ファイルサイズ以上のFORTRAN BUFFERを獲得出来る場合 ファイルサイズ分のFORTRAN BUFFERを獲得 (2) ファイルサイズ以上のFORTRAN BUFFERを獲得出来ない場合 ・アクセスパターンがランダム → 1レコードを指定 ・アクセスパターンがシーケンシャル → シーケンシャルアク セスに変更する. ┌────────────┐ │FORTRAN BUFFERの指定方法│指定はFORTRANレコード長(RECL) 単位 └────────────┘ (1) FORTRAN BUFFER の省略値は, 出力先のワーク領域によって, 大きさが異なります. 一般ワーク領域, ホームディレクトリへの出力の場合 RECL*20 高速ワーク領域, 大容量ワーク領域への出力の場合 8MB (2) 全ての装置参照番号に対して同一サイズを指定 実行時オプション "-d" で指定 (3) 装置参照番号毎に別々のサイズを指定 環境変数 "fu[ 装置参照番号]bf"で指定 (例) 100レコード分のFORTRAN BUFFERを指定 (サイズRECL*100) 全ての装置参照番号に対して 装置参照番号毎に 同一サイズを指定 別々のサイズを指定 ┌──────────────┐┌──────────────┐ │実行シェル ││実行シェル │ │#!/bin/sh ││#!/bin/sh │ │a.out -Wl,-d100 ││fu01='data' ;export fu01 │ └──────────────┘│fu01bf=100 ;export fu01bf │ │a.out │ └──────────────┘ [ 注意1] 実行時オプションと環境変数の両方で指定した場合は, 環境変数で 指定した装置番号に対してのみ, 環境変数での指定が優先されます. [ 注意2] 実行時オプションでFORTRAN BUFFERを獲得する場合, 全ての装置参照 番号毎にFORTRAN BUFFERが獲得されるため, 無駄なメモリが消費され る場合もありますので, 注意が必要です. ┌─────────┐ │1.3 WORK領域の選択│ └─────────┘ [ 概要 ] 入出力サイズ(FORTRAN BUFFER のサイズ) が大きいファイルは, 高速ワーク領域または, 大容量ワーク領域を使用すると, 高速な 入出力が行えます. [ 説明 ] 入出力サイズ(FORTRAN BUFFER のサイズ) により以下のように ワーク領域を使用すると効率よく入出力が行われます. 入出力サイズ1MB 以上のファイル -----> 高速ワーク領域 (環境変数 $FAST) または 大容量ワーク領域 (環境変数 $LARGE) 入出力サイズ1MB 未満のファイル -----> 一般ワーク領域 (環境変数 $WORK) ファイル名はソースプログラム内部で指定せず, 静的結合を使って環境変数で 指定すると, 入出力サイズによってワーク領域を変更し易くなります. < 2.1 静的結合の使用 >参照 [ 手順 ] ワーク領域の指定は静的結合では以下のように行います. (例) 入出力サイズ(FORTRAN BUFFER のサイズ) 1MB以上のファイルは 大容量ワーク, 1MB未満のファイルは一般ワーク領域を使用 ┌──────────────────────────────┐ │実行シェル │ │#!/bin/sh │ │fu02='$WORK/small.dat' ;export fu02 ワーク領域の指定 │ │fu03='$LARGE/large.dat';export fu03 │ │fu02bf=32 ;export fu02bf 入出力サイズの指定 │ │fu03bf=2048 ;export fu03bf │ │a.out │ └──────────────────────────────┘ [ 注意1] 高速ワーク領域, 大容量ワーク領域を利用する場合, 実行前に vallocコマンドを使用してください. その際 [初期割当量] をファイルサイズ以上指定すると, 高速 な入出力が行われます. ┌──────────────────────────────┐ │ valloc -f [初期割当量] [増分割当量] file名 │ │デフォルト 128MB:16BLOCK 128MB:16BLOCK │ └──────────────────────────────┘ 割当量はBLOCK 数で指定します.(1BLOCK=8MB) (例) file名=data1,初期割当量=256MB,増分割当量=64MBの時 ┌──────────────────────────────┐ │ valloc -f 32 8 data1 │ └──────────────────────────────┘ [ 注意2] 高速ワーク領域, 大容量ワーク領域はロードモジュールは置けません. ┌─────────┐ │2.1 静的結合の使用│ └─────────┘ [ 概要 ] 入出力ファイルは, 静的結合を行うとプログラムを修正することな しにファイル名 /WORK領域等が変更できます. [ 説明 ] ファイルの結合には, 以下の2つの種類があります. (1) 動的結合 プログラム中のOPEN文でファイル名が指定されます. (2) 静的結合 実行シェル中の環境変数でファイル名が指定されます. 静的結合を行うことで, 入出力サイズに最適なWORK領域の選択がプログラムを 変更しないで行えます. <1.3 WORK領域の選択 > 参照 [ 手順 ] 静的結合は, 実行シェル中で fu(装置参照番号) = (入出力ファイル名) でファイル名を指定します. (例)入出力ファイル名 a.file 装置参照番号 1 ロードモジュール名 a.out 静的結合 動的結合 ┌──────────────┐┌──────────────┐ │プログラム ││プログラム │ │ OPEN(1) ││ OPEN(1,FILE='a.file') │ │ WRITE(1) 'ABCDE' ││ WRITE(1) 'ABCDE' │ │ STOP ││ STOP │ │ END ││ END │ └──────────────┘└──────────────┘ ┌──────────────┐┌──────────────┐ │実行シェル ││実行シェル │ │#!/bin/sh ││#!/bin/sh │ │ fu01=a.file ││ a.out │ │ export fu01 ││ │ │ a.out ││ │ └──────────────┘└──────────────┘ [ 注意 ] 同一装置参照番号に対して静的結合と動的結合の両方でファイル名 を指定した場合には, 動的結合が優先されます. ┌────────────────┐ │2.2 全配列指定/ DO形並びの使用 │ └────────────────┘ [ 概要 ] 配列のデータをREAD/WRITEする時, 全配列指定やDO形並びでコーディ ングすると, 高速な入出力が行えます. [ 説明 ] DOループを使用してREAD/WRITEを行うと, 要素単位に入出力が行われ るため, 高速な入出力が望めません. 高速な入出力は, 全配列指定またはDO形並びを使用してのREAD/WRITE により可能となります. (一括した入出力(ベクトル転送)が行われま す) なお, ベクトル転送が行われるためには, 連続した領域を入出力する 必要があります. ( [ 注意 ] 参照 )        数百kbyte から, 数Mbyte 以上の領域の入出力を行うと, ベクトル転 送の効果が得られます. [ 手順 ] (例) DOループによるWRITE(低速) 全配列指定によるWRITE (高速) ┌──────────────┐┌──────────────┐ │ DO 10 I=1,N ││ DO 10 I=1,N │ │ E=DCMPLX(I,I) ││ E(I)=DCMPLX(I,I) │ │ WRITE(6) E ││ 10 CONTINUE │ │ 10 CONTINUE ││ WRITE(6) E │ └──────────────┘└──────────────┘ DO形並びによるWRITE (高速) ┌──────────────┐ │ DO 10 I=1,N │ │ E(I)=DCMPLX(I,I) │ │ 10 CONTINUE │ │ WRITE(6)(E(I),I=1,N) │ └──────────────┘   [ 注意 ] DO形並びを使う場合, 「不連続な要素アクセスは避ける」ようにして        下さい.    (例)       DO形並びの不連続アクセス (低速)       ┌──────────────┐       │  DO 10 I=1,N       │       │  E(I)=DCMPLX(I,I)    │       │ 10 CONTINUE        │       │ WRITE(10) (E(I),i=1,N,2)│       └──────────────┘ ┌─────────────┐ │2.3 書式なし入出力文の使用│ └─────────────┘ [ 概要 ] ファイルの入出力を書式なしにすることにより, 高速な入出力が行 えます. [ 説明 ] 書式ありREAD/WRITEを行うとバイナリ〜キャラクタ間のコード変換 を行う為, 書式なしに比べてファイルの入出力に時間がかかります. 書式ありでREAD/WRITEを行う必要のないデータは, 書式なしでREAD /WRITEを行うことをお勧めします. [ 手順 ] (例)チェックポイント用配列のWRITE 書式ありWRITE (低速) 書式なしWRITE (高速) ┌──────────────┐┌──────────────┐ │ READ(1,*) (E(I),I=1,N) ││ READ(1,*) (E(I),I=1,N) │ │ 100 DO 10 I=1,N ││ 100 DO 10 I=1,N │ │ E(I)=.... ││ E(I)=.... │ │ 10 CONTINUE ││ 10 CONTINUE │ │ REWIND(2) ││ REWIND(2) │ │ WRITE(2,*) E ←││ WRITE(2) E ←│ │ IF(収束) THEN GOTO 200 ││ IF(収束) THEN GOTO 200 │ │ GOTO 100 ││ GOTO 100 │ │ 200 WRITE(1,*) E ││ 200 WRITE(1,*) E │ │ END ││ END │ └──────────────┘└──────────────┘