HP Fortran プログラマーガイド

HP Fortran プ ロ グ ラ マーガ イ ド
HP-UX 11i v1、 HP-UX 11i v2、 HP-UX 11i v3
第8版
Manufacturing Part Number : B3909-90030
2007 年 9 月
© Copyright 2007 Hewlett-Packard Development Company, L.P.
ご注意
1. 本書に記載 し た内容は、 予告な し に変更す る こ と があ り ます。
2. 本書は内容について細心の注意を も っ て作成いた し ま し たが、 万一ご不審な点や誤 り 、 記載
も れな ど、 お気付 き の点がご ざい ま し た ら 当社ま でお知 ら せ く だ さ い。
3. 当社は、 お客様の誤っ た操作に起因す る 損害については、 責任を負いかねますので ご了承 く
だ さ い。
4. 当社では、 本書に関 し て特殊目的に対す る 適合性、 市場性な ど については、 一切の保証を い
た し かねます。 ま た、 備品、 性能な ど に関連 し た損傷について も 保証いた し かねます。
5. 当社提供外の ソ フ ト ウ ェ アの使用や信頼性についての責任は負いかねます。
6. 本書の内容の一部ま たは全部を、 無断で コ ピー し た り 、 他のプ ロ グ ラ ム言語に翻訳す る こ と
は法律で禁止 さ れてい ます。
7. 本製品パ ッ ケージ と し て提供 し た本書や媒体は本製品用だけにお使い く だ さ い。 プ ロ グ ラ ム
を コ ピーす る 場合はバ ッ ク ア ッ プ用だけに し て く だ さ い。 プ ロ グ ラ ム を その ま ま の形で、 あ
る いは変更を加え て第三者に販売す る こ と は固 く 禁 じ ら れてい ます。
U.S. Government License
Confidential computer software. Valid license from HP required for possession, use or copying.
Consistent with FAR 12.211 and 12.212, Commercial Computer Software, Computer Software
Documentation, and Technical Data for Commercial Items are licensed to the U.S.
Government under vendor's standard commercial license.
著作権
©Copyright 2007 Hewlett-Packard Development Company, L.P.
本書には著作権に よ っ て保護 さ れてい る 内容が含ま れてい ます。 本書の内容の一部ま たは全部を
著作者の許諾な し に複製、 改変、 お よ び翻訳す る こ と は、 著作権法下での許可事項を除 き 、 禁止
さ れてい ます。
商標
Intel® お よ び Itanium® は、 米国な ら びに他の国におけ る Intel Corporation ま たはその関連会
社の商標ま たは登録商標です。
Unix® は、 The Open Group の登録商標です。
2
目次
1. HP Fortran の概要
HP Fortran コ ンパ イ ラ の環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ド ラ イバ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C プ リ プロセッサ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
フ ロ ン ト エン ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バ ッ ク エン ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
リ ン カー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP-UX オペレーテ ィ ン グ シ ス テ ム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
25
27
28
32
37
40
41
2. コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
f90 コ マ ン ド の構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
コ マ ン ド 行オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
シ ン ボルのバ イ ンデ ィ ン グオプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
最適化オプシ ョ ン を使用す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
一般最適化オプシ ョ ン を確認す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
最適化オプシ ョ ン の微調整 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
フ ァ イ ル名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
HP Fortran プ ロ グ ラ ム の リ ン ク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
f90 ま たは ld で リ ン ク す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
ラ イ ブ ラ リ に リ ン ク す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
特殊な目的のための コ ンパ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
モジ ュ ールを使用 し てプ ロ グ ラ ム を コ ンパ イ ルす る . . . . . . . . . . . . . . . . . . . . . . . . . . 109
異な る PA-RISC マシ ン用に コ ンパ イ ルす る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
共有 ラ イ ブ ラ リ を作成す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
C プ リ プ ロ セ ッ サ を使用す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
デマ ン ド ロ ー ド 可能な実行可能 コ ー ド を作成す る . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
共有実行可能 コ ー ド を作成す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
64 ビ ッ ト モー ド で コ ンパ イ ルす る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
環境変数の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
HP_F90OPTS 環境変数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
LPATH 環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
MP_NUMBER_OF_THREADS 環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3. デー タ 記憶領域の制御
暗黙の型宣言の使用不能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
自動割 り 付け変数 と 静的変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
3
目次
定数の精度拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
基本精度の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ロ グ ラ ム間でのデー タ 共有 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
モジ ュ ール と 共通ブ ロ ッ ク の比較. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
132
134
138
143
4. デバ ッ グ
HP WDB デバ ッ ガの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デバ ッ グ情報の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
実行時例外の処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バ ス エ ラ ー例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
浮動小数点例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
不正命令例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
セ グ メ ン テーシ ョ ン違反例外. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
不正な引 き 数に よ る 例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デバ ッ グ行の使用方法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
146
147
148
149
149
150
151
152
153
5. ON 文の使用方法
ON 文で処理す る 例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ON 文で指定す る 動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
実行プ ロ グ ラ ム を終了す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
エ ラ ーを無視す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ト ラ ッ プ手続 き を呼び出す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ctrl-C 割 り 込みの ト ラ ッ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ ア ダ ンプの許可 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
156
158
158
159
160
163
164
6. パ フ ォ ーマ ン スおよび最適化
4
プ ロ フ ァ イ ラ の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP Caliper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gprof. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
prof. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
168
168
171
172
最適化を制御す る オプシ ョ ンの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
最適化レベルの設定に +O を使用す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
最適化オプシ ョ ン を使用す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
保守的な最適化 と 積極的な最適化の対比 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP Fortran プ ロ グ ラ ム のパ ラ レル化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パ ラ レ ル実行用の コ ンパ イ ル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パフ ォ ーマ ン ス と パ ラ レル化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パ ラ レ ル化 さ れたプ ロ グ ラ ム を プ ロ フ ァ イ ルす る . . . . . . . . . . . . . . . . . . . . . . . . . . .
173
173
175
180
182
182
182
183
目次
パ ラ レ ル化を阻害す る 条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ベ ク ト ル化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+Ovectorize オプシ ョ ン を使用す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ベ ク ト ル化を局所的に制御す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
BLAS ラ イ ブ ラ リ ルーチン を呼び出す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パフ ォ ーマ ン ス用の コ ー ド 生成の制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
183
187
187
188
189
192
7. HP-UX ア プ リ ケーシ ョ ンの作成
コ マ ン ド 行引 き 数の参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP-UX シ ス テ ムお よ び ラ イ ブ ラ リ ルーチンの呼び出 し . . . . . . . . . . . . . . . . . . . . . . . .
HP-UX フ ァ イ ル入出力の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FSTREAM を使用 し た ス ト リ ーム入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP-UX シ ス テ ム コ ールを使用 し た入出力を実行す る . . . . . . . . . . . . . . . . . . . . . . . .
フ ァ イ ルへの接続を設定す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP-UX フ ァ イ ル記述子を取得す る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
194
196
197
197
198
198
198
8. HP Fortran か らの C ルーチ ンの呼び出 し
デー タ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
符号な し 整数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
論理型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
複素数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構造型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ポインタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
引 き 数渡 し 規約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
大文字 と 小文字の区別. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
配列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C の文字列. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C の ヌ ル終了文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fortran の隠 し 長 さ 引 き 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
文字列を渡す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
フ ァ イ ル処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ の共有 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
200
202
202
203
205
205
206
208
211
215
215
215
216
219
221
9. Fortran 指令の使用方法
指令の構文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP Fortran 指令の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
$HP$ ALIAS 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
$HP$ CHECK_OVERFLOW 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
226
227
227
231
5
目次
$HP$ LIST 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
$HP$ OPTIMIZE 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
互換性指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ベ ク ト ル化の制御. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パ ラ レ ル化の制御. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
依存検出の制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
副作用検出の制御. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
232
232
234
234
235
235
236
10. HP Fortran への移行
HP FORTRAN 77 と の非互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ ンパ イ ラ の制限. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サポー ト さ れていない コ ンパ イ ル行オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
フ ォーマ ッ ト フ ィ ール ド 幅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
浮動小数点定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
組み込み関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
手続 き 呼び出 し と 定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ 型 と 定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
入出力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
その他. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
移行に伴 う 問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ソ ース コ ー ド に関す る 問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ マ ン ド 行オプシ ョ ンに関す る 問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オブジ ェ ク ト コ ー ド に関す る 問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ フ ァ イ ルに関す る 問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
移行方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HP 社提供の移行ツール. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
238
238
238
239
240
240
240
241
242
243
243
245
245
248
249
250
251
251
11. HP Fortran への移植
拡張機能の互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
文 .................................................................
コ ンパ イ ラ 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
組み込み手続 き . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
移植オプシ ョ ンの使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
初期化 さ れていない変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
大 き な語サ イ ズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ワ ン ト リ ッ プ DO ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
名前の競合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
256
256
257
259
261
261
262
262
263
目次
下線を追加 し た名前 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ロ グ ラ ム形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
エ ス ケープシーケ ン ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tru64 か ら HP Fortran への移植 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
265
266
266
267
用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
7
目次
8
図一覧
図 1-1. HP Fortran コ ンパ イ ラ の環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
図 3-1. 基本精度の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135
図 8-1. Fortran お よ び C での 2 次元配列の メ モ リ 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . .211
9
図一覧
10
表一覧
表 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 1-1. f90 ド ラ イ バを制御す る オプシ ョ ン . . . . . . . . . . . . . . . . . . .
表 1-2. C プ リ プ ロ セ ッ サ を制御す る オプシ ョ ン . . . . . . . . . . . . . . .
表 1-3. フ ロ ン ト エ ン ド を制御す る オプシ ョ ン . . . . . . . . . . . . . . . .
表 1-4. 最適化を制御す る オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . .
表 1-5. コ ー ド 生成を制御す る オプシ ョ ン . . . . . . . . . . . . . . . . . . . .
表 1-6. リ ン カーを制御す る オプシ ョ ン . . . . . . . . . . . . . . . . . . . . .
表 2-1. 頻繁に使用す る オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . .
表 2-2. 分類別のオプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 2-3. デー タ 型の大 き さ と +autodbl[4] . . . . . . . . . . . . . . . . . . . .
表 2-4. +FP オプシ ョ ン の値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 2-5. +traceback オプシ ョ ン で認識 さ れ る シ グナル . . . . . . . . . . .
表 2-6. 最適化レベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 2-7. -t オプシ ョ ン の値 と サブプ ロ セ ス . . . . . . . . . . . . . . . . . . . .
表 2-8. -W オプシ ョ ンの値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 2-9. +O[no]fltacc に よ っ て実行 さ れ る 最適化 . . . . . . . . . . . . . . .
表 2-10. +Oinline_budget オプシ ョ ン の値 . . . . . . . . . . . . . . . . . . .
表 2-11. 組み込み関数の ミ リ コ ー ド バージ ョ ン . . . . . . . . . . . . . . . .
表 2-12. f90 が認識す る フ ァ イ ル名 . . . . . . . . . . . . . . . . . . . . . . . .
表 2-13. PA-RISC においてデフ ォ ル ト で リ ン ク さ れ る ラ イ ブ ラ リ . .
表 2-14. HP Fortran の環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . .
表 4-1. +fp_exception が認識す る シ グナル . . . . . . . . . . . . . . . . . . .
表 5-1. ON 文で処理す る 例外 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 6-1. 最適化レベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 6-2. 実装最適化オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 6-3. 最適化オプシ ョ ン を微調整す る . . . . . . . . . . . . . . . . . . . . .
表 6-4. 保守的な最適化、 積極的な最適化、 デフ ォ ル ト の最適化 . . .
表 6-5. ベ ク ト ルルーチン の +Ovectorize に よ る 呼び出 し . . . . . . . .
表 8-1. HP Fortran お よ び C のデー タ 型の対応 . . . . . . . . . . . . . . .
表 8-2. HP Fortran お よ び C デー タ 型の大 き さ の相違 . . . . . . . . . .
表 8-3. +autodbl で コ ンパ イ ル し た結果の大 き さ の相違 . . . . . . . . .
表 9-1. HP Fortran の指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 9-2. HP Fortran で認識 さ れ る 指令の互換性. . . . . . . . . . . . . . . .
表 10-1. f90 でサポー ト さ れていない f77 オプシ ョ ン . . . . . . . . . . .
表 10-2. f90 オプシ ョ ン に置 き 換え ら え る f77 オプシ ョ ン . . . . . . . .
表 10-3. f90 オプシ ョ ン がサポー ト し てい る HP FORTRAN 77 指令
表 10-4. 名前が競合す る 組み込み関数 と libU77 ルーチン . . . . . . . .
表 10-5. f90 でサポー ト さ れてい る f77 オプシ ョ ン . . . . . . . . . . . . .
表 11-1. 文の互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 11-2. 指令の互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
表 11-3. HP Fortran が認識す る 指令の接頭辞 . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .19
. . . . . . . . . . . . . . . . . . .25
. . . . . . . . . . . . . . . . . . .27
. . . . . . . . . . . . . . . . . . .28
. . . . . . . . . . . . . . . . . . .33
. . . . . . . . . . . . . . . . . . .34
. . . . . . . . . . . . . . . . . . .37
. . . . . . . . . . . . . . . . . . .46
. . . . . . . . . . . . . . . . . . .47
. . . . . . . . . . . . . . . . . . .51
. . . . . . . . . . . . . . . . . . .60
. . . . . . . . . . . . . . . . . . .61
. . . . . . . . . . . . . . . . . . .69
. . . . . . . . . . . . . . . . . . .77
. . . . . . . . . . . . . . . . . . .80
. . . . . . . . . . . . . . . . . . .90
. . . . . . . . . . . . . . . . . . .93
. . . . . . . . . . . . . . . . . . .94
. . . . . . . . . . . . . . . . . .100
. . . . . . . . . . . . . . . . . .104
. . . . . . . . . . . . . . . . . .123
. . . . . . . . . . . . . . . . . .148
. . . . . . . . . . . . . . . . . .157
. . . . . . . . . . . . . . . . . .174
. . . . . . . . . . . . . . . . . .176
. . . . . . . . . . . . . . . . . .177
. . . . . . . . . . . . . . . . . .180
. . . . . . . . . . . . . . . . . .187
. . . . . . . . . . . . . . . . . .200
. . . . . . . . . . . . . . . . . .201
. . . . . . . . . . . . . . . . . .201
. . . . . . . . . . . . . . . . . .227
. . . . . . . . . . . . . . . . . .234
. . . . . . . . . . . . . . . . . .238
. . . . . . . . . . . . . . . . . .238
. . . . . . . . . . . . . . . . . .246
. . . . . . . . . . . . . . . . . .248
. . . . . . . . . . . . . . . . . .248
. . . . . . . . . . . . . . . . . .256
. . . . . . . . . . . . . . . . . .258
. . . . . . . . . . . . . . . . . .259
11
表一覧
表 11-4. 規格に定め ら れていない HP Fortran の組み込み手続 き . . . . . . . . . . . . . . . . . . . . .260
12
出版履歴
出版の日付は、 最新版がで き る たびに変更 し ます。 内容の小 さ な変更に対 し ては、 増刷の際に対
応 し 、 出版日の変更は行い ません。 マニ ュ アルの部品番号は、 改訂が行われ る たびに変更 し ま
す。
新版の作成は、 記載内容の訂正 も し く は ド キ ュ メ ン ト 製品の変更に と も な っ て行われ ます。 お手
元のマニ ュ アルが最新版か ど う かは、 当社の営業担当に確認 し て く だ さ い。
•
1998 年 10 月 第 1 版、 B3909-90002 ( 英語版のみ )
•
2001 年 6 月 第 2 版、 B3909-9005 ( 英語版のみ )
•
2001 年 9 月 第 3 版、 B6252-90005 ( 英語版 : B3909-90009)
•
2003 年 6 月 第 4 版、 B3909-90012 ( 英語版 : B3909-90010)
•
2003 年 9 月 第 5 版、 B3909-90016 ( 英語版 :B3909-90014)
•
2004 年 12 月 第 6 版、 B3909-90020 ( 英語版 : B3909-90018)
•
2007 年 2 月 第 7 版、 B3909-90028 ( 英語版 : B3909-90027)
•
2007 年 9 月 第 8 版、 B3909-90030 ( 英語版 : B3909-90029)
原典
本書は 『HP Fortran Programmer's Guide』 (HP Part No. B3909-90029) を翻訳 し た も のです。
13
14
納入後の保証について
•
保証の期間は、 ご購入時に当社 よ り お出 し し た見積書に記載 さ れた期間 と し ます。 保証サー
ビ ス は、 当社の定め る 休日を除 く 月曜日か ら 金曜日ま での、 午前 8 時 45 分か ら 午後 5 時 30
分の範囲で無料で行い ます。 当社で定めたシ ス テ ム製品については出張修理を行い、 その他
の製品については当社にご返却いただいた上での引取 り 修理 と な り ます。 当社が定め る 地域
以外におけ る 出張修理対象製品の修理は、 保証期間中において も 技術者派遣費が有料 と な り
ます。
•
ソ フ ト ウ ェ ア製品の保証は上記にかかわ ら ず、 下記に定め る 範囲 と さ せていただ き ます。
— ソ フ ト ウ ェ ア製品お よ びマニ ュ アルは当社が供給 し た媒体物の破損、 資料の落丁お よ び
プ ロ グ ラ ム イ ン ス ト ラ ク シ ョ ンが実行で き ない場合のみ保証いた し ます。
— バグお よ び前記以外の問題の解決は、 別に締結す る ソ フ ト ウ ェ アサポー ト 契約に基づい
て実施 さ れ ます。
•
次の よ う な場合には、 保証期間内で も 修理が有料 と な り ます。
— 取扱説明書等に記載 さ れてい る 保証対象外部品の故障の場合。
— 当社が供給し ていないソ フ ト ウ ェ ア、 ハード ウ ェ ア、 ま たは補用品の使用によ る 故障の場合。
— お客様の不適当ま たは不十分な保守に よ る 故障の場合。
— 当社が認めていない改造、 酷使、 誤使用ま たは誤操作に よ る 故障の場合。
— 納入後の移設が不適切であ っ たための故障ま たは損傷の場合。
— 指定外の電源 ( 電圧、 周波数 ) 使用ま たは電源の異常に よ る 故障の場合。
— 当社が定めた設置場所基準に適合 し ない場所での使用、 お よ び設置場所の不適当な保守
に よ る 故障の場合。
— 火災、 地震、 風水害、 落雷、 騒動、 暴動、 戦争行為、 放射能汚染、 お よ びその他天災地
変等の不可抗力的事故に よ る 故障の場合。
•
当社で取 り 扱 う 製品は、 ご需要先の特定目的に関す る 整合性の保証はいた し かねます。 ま
た、 そ こ か ら 生 じ る 直接的、 間接的損害に対 し て も 責任を負いかねます。
•
当社で取 り 扱 う 製品を組み込みあ る いは転売 さ れ る 場合は、 最終需要先におけ る 直接的、 間
接的損害に対 し ては責任を負いかねます。
•
製品の保守、 修理用部品の供給期間は、 その製品の製造中止後 5 年間 と さ せていただ き ます。
本製品の修理については取扱説明書に記載 さ れてい る 最寄の事業所へお問い合わせ く だ さ い。
15
16
ま えがき
『HP Fortran プ ロ グ ラ マーガ イ ド 』 では、 HP 9000 シ ス テ ムお よ び Integrity シ ス テ ム において
HP Fortran の機能を使用 し て、 プ ロ グ ラ ム を開発、 コ ンパ イ ル、 デバ ッ グお よ び最適化す る 方
法について説明 し ます。 ま た、 HP FORTRAN 77 プ ロ グ ラ ム を現在の HP Fortran コ ンパ イ ラ
に移行す る 方法や、 他社の Fortran で書かれたプ ロ グ ラ ム を HP Fortran に移植す る 場合の コ ン
パ イ ラ 機能の使用方法について も 説明 し ます。
ソ フ ト ウ ェ アに不具合があ る 場合は、 ヒ ュ ーレ ッ ト ・ パ ッ カー ド 社のお近 く の販売店ま たは代理
店にお問い合わせ く だ さ い。
本書で紹介す る 概念は、 HP 社のパ ラ レ ル アーキ テ ク チ ャ 、 プ ロ グ ラ ミ ン グモデル、 ま たは最適
化の概念に慣れていな く て も 理解で き ます。
Integrity シ ス テ ム対応の HP Fortran は、 HP-UX PA-RISC 対応の Fortran 製品を移植 し た製
品です。 HP 9000 と Integrity シ ス テ ム間では、 ソ ース に互換性があ り ます。 ただ し 、 Integrity
シ ス テ ム対応の HP Fortran は PA-RISC 上では動作 し ません。
17
マニ ュ アルの範囲
本書は、 次のマシ ン での HP Fortran コ ンパ イ ラ を使用 し たプ ラ グ ラ ミ ン グ手法について説明 し
てい ます。
•
HP-UX 11i v1 以降のバージ ョ ン (HP 9000 シ ス テ ム )
•
HP-UX 11i v2 以降のバージ ョ ン (Integrity シ ス テ ム )
HP Fortran は、 拡張共有 メ モ リ プ ロ グ ラ ミ ン グ モデルを サポー ト し てい ます。 HP-UX 11i v1
以降には、 必要な アセ ン ブ ラ 、 リ ン カーお よ び ラ イ ブ ラ リ が組み込まれてい ます。
HP Fortran は、 略 し て Fortran 90、 Fortran95 と 呼ばれ る 、 Fortran 国際規格を完全にサポー
ト し てい ます。 それ ら は、 ISO/IEC 1539:1991(E) と ISO/IEC 1539:1997(E) に よ り 定義 さ れて
い ます。
18
表記規約
本項では、 本書で使用す る 表記規約について説明 し ます。
表1
bold monospace
コ マ ン ド 例中の bold monospace ( 太字のモ ノ スペース フ ォ ン ト )
は、 正確にその と お り 入力 し なければな ら ない項目を示 し ます。
monospace
本文中の monospace ( モ ノ スペース フ ォ ン ト ) は、 コ マ ン ド 名、 シ
ス テ ム コ ール、 デー タ 構造、 型を示 し ます。
コ マ ン ド 例中の monospace ( モ ノ スペース フ ォ ン ト ) は、 エ ラ ー
メ ッ セージ を初め と す る コ マ ン ド 出力を示 し ます。
italic
構文中の italic ( イ タ リ ッ ク ) は、 指定 し なければな ら ない変数を
示 し ます。
次に示す例では、 変数 output_file が省略可能であ る こ と を示す
ために角か っ こ ( [ ] ) を使用 し てい ます。
command input_file [output_file]
角か っ こ ( [ ] )
コ マ ン ド 例中の角か っ こ は、 省略可能な入力項目を示 し ます。
中か っ こ ({})、 縦線 (|)
コ マ ン ド 構文中の中か っ こ で囲まれた文字は、 選択肢を示 し ます。
選択肢は、 中か っ こ で囲まれ、 縦線 (|) で区切 ら れます。
次に示す コ マ ン ド 例では、 a ま たは b を入力で き る こ と を示 し ます。
command {a | b}
水平省略記号 (...)
コ マ ン ド 例中の水平省略記号は、 直前の項目の繰 り 返 し を示 し ます。
垂直省略記号
垂直省略記号は、 例文の中で コ ー ド が 1 行以上省略 さ れてい る こ と
を表 し ます。
Keycap
Keycap は、 コ マ ン ド 例を実行す る ために押すキーボー ド のキーを示
し ます。
『』
二重かぎか っ こ 部分は、 マニ ュ アルな ど の出版物を表 し ます。
19
本書で説明す る 指令やプ ラ グマは、 他所で注記 さ れていなければ、 HP Fortran や C コ ンパ イ ラ
で使用 さ れ ます。 aC++ コ ンパ イ ラ は、 プ ラ グマ を サポー ト し ませんが、 メ モ リ ク ラ ス はサポー
ト し ます。 こ れ ら の指令やプ ラ グマは一般に、 小文字を使用 し ますが、 各 コ ンパ イ ラ は大文字 /
小文字の区別を し ません。
マ ンページの参照先は、 mnpgname(1) の形式で表記 さ れてい ます。 こ こ で mnpgname は、 マ ン
ページ名で、 後続のか っ こ 内は項番号です。 こ のマ ンページ を参照す る には、 次の よ う に入力 し
ます。
% man 1 mnpgname
注記
「注記」 は、 重要な補足情報を示 し ます。
コ マ ン ド 構文
次の例について説明 し ます。
COMMAND input_file [...] {a | b} [output_file]
•
COMMAND は、 こ の と お り 入力 し ます。
•
input_file は、 ユーザーが指定す る フ ァ イ ル名を示 し ます。
•
角か っ こ 中の水平省略記号は、 省略可能な入力フ ァ イ ル名を追加指定で き る こ と を示 し ま
す。
•
a ま たは b を指定す る 必要があ り ます。
•
[output_file] は、 省略可能な フ ァ イ ル名を示 し ます。
20
関連文書
次の文書は、 コ ンパ イ ラ お よ び関連ツール使用時の参考資料です。
•
『HP aC++ Online Programmer's Guide』 は、 aC++ についての参照情報 と 簡単な演習を提
供 し ます。 本マニ ュ アルは html フ ォ ーマ ッ ト でのみ利用で き ます。
•
『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 は、 HP Fortran の言語 リ フ ァ レ ン ス と し て提供 さ れ、 言
語の機能 と 要件について説明 し ます。
•
『HP C/HP-UX Reference Manual』 は、 HP 社に よ り 実装 さ れた C プ ロ グ ラ ミ ン グ言語の参
照情報を提供 し ます。
•
『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 は、 HP 9000 シ ス テ ム での浮動小数点演算の
実装方法や、 浮動小数点の動作がプ ロ グ ラ マーに与え る 影響について説明 し てい ます。 浮動
小数点を多用す る プ ロ グ ラ ム を書いた り 、 移植 し た り す る プ ロ グ ラ マーに と っ て有用な情報
が書かれてい ます。
•
『HP MLIB User's Guide VECLIB and LAPACK』 では、 工業的で科学的な アプ リ ケーシ ョ
ン に対応す る 数学的な ソ フ ト ウ ェ アや計算用のカーネルについて説明 し てい ます。
•
『HP MPI User's Guide』 では、 HP 社の Message-Passing Interface ラ イ ブ ラ リ を使用す る
メ ッ セージ ・ パ ッ シ ン グ ・ プ ロ グ ラ ミ ン グ を説明 し てい ます。
•
『HP-UX リ ン カー& ラ イ ブ ラ リ ー ・ ユーザーズ ・ ガ イ ド 』 では、 HP 社の コ ンパ イ ラ 、 アセ
ン ブ ラ 、 リ ン カー、 ラ イ ブ ラ リ 、 オブジ ェ ク ト フ ァ イ ルを使用 し た、 HP-UX での ソ フ ト
ウ ェ アの開発方法について説明 し てい ます。
•
『HP-UX パ ラ レル プ ロ グ ラ ミ ン グ ガ イ ド 』 では、 HP-UX に実装 さ れた コ ンパ イ ラ (HP
Fortran, HP aC++ (ANSI C++), HP C) を使用 し て、 共有 メ モ リ を効率的にプ ロ グ ラ ミ ン グ
す る 方法を説明 し てい ます。 こ のマニ ュ アルは、 HP-UX 11.0 以降を使用す る 、 Fortran、
C、 お よ び C++ に習熟 し たプ ロ グ ラ マーを対象 と し てい ます。
•
『Programming with Threads on HP-UX』 は、 POSIX ス レ ッ ド に よ る プ ロ グ ラ ミ ン グにつ
いて説明 し てい ます。
•
『Threadtime』 (Scott J. Norton と Mark D. DiPasquale に よ る 共著 ) は、 POSIX ス レ ッ ド 構
造、 ス レ ッ ド 管理機能、 お よ びス レ ッ ド の作成、 終了、 同期を初め と す る 、 ス レ ッ ド 管理の
基本についての詳細なガ イ ド ラ イ ン を提供 し ます。
21
22
1 HP Fortran の概要
f90 を使用 し て、 Fortran プ ロ グ ラ ム を コ ンパ イ ルす る と 、 コ ンパ イ ラ を初め と す る 多数の成分
が呼び出 さ れ、 プ ロ グ ラ ムの実行フ ァ イ ルを作成 し ます。 f90 は、 デフ ォ ル ト で さ ま ざ ま な成分
を呼び出 し て ソ ース フ ァ イ ルの構文を解析 し 、 中間 コ ー ド を生成 し ます。 さ ら に、 中間 コ ー ド を
最適化 し てオブジ ェ ク ト コ ー ド を生成 し 、 必要に応 じ て、 オブジ ェ ク ト コ ー ド に追加す る ラ イ ブ
ラ リ フ ァ イ ルを検索 し ます。 最後にすべてのオブジ ェ ク ト フ ァ イ ルを最終的な実行可能フ ァ イ ル
に リ ン ク し ます。
た と えば、 x.f90, y.f90, z.f90 と い う 3 つの ソ ース フ ァ イ ルで構成 さ れ る プ ロ グ ラ ム があ る と
し ます。 次に示す コ マ ン ド 行は、 ソ ース フ ァ イ ルを処理 し 、 構文エ ラ ーがなければ、 a.out と い
う デフ ォ ル ト 名で実行可能フ ァ イ ルを生成 し ます。
$ f90 x.f90 y.f90 z.f90
コ ンパ イ ルが完了す る と 、 次の よ う に実行可能プ ロ グ ラ ム を呼び出 し て、 プ ロ グ ラ ム を実行 し ま
す。
$ a.out
し か し 、 成分のプ ロ グ ラ ムに対す る 動作や処理を制御 し たい場合があ る か も し れ ません。 た と え
ば、 実行可能プ ロ グ ラ ムにデフ ォ ル ト 名 a.out 以外の名前を付けた り 、 デフ ォ ル ト 以外の ラ イ
ブ ラ リ を リ ン ク し たい場合があ り ます。 HP Fortran コ ンパ イ ラ には、 コ ンパ イ ルプ ロ セ ス を制
御可能にす る さ ま ざ ま な コ マ ン ド 行オプシ ョ ンが用意 さ れてい ます。 本章では、 コ ンパ イ ルプ ロ
セ ス、 お よ び f90 コ マ ン ド が呼び出す さ ま ざ ま な成分を制御す る オプシ ョ ンについて概説 し ま
す。
注記
f90 オプシ ョ ン の要約 リ ス ト を表示す る には、 f90(1) のマ ンページ を参照す る か、
次の コ マ ン ド を使用 し ます。
$ f90 +usage
オプシ ョ ンの詳細は、 最新版の 『HP-UX パ ラ レル プ ロ グ ラ ミ ン グ ガ イ ド 』 を参
照 し て く だ さ い。
第1章
23
HP Fortran の概要
HP Fortran コ ンパイ ラ の環境
HP Fortran コ ンパイ ラの環境
図 1-1 は、 コ ンパ イ ルプ ロ セ ス を示 し てい ます。 HP Fortran コ ンパ イ ラ 環境が さ ま ざ ま な成分
で構成 さ れてい る こ と が分か り ます。 ア ク テ ィ ブなプ ロ セ ス は網掛けな し 、 デー タ 要素は網掛け
で表 し てい ます。 パフ ォ ーマ ン ス解析ツール と デバ ッ ガ (WDB) を除 く 成分は、 f90 コ マ ン ド で
起動 し ます。 C プ リ プ ロ セ ッ サ と リ ン カーは、 cpp コ マ ン ド お よ び ld コ マ ン ド を使用 し て、 個
別に起動で き ます。 詳細は、 cpp(1) と ld(1) のマ ンページ を参照 し て く だ さ い。 本章の残 り の項
では、 さ ま ざ ま成分、 お よ び成分を制御す る コ マ ン ド 行オプシ ョ ンについて簡単に説明 し ます。
各項には、 本マニ ュ アル中で参照可能な他の項 も あわせて紹介 し てい ます。
図 1-1
HP Fortran コ ンパイ ラの環境
ソ ース
フ ァ イル
f90 ド ラ イバ
C プ リ プロセ ッサ
(cpp)
ライブラ リ
パ フ ォ ーマ ン ス
解析ツール
お よび WDB
HP Fortran コ ンパイ ラ
バッ ク エン ド
フ ロン ト エン ド
HLO
( 高水準オプ
テ ィ マ イザ )
CodeGen
および
低水準オプ
テ ィ マ イザ
リ ン カー
実行可能
フ ァ イル
モ ジ ュ ール
情報
24
第1章
HP Fortran の概要
ド ラ イバ
ド ラ イバ
ド ラ イバは、 コ ンパ イ ラ を呼び出す f90 コ マ ン ド 行を解析 し て、 コ ンパ イ ルを完了す る ために必
要なサブプ ロ セ ス を呼び出 し 、 コ ンパ イ ルプ ロ セ ス全体を制御 し ます。
ド ラ イ バの機能を制御す る コ マ ン ド 行オプシ ョ ンは、 次の処理を行い ます。
•
f90 がデフ ォ ル ト で呼び出すサブプ ロ セ ス の代わ り のサブプ ロ セ ス を呼び出 し ます。
•
引 き 数をサブプ ロ セ ス に渡 し ます。
•
コ ンパ イ ラ がサポー ト し てい る すべてのオプシ ョ ンの要約 リ ス ト を表示 し ます。
•
現在使用 し てい る f90 のバージ ョ ン情報を表示 し ます。
•
ド ラ イ バが表示す る コ ンパ イ ルプ ロ セ ス の情報レベルを制御 し ます。
表 1-1 では、 ド ラ イ バを制御す る オプシ ョ ン を リ ス ト し て、 簡単に説明 し てい ます。
表 1-1 f90 ド ラ イバを制御する オプ シ ョ ン
オプ シ ョ ン
機能
-c
コ マ ン ド 行の各 ソ ース フ ァ イ ルで リ ン ク フ ェ ーズ を抑制 し
て、 オブジ ェ ク ト フ ァ イ ル (.o) を生成 し ます。
-o outfile
出力フ ァ イ ルにデフ ォ ル ト の名前 (a.out ま たは
filename.o) を付けずに、 outfile で指定 さ れた フ ァ イ ル名
を付け ます。 リ ン ク が抑止 さ れてい る 場合、 フ ロ ン ト エ ン ド
は、 こ のオプシ ョ ン を使用 し て、 オブジ ェ ク ト フ ァ イ ルに名
前を付け ます。
+pre_include=file
コ マ ン ド 行に指定 さ れてい る すべての ソ ース フ ァ イ ルを処理
す る 前に、 file の内容を挿入 し ます。 コ マ ン ド 行では、 こ
のオプシ ョ ン を複数使用 し て、 それぞれ異な る file を使用
で き ます。 こ のオプシ ョ ン で指定 し た フ ァ イ ルは、 指定順に
処理 さ れ ます。
第1章
25
HP Fortran の概要
ド ラ イバ
表 1-1 f90 ド ラ イバを制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
-tx,name
機能
コ ンパ イ ルの 1 つ以上のサブプ ロ セ ス (x) のプ ラ イ ベー ト
バージ ョ ン (name) を置 き 換え ます。 x には、 次のいずれか を
指定 し ます。
a アセ ンブ ラ
c コ ンパ イ ラ
l リ ン カー
p C プ リ プロセッサ
s 起動フ ァ イ ル (crt0.o ラ イ ブ ラ リ )
e デバ ッ グ フ ァ イ ル (end.o ラ イ ブ ラ リ )
コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ ンパ イ ル行に +tl
を指定す る 場合は、 リ ン ク 行に も 同 じ オプシ ョ ン を指定す る
必要があ り ます。
+usage
すべての f90 オプシ ョ ン を リ ス ト し て、 簡単に説明 し ます。
-v
プ ロ グ ラ ムの コ ンパ イ ルの進行に伴い、 冗長情報を標準出力
に表示 し ます。
+version
コ ンパ イ ルせずに、 コ ンパ イ ラ のバージ ョ ン情報を標準出力
に表示 し ます。
-Wx,arg1[,arg2,...,argN]
arg1 か ら argN ま で を、 x で識別 さ れ る コ ンパ イ ルのサブプ
ロ セ ス に渡 し ます。 x には、 次のいずれか を指定 し ます。
a アセ ンブ ラ
c コ ンパ イ ラ
l リ ン カー
p C プ リ プロセッサ
コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ ンパ イ ル行に +Wl
を指定す る 場合は、 リ ン ク 行に も 同 じ オプシ ョ ン を指定す る
必要があ り ます。
26
第1章
HP Fortran の概要
C プ リ プロセ ッサ
C プ リ プロセ ッサ
HP Fortran の ソ ース フ ァ イ ルには、 プ ロ グ ラ ム を コ ンパ イ ラ に渡す前に、 C プ リ プ ロ セ ッ サ
(cpp) が読み込んで展開す る 指令を書 く こ と がで き ます。 cpp 指令を使用す る と 、 プ ロ グ ラ ムの
一部を条件付 き コ ンパ イ ル用に コ ーデ ィ ン グで き ます。 デフ ォ ル ト では、 f90 コ マ ン ド は、 拡張
子が .F の ソ ース フ ァ イ ルを C プ リ プ ロ セ ッ サに渡 し ます。
表 1-2 では、 プ リ プ ロ セ ッ サ を制御す る オプシ ョ ン を リ ス ト し て、 各オプシ ョ ン について簡単に
説明 し てい ます。 た と えば、 +cpp オプシ ョ ン を使用す る と 、 デフ ォ ル ト の動作を無効に し て、
コ マ ン ド 行に指定 さ れてい る すべての ソ ース フ ァ イ ルを プ リ プ ロ セ ッ サに渡す よ う に変更で き ま
す。 詳細は、 117 ページの 「C プ リ プ ロ セ ッ サ を使用す る 」 の項お よ び cpp(1) のマ ンページ を
参照 し て く だ さ い。
表 1-2 C プ リ プ ロ セ ッ サを制御する オプ シ ョ ン
オプ シ ョ ン
機能
+cpp={yes|no|default}
+cpp=yes は、 すべての ソ ース フ ァ イ ルを プ リ プ ロ セ ッ サに
渡 し ます。 +cpp=default は、 拡張子が .F の フ ァ イ ルだけ を
渡 し ます。 +cpp=no は、 フ ァ イ ルの引 き 渡 し を抑止 し ます。
デフ ォ ル ト は +cpp=default です。
+[no]cpp_keep
C プ リ プ ロ セ ッ サの出力を保存 [ ま たは、 破棄 ] し ます。 ソ ー
ス フ ァ イ ル名が file.f ま たは file.F の場合、 出力には拡
張子 file.i を付けて保存 さ れます。 ソ ース フ ァ イ ル名が
file.f90 の場合、 出力フ ァ イ ル名は file.i90 にな り ます。
デフ ォ ル ト (+nocpp_keep) では、 出力を破棄 し ます。
-Dname[=def]
シ ン ボル name を プ リ プ ロ セ ッ サに対 し て定義 し ます。 def を
指定す る と 、 name がその値に定義 さ れます。
-Idirectory
イ ン ク ルー ド 指令で指定 し た フ ァ イ ルを検索す る デ ィ レ ク ト
リ リ ス ト に directory を追加 し ます。 コ マ ン ド 行では、 こ の
オプシ ョ ン を複数使用 し て、 それぞれ異な る デ ィ レ ク ト リ を
指定で き ます。
-Uname
name ( プ リ プ ロ セ ッ サが事前定義 し た予約済みシ ン ボル ) の
初期定義を削除 し ます。
第1章
27
HP Fortran の概要
フ ロン ト エン ド
フ ロン ト エン ド
フ ロ ン ト エ ン ド は ソ ース コ ー ド を解析 し ます。 解析に失敗す る と 、 警告 メ ッ セージ ま たはエ ラ ー
メ ッ セージ を出力 し ます。 コ マ ン ド 行オプシ ョ ン を使用す る と 、 ソ ース コ ー ド についての フ ロ ン
ト エ ン ド の仮定 ( ソ ース が自由形式か固定形式か、 暗黙ま たは明示の型宣言を使用 し てい る か、
拡張機能を含んでい る かな ど ) を制御で き ます。 他の フ ロ ン ト エ ン ド オプシ ョ ンは、 エ ラ ー メ ッ
セージの レベル、 使用言語 ( 母国語サポー ト )、 基本精度、 .mod フ ァ イ ルの検索規則を制御 し ま
す。 表 1-3 には、 フ ロ ン ト エ ン ド を制御す る オプシ ョ ン を リ ス ト し てい ます。
表 1-3 フ ロ ン ト エ ン ド を制御する オプ シ ョ ン
オプ シ ョ ン
+[no]autodbl
機能
すべての整数型、 論理型、 実数型を 8 バ イ ト に、 すべての倍
精度型 と 複素数型を 16 バ イ ト にプ ロ モー ト し ます [ ま たは、
プ ロ モー ト し ません ]。 デフ ォ ル ト は +noautodbl です。
こ のオプシ ョ ン の使用方法については、 134 ページの 「基本精
度の拡張」 の項を参照 し て く だ さ い。
+[no]autodbl4
すべての整数型、 論理型、 実数型を 8 バ イ ト に、 すべての複
素数型を 16 バ イ ト にプ ロ モー ト し ます [ ま たは、 プ ロ モー ト
し ません ]。 +autodbl4 オプシ ョ ンは、 倍精度型 と 倍精度複素
数型の大 き さ を プ ロ モー ト し ません。 デフ ォ ル ト は
+noautodbl4 です。
こ のオプシ ョ ン の使用方法については、 134 ページの 「基本精
度の拡張」 の項を参照 し て く だ さ い。
+check={all|none}
配列添え字の コ ンパ イ ル時範囲チ ェ ッ ク を有効 (+check=all)
ま たは無効 (+check=none) に設定 し ます。 デフ ォ ル ト は
+check=none です。
こ のオプシ ョ ン の使用方法については、 151 ページの 「セ グ メ
ン テーシ ョ ン違反例外」 の項を参照 し て く だ さ い。
28
第1章
HP Fortran の概要
フ ロン ト エン ド
表 1-3 フ ロ ン ト エ ン ド を制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
+[no]dlines
機能
デバ ッ グ行を ソ ース文 [ ま たは、 注釈 ] と し て コ ンパ イ ル し ま
す。 ソ ース行は固定形式にす る 必要があ り ます。 デフ ォ ル ト
の +nodlines は、 第 1 桁目に D ま たは d が付いた ソ ース行を
注釈 と し て扱い ます。
こ のオプシ ョ ン の使用方法については、 153 ページの 「デバ ッ
グ行の使用方法」 の項を参照 し て く だ さ い。
+[no]escape
バ ッ ク ス ラ ッ シ ュ (\) を C のエ ス ケープ [ ま たは、 文字 ] と し
て扱い ます。 デフ ォ ル ト は +noescape です。
こ のオプシ ョ ン の使用方法については、 266 ページの 「エ ス
ケープシーケ ン ス」 の項を参照 し て く だ さ い。
+[no]extend_source
1 行の ソ ース行で最大 254 文字を許可 し ます [ ま たは、 許可 し
ません ]。 デフ ォ ル ト の +noextend_source では、 固定形式
が 72 文字、 自由形式が 132 文字ま でです。
こ のオプシ ョ ン の使用方法については、 266 ページの 「プ ロ グ
ラ ム形式」 の項を参照 し て く だ さ い。
-Idirectory
INCLUDE 行お よ び イ ン ク ルー ド 指令で指定 し た フ ァ イ ル、 お
よ び .mod フ ァ イ ルを検索す る デ ィ レ ク ト リ の リ ス ト に
directory を追加 し ます。 コ マ ン ド 行では、 こ のオプシ ョ ン
を複数使用 し て、 それぞれ異な る デ ィ レ ク ト リ を指定で き ま
す。
こ のオプシ ョ ン の使用方法については、 113 ページの 「.mod
フ ァ イ ルを管理す る 」 の項を参照 し て く だ さ い。
+[no]implicit_none
識別子の型を暗黙的に定義 し ません [ ま たは、 定義 し ます ]。
デフ ォ ル ト は暗黙の型宣言 (+noimplicit_none) を行い ます。
こ のオプシ ョ ン の使用方法については、 128 ページの 「暗黙の
型宣言の使用不能」 の項を参照 し て く だ さ い。
第1章
29
HP Fortran の概要
フ ロン ト エン ド
表 1-3 フ ロ ン ト エ ン ド を制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
+langlvl={90|default}
機能
Fortran 規格 (+langlvl=90) に対す る すべての拡張機能に警
告を発行 し ます。 デフ ォ ル ト の +langlvl=default は拡張機
能を許可 し ます。
こ のオプシ ョ ン の使用方法については、 255 ページの第 11 章
「HP Fortran への移植」 を参照 し て く だ さ い。
+[no]list
コ ンパ イ ル中にプ ロ グ ラ ム リ ス ト を標準出力に書 き 込みます
[ ま たは、 書 き 込みを抑制 し ます ]。 デフ ォ ル ト は +nolist で
す。
+moddir=directory
.mod フ ァ イ ルを directory に書 き 込みます。 デフ ォ ル ト で
は、 .mod フ ァ イ ルを現在のデ ィ レ ク ト リ に書 き 込みます。
こ のオプシ ョ ン の使用方法については、 113 ページの 「.mod
フ ァ イ ルを管理す る 」 の項を参照 し て く だ さ い。
+nls=lang
lang で指定 し た言語の文字列 と 注釈におけ る 16 ビ ッ ト の
NLS ( 母国語サポー ト ) を有効に し ます。
+[no]onetrip
カ ウ ン タ 制御の DO ループ を少な く と も 1 回実行 し ます
(+onetrip)。 デフ ォ ル ト は +noonetrip です。
こ のオプシ ョ ン の移植時に使用す る 方法については、 262 ペー
ジの 「 ワ ン ト リ ッ プ DO ループ」 の項を参照 し て く だ さ い。
+[no]ppu
外部の可視シ ン ボルの定義の最後、 ま たは、 可視シ ン ボルへ
の引用に下線を追加 し ます [ ま たは、 追加 し ません ]。
Itanium® アーキ テ ク チ ャ でのデフ ォ ル ト は +ppu です。 64
ビ ッ ト PA-RISC アーキ テ ク チ ャ でのデフ ォ ル ト は +ppu です。
32 ビ ッ ト PA-RISC アーキ テ ク チ ャ でのデフ ォ ル ト は +noppu
です。
こ のオプシ ョ ン の移植時に使用す る 方法については、 265 ペー
ジの 「下線を追加 し た名前」 の項を参照 し て く だ さ い。
30
第1章
HP Fortran の概要
フ ロン ト エン ド
表 1-3 フ ロ ン ト エ ン ド を制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
+real_constant={single|
double}
機能
すべての単精度実数お よ び複素数定数を単精度
(+real_constant=single) ま たは倍精度
(+real_constant=double) と し て扱い ます。 デフ ォ ル ト は
+real_constant=single です。 こ のオプシ ョ ンは、 精度を
明示的に指定 し た定数、 お よ び +autodbl オプシ ョ ン ま たは
+autodbl4 オプシ ョ ン を指定 し た場合には適用 さ れ ません。
こ のオプシ ョ ン の使用方法については、 132 ページの 「定数の
精度拡張」 の項を参照 し て く だ さ い。
+source={fixed|free|def
ault}
固定形式の ソ ース フ ァ イ ル (+source=fixed) ま たは自由形式
の ソ ース フ ァ イ ル (+source=free) を受け入れ ます。 デフ ォ ル
ト の +source=default では、 .f90 フ ァ イ ルが自由形式、 .f
お よ び .F の ソ ース フ ァ イ ルが固定形式にな り ます。
こ のオプシ ョ ン の使用方法については、 266 ページの 「プ ロ グ
ラ ム形式」 の項を参照 し て く だ さ い。
+[no]uppercase
すべての外部名に大文字 [ ま たは、 小文字 ] を使用 し ます。 デ
フ ォ ル ト は +nouppercase です。
こ のオプシ ョ ン の使用方法については、 208 ページの 「大文字
と 小文字の区別」 の項を参照 し て く だ さ い。
-w
第1章
警告 メ ッ セージ を抑止 し ます。
31
HP Fortran の概要
バッ クエン ド
バッ クエン ド
バ ッ ク エ ン ド の主な機能は、 次の 2 つです。
•
よ り 高速なパフ ォ ーマ ン ス を実現す る ために、 プ ロ グ ラ ム を最適化 し ます。
•
オブジ ェ ク ト フ ァ イ ルに コ ー ド を生成 し ます。
最適化は、 コ ンパ イ ラ のバ ッ ク エ ン ド を構成す る 次の 2 つの副成分に よ っ て実行 さ れ ます。
•
HLO ( 高水準オプ テ ィ マ イザ )。 パフ ォ ーマ ン ス を改善す る ために、 ハ イ セマ ン テ ィ ッ ク レ
ベルの解析 と 変形を広範囲に行い ます。
•
低水準オプテ ィ マ イ ザ。従来の最適化 ( 共通式の除去やデ ッ ド コ ー ド の削除 ) お よ びマシ ン固
有の最適化を行い ます。
大部分の コ マ ン ド 行オプシ ョ ンは、 最適化を制御す る オプシ ョ ン です。 オプシ ョ ン を使用す る
と 、 次の処理が可能にな り ます。
•
プ ロ グ ラ ムに適用す る 最適化の レベルを設定 し ます。
•
アプ リ ケーシ ョ ンに対 し て、 一定の要件を満たす最適化を適用 し ます。 た と えば、 パフ ォ ー
マ ン ス よ り も 、 コ ンパ イ ルの速度を重視 し て最適化 し ます。
•
プ ロ グ ラ ム ま たはプ ロ グ ラ ム の一部に特定の最適化技術を適用 し て、 パフ ォ ーマ ン ス を微調
整 し ます。
表 1-4 では、 最適化を制御す る オプシ ョ ン を リ ス ト し て、 簡単に説明 し てい ます。 こ ら ら のオプ
シ ョ ンの使用方法については、 173 ページの 「最適化を制御す る オプシ ョ ン の使用方法」 の項を
参照 し て く だ さ い。
注記
32
f90 コ マ ン ド を使用 し て、 コ ンパ イ ル と リ ン ク を別の コ マ ン ド 行で実行す る 場合、
多数の最適化オプシ ョ ン を両方の コ マ ン ド 行に書 く 必要があ り ます。 167 ページ
の第 6 章 「パフ ォ ーマ ン スお よ び最適化」 を参照 し て く だ さ い。 f90 コ マ ン ド を
使用 し て コ ンパ イ ル と リ ン ク を実行す る 方法については、 102 ページの 「f90 ま
たは ld で リ ン ク す る 」 の項を参照 し て く だ さ い。
第1章
HP Fortran の概要
バッ クエン ド
表 1-4 最適化を制御する オプ シ ョ ン
オプ シ ョ ン
機能
+DC7200
PA7200 プ ロ セ ッ サ を対象に し て、 メ モ リ 階層構造の最適化を
実行 し ます。
-O[optlevel]
プ ロ グ ラ ム を最適化 し ます。 こ こ で optlevel は、 0 ( 最適化な
し ), 1, 2, ま たは 3 ( 最高水準 ) です。 optlevel を指定 し ない
と 、 プ ロ グ ラ ムは レベル 2 (-O2) で最適化 さ れます。
+Ooptlevel
こ のオプシ ョ ンは、 -O[optlevel] オプシ ョ ン と 同 じ 意味にな
り ます。 ただ し 、 こ のオプシ ョ ン では、 optlevel を指定す る
必要があ り ます。 メ イ ク フ ァ イ ルの互換性を提供 し てい ます。
+O[no]info
最適化プ ロ セ ス に関す る フ ィ ー ド バ ッ ク 情報を提供 し ます [ ま
たは、 提供 し ません ]。 こ のオプシ ョ ンは、 特に最適化レベル 3
の場合が最 も 有用です。 デフ ォ ル ト は +Onoinfo です。
+O[no]optimization
optimization を使用可能 [ ま たは、 使用不能 ] に設定 し ます。
最適化の種類 ( た と えば、 コ ー ド サ イ ズ を拡張 し ない最適化 )、
ま たは特定の最適化技術 ( た と えば、 イ ン ラ イ ン展開 ) を事前
定義の文字列で指定 し ます。 optimization の値のそれぞれに
ついては、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ
さ い。
バ ッ ク エ ン ド の成分 と し ては、 他に CodeGen ( コ ー ド ジ ェ ネ レー タ ) があ り ます。 CodeGen は、
表 1-5 の コ マ ン ド 行オプシ ョ ン で制御で き ます。 こ れ ら のオプシ ョ ン を使用す る と 、 出力フ ァ イ
ルにデバ ッ グ情報ま たはプ ロ フ ァ イ リ ン グ情報を含めた り 、 局所変数を静的 メ モ リ に保存で き ま
す。
第1章
33
HP Fortran の概要
バッ クエン ド
表 1-5 コ ー ド 生成を制御する オプ シ ョ ン
オプ シ ョ ン
機能
+[no]asm
ソ ース フ ァ イ ルを コ ンパ イ ル し て、 対応す る フ ァ イ ル ( 拡張子 .s)
でアセ ン ブ リ 言語の出力を残す よ う に [ ま たは、 残 さ ない よ う に ]
指定 し ます。 デフ ォ ル ト は +noasm です。
+DAmodel
PA-RISC アーキ テ ク チ ャ の特定バージ ョ ン用の コ ー ド を生成 し ま
す。 model は、 次のいずれかです。
•
PA-RISC バージ ョ ン番号 (1.1 ま たは 2.0)
•
モデル番号 ( た と えば、 750 や 870)
•
PA-RISC プ ロ セ ッ サ名 ( た と えば、 PA7000, PA7100, PA8000)
•
キー ワー ド portable。PA-RISC 1.1 お よ び 2.0 のすべての ワ ー
ク ス テーシ ョ ン と サーバー間の互換性を確保 し た コ ー ド を生
成 し ます。
こ のオプシ ョ ン の使用方法については、 114 ページの 「異な る
PA-RISC マシ ン用に コ ンパ イ ルす る 」 の項を参照 し て く だ さ い。
34
第1章
HP Fortran の概要
バッ クエン ド
表 1-5 コ ー ド 生成を制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
+DSmodel
機能
PA-RISC アーキ テ ク チ ャ の特定の実装に適切な命令の ス ケ ジ ュ ー
リ ン グ を実行 し ます。 model は、 次のいずれかです。
•
PA-RISC バージ ョ ン番号 (1.1 ま たは 2.0)
•
モデル番号 ( た と えば、 750 や 870)
•
PA-RISC プ ロ セ ッ サ名 ( た と えば、 PA7000、PA7100、PA8000)
こ のオプシ ョ ン の使用方法については、 114 ページの 「異な る
PA-RISC マシ ン用に コ ンパ イ ルす る 」 の項を参照 し て く だ さ い。
Itanium® ベース アーキ テ ク チ ャ で、 model に定義 さ れてい る 値
は以下の と お り です。
-g
•
blended : プ ロ セ ッ サが組み合わせ ら れてい る ( た と えば
Itanium® と Itanium®2 プ ロ セ ッ サの組み合わせ ) 場合に、
最高のパフ ォ ーマ ン ス を得 る よ う にチ ュ ーニ ン グ し ます。 こ
の値は、 Itanium® アーキ テ ク チ ャ でのデフ ォ ル ト です。
•
itanium : Itanium® プ ロ セ ッ サで、 最高のパフ ォ ーマ ン ス を
得 る よ う にチ ュ ーニ ン グ し ます。
•
itanium2 : Itanium®2 プ ロ セ ッ サで、 最高のパフ ォ ーマ ン ス
を得 る よ う にチ ュ ーニ ン グ し ます。
•
native : コ ンパ イ ラ が実行 さ れてい る プ ロ セ ッ サで、 最高の
パフ ォ ーマ ン ス を得 る よ う にチ ュ ーニ ン グ し ます。
デバ ッ ガが必要 と す る デバ ッ グ情報を生成 し ます。 こ のオプシ ョ
ンは、 最適化レベル 0, 1, お よ び 2 で互換性があ り ます。 コ ンパ イ
ル と リ ン ク を別々に実行 し て、 コ マ ン ド 行で -g を指定す る 場合
は、 リ ン ク 行に も 同 じ オプシ ョ ン を指定す る 必要があ り ます。
デバ ッ ガがプ ロ グ ラ ム を準備す る 場合の こ のオプシ ョ ンの使用方
法については、 146 ページの 「HP WDB デバ ッ ガの使用方法」 の
項を参照 し て く だ さ い。
第1章
35
HP Fortran の概要
バッ クエン ド
表 1-5 コ ー ド 生成を制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
+[no]gprof
機能
gprof でプ ロ フ ァ イ リ ン グす る オブジ ェ ク ト フ ァ イ ルを準備 し ま
す [ ま たは、 準備 し ません ] (gprof(1) のマ ンページ を参照 )。 デ
フ ォ ル ト は +nogprof です。 コ ンパ イ ル と リ ン ク を別々に実行 し
て、 コ マ ン ド 行で +gprof を指定す る 場合は、 リ ン ク 行で も 同 じ
オプシ ョ ン を指定す る 必要があ り ます。
こ のオプシ ョ ン を指定 し て、 gprof でプ ロ グ ラ ム を プ ロ フ ァ イ ル
す る 方法については、 「gprof」 の項を参照 し て く だ さ い。
+k
膨大な共有デー タ 項目を使用す る プ ロ グ ラ ム の コ ー ド を生成 し ま
す。 こ のオプシ ョ ンが必要な と き には リ ン カーが診断 メ ッ セージ
を表示 し ます。
+pic={short|long|no}
共有 ラ イ ブ ラ リ で使用す る 短いデ ィ ス プ レース メ ン ト
(+pic=short) ま たは長いデ ィ ス プ レース メ ン ト (+pic=long) を
持つ PIC ( 位置独立 コ ー ド ) を生成 し ます。 デフ ォ ル ト は
+pic=no です。
共有 ラ イ ブ ラ リ を作成す る と き に、 こ のオプシ ョ ン を使用す る 方
法については、 115 ページの 「+pic 指定で コ ンパ イ ルす る 」 の項
を参照 し て く だ さ い。
+[no]prof
prof でプ ロ フ ァ イ リ ン グす る オブジ ェ ク ト フ ァ イ ルを準備 し ます
[ ま たは、 準備 し ません ] (prof(1) のマ ンページ を参照 )。 デフ ォ
ル ト は +noprof です。 コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ
マ ン ド 行で +prof を指定す る 場合は、 リ ン ク 行で も 同 じ オプシ ョ
ン を指定す る 必要があ り ます。
こ のオプシ ョ ン を指定 し て、 prof でプ ロ グ ラ ム を プ ロ フ ァ イ ルす
る 方法については、 「prof」 の項を参照 し て く だ さ い。
+[no]save
すべての副プ ロ グ ラ ムにあ る すべての局所変数を保存 し ます [ ま
たは、 保存 し ません ]。
移植時に こ のオプシ ョ ン を使用す る 方法については、 261 ページ
の 「初期化 さ れていない変数」 の項を参照 し て く だ さ い。
36
第1章
HP Fortran の概要
リ ン カー
リ ン カー
リ ン カー (ld) は、 バ ッ ク エ ン ド が生成 し たオブジ ェ ク ト フ ァ イ ル と ラ イ ブ ラ リ か ら 実行可能プ
ロ グ ラ ム を生成 し ます。 リ ン カーを制御す る 重要なオプシ ョ ンは、 リ ン カーが検索す る ラ イ ブ ラ
リ や検索パ ス を指定す る オプシ ョ ン です。 他のオプシ ョ ンは、 リ ン カーが出力フ ァ イ ルに含めた
り 含めなか っ た り す る 情報の種類 ( た と えば、 デバ ッ グが使用す る シ ン ボルテーブル情報、 ま た
は出力フ ァ イ ルを共有可能フ ァ イ ルやデマ ン ド ロ ー ド 可能フ ァ イ ルに識別す る マー ク ) を制御 し
ます。 表 1-6 では、 リ ン カーを制御す る オプシ ョ ン を リ ス ト し て、 簡単に説明 し ます。
注記
f90 コ マ ン ド を使用 し て、 コ ンパ イ ル と リ ン カーを別々の コ マ ン ド 行で実行 し 、
表 1-6 に リ ス ト さ れてい る オプシ ョ ン (-c を除 く ) で コ ンパ イ ルす る 場合は、 同
じ オプシ ョ ン を リ ン ク 行に も 指定す る 必要があ り ます。
表 1-6 リ ン カ ーを制御する オプ シ ョ ン
オプ シ ョ ン
機能
-c
リ ン ク を抑止 し て、 オブジ ェ ク ト フ ァ イ ルだけ を生成 し ます。
+[no]demand_load
リ ン カーの出力フ ァ イ ルに demand load と し てマー ク し ます [ ま た
は、 マー ク し ません ]。 コ ンパ イ ル と リ ン カーを別々に実行 し て、 コ
マ ン ド 行に +demand_load を指定す る 場合、 同 じ オプシ ョ ン を リ ン
ク 行に も 指定す る 必要があ り ます。 デフ ォ ル ト は +nodemand_load
です。
こ のオプシ ョ ンの使用方法については、 120 ページの 「デマ ン ド
ロ ー ド 可能な実行可能 コ ー ド を作成す る 」の項を参照 し て く だ さ い。
+FPflags
浮動小数点例外を ト ラ ッ プす る 実行時の環境を、 プ ロ グ ラ ム起動時
に初期化す る 方法を指定 し ます。 コ ンパ イ ル と リ ン ク を別々に実行
し て、 コ マ ン ド 行に +FP を指定す る 場合、 同 じ flags を付けて リ ン
ク 行で も 指定す る 必要があ り ます。 デフ ォ ル ト では、 すべての ト
ラ ッ プが使用不能に設定 さ れ ます。 flags の特定の値については、
ld(1) のマ ンページ を参照 し て く だ さ い。
こ のオプシ ョ ンの使用方法については、 149 ページの 「浮動小数点
例外」 の項を参照 し て く だ さ い。
第1章
37
HP Fortran の概要
リ ン カー
表 1-6 リ ン カ ーを制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
機能
+[no]fp_exceptions
浮動小数点例外を使用可能 [ ま たは、 使用不能 ] に設定 し ます。 浮動
小数点例外を使用可能に設定す る と 、 プ ロ グ ラ ムは起動時に実行時
エ ラ ーの手続 き ト レース バ ッ ク を発行 し ます。 デフ ォ ル ト は
+nofp_exceptions です。
こ のオプシ ョ ンの使用方法については、 149 ページの 「浮動小数点
例外」 の項を参照 し て く だ さ い。
-Ldirectory
ラ イ ブ ラ リ 検索パ ス の先頭に directory を追加 し ます。 こ のオプ
シ ョ ンは、 -l オプシ ョ ン で指定 し た ラ イ ブ ラ リ だけに適用 さ れ ます
( 後述を参照 )。 コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ マ ン ド 行
に -L を指定す る 場合、 同 じ オプシ ョ ン を リ ン ク 行に も 指定す る 必要
があ り ます。
こ のオプシ ョ ンの使用方法については、 108 ページの 「 ラ イ ブ ラ リ
の検索規則」 の項を参照 し て く だ さ い。
-lx
ラ イ ブ ラ リ libx.a ま たは libx.sl を実行可能プ ロ グ ラ ム に リ ン ク
し ます。 コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ マ ン ド 行に -l を
指定す る 場合、 同 じ オプシ ョ ン を リ ン ク 行に も 指定す る 必要があ り
ます。
こ のオプシ ョ ンの使用方法については、 105 ページの 「デフ ォ ル ト
以外の ラ イ ブ ラ リ に リ ン ク す る 」 の項、 お よ び ld(1) のマ ンページ
を参照 し て く だ さ い。
-o outfile
出力フ ァ イ ルにデフ ォ ル ト 名 a.out ではな く 、 outfile で指定 し た
フ ァ イ ル名を付け ます。 -c オプシ ョ ン で リ ン ク を抑制 し てい る 場
合、 こ のオプシ ョ ン を使用 し て、 オブジ ェ ク ト フ ァ イ ルに名前を付
け ます。
+[no]shared
リ ン カーの出力フ ァ イ ルに shared [ ま たは、 unshared] と し てマー
ク し ます。 コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ マ ン ド 行に
+shared を指定す る 場合、 同 じ オプシ ョ ン を リ ン ク 行に も 指定す る
必要があ り ます。 デフ ォ ル ト は +shared です。
こ のオプシ ョ ンの使用方法については、 121 ページの 「共有実行可
能 コ ー ド を作成す る 」 の項を参照 し て く だ さ い。
38
第1章
HP Fortran の概要
リ ン カー
表 1-6 リ ン カ ーを制御する オプ シ ョ ン ( 続き )
オプ シ ョ ン
+[no]strip
機能
リ ン カーの出力か ら シ ン ボルテーブル情報を削除 し ます [ ま たは、
削除 し ません ]。 詳細は、 ld(1) お よ び strip(1) のマ ンページ を参照
し て く だ さ い。 こ のオプシ ョ ンは -g と 互換性があ り ません。 コ ンパ
イ ル と リ ン ク を別々に実行 し て、 コ マ ン ド 行に +strip を指定す る
場合、 同 じ オプシ ョ ン を リ ン ク 行に も 指定す る 必要があ り ます。 デ
フ ォ ル ト は +nostrip です。
こ のオプシ ョ ンの使用方法については、 147 ページの 「デバ ッ グ情
報の削除」 の項を参照 し て く だ さ い。
+[no]ttybuf
端末出力にバ ッ フ ァ 付 き [ ま たは、 バ ッ フ ァ な し ] の出力を使用 し ま
す。 デフ ォ ル ト は +ttybuf です。
+[no]U77
BSD 3F (libU77 ラ イ ブ ラ リ ) をサポー ト し ます [ ま たは、 サポー ト
し ません ]。 コ ンパ イ ル と リ ン ク を別々に実行 し て、 コ ンパ イ ル行に
+U77 を指定す る 場合、 同 じ オプシ ョ ン を リ ン ク 行に も 指定す る 必要
があ り ます。 デフ ォ ル ト は +noU77 です。
libU77 ラ イ ブ ラ リ については、 106 ページの 「HP Fortran 追加 ラ
イ ブ ラ リ 」 の項、 お よ び 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参
照 し て く だ さ い。
-Wl,options
第1章
コ ン マで区切っ た option の並びを リ ン カーに渡 し ます。 リ ン カー
でサポー ト さ れてい る オプシ ョ ン については、 ld(1) のマ ンページ を
参照 し て く だ さ い。
39
HP Fortran の概要
ツール
ツール
HP Fortran コ ンパ イ ラ の環境には、 高水準言語のデバ ッ ガ と パフ ォ ーマ ン ス解析ツールがあ り
ます。 デバ ッ ガは、 GUI ( グ ラ フ ィ ッ ク ユーザー イ ン タ フ ェ ース ) ベース の HP WDB です。 デ
バ ッ グ用にプ ロ グ ラ ム を準備す る には、 -g オプシ ョ ン で コ ンパ イ ルす る 必要があ り ます。 こ の
オプシ ョ ンの使用方法については、 146 ページの 「HP WDB デバ ッ ガの使用方法」 の項を参照
し て く だ さ い。
パフ ォ ーマ ン ス解析ツールには、 UNIX 標準のユーテ ィ リ テ ィ (prof と gprof) があ り ます。
prof お よ び gprof を使用す る には、 それぞれ +prof オプシ ョ ン と +gprof オプシ ョ ン を指定 し
て コ ンパ イ ルす る 必要があ り ます。 すべてのパフ ォ ーマ ン ス解析ツールについての詳細は、 168
ページの 「プ ロ フ ァ イ ラ の使用方法」 の項、 お よ び CXperf(1), prof(1), gprof(1), ttv(1) の各マ
ンページ を参照 し て く だ さ い
40
第1章
HP Fortran の概要
HP-UX オペ レ ーテ ィ ン グ シ ス テム
HP-UX オペ レーテ ィ ング シ ス テム
HP-UX オペレーテ ィ ン グ シ ス テ ムは、 図 1-1 に記載 さ れてい ませんが、 HP-UX でプ ロ グ ラ ム
を実行す る 場合、 さ ま ざ ま な リ ソ ース を提供 し ます。 た と えば、 HP-UX は、 実行可能プ ロ グ ラ
ム を起動す る コ マ ン ド 行を取 り 込んで引 き 数に分け、 プ ロ グ ラ ム を使用可能に し ます。
HP-UX には呼び出 し 可能な シ ス テ ムルーチンが多数サポー ト さ れてお り 、 カーネルレベルの リ
ソ ース に対す る 低レベルのア ク セ ス を提供 し てい ます。 た と えば、 プ ロ グ ラ ムは、 Fortran 入出
力の代わ り に、 HP-UX フ ァ イ ル処理ルーチン を呼び出せます。
193 ページの第 7 章 「HP-UX アプ リ ケーシ ョ ン の作成」 では、 HP Fortran プ ロ グ ラ ム で
HP-UX の リ ソ ース を活用す る 方法について説明 し てい ます。 HP-UX シ ス テ ムルーチン の詳細
は、 『HP-UX リ フ ァ レ ン ス 』 を参照 し て く だ さ い。
第1章
41
HP Fortran の概要
HP-UX オペ レ ーテ ィ ン グ シ ス テム
42
第1章
2
コ ンパイル と リ ン ク
本章では、 HP Fortran プ ロ グ ラ ム を コ ンパ イ ルお よ び リ ン ク す る 方法について、 次の項目を中
心に説明 し ます。
•
f90 コ マ ン ド を使用 し た コ ンパ イ ル
•
HP Fortran プ ロ グ ラ ム の リ ン ク
•
特殊な目的のための コ ンパ イ ル
•
環境変数の使用方法
第2章
43
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
f90 コ マ ン ド を使用 し た コ ンパイル
f90 コ マ ン ド は、 デフ ォ ル ト で、 コ マ ン ド 行並びの ソ ース フ ァ イ ルを コ ンパ イ ル し 、 コ ンパ イ ル
が成功す る と 、 結果のオブジ ェ ク ト フ ァ イ ルを リ ン カーに渡 し ます。 リ ン カーは リ ン ク に成功す
る と 、 デフ ォ ル ト の フ ァ イ ル名 a.out で、 実行可能プ ロ グ ラ ム を生成 し ます。
こ こ では、 hello.f90 と い う プ ロ グ ラ ム を例に説明 し ます。
例 2-1
hello.f90
PROGRAM main
CALL hello()
END PROGRAM main
SUBROUTINE hello()
PRINT *, 'Hello, I must be going.'
END SUBROUTINE hello
こ のプ ロ グ ラ ム を次の コ マ ン ド 行で コ ンパ イ ル し ます。
$ f90 hello.f90
f90 は、 hello.o ( オブジ ェ ク ト コ ー ド ) お よ び a.out ( 実行可能プ ロ グ ラ ム ) を生成 し ます。
次の よ う に、 コ マ ン ド 行にオブジ ェ ク ト フ ァ イ ルだけ を指定 し た場合、
$ f90 hello.o
f90 はオブジ ェ ク ト フ ァ イ ルを リ ン カーに渡 し ます。 リ ン カーは、 処理に成功す る と 、 実行可能
プ ロ グ ラ ム a.out を生成 し ます。
次に、 実行可能プ ロ グ ラ ムの実行例を示 し ます。
$ a.out
Hello, I must be going.
本項では、 次の項目を含む f90 コ マ ン ド の使用方法について、 よ り 詳 し く 説明 し ます。
•
コ マ ン ド 行構文
•
コ マ ン ド 行オプシ ョ ン
•
f90 に よ っ て認識 さ れ る フ ァ イ ル名
44
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
f90 コ マ ン ド の構文
f90 コ マ ン ド の構文は、 次の と お り です。
f90 [options] [files]
こ こ で options は、 1 つ以上の コ マ ン ド 行オプシ ョ ンの並びです。 files は、 コ ンパ イ ルす る HP
Fortran ソ ース フ ァ イ ル、 ま たは、 リ ン ク す る オブジ ェ ク ト コ ー ド の 1 つ以上の並びです。
options お よ び files は、 各項目を空白で区切 り 、 任意の順番で指定す る こ と がで き ます。 ただ
し 、 指定 し た順番に意味のあ る オプシ ョ ン も あ り ます。 た と えば、 リ ン ク す る ラ イ ブ ラ リ を指定
す る -l オプシ ョ ンは、 リ ン ク 先のプ ロ グ ラ ム フ ァ イ ルの後に指定す る 必要があ り ます。
-l オプシ ョ ン の使用方法についての詳細は、 105 ページの 「デフ ォ ル ト 以外の ラ イ ブ ラ リ に リ
ン ク す る 」 の項を参照 し て く だ さ い。 f90 コ マ ン ド 行についての詳細は、 『HP Fortran リ フ ァ レ
ン ス ガ イ ド 』 を参照 し て く だ さ い。
コ マ ン ド 行オプ シ ョ ン
コ マ ン ド 行オプシ ョ ン を使用す る と 、 f90 コ マ ン ド のデフ ォ ル ト の動作を変更で き ます。 フ ァ イ
ルの コ ンパ イ ルや リ ン ク を制御す る オプシ ョ ン も あ り ます。 た と えば、 -O オプシ ョ ンは、 最適
化を要求 し ます。 f90 コ マ ン ド に対 し て、 プ ロ セ ス を完全に ス キ ッ プ さ せ る オプシ ョ ン も あ り ま
す。 た と えば、 -c オプシ ョ ン を指定す る と 、 リ ン ク を ス キ ッ プ し て、 コ ンパ イ ルだけが実行 さ
れます。 さ ら に、 デフ ォ ル ト 以外のプ ロ セ ス を呼び出すオプシ ョ ン も あ り ます。 た と えば、
+cpp=yes オプシ ョ ン を指定す る と 、 f90 コ マ ン ド は、 ソ ース フ ァ イ ルを コ ンパ イ ルす る 前に C
プ リ プ ロ セ ッ サ (cpp) に渡 し ます (cpp の使用方法については、 117 ページの 「C プ リ プ ロ セ ッ
サを使用す る 」 の項を参照 )。
多 く のオプシ ョ ンは、 +[no]option と い う 形式で使用 し ます。 こ こ で +option はオプシ ョ ンの
機能を使用可能に し 、 +nooption は使用不能に し ます。 機能を使用可能ま たは使用不能に設定
す る だけでな く 、 +option=arg 形式で使用す る オプシ ョ ン も あ り ます。 引 き 数を付けずに、 オ
プシ ョ ン名だけ を指定す る と 、 f90 は、 stderr の arg の値を リ ス ト し ます。 た と えば、 次の よ
う に コ マ ン ド 行を指定す る と 、
$ f90 +langlvl= prog.f90
f90 は次の よ う な メ ッ セージ を発行 し ます。
f90: The '+langlvl=' option requires
one of the following sub-options:
90
default
第2章
generate messages about non-FORTRAN 90 features
no messages about nonstandard FORTRAN features
45
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
引 き 数 と し て フ ァ イ ル名を使用す る オプシ ョ ン も あ り ます。 た と えば、 -oname オプシ ョ ン では、
出力フ ァ イ ルに付け る 名前を指定 し ます。 f90 コ マ ン ド 行に スペルを間違え てオプシ ョ ン を指定
す る と 、 ド ラ イ バは入力 さ れたオプシ ョ ン に似た名前のオプシ ョ ン を検索 し て、 使用可能な代替
オプシ ョ ン を stderr に リ ス ト し 、 プ ロ グ ラ ム を そのオプシ ョ ン な し で コ ンパ イ ル し ます。
すべてのオプシ ョ ンの構文についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て
く だ さ い。 次の コ マ ン ド を入力す る と 、 オプシ ョ ンの使用方法に関す る 簡単な説明が表示 さ れ ま
す。
$ f90 +usage
頻繁に使用する オプ シ ョ ン
表 2-1 は、 コ ンパ イ ラ のデフ ォ ル ト の動作を変更す る 場合に必要な頻繁に使用す る コ マ ン ド 行オ
プシ ョ ン を示 し ます。 すべての HP Fortran コ マ ン ド 行オプシ ョ ンについての詳細は、 48 ページ
の 「オプシ ョ ン説明」 を参照 し て く だ さ い。
表 2-1 頻繁に使用する オプ シ ョ ン
オプ シ ョ ン
機能
-c
リ ン ク せずに コ ンパ イ ルのみ行い ます。 コ ンパ イ ル と リ ン ク を別の手順で行
う 場合に、 こ のオプシ ョ ン を使用 し て く だ さ い。
-g
デバ ッ グす る プ ロ グ ラ ム を準備 し ます。 プ ロ グ ラ ムのデバ ッ グ を準備す る 場
合に、 こ のオプシ ョ ン を使用 し ます。
-Ldirectory
ラ イ ブ ラ リ を検索す る 場所を指定 し ます。 後に -l オプシ ョ ン を指定 し ます。
LPATH 環境変数が設定 さ れてい る 場合に こ のオプシ ョ ン を使用 し ます。
-lx
ラ イ ブ ラ リ を指定 し ます。 ラ イ ブ ラ リ ルーチン を リ ン ク す る 場合に、 こ のオ
プシ ョ ン を使用 し ます。
-O
最適化 し ます。 デフ ォ ル ト の最適化レベルに比べてプ ロ グ ラ ム を最適化す る
場合に、 こ のオプシ ョ ン を使用 し ます。
+save
SAVE 属性を局所変数に指定 し ます。 非初期化変数を含む古い Fortran プ ロ
グ ラ ム を移植す る 場合に、 こ のオプシ ョ ン を使用 し ます。
-o outfile
出力フ ァ イ ルに名前 outfile を付け ます。 実行可能フ ァ イ ルま たはオブ
ジ ェ ク ト フ ァ イ ルに名前を付け る 場合に、 こ のオプシ ョ ン を使用 し ます。
+usage
f90 に現在サポー ト さ れてい る コ ンパ イ ル行オプシ ョ ン を リ ス ト し ます。
46
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-1 頻繁に使用する オプ シ ョ ン ( 続き )
オプ シ ョ ン
機能
冗長モー ド を使用可能に し ます。 コ ンパ イ ルプ ロ セ ス の リ ポー ト を出力す る
場合に、 こ のオプシ ョ ン を使用 し ます。
-v
分類別の コ マ ン ド 行オプ シ ョ ン
表 2-2 は、 f90 の コ マ ン ド 行オプシ ョ ン を分類別に ま と めた も のです。 各オプシ ョ ン についての
詳細は、 48 ページの 「オプシ ョ ン説明」 の項を参照 し て く だ さ い。
表 2-2 分類別のオプ シ ョ ン
分類
オプ シ ョ ン
互換性お よ び移植
+autodbl, +autodbl4, +charlit77 +[no]es,
+extend_source, gformat77, +i8, +io77, +langlvl,
+multi_open, +nocheckuf, +nopadsharedcommon,
+onetrip, +ppu, +r8, +save, +[no]signedzero, +U77
コ ンパ イ ラ 構成
-t, -W
デー タ 記憶領域
+autodbl, +autodbl4, +hugecommon, +hugesize, +i8,
+indirectcommonlist=file, +nopadsharedcommon, +r8,
+real_constant, +save
デ ィ レ ク ト リ 、 モジ ュ ール、
お よ び ラ イ ブ ラ リ の検索パ ス
+U77, -I, -L, -l, +moddir
デバ ッ グ
+check, +dlines, -g, +fp_exception
エ ラ ー制御
+FP, +fp_exception
業界標準拡張
+O[no]openmp
言語機能
+escape, +extend_source, +implicit_none, +langlvl,
+[no]signedzero, +source
リ ンク
+demand_load, -dynamic, +FP, +k, -L, -l, +shared,
+sharedlibF90, +strip, +uppercase
リ ス ト お よ び メ ッ セージ
+asm, +langlvl=90, +list, -v, +version, +what, -w
第2章
47
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-2 分類別のオプ シ ョ ン ( 続き )
分類
オプ シ ョ ン
母国語サポー ト
+nls
パフ ォ ーマ ン スお よ び最適化
+cat,+DA, +DC, +DO, +DS, +fastallocatable, +O, -O
+Oparallel_intrinsics
プ リ プロセッサ
+cpp, +cpp_keep, -D, -U
プロ フ ァ イル
+gprof, +prof, +pa, +pal
その他
+asm, -c, +getarg0, +getarg1, +noalign64bitpointers,
-o, +pic, +pre_include, +ttybuf, +usage, +Z, +z
オプ シ ョ ン説明
次のアルフ ァ ベ ッ ト 順の リ ス ト は、 HP Fortran で認識 さ れ る 各々の コ マ ン ド 行オプシ ョ ン につ
いて説明 し ます。 現在サポー ト さ れてい る すべてのオプシ ョ ン の リ ス ト と その簡潔な説明は、
+usage オプシ ョ ン を使用 し て表示す る こ と も で き ます。
+A
FORTRAN STRUCTURE、 COMMON ブ ロ ッ ク 、 EQUIVALENCE ク ラ ス内のデー タ 項
目の割 り 付け境界を設定 し ます。 +A を引 き 数な し で指定す る と 、 デー タ は 2
バ イ ト 境界で割 り 付け ら れ ます。 そのため、 f77 の +A と は若干異な り ます。
+noalign64bitpointers
ワ イ ド モー ド (+DA2.0W) に コ ンパ イ ルす る 際、 ポ イ ン タ の正 し い割 り 付け境
界を構造型内で無効に し ます。
+allow_ivdep
IVDEP 指令を 使用可能にし ま す。
IVDEP 指令は コ ンパ イ ラ の依存検査を補助 し ます。 IVDEP 指令は DO ループの
繰 り 返 し 処理に対 し てのみ適用 さ れ、 +allow_ivdep コ ンパ イ ラ フ ラ グ を使用
し てい る 場合にのみ有効 と な り ます。
IVDEP 指令は次の形式で指定 し ます。
C$DIR IVDEP
48
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
規則お よ び動作 :
IVDEP 指令と は、 DO ループ内でのメ モリ 参照の順序に関する コ ン パイ ラ のオプ
ティ マイ ザに対する アサート です。
IVDEP 指令は、 通常の ス カ ラ 実行順序において、 すべての依存は同 じ 順方向で
起 こ る と 仮定 し て依存検査を開始す る よ う に コ ンパ イ ラ に伝え ます。 こ れは、
通常の コ ンパ イ ラ の動作 と は異な っ てい ます。 通常の コ ンパ イ ラ に よ る 依存検
査では、 最初に依存の方向について仮定す る こ と はあ り ません。
IVDEP 指令は、 対象と なる それぞれの DO ループの DO 文の先頭に挿入す る 必要
があ り ます。 以下の場合を除いて、 コ ー ド 行を入力 し てはいけ ません。
IVDEP 指令は、 依存は出現順である と 分かっ ている DO ループに対し て適用さ れ
ま す。 た と えば、 ループ内で 2 つの メ モ リ 参照が同 じ メ モ リ 領域 を参照 し て
ど ち ら か一方が メ モ リ 領域を変更 し た場合は、 その領域を最初に参照 し た方が
ソ ース コ ー ド の文字列の先の位置になければいけ ません。 こ の こ と か ら 、 代入
文の右辺は左辺 よ り 先にあ る と 考え ら れ ます。
IVDEP 指令は、 コ ンパ イ ラ に対 し て文が順番に実行 さ れずに他の特定の順序で
実行 さ れた場合に、 プ ロ グ ラ ムが正 し く 動作す る こ と を伝え ます。 た と えば、
最初の文ま たはブ ロ ッ ク をすべての繰 り 返 し が完了す る ま で実行 し てか ら 、 次
の文ま たはブ ロ ッ ク をすべての繰 り 返 し が完了す る ま で実行す る 、 と いっ た場
合です。 オプテ ィ マ イ ザは依存を判別す る ための他の情報 と 共に こ の情報を利
用 し て、 別の実行順序を選択 し ます。
例:
以下の例では IVDEP 指令によ っ て、 ループ内に存在する 依存についてよ り 多く
の情報を 得ていま す。 こ れによ り 、 ループ変換が可能と なる 場合があり ま す。
C$DIR IVDEP
DO I+1, N
A(INDARR(I)) = A(INDARR(I)) + B(I)
END DO
こ の例での ス カ ラ 実行順序を、 以下に示 し ます。
1. INDARR(I) を取 り 出す。
2. 手順 1 の結果を も と にし て A(INDARR(I)) を 取り 出す。
3. B(I) を取 り 出す。
4. 手順 2 と 手順 3 の結果を加算す る 。
第2章
49
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
5. 手順1で A(INDARR(I))によ っ て指定さ れた位置に、手順4の結果を 格納する 。
IVDEP はコ ン パイ ラ に対し て、 手順 1 と 手順 5 で同じ メ モリ 領域にアク セス があ
れば、 手順 1 は先に実行さ れる ので必ず手順 1 がその領域に最初にアク セス する
と 仮定する よ う に指示を 出し ま す。 こ の方法に よ り 、 コ ンパ イ ラ は配列参照の
相対順序を保持す る 命令ス ケ ジ ュ ールを選択 し てい る 限 り 、 命令の再順序付け
を行 う こ と がで き ます。
+allow_unaligned
割 り 付けの際に、 本来のデー タ 型変換ルールを緩和 し ます。
+[no]asm
+asm は、 名前付 き プ ロ グ ラ ム を コ ンパ イ ル し 、 .s 拡張子が付いた対応す る
フ ァ イ ルにアセ ン ブ リ 言語を出力 し ます。 こ のオプシ ョ ン に よ っ て生成 さ れ る
アセ ンブ リ 言語は、 アセ ンブ ラ への入力 と し てはサポー ト さ れません。
デフ ォ ル ト は +noasm です。
-S オプシ ョ ンは、 +asm と 同 じ 機能です。
+[no]autodbl
+autodbl は、 整数型、 論理型、 お よ び実数型の各項目の基本の大 き さ を 8 バ
イ ト に し ます ( 表 2-3 を参照 )。 ま た、 倍精度実数型 と 複素数型の基本の大 き
さ も 16 バ イ ト に し ます。 こ のオプシ ョ ン では、 次の項目のサ イ ズは大 き く な
り ません。
•
文字型の項目
•
BYTE 文で宣言 さ れた項目
•
DOUBLE COMPLEX 文で宣言 さ れた項目
•
大 き さ が明示的に指定 さ れた項目
た と えば、 次の項目は +autodbl の影響を受け ません。
INTEGER(KIND=4)
INTEGER(4) J
REAL*8 D
3.1416_4, 113_4
50
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
ただ し 、 4.0E0 や 2.3D0 な ど、 指数が指定 さ れてい る 定数は倍精度にな る の
で注意 し て く だ さ い。
プ ロ モー ト さ れ る 項目には、 定数、 ス カ ラ 変数、 配列、 お よ び構造型 ( 旧形式
を含む ) の成分が含ま れ ます。 ま た、 こ のオプシ ョ ン では、 組み込み関数だけ
でな く 、 利用者定義関数の結果 と 引 き 数 も 適正な有効桁数にプ ロ モー ト さ れ ま
す。 ON 文で指定 し た型 も プ ロ モー ト さ れ ます。
選択 し た フ ァ イ ルだけでな く 、 プ ロ グ ラ ム全体を こ のオプシ ョ ン で コ ンパ イ ル
し なければな り ません。
こ のオプシ ョ ンは、 有効桁数を 8 バ イ ト お よ び 16 バ イ ト にす る 必要があ る
プ ロ グ ラ ム を移植す る 場合に便利です。 単精度項目だけ を プ ロ モー ト す る 場
合は、 +autodbl4 オプシ ョ ン を使用 し ます (REAL(KIND=16) の算術は低速で
す )。
デフ ォ ル ト は +noautodbl です。
表 2-3 デー タ 型の大き さ と +autodbl[4]
組み込み型のバイ ト 単位の大き さ
整数型、 論理
型、 実数型
倍精度型
複素数型
基本の大 き さ
4
8
8
+autodbl
8
16
16
+autodbl4
8
8
16
+[no]autodbl4
+autodbl と 同様に、 +auotdbl4 を指定す る と 、 整数型、 論理型、 お よ び実数
型の各項目の基本の大 き さ を 8 バ イ ト に、 複素数型の項目の基本の大 き さ を
16 バ イ ト に し ます ( 表 2-3 を参照 )。 +autodbl と 違っ て、 倍精度の基本の大
き さ は変わ り ません。
こ のオプシ ョ ン では、 次の項目の大 き さ は大 き く な り ません。
INTEGER(KIND=4)
INTEGER(4) J
REAL*8 D
第2章
51
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
3.1416_4, 113_4
ただ し 、 4.0E0 や 2.3D0 な ど、 指数が指定 さ れてい る 定数は倍精度にな る の
で注意 し て く だ さ い。
プ ロ モー ト さ れ る 項目には、 定数、 ス カ ラ 変数、 配列、 お よ び構造型 ( 旧形式
を含む ) の成分が含ま れ ます。 ま た、 こ のオプシ ョ ン では、 組み込み関数だけ
でな く 、 利用者定義関数の結果 と 引 き 数 も 適正な有効桁数にプ ロ モー ト さ れ ま
す。 ON 文で指定 し た型 も プ ロ モー ト さ れ ます。
選択 し た フ ァ イ ルだけでな く 、 プ ロ グ ラ ム全体を こ のオプシ ョ ン で コ ンパ イ ル
し なければな り ません。 こ のオプシ ョ ンは、 単精度項目のみを プ ロ モー ト し た
い と き に使用 し ます。
デフ ォ ル ト は +noautodbl4 です。
注記
+autodbl4 オプシ ョ ン を指定す る と 、 REAL, INTEGER, お よ び DOUBLE
PRECISION と 宣言 さ れ る 項目は同 じ 大 き さ にな り ます。 こ れは、 Fortran 規格の
違反 と な り ます。
-Boption
-B は HP Fortran が認識す る オプシ ョ ン で、 グ ロ ーバルな シ ン ボルへの参照
を、 現在の翻訳単位で定義 さ れてい る シ ン ボルで解決す る のか、 ほかの ロ ー ド
モジ ュ ールで解決 さ れ る 可能性があ る も の と みなすのか を指定 し ます。 -B オ
プシ ョ ンは、 HP-UX バージ ョ ン 11i 以降でのみサポー ト さ れてい ます。 81
ページの 「シ ン ボルのバ イ ンデ ィ ン グオプシ ョ ン」 を参照 し て く だ さ い。
-c
-c を指定す る と 、 指定 し た ソ ース フ ァ イ ルを コ ンパ イ ル し ますが、 リ ン ク は
行い ません。 コ ンパ イ ラ は、 フ ァ イ ル並びの フ ァ イ ルご と に再配置可能な フ ァ
イ ル (.o) を生成 し ます ( フ ァ イ ルには、 .f90, .f, .F, .i, .i90, お よ び .s
フ ァ イ ルがあ り ます )。 -c オプシ ョ ン と -o オプシ ョ ン を一緒に使用 し た場合、
コ マ ン ド 行に 1 つの ソ ース フ ァ イ ル し か指定で き ません。 その場合、 生成 さ れ
る オブジ ェ ク ト フ ァ イ ルは -o オプシ ョ ン で指定 し た名前で作成 さ れます。
-C
配列の添え字を実行時にエ ラ ーチ ェ ッ ク し ます。 -C は、 +check=all オプシ ョ
ン と 同 じ 機能です。
+cat
52
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
同 じ プ ロ グ ラ ム形式の ソ ース を 1 つに連結 し 、 連結 し た ソ ース を一括で コ ンパ
イ ル し ます。 こ れに よ り 、 連結 し た フ ァ イ ル内で +O3 の レベルの イ ン ラ イ ン化
を有効に し ます。
+charlit77
+charlit77 を指定す る と 、 文字定数は書 き 込み可能な静的ス ト レージに置か
れ ます。 文字列は、 呼び出 さ れたルーチン に よ っ て変更 さ れた実引 き 数の よ う
に渡 さ れ ます。
+check={all|none}
+check=all は、 配列添え字の コ ンパ イ ル時の範囲チ ェ ッ ク を可能に し ます。
ま た、 +check=all オプシ ョ ン を指定す る と 、 次のいずれかが検出 さ れた場合
に実行時エ ラ ー と な り 、 実行中のプ ロ グ ラ ム が停止 し ます。
•
整数オーバーフ ロ ー
•
上下限を越え た添え字
•
上下限を越え た部分列
デフ ォ ル ト は +check=none です。 -C オプシ ョ ンは、 +check=all と 同 じ 機能
です。
+cpp={yes|no|default}
+cpp=yes は、 コ マ ン ド 行で指定 し た ソ ース フ ァ イ ルを コ ンパ イ ルす る 前に、
C プ リ プ ロ セ ッ サに渡す よ う に、 コ ンパ イ ラ に対 し て指示 し ます。 こ のオプ
シ ョ ンは、 .i フ ァ イ ル と .i90 フ ァ イ ルに適用 さ れません。
デフ ォ ル ト の +cpp=default を指定す る と 、 C プ リ プ ロ セ ッ サは .F 拡張子付
き の フ ァ イ ルに適用 さ れますが、 .f ま たは .f90 拡張子付 き の フ ァ イ ルに適用
さ れ ません。
+cpp=no を指定す る と 、 コ ンパ イ ラ では、 .F 付 き の フ ァ イ ルを含め、 コ マ ン
ド 行で指定 し た ど の フ ァ イ ルに対 し て も 、 C プ リ プ ロ セ ッ サ を呼び出 し ませ
ん。
C プ リ プ ロ セ ッ サか ら の出力を保存す る 場合は、 +cpp_keep オプシ ョ ン を使
用 し ます。
+[no]cpp_keep
第2章
53
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+cpp_keep を指定す る と 、 C プ リ プ ロ セ ッ サか ら の出力を コ ンパ イ ラ が保持
し ます。 ソ ース フ ァ イ ル名が file.f ま たは file.F であれば、 出力フ ァ イ ル
名は file.i と な り ます。 ソ ース フ ァ イ ル名が file.f90 であれば、 出力フ ァ
イ ル名は file.i90 と な り ます。 コ ンパ イ ラ は、 .i お よ び .i90 拡張子が付い
た ソ ース フ ァ イ ルを受け入れます。
デフ ォ ル ト の +nocpp_keep を指定す る と 、 出力フ ァ イ ルは破棄 さ れ ます。
こ のオプシ ョ ン では、 ソ ース フ ァ イ ルは C プ リ プ ロ セ ッ サに渡 さ れないので
注意 し て く だ さ い。 C プ リ プ ロ セ ッ サに渡すには、 +cpp=yes オプシ ョ ン を指
定 し なければな り ません。
-D name[=def]
-D オプシ ョ ンは、 C プ リ プ ロ セ ッ サに対 し てシ ン ボル名 (name) を定義 し ま
す。 シ ン ボル名に値 (def) を与え なければ、 name は 1 と し て定義 さ れます。
こ のオプシ ョ ンは、 C プ リ プ ロ セ ッ サに渡 さ れ る フ ァ イ ルにのみ適用 さ れ ま
す。
+DAmodel
+DA オプシ ョ ン を指定す る と 、 PA-RISC アーキ テ ク チ ャ の特定バージ ョ ン用
にオブジ ェ ク ト コ ー ド が生成 さ れ ます。 デフ ォ ル ト では、 コ ンパ イ ラ は コ ンパ
イ ル し よ う と す る マシ ン モデル用の コ ー ド を生成 し ます。 こ のオプシ ョ ン を使
用す る と 、 デフ ォ ル ト を無効に し て、 コ ンパ イ ル し たマシ ン用ではな く 、 プ ロ
グ ラ ム を実行す る マシ ン用の コ ー ド を コ ンパ イ ラ に生成 さ せ る こ と がで き ま
す。
model には、 次のいずれか を指定で き ます。
•
PA-RISC のバージ ョ ン番号 (1.1 ま たは 2.0)
•
モデル番号 (750 や 870 な ど )
•
PA-RISC プ ロ セ ッ サ名 ( た と えば、 PA7000, PA7100, ま たは PA8000 な ど )
•
portable。 こ の語を指定す る と 、 コ ンパ イ ラ はすべての PA-RISC 1.1 お よ
び 2.0 シ ス テ ム間で互換性のあ る コ ー ド を生成 し ます。
最高のパフ ォ ーマ ン ス を得 る には、 +DA を使用 し て、 プ ロ グ ラ ム を実行す る 予
定のマシ ンのモデル番号ま たはアーキ テ ク チ ャ を指定 し ます。
54
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+DA オプシ ョ ン では、 HP-UX 数学 ラ イ ブ ラ リ に適切な検索パ ス も 指定 し ます。
プ ロ グ ラ ム で数学関数を呼び出す場合、 +DA2.0 を指定す る と 数学 ラ イ ブ ラ リ
の PA2.0 バージ ョ ン を リ ン ク し 、 +DA1.1 を指定す る と PA1.1 バージ ョ ン の ラ
イ ブ ラ リ を リ ン ク し ます ( 数学 ラ イ ブ ラ リ の使用方法についての詳細は、
『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 )。
+DA2.0W では、 メ モ リ ア ド レ ス は 64 ビ ッ ト 値にな り ます。 こ れに よ っ て、 共
通ブ ロ ッ ク と 動的割 り 付け メ モ リ が 32 ビ ッ ト ア ド レ ス の限界を超え る こ と が
可能にな り ます。 こ の機能は、 アプ リ ケーシ ョ ン が実行 さ れてい る シ ス テ ム の
使用可能な仮想 メ モ リ に よ っ て制約 さ れ ます。
注記
64 ビ ッ ト コ ー ド を生成す る には、 +DA2.OW を指定 し なければな り ません。 PA64
では、 ポ イ ン タ を除いて、 すべてのデー タ 型は、 PA32 の場合のサ イ ズ と 変わ り ま
せん。 Fortran ポ イ ン タ は、 ユーザーには隠 さ れてお り 、 直接操作す る こ と はで
き ません。
+DA2.0W
Cray 形式ポ イ ン タ の基本の大 き さ を変更 し ます。 デフ ォ ル ト の 4 バ イ ト では
な く 、 整数や C のポ イ ン タ の基本の大 き さ (8 バ イ ト ) にな り ます。
+DC
コ ンパ イ ラ にキ ャ ッ シ ュ の値を指定 し ます。 構文は +DC<a>:<b>:<c> で、
<a> にはキ ャ ッ シ ュ サ イ ズの合計 (バ イ ト 単位)、 <b> にはキ ャ ッ シ ュ 行のサ
イ ズ (バ イ ト 単位)、 <c> にはキ ャ ッ シ ュ の関連付け を指定 し ます。
+DC7200
+DC7200 を指定す る と 、 メ モ リ 階層を PA7200 プ ロ セ ッ サ用に最適化 し ます。
+DDdatamodel
ILP32 ま たは LP64 デー タ モデルのいずれか を使用 し た コ ー ド を生成 し ます。
datamodel には、 次の値が定義 さ れてい ます。
32
ILP32 デー タ モデルを使用 し ます。 int、 long、 ポ イ ン タ
デー タ 型の大 き さ は 32 ビ ッ ト です。
64
LP64 デー タ モデルを使用 し ます。 int デー タ 型の大 き さ は
32 ビ ッ ト で、 long と ポ イ ン タ のデー タ 型は 64 ビ ッ ト です。
プ リ プ ロ セ ッ サに LP64 を定義 し ます。
デフ ォ ル ト は +DD32 です。
第2章
55
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+[no]demand_load
+demand_load は、 リ ン カーか ら の出力フ ァ イ ルに をデマン ド ロー ド 可能 ( 共
用不能 ) と し てマー ク し ます。 プ ロ セ ス が デマン ド ロー ド 可能 と し てマー ク さ
れてい る 場合、 そのページはア ク セ ス時にのみ物理 メ モ リ に取 り 込まれ ます。
デフ ォ ル ト の +nodemand_load を指定す る と 、 リ ン カーか ら の出力フ ァ イ ル
がデマン ド ロー ド 可能 ( 共用不能 ) と し てマー ク さ れ る のを防ぎ ます。
-q オプシ ョ ンは +demand_load と 同 じ 機能であ り 、 -Q オプシ ョ ンは、
+nodemand_load と 同 じ 機能です。
+dfname
プ ロ フ ァ イ ルベース の最適化で使用す る 、 プ ロ フ ァ イ ルデー タ ベース の フ ァ イ
ル名を指定 し ます。
+df を使用す る 場合には、 同時に +P を指定 し なければな り ません。
こ のオプシ ョ ンは +Oprofile=use: filename と 同義です。
こ のオプシ ョ ンは、 Itanium® ベース アーキ テ ク チ ャ でのみ有効です。
フ ァ イ ル名が指定 さ れない場合のデフ ォ ル ト は flow.data です。
+[no]dlines
+dlines を指定す る と 、 1 桁目が “D” ま たは “d” にな っ てい る ソ ース行が コ ン
パ イ ル対象の文 と し て扱われ ます。 デフ ォ ル ト の +nodlines を指定す る と 、 1
桁目が “D” ま たは “d” で始ま る 行は注釈 と し て扱われ ます。
+dlines オプシ ョ ンは、 固定形式の ソ ース フ ァ イ ルに対 し てのみ使用 し て く
だ さ い。
+DOosname
+DOosname は、 コ ンパ イ ラ の タ ーゲ ッ ト オペレーテ ィ ン グ シ ス テ ム を設定 し 、
下位互換のない最適化を使用可能に し ます。
PA-RISC ベース シ ス テ ムが認識する osname の値は、 11.0 お よ び
11.0EP9806 です。
Itanium® ベース シ ス テ ム が認識す る osname の値は、 11.20、 11.22、 お よ び
11.23 です。
+DOosname はすべての最適化レベルで使用で き ます。 osname のデフ ォ ル ト 値
は、 コ ンパ イ ラ を実行 し てい る コ ン ピ ュ ー タ のオペレーテ ィ ン グ シ ス テ ムの
バージ ョ ン です。
56
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+DSmodel
+DS は、 model に よ っ て指定 さ れ る よ う に、 PA-RISC アーキ テ ク チ ャ の特定
の実装のために命令の ス ケ ジ ュ ー リ ン グ アルゴ リ ズ ム を指定 し ます。
model には、 次のいずれか を指定で き ます。
•
PA-RISC のバージ ョ ン番号 (1.1 ま たは 2.0)
•
モデル番号 (750 や 870 な ど )
•
PA-RISC プ ロ セ ッ サ名 ( PA7000, PA7100, ま たは PA8000 な ど )
•
Itanium® の値は以下の よ う に定義 さ れてい ます。
た と えば、 +DS750 と 指定す る と 、 PA-RISC 1.1 の 1 つの実現方法に適 し た
チ ュ ーニ ン グ を行 う 命令の ス ケ ジ ュ ー リ ン グが行われ ます。 +DS2.0 ま たは
+DS1.1 と 指定す る と 、 それぞれ典型的な PA-RISC 2.0 ま たは 1.1 シ ス テ ムに
適 し た命令の ス ケ ジ ュ ー リ ン グが行われます。 特定のモデルのパフ ォ ーマ ン ス
を改善す る には、 そのモデル番号を +DS に指定 し ます。
特定のモデルに適 し た ス ケ ジ ュ ー リ ン グに よ り チ ュ ーニ ン グ さ れたオブジ ェ ク
ト コ ー ド は、 他のシ ス テ ム で も 実行で き ますが、 効率が低下す る 可能性があ り
ます。
こ のオプシ ョ ン を指定 し なければ、 コ ンパ イ ラ は +DA オプシ ョ ン に よ っ て指
定 さ れた引 き 数を使用 し ます。 +DS も +DA も 指定 し ない と 、 デフ ォ ル ト の命令
の ス ケ ジ ュ ー リ ン グが コ ンパ イ ル対象のシ ス テ ム に対 し て行われます。
Itanium® ベース アーキ テ ク チ ャ に対 し て、 model に定義 さ れてい る 値は以下
の と お り です。
blended
プ ロ セ ッ サが組み合わせ ら れてい る ( た と えば Itanium® と
Itanium®2 プ ロ セ ッ サの組み合わせ ) 場合に、 最高のパ
フ ォ ーマ ン ス を得 る よ う にチ ュ ーニ ン グ し ます。
itanium
Itanium® プ ロ セ ッ サで、 最高のパフ ォ ーマ ン ス を得 る よ う
にチ ュ ーニ ン グ し ます。
itanium2
Itanium®2 プ ロ セ ッ サで、 最高のパフ ォ ーマ ン ス を得 る よ
う にチ ュ ーニ ン グ し ます。
native
コ ンパ イ ラ が実行 さ れてい る プ ロ セ ッ サで、 最高のパフ ォー
マ ン ス を得 る よ う にチ ュ ーニ ン グ し ます。
-dynamic
-dynamic を指定す る と 、 動的に束縛 さ れた実行可能フ ァ イ ルを生成 し ます。
第2章
57
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+[no]escape
+escape を指定す る と 、 バ ッ ク ス ラ ッ シ ュ 文字 (\) が C の よ う にエ ス ケープ
文字 と し て扱われ ます。 デフ ォ ル ト の +noescape を指定す る と 、 バ ッ ク ス
ラ ッ シ ュ 文字は文字定数 と し て扱われ ます。
+[no]es
+[no]es は、 境界線を越え た文字定数表現 と ホ レ リ ス定数が、 パデ ィ ン グ さ
れていない こ と を除いて、 +[no]extend_source と 似てい ます。 こ のオプシ ョ
ンは、 Fortran 77 の +es オプシ ョ ン に互換性を提供 し ます。
58
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
-exec
作成 し たすべてのオブジ ェ ク ト フ ァ イ ルを使用 し て実行可能フ ァ イ ルを作成す
る こ と を指定 し ます。 保護 さ れた、 ま たは隠 さ れてい る エ ク ス ポー ト ク ラ ス の
定数は読み取 り 専用デー タ のセ ク シ ョ ンに配置 さ れ ます。
こ のオプシ ョ ン を指定す る と 、 -Bprotected_def オプシ ョ ン も 自動的に指定
さ れ ます。
+[no]extend_source
+extend_source オプシ ョ ン を指定す る と 、 ソ ース行を拡張 し て最高 254 文
字ま で含め る こ と がで き ます。 デフ ォ ル ト の +noextend_source を指定す る
と 、 固定形式の ソ ース行は 72 文字以内に、 自由形式の ソ ース行は 132 文字以
内に制限 さ れ ます。
コ ンパ イ ラ が 72 桁目以降の文字を無視す る 必要があ る プ ロ グ ラ ム では、
+extend_source オプシ ョ ン を指定す る と 正常に コ ンパ イ ル さ れません。
+externals=file
組み込み関数ではなく 、 外部に存在する と みなすべき プロ シージャ 名の一覧を
含むフ ァ イ ルを 指定し ま す。 こ のオプショ ン を 使用する と 、 そのフ ァ イ ル内に名
前のある ルーチン は、 EXTERNAL 属性で宣言さ れている も のと し て扱われま す。
+fastallocatable
+fastallocatable は、 コ ンパ イ ラ に よ っ て作 ら れたオブジ ェ ク ト コ ー ド 中
で、 割 り 当て可能な配列に対 し て違 う 説明が可能です。 こ の代替説明は、 割 り
当て可能な配列参照を含む コ ー ド の最適化において、 問題を回避す る こ と がで
き ます。 さ ら に、 割 り 当て可能な配列に対す る 代替説明は、 古い説明 と バ イ ナ
リ の互換性があ り ます。
+FPflags
+FP オプシ ョ ン浮動小数点演算を ト ラ ッ プす る 実行環境を ど の よ う に初期化す
る か を指定 し ます。 大文字は ト ラ ッ プ を可能に、 小文字は ト ラ ッ プで き ない よ
う に し ます。 flags は必要な動作を指定す る ために連結す る こ と がで き ます。
連結す る と き は、 空白や タ ブ を含めないで く だ さ い。 flags に有効な値につい
ては、 表 2-4 を参照 し て く だ さ い。
デフ ォ ル ト では、 すべての ト ラ ッ プが使用不可にな っ てい ます。 ただ し 、
flags か ら 大文字を除外す る か、 それ と 同等の小文字 (v, z, o, u, i, d) を
flags で指定すれば、 動作を特別に使用不可にす る こ と がで き ます。 た と え
ば、 次の 2 つの コ マ ン ド 行は同 じ です。
第2章
59
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
$ f90 +FPvZI test.f90
$ f90 +FPZI test.f90
PA1.1 ラ イ ブ ラ リ を使用 し てい る 場合は、 fpsetdefaults ま たは fpsetmask
ルーチン を使用 し て、 こ れ ら の設定を実行時に動的に変更で き ます。 こ の 2 つ
のルーチンについての詳細は、 fpgetround(3M) のマ ンページ と 『HP-UX フ
ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ い。
即時ア ン ダーフ ロ ーを使用可能にす る と 、 PA-RISC 1.1 お よ び 2.0 アーキ テ ク
チ ャ の異な る 処理系で、 同 じ プ ロ グ ラ ム フ ァ イ ルか ら 異な る 計算結果が得 ら れ
る 可能性があ り ます。 こ れは、 ハー ド ウ ェ アに、 即時ア ン ダーフ ロ ーが使用可
能な も の と 、 そ う でない も のがあ る か ら です。 +FPD オプシ ョ ン を使用可能に
すれば、 非正規化値を 0 に フ ラ ッ シ ュ で き ますが、 その必要はあ り ません。
表 2-4 +FP オプ シ ョ ンの値
値
V
意味
不正な浮動小数点演算を ト ラ ッ プす る 。 不正な浮動小数点演算の例は、 次の と お
り。
•
NaN の算術演算
•
(+inf) + (-inf) や (+inf) - (+inf) な ど の演算
•
0 と 無限大の乗算
•
除算演算 0/0 お よ び inf/inf
•
特定の浮動小数点の剰余演算
•
負の値の平方根
•
順不同の値の特定の種類の比較
Z
浮動小数点ゼ ロ 除算を ト ラ ッ プす る
O
浮動小数点オーバーフ ロ ーを ト ラ ッ プす る
U
浮動小数点ア ン ダーフ ロ ーを ト ラ ッ プす る
I
不正確な結果 と な る 浮動小数点演算を ト ラ ッ プす る 。 不正確な結果の ト ラ ッ プは、
結果を生成す る ために丸めが必要な場合に発生す る 。 た と えば、 分数 1.0/3.0 の
場合、 こ の分数には正確な浮動小数点表現がないため、 不正確な結果の ト ラ ッ プが
発生す る 。
60
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-4 +FP オプ シ ョ ンの値 ( 続き )
値
D
意味
即時ア ン ダーフ ロ ーが利用可能なバージ ョ ン 1.0 以降の PA-RISC シ ス テ ム上で、
非正規化値の即時ア ン ダーフ ロ ー ( 非正規化値を即時にゼ ロ にす る 機能 ) を使用可
能にす る ( つま り 、 +FPD を指定す る と 、 実行時に使用 さ れ る プ ロ セ ッ サ上で使用可
能な場合にのみ、 即時ア ン ダーフ ロ ーが使用可能にな る )。 非正規化値 と は、 絶対
値が き わめて 0 に近い値であ る 。 IEEE の単精度デー タ 型の場合、 最大の非正規化
値は、 ほぼ 2-126 と 等 し く な る 。 IEEE の倍精度デー タ 型の場合は、 ほぼ 2 -1022 と
等 し く な る 。 即時ア ン ダーフ ロ ーが発生す る と 、 一部の浮動小数点アプ リ ケーシ ョ
ンは高速で実行 さ れ る が、 き わめて 0 に近い数値の有効桁数が低下す る 可能性があ
る。
+[no]fp_exception
+fp_exceptions は コ ンパ イ ル時の フ ラ グです。 +fp_exceptions オプシ ョ
ン を指定す る と 、 表 2-5 に示す HP-UX シ グナルの発生時に、 説明的な メ ッ
セージ と 手続 き ト レース バ ッ ク を標準エ ラ ーに対 し て発行 し ます。
こ れ ら のシ グナルについての詳細は、 『HP-UX リ フ ァ レ ン ス 』 の signal(2)
お よ び signal(5) を参照 し て く だ さ い。 浮動小数点例外 と エ ラ ー処理について
の詳細は、 『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ
い。
ま た、 ON 文を使用 し て独自の ト ラ ッ プ手続 き を書 く こ と も で き ます。 ON 文の
構文については、 ON 文の使用方法については 155 ページの第 5 章 「ON 文の
使用方法」 を参照 し て く だ さ い
デフ ォ ル ト の +nofp_exceptions は、 ト レース バ ッ ク 情報を使用不能に し ま
す。
表 2-5 +traceback オプ シ ョ ン で認識 さ れる シグナル
シグナル
意味
SIGILL
不正な命令
SIGFPE
浮動小数点例外
SIGBUS
バ ス エ ラ ー命令
SIGSEGV
セグ メ ン ト 化違反
第2章
61
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-5 +traceback オプ シ ョ ン で認識 さ れる シグナル ( 続き )
シグナル
SIGSYS
意味
シ ス テ ム コ ールの不正な引 き 数
-g
-g を指定す る と 、 HP WDB デバ ッ ガが使用す る 情報を生成 し ます。 -g オプ
シ ョ ンは、 最適化オプシ ョ ン -O, -O1/+O1, お よ び -O2/+O2 を使用 し て コ ンパ
イ ル済みの コ ー ド をデバ ッ グ用に準備す る こ と がで き ます。 ただ し 、 -O3/+O3
以上の最適化オプシ ョ ンは対象外です。
-G
gprof(1) に よ る プ ロ フ ァ イ ルのための コ ー ド を生成 し ます。 こ れは、 +gprof
と 同 じ 機能です。
+getarg
+getarg0 と +getarg1 は、 getarg 組み込みサブルーチン の動作を制御 し ま
す。 +getarg0 は、 getarg の業界標準動作を要求 し 、 イ ンデ ッ ク ス値ゼ ロ に
よ っ てプ ロ グ ラ ム名が返 さ れます。 HP FORTRAN 77 getarg 組み込み関数
も 、 こ の業界標準規則を実装 し てい ます。 +getarg1 は、 非標準動作を要求す
る ために使用 し 、 イ ンデ ッ ク ス値 1 に よ っ てプ ロ グ ラ ム名が返 さ れます (HP
Fortran の旧バージ ョ ンは こ の よ う に動作 し ます )。 デフ ォ ル ト は、 +getarg0
です。
gformat77
gformat77 は、 G 編集記述子でゼ ロ に フ ォ ーマ ッ ト す る FORTRAN 77 の形
式を要求 し ます。 今書 き 込まれてい る 値がゼ ロ であ る な ら ば、 Fortran 90 は F
編集記述子を使用 し ます。
+[no]gprof
+gprof は、 gprof でのプ ロ フ ァ イ ルに備え て、 オブジ ェ ク ト コ ー ド を準備 し
ます。 デフ ォ ル ト は +nogprof です。
gprof は、 「HP-UX General Programming Tools」 の一部 と し て提供 さ れ ま
す ( 詳細は、 gprof(1) を参照 )。
-G オプシ ョ ン を使用す る と 、 +gprof と 同 じ 機能を実行で き ます。
+hugecommon
62
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+hugecommon は、 指定 し た COMMON ブ ロ ッ ク を ヒ ュ ージデー タ セ グ メ ン ト に
配置す る よ う に コ ンパ イ ラ に指示 し ます。 こ のオプシ ョ ン の形式は次の と お り
です。
+hugecommon=name
こ こ で name は、 COMMON ブ ロ ッ ク の名前を表 し ます。 デフ ォ ル ト では、 2GB
よ り 大 き い COMMON ブ ロ ッ ク だけが ヒ ュ ージデー タ セ グ メ ン ト に配置 さ れ ま
す。
た と えば、 % f90 +hugecommon=results pcvals.f90 は、 results と い う
名前の COMMON ブ ロ ッ ク を ヒ ュ ージデー タ セ グ メ ン ト に配置 し ます。
+hugecommon オプシ ョ ンは、 複数の異な る COMMON ブ ロ ッ ク が、 個々には
2GB を占有 し ないが、 全体 と し て 2GB を超え る 場合に特に役立ち ます。 こ の
場合に、 こ れ ら の COMMON ブ ロ ッ ク の名前を複数の +hugecommon オプシ ョ ン
で指定 し てプ ロ グ ラ ム を コ ンパ イ ルす る と 、 大 き な COMMON ブ ロ ッ ク を ヒ ュ ー
ジデー タ セグ メ ン ト に配置す る こ と がで き ます。
1 つのオブジ ェ ク ト フ ァ イ ルで ヒ ュ ージ と 指定 さ れてい る 共通ブ ロ ッ ク は、 す
べてのオブジ ェ ク ト フ ァ イ ルで ヒ ュ ージ と 指定 し なければな り ません。 そ う し
ない場合には、 プ ロ グ ラ ムの リ ン ク が失敗 し ます。
注記
PA2.0W オブジ ェ ク ト は、 32 ビ ッ ト オブジ ェ ク ト フ ァ イ ル と 結合で き ません。
64 ビ ッ ト アプ リ ケーシ ョ ンは、 PA8000 ベース シ ス テ ム以外では実行で き ませ
ん。
+hugesize
+hugesize コ ンパ イ ル行オプシ ョ ンは、 指定サ イ ズ よ り 大 き い COMMON ブ
ロ ッ ク を ヒ ュ ージデー タ セ グ メ ン ト に配置す る よ う に コ ンパ イ ラ に指示 し ま
す。 こ のオプシ ョ ンの形式は次の と お り です。
+hugesize=n
こ こ で n は、 キ ロ バ イ ト (1024 バ イ ト ) 単位のサ イ ズ を表 し ます。
デフ ォ ル ト では、 2GB (2147483648 バ イ ト ) よ り 大 き い COMMON ブ ロ ッ ク を
ヒ ュ ージデー タ セグ メ ン ト に配置 し ます。 すなわち、 +hugesize=2097152 が
デフ ォ ル ト 設定値です。
た と えば、 % f90 +hugesize=1024 hello.f90 は、 1048576 バ イ ト (1MB)
よ り 大 き い COMMON ブ ロ ッ ク を ヒ ュ ージデー タ セグ メ ン ト に配置す る よ う に
指定 し ます。
第2章
63
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
1 つのオブジ ェ ク ト フ ァ イ ルで ヒ ュ ージ と 指定 さ れてい る 共通ブ ロ ッ ク は、 す
べてのオブジ ェ ク ト フ ァ イ ルで ヒ ュ ージ と 指定 し なければな り ません。 そ う し
ない場合には、 プ ロ グ ラ ムの リ ン ク が失敗 し ます。
PA2.0W オブジ ェ ク ト は、 32 ビ ッ ト オブジ ェ ク ト フ ァ イ ル と 結合で き ません。
64 ビ ッ ト アプ リ ケーシ ョ ンは、 PA8000 ベース シ ス テ ム以外では実行で き ま
せん。
+i2
+i2 は、 4 バ イ ト の整数、 論理定数、 組み込み関数、 ユーザー変数を、 デフ ォ
ル ト の 4 バ イ ト ではな く 、 2 バ イ ト の整数に変更 し ます。
+i8
+i8 は、 4 バ イ ト の整数、 論理定数、 組み込み関数、 ユーザー変数を、 デフ ォ
ル ト の 4 バ イ ト ではな く 、 8 バ イ ト の整数に変更 し ます。
+ild
イ ン ク リ メ ン タ ル リ ン ク を指定 し ます。 こ のオプシ ョ ンは、 64 ビ ッ ト での リ
ン ク でのみ有効です。
出力フ ァ イ ルが存在 し ない場合、 ま たは、 +ild オプシ ョ ン な し で作成 さ れた場
合、 リ ン カーに よ っ て初期 イ ン ク リ メ ン タ ル リ ン ク が実行 さ れ ます。 作成 さ れ
た出力フ ァ イ ルは、 こ れ以降の イ ン ク リ メ ン タ ル リ ン ク に使用 さ れます。 イ ン
ク リ メ ン タ ル リ ン ク オプシ ョ ンは、 実行可能フ ァ イ ルの リ ン ク で も 共有 ラ イ ブ
ラ リ の リ ン ク で も 有効です。 こ れは、 再配置可能な リ ン ク 、 出力モジ ュ ールを
削除す る オプシ ョ ン ( ま たはツール )、 一部の最適化オプシ ョ ン では無効です。
詳細は、 ld(1) を参照 し て く だ さ い。
+ildrelink
出力す る ロ ー ド モジ ュ ール と 無関係に、 初期 イ ン ク リ メ ン タ ル リ ン ク を行い ま
す。 こ のオプシ ョ ンは、 64 ビ ッ ト での リ ン ク でのみ有効です。
イ ン ク リ メ ン タ ル リ ン ク の際、 特定の状況 ( 内部のパデ ィ ン グ空間を使い切 る
な ど ) においては、 イ ン ク リ メ ン タ ル リ ン カーは強制的に初期 イ ン ク リ メ ン タ
ル リ ン ク を実行 し ます。 +ildrelink オプシ ョ ン で、 定期的に出力フ ァ イ ルを
再構築す る こ と に よ り 、 予期 し ない初期 イ ン ク リ メ ン タ ル リ ン ク を回避で き ま
す。
-Idirectory
64
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
-I では、 .mod フ ァ イ ルや、 INCLUDE 行ま たは #include 指令で指定 し た フ ァ
イ ルの名前が相対パ ス名の場合、 つま り 、 ス ラ ッ シ ュ (/) で始ま ら ない場合
に、 その フ ァ イ ルを検索す る デ ィ レ ク ト リ を指定 し ます。 デ ィ レ ク ト リ は、 次
の順序で検索 さ れ ます。
•
現在の ソ ースデ ィ レ ク ト リ 。つま り 、 INCLUDE 行ま たは #include 指令を記
述 し た フ ァ イ ルが入っ てい る デ ィ レ ク ト リ
•
-I オプシ ョ ン で指定 し た と お り の順番の各デ ィ レ ク ト リ
•
現在の ワ ー ク デ ィ レ ク ト リ
•
/usr/include デ ィ レ ク ト リ
+[no]implicit_none
+implicit_none は、 暗黙的な識別子の型を不定に し ます。 こ れは、 files 並
びに指定 さ れた各フ ァ イ ル内のプ ロ グ ラ ム単位ご と に IMPLICIT NONE を指定
す る の と 同 じ こ と です。 こ のオプシ ョ ン で コ ンパ イ ルす る ソ ース コ ー ド には、
他の IMPLICIT 文を含め る こ と がで き 、 その場合はそち ら が優先 さ れ ます。 デ
フ ォ ル ト の +noimplicit_none を使用す る と 、 暗黙的に識別子の型が定義 さ
れます。
+indirectcommonlist=file
フ ァ イ ル中に リ ス ト さ れてい る 共通ブ ロ ッ ク (1 行に 1 つ、 / で閉 じ ら れていな
い も の ) は、 共有の共通ブ ロ ッ ク の よ う に扱われ ますが接続 さ れてい ません。
ユーザーは こ の よ う な共通ブ ロ ッ ク を、 参照す る 前に接続す る か ス ト レージ を
割 り 当て なければな り ません。
C 言語プ ロ グ ラ ムは主に、 共有 メ モ リ セ グ メ ン ト に接続す る 、 ま たは 1 ブ ロ ッ
ク の メ モ リ を malloc す る ために使用 さ れ、 共有ブ ロ ッ ク の外部シ ン ボルにそ
のア ド レ ス を保存 し ます。 こ の よ う な共通ブ ロ ッ ク を参照す る すべての
Fortran の コ ー ド は、 間接共有ブ ロ ッ ク に対応す る 外部シ ン ボル中で、 ア ド レ
ス を間接参照 し ます。
+indirectcommonlist フ ラ グは、 その よ う な共通ブ ロ ッ ク 中の変数を参照す
る すべての リ ソ ース フ ァ イ ルを コ ンパ イ ル し なければな り ません。 そ し て、 そ
の共通ブ ロ ッ ク 名は、 名前付 き フ ァ イ ルに出て こ なければな り ません。
第2章
65
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+io77
E と F の編集記述子で実数を表示 し た際に小数点に先行す る 、 省略可能な
「0」 の生成を抑制 し ます。 Fortran 77 は、 NOSTANDARDIO フ ラ グ を使用 し ない
限 り 、 こ う し た先行す る 0 を抑制 し てい ま し た。
-ipo
こ のオプシ ョ ンは Itanium® ベース アーキ テ ク チ ャ でのみ有効です。
フ ァ イ ルに ま たが る プ ロ シージ ャ 間の最適化を有効に し ます。 こ のオプシ ョ ン
を使用 し て作 ら れたオブジ ェ ク ト フ ァ イ ルには、 IELF 形式の中間 コ ー ド が含
ま れ ます。 リ ン ク 時には、 ld がプロ シージャ 間の最適化を 行う u2comp を自動
的に実行 し ます。 こ のオプシ ョ ンは、 最適化レ ベル +O1 と +O2 では無視さ れま
す。 +O4 ま たは +Ofaster を使用 し てい る 場合は、 デフ ォ ル ト で こ のオプシ ョ
ン が有効 と な り ます。
+k
+k は、 大量の共有デー タ 項目を参照す る プ ロ グ ラ ム用に コ ー ド を生成 し ます。
こ のオプシ ョ ン が必要にな る のは まれですが、 その場合は リ ン カーか ら 診断
メ ッ セージが発行 さ れ ます。 デフ ォ ル ト では、 共有 ラ イ ブ ラ リ 内の大域デー タ
を参照す る プ ロ グ ラ ム用に、 短いデ ィ ス プ レース メ ン ト の コ ー ド 列が コ ンパ イ
ラ に よ っ て生成 さ れます。 ほぼど んなプ ロ グ ラ ム の場合 も 、 こ れで十分です。
-K
局所変数の記憶領域 と し て、 ス タ ッ ク ではな く 、 静的領域を使用 し ます。 こ の
オプシ ョ ンは、 +save オプシ ョ ン と 同 じ 機能です。
-L directory
-l 演算対象で指定 さ れた ラ イ ブ ラ リ の場合、 標準のデ ィ レ ク ト リ を検索す る
前に directory を検索 し ます。 複数のデ ィ レ ク ト リ を指定で き ます。 その場
合、 各 directory の前に、 それぞれ -L オプシ ョ ン を指定 し なければな り ま
せん。 -L オプシ ョ ン で指定 し たデ ィ レ ク ト リ は、 指定 し た順序で検索 さ れま
す。 こ のオプシ ョ ンは、 コ マ ン ド 行で -l オプシ ョ ンの前に指定 し なければな
り ません。
-lx
-l を指定す る と 、 リ ン カーが /lib/libx.a ( ま たは .sl) ま たは
/usr/lib/libx.a ( ま たは .sl) と い う 名前の ラ イ ブ ラ リ を検索 し ます。 こ の
場合、 リ ン カーが最初に検索す る のは、 /lib です。 -a リ ン カーオプシ ョ ン の
66
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
現在の状態に よ っ て、 アーカ イ ブ (.a) バージ ョ ン と 共有 (.sl) バージ ョ ンの
う ち、 ど ち ら のバージ ョ ンの ラ イ ブ ラ リ が検索 さ れ る かが決ま り ます。 -a オ
プシ ョ ン については、 ld(1) のマ ンページ を参照 し て く だ さ い。
+langlvl={90|default}
+langlvl=90 を指定す る と 、 Fortran 90 規格に厳密に準拠 し てい る か ど う か
をチ ェ ッ ク し 、 規格に対す る HP Fortran 90 拡張機能については警告を発行
し ます。 デフ ォ ル ト の +langlvl=default を使用す る と 、 拡張機能を使用す
る こ と がで き ます。
+[no]list
+list は、 標準出力に ソ ース リ ス ト を出力 し ます。 デフ ォ ル ト の +nolist を
使用す る と 、 ソ ース リ ス ト は出力 さ れ ません。
-minshared
現在の コ ンパ イ ル作業の結果が、 最小限の共有 ラ イ ブ ラ リ のみを使用す る よ う
指示 し ます。
+moddir=directory
+moddir は、 コ ンパ イ ラ に .mod フ ァ イ ルを directory に書 き 込む よ う に指
示 し ます。 こ のオプシ ョ ン を指定 し なければ、 モジ ュ ールは現在のデ ィ レ ク ト
リ に書 き 込まれます。
+multi_open
複数の Fortran OPEN ス テー ト メ ン ト で フ ァ イ ルを オープンす る こ と を許可 し 、
複数の FORTRAN UNIT を同 じ フ ァ イ ルに結び付け ら れ る よ う に し ます。
-n
リ ン カーの出力を、 共有 と し てマー ク し ます。 詳細 と シ ス テ ムのデフ ォ ル ト に
ついては、 ld(1) を参照 し て く だ さ い。
-N
リ ン カーの出力を、 非共有 と し てマー ク し ます。 詳細 と シ ス テ ムのデフ ォ ル ト
については、 ld(1) を参照 し て く だ さ い。
+nls=lang
+nls は、 16 ビ ッ ト の母国語のサポー ト を有効に し 、 lang で指定 し た言語で
文字列や注釈を処理で き る よ う に し ます。 母国語サポー ト の詳細は、 『日本語
環境ユーザーガ イ ド 』 を参照 し て く だ さ い。
第2章
67
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
-Y オプシ ョ ン で、 +nls で同 じ 機能を実行す る こ と がで き ます。
+noalign64bitpointers
+noalign64bitpointers は、 ワ イ ド モー ド (+DA2.0W) に コ ンパ イ ルす る と
き 、 正 し いデー タ の割 り 付け境界を、 構造型で不可に し ます。 Fortran 90 の
初期の リ リ ース では、 こ の よ う なポ イ ン タ は不相応に割 り 付け さ れ、 と き には
実行時アボー ト につなが り ます。 こ の変化は、 潜在的なバ イ ナ リ の非互換性に
つなが る ので、 +noalign64bitpointers フ ラ グは、 古い動作を維持す る ため
に用意 さ れ ます。 ワ イ ド モー ド (+DA2.0W) で コ ンパ イ ル し 、 POINTER 属性の
コ ン ポーネ ン ト を含む構造型を持つユーザーは、 その構造型の変数を参照す
る 、 すべての リ ソ ース フ ァ イ ルを再 コ ンパ イ ル し なければな り ません。
+nocheckuf
+nocheckuf は、 ACCESS = sequential で開いてい る テ キ ス ト フ ァ イ ルに対
す る OPEN 文のエ ラ ーチ ェ ッ ク を不可に し ます。 こ のオプシ ョ ンは、
BUFFERIN/BUFFEROUT 文が、 オープ ン な状態の装置にア ク セ スす る ため
に使用 さ れ る と き だけ便利です。 主なプ ロ グ ラ ムは、 何か効果を得 る ために こ
のオプシ ョ ン で コ ンパ イ ル さ れなければな り ません し 、 故にすべての OPEN
文は、 こ のエ ラ ーチ ェ ッ ク を ス キ ッ プ し ます。
+nopadsharedcommon
共有の共通ブ ロ ッ ク を、 8 バ イ ト の倍数にパデ ィ ン グ し てはいけ ません。 こ の
オプシ ョ ンは、 f77 生成プ ロ グ ラ ム と f90 生成プ ロ グ ラ ム間で、 共通ブ ロ ッ ク
を共有す る と き に便利です。 同 じ 共有の共通ブ ロ ッ ク を参照 し てい る すべての
リ ソ ース フ ァ イ ルは、 同 じ 設定の こ の フ ラ グで コ ンパ イ ル さ れなければな り ま
せん。
-O[n]
-O は、 オプテ ィ マ イ ザを呼び出 し ます。 こ こ で n は、 最適化レベル 0 ~ 4 で
す (+O4 は認識 さ れ ますが、 サポー ト さ れてい ません )。 デフ ォ ル ト は最適化レ
ベル 2 です。
こ のオプシ ョ ンは互換用に用意 さ れてお り 、 その機能は +On オプシ ョ ン と 同
じ です。 こ の 2 つのオプシ ョ ン の違いは、 -O オプシ ョ ン では レベルが省略可
能であ る こ と だけです。 最適化レベルについての詳細は、 +On オプシ ョ ン を参
照 し て く だ さ い。
+On
68
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+O は、 オプテ ィ マ イ ザを呼び出 し ます。 こ こ で n は、 最適化レベル 0 ~ 4 で
す。 +O4 は、 認識 し ますがサポー ト さ れてい ません。 f77 のオプシ ョ ン +O4 と
の互換用に用意 さ れてい ます。 -g オプシ ョ ンは、 +O0, +O1, お よ び +O2 オプ
シ ョ ン と と も に指定で き ます。
表 2-6 は、 最適化レベルを示 し てい ます。
注記
最適化レベル と 方法についての詳細は、 『HP-UX パ ラ レル プ ロ グ ラ ミ ン グ ガ イ
ド 』 を参照 し て く だ さ い。
+O[no]optimization
+O[no] では、 特定の最適化、 ま たは特定 ク ラ ス の最適化 ( コ ンパ イ ル時間に
影響す る 最適化な ど ) を使用可能ま たは使用不能にす る こ と がで き ます )。
+O[no]optimization についての詳細は、 83 ページの 「最適化オプシ ョ ン を
使用す る 」 の項を参照 し て く だ さ い。
表 2-6 最適化レ ベル
レ ベル
最適化
0
定数の畳み込みやテ ス ト 条件の部分的な評価な ど、 局所的な最適化
1
次の よ う な限定的な最適化 :
第2章
•
基本ブ ロ ッ ク の最適化
•
分岐の最適化
•
命令ス ケ ジ ュ ー リ ン グ
69
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-6 最適化レ ベル ( 続き )
レ ベル
2
3
4
最適化
レベル 1 で実行 さ れ る 最適化 と 、 次の最適化 :
•
カ ラ ー リ ン グ レ ジ ス タ 割 り 付け
•
誘導変数 と 強度縮小
•
共通式の除去
•
不変式のループ外への移動
•
ロ ー ド / ス ト アの最適化
•
未使用の定義の削除
•
デー タ フ ロ ー解析
•
ソ フ ト ウ ェ アパ イ プ ラ イ ニ ン グ
•
ス カ ラ 置換
•
SUM リ ダ ク シ ョ ン に よ る 最適化
レベル 1 お よ び 2 で実行 さ れ る 最適化 と 、 次の最適化 :
•
ク ロ ーン生成 と イ ン ラ イ ン展開を含む手続 き 間の最適化
•
融合 と 交換を含む、 メ モ リ パフ ォ ーマ ン ス改善のためのループ変形
現在、 レベル 4 の最適化は、 PA-RISC コ ンパ イ ラ ではサポー ト さ れてい ません。
+O4 を指定す る と 、 警告 メ ッ セージが発行 さ れ、 最適化レベル 3 で コ ンパ イ ル さ
れ ます。
Itanium® アプ リ ケーシ ョ ン では、 翻訳単位を ま たいだプ ロ シージ ャ 間の最適化
( リ ン ク 時の最適化 ) と レベル 3 の最適化を実行 し ます。 こ の レベルで生成 さ れ
たオブジ ェ ク ト フ ァ イ ルには、 ユーザー コ ー ド の中間表現が含ま れ、 一時フ ァ イ
ル と し て使用 さ れ ます。 こ の中間オブジ ェ ク ト フ ァ イ ルについて、 異な る バー
ジ ョ ンの コ ンパ イ ラ 同士での互換性は保障 さ れてい ません。 ま た、 同時に
+Oprofile=use オプシ ョ ン を使用す る 必要があ り ます。
+Ooptlevel=name1 [,name2...]
70
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
指定 さ れた、 1 つま たはそれ以上のルーチンについて、 最適化レベルを
optlevel に下げます。 こ のオプシ ョ ンは、 最適化レベルの 1、 2、 3、 4 で使
用可能です。 こ のオプシ ョ ン では、 最適化レベルを +Ooptlevel オプシ ョ ン で
指定 し た レベル よ り 高 く す る こ と はで き ません。 こ のオプシ ョ ンは、
optlevel の値を変更 し て、 複数指定す る こ と がで き ます。
-o outfile
-o は、 実行可能フ ァ イ ルのデフ ォ ル ト 名を a.out ではな く outfile に し ま
す。 -o outfile を指定 し なければ、 a.out が存在す る 場合は、 a.out は上書
き さ れ、 存在 し ない場合は、 a.out が作成 さ れ ます。 outfile の名前の末尾
には、 .f, .f90, .F, .i, ま たは .i90 を付けないで く だ さ い。 ま た、 + ま たは で始めないで く だ さ い。 -c と -o オプシ ョ ン と を と も に使用す る と 、 コ マ ン ド
行に ソ ース フ ァ イ ルを 1 つ し か指定で き ません。 その場合、 生成 さ れ る オブ
ジ ェ ク ト フ ァ イ ル名は outfile に変更 さ れ ます。
+[no]objdebug
こ のオプシ ョ ンは、 -g オプシ ョ ン のいずれか と 組み合わせ る と 、 デバ ッ グ情
報を a.out ではな く オブジ ェ ク ト フ ァ イ ル内に残 し ます。 こ れは、 pxdb の手
順を ス キ ッ プす る ため、 リ ン ク が速 く な り ます。 こ れは、 wdb(1) ま たは gdb(1)
でのみ使用可能です。
+objdebug は、 コ ンパ イ ル時のデフ ォ ル ト です。
一部のオブジ ェ ク ト が +objdebug で コ ンパ イ ル さ れていて も 、 リ ン ク 時に
+noobjdebug を使用 し て、 デバ ッ グ情報を a.out に残す こ と がで き ます。
注記
デバ ッ グ情報を保存す る +objdebug を使用す る 場合には、 オブジ ェ ク ト フ ァ イ ル
と アーカ イ ブ ラ イ ブ ラ リ は、 デバ ッ ガか ら ア ク セ ス で き る 必要があ り ます。
+[no]onetrip
+onetrip を指定す る と 、 DO ループ を最低 1 度は実行す る コ ー ド を生成 し ま
す。 言語規格に よ り 、 HP Fortran では、 次の条件が真の と き には DO ループ
を実行 し ません。
第2章
•
増分値が 0 よ り 大 き く 、 始値が限界値 よ り 大 き い場合
•
増分値が 0 よ り 小 さ く 、 始値が限界値 よ り 小 さ い場合
71
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
ただ し 、 Fortran の古い実現方法 ( 一部の FORTRAN 66 処理系な ど ) では、
DO ループが常に 1 度は実行 さ れ ます。 +onetrip オプシ ョ ン を使用す る と 、
こ の よ う な規格に定め ら れていない実現方法 と の互換性が得 ら れます。
デフ ォ ル ト は +noonetrip です。
-p
prof(1) に よ る プ ロ フ ァ イ ルのための コ ー ド を生成 し ます。 こ れは +prof オプ
シ ョ ン と 同 じ 機能です。 デフ ォ ル ト は +noprof です。
+P
+I ld(1)、 +I、 +df を使用 し た コ ンパ イ ルで生成 さ れたデー タ ベース フ ァ イ
ル flow.data のプ ロ フ ァ イ ル情報に基づいて、 アプ リ ケーシ ョ ン を詳細に最
適化 し ます。 +P オプシ ョ ンは、 +I、 -S オプシ ョ ン と は互換性があ り ません。
ま た、 コ ンパ イ ル時に限 り 、 -g オプシ ョ ン と は互換性があ り ません。
注記
こ のオプシ ョ ンは、 Itanium® ベース シ ス テ ム でのみ有効です。
+pa
+pa を指定す る と 、 ルーチン レベルのプ ロ フ ァ イ ル用にアプ リ ケーシ ョ ン を コ
ンパ イ ル し ます。
注記
+pa は、 HP Fortran コ ンパ イ ラ が PIC ( 位置独立 コ ー ド ) を生成す る 場合には無
視 さ れます。 結果 と し て、 +pic=short, +pic=long, +z, +Z の各オプシ ョ ン で
は、 +pa が無視 さ れ る こ と にな り ます。
+[no]padsrc
文の フ ィ ール ド 幅 よ り 長 さ が短い ソ ース レ コ ー ド で、 フ ィ ール ド 幅の終わ り ま
での右の領域がパデ ィ ン グ さ れ る (ま たは、 さ れない) よ う に指定 し ます。 こ
のオプシ ョ ンに よ り 、 ソ ース レ コ ー ド 内で継続 さ れ る 文字お よ びホ レ リ ス定
数の解釈が影響を受け ます。 デフ ォ ル ト は +padsrc です。
+pal
+pal を指定す る と 、 ルーチン レベル ま たはループ レベルのプ ロ フ ァ イ ル用に
アプ リ ケーシ ョ ン を コ ンパ イ ル し ます。
72
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
注記
+pal は、 HP Fortran コ ンパ イ ラ が PIC ( 位置独立 コ ー ド ) を生成す る 場合には
無視 さ れ ます。 結果 と し て、 +pic=short, +pic=long, +z, +Z の各オプシ ョ ン
では、 +pal が無視 さ れ る こ と にな り ます。
+parallel
パ ラ レル実行可能な コ ー ド を生成 し ます。 最適化レベルが +O0 か ら +O2 で コ
ンパ イ ル さ れたパ ラ レルなプ ロ グ ラ ム で使用 し ます。 こ のオプシ ョ ンは、
HP-UX バージ ョ ン 11i v1 以降でのみ有効です。
+[no]parallel_intrinsics
libF90_parallel ラ イ ブ ラ リ 内の、 一部の組み込み関数のパ ラ レルバージ ョ ン
と リ ン ク し ます。 デフ ォ ル ト は +Onoparallel_intrinsics です。
+pic={short|long|no}
+pic は、 共有 ラ イ ブ ラ リ に追加す る こ と がで き る オブジ ェ ク ト コ ー ド を生成
し ます。 こ のオプシ ョ ン で生成 さ れ る オブジ ェ ク ト コ ー ド は、 位置独立 コ ー ド
(PIC) です。 すべてのア ド レ ス は、 pc 相対ま たは間接参照です。
引 き 数 (short ま たは long) では、 デー タ リ ン ク テーブルに割 り 付け る 大 き さ
を指定 し ます。 通常は、 +pic=short を指定 し て PIC を生成 し ます。 リ ン
カーか ら デー タ リ ン ク テーブルのオーバーフ ロ ーを示すエ ラ ー メ ッ セージが発
行 さ れた場合は、 +pic=long を使用 し て く だ さ い。 +pic=long を指定す る と 、
大量のシ ン ボルを移入で き る よ う に、 コ ンパ イ ラ に よ っ て スペース が追加割 り
付け さ れ ます。
デフ ォ ル ト の +pic=no を使用す る と 、 コ ンパ イ ラ は絶対 コ ー ド で生成 し ます。
+z オプシ ョ ンは +pic=short と 、 +Z オプシ ョ ンは +pic=long と 同 じ 機能で
す。
+[no]ppu
+ppu オプシ ョ ンは、 サブルーチン、 関数、 お よ び共通ブ ロ ッ ク な ど の外部名
に下線を追加 し ます ( デフ ォ ル ト の int_sum ではな く int_sum_ な ど )。
64 ビ ッ ト の Itanium® お よ び PA-RISC アーキ テ ク チ ャ 用のデフ ォ ル ト は、
+ppu です。32 ビ ッ ト の PA-RISC アーキ テ ク チ ャ 用のデフ ォ ル ト は、+noppu で
す。
第2章
73
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
注記
複数言語プ ロ グ ラ ムは、 +ppu オプシ ョ ンの影響を受け ます。 C
言語が Fortan ルーチン を引用す る 場合には、 +ppu を使用 し て
コ ンパ イ ル さ れ る Fortran コ ー ド の COMMON ブ ロ ッ ク は、 末尾
に下線 (_) を必要 と し ます。 末尾の下線を必要 と し ないために、
64 ビ ッ ト モー ド では、 +noppu を使用す る こ と も で き ます。
+pre_include=file
+pre_include は、 コ ンパ イ ル前に コ ンパ イ ラ に よ っ て file に コ ー ド が追加
さ れ ます。 こ のオプシ ョ ン を同 じ コ マ ン ド 行で 2 度以上使用 し て、 それぞれ異
な る files に指定で き ます。
+[no]prof
+prof は、 prof でのプ ロ フ ァ イ ルに備え てオブジ ェ ク ト フ ァ イ ルを準備 し ま
す。 デフ ォ ル ト は +noprof です。
-p オプシ ョ ンは、 +prof と 同 じ 機能です。
prof は、 「HP-UX General Programming Tools」 の一部 と し て提供 さ れ ます
(prof(1) を参照 )。
-q
リ ン カーか ら の出力にデマン ド ロー ド と し てマー ク し ます。 +demand_load オ
プシ ョ ン と 同 じ 機能です。 デフ ォ ル ト は +nodemand_load です。
-Q
リ ン カーか ら の出力に、 デマ ン ド ロ ー ド ではない、 と し てマー ク し ます。
+nodemand_load オプシ ョ ン ( デフ ォ ル ト ) と 同 じ 機能です。
+r8
+r8 は、 4 バ イ ト の実定数、 組み込み関数、 そ し てユーザー変数を、 8 バ イ ト
に変更 し ます ( デフ ォ ル ト の 4 バ イ ト よ り も む し ろ )。
-R4
実数 と 複素数の定数の精度を、 単精度に し ます。 +real_constant=single オ
プシ ョ ン ( デフ ォ ル ト ) と 同 じ 機能です。
-R8
74
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
実数 と 複素数の定数の精度を、 倍精度に し ます。 +real_constant=double オ
プシ ョ ン と 同 じ 機能です。 デフ ォ ル ト は +real_constant=single です。
+real_constant={single|double}
+real_constant=single は、 すべての単精度数値定数を単精度 と し て扱い、
+real_constant=double オプシ ョ ンは、 すべての単精度数値定数を倍精度 と
し て扱い ます。 デフ ォ ル ト は +real_constant=single です。
-R4 お よ び -R8 オプシ ョ ンは、 同 じ 機能です。
-s
リ ン カーの出力か ら シ ン ボルテーブル情報を削除 し ます。 +strip オプシ ョ ン
と 同 じ 機能です。 デフ ォ ル ト は +nostrip です。
-S
指定 さ れた ソ ース フ ァ イ ルのアセ ン ブ リ リ ス ト を生成 し ます。 +asm オプシ ョ
ン と 同 じ 機能です。 デフ ォ ル ト は +noasm です。
+[no]save
+save は、 すべての局所変数を静的領域に割 り 付け ます。 こ のオプシ ョ ンは、
メ モ リ の静的割 り 付け指定に依存す る 旧 Fortran プ ロ グ ラ ム を移植す る 場合に
便利です ( 静的領域に保存 さ れた変数の値は、 それが宣言 さ れてい る プ ロ グ ラ
ム単位の呼び出 し 間で も 保持 さ れます )。 +save オプシ ョ ン を指定す る と 、 初
期化 さ れていない変数はすべて 0 で初期化 さ れます。 デフ ォ ル ト は +nosave
です。
AUTOMATIC 属性を指定 し て明示的に宣言 し た変数に対 し て +save オプシ ョ ン
は無効です。
+save コ マ ン ド 行オプシ ョ ンは、 コ ンパ イ ラ に よ っ て行われ る 最適化の多 く を
禁止 し ます。 通常は、 +Oinitcheck オプシ ョ ン を使用す る 方がパフ ォ ーマ ン
ス は向上 し ます。 こ のオプシ ョ ン では、 初期化 さ れていない変数を 0 に設定 し
ますが、 +save オプシ ョ ン を使用す る 場合 よ り も 選択の幅が大 き く な り ます。
83 ページの 「最適化オプシ ョ ン を使用す る 」 の項を参照 し て く だ さ い。
-K オプシ ョ ンは、 +save と 同 じ 機能です。
+[no]shared
+noshared は、 リ ン カーか ら の出力フ ァ イ ルが共用可能 と し てマー ク さ れ る
の を防ぎ ます。 デフ ォ ル ト の +shared を使用す る と 、 出力フ ァ イ ルは共用可
能 と し てマー ク さ れます。
第2章
75
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
-n オプシ ョ ンは +shared と 、 -N オプシ ョ ンは +noshared と 同 じ 機能です。
+[no]sharedlibF90
+sharedlibF90 を使用 し てユーザーは、 libF90 あ る いは libF90_parallel
の共有バージ ョ ン を、 /usr/lib か ら リ ン ク さ せ る こ と がで き ます。 こ の こ と
に よ り 、 Fortran 90 の ド ラ イ バは、 libF90 の共有バージ ョ ン と リ ン ク し よ う
と す る ため、 潜在的な問題を解決す る こ と にな り ます。 デフ ォ ル ト は
+nosharedlibF90 です。
+[no]sharedlibIO77
libIO77 ラ イ ブ ラ リ の共有 [ アーカ イ ブ ] バージ ョ ン と リ ン ク し ます。 デフ ォ
ル ト では、 アーカ イ ブバージ ョ ンの libIO77 と リ ン ク し ます。 こ のオプシ ョ ン
は、 Itanium® プ ラ ッ ト フ ォ ーム でのみサポー ト さ れてい ます。
+[no]sharedlibU77
+U77 と 組み合わせ る と 、 libU77 ラ イ ブ ラ リ の共有 [ アーカ イ ブ ] バージ ョ ン
と リ ン ク し ます。 デフ ォ ル ト では、 アーカ イ ブバージ ョ ン の libU77 と リ ン ク
し ます。 こ のオプシ ョ ンは、 Itanium® プ ラ ッ ト フ ォ ーム でのみサポー ト さ れ
てい ます。
+[no]signedzero
+[no]signedzero は、 ゼ ロ サ イ ン のサポー ト を可能に し ます。 こ のオプシ ョ
ンは強制的に、 フ ォ ーマ ッ ト さ れた出力 リ ス ト 項目 と し て出て く る 負のゼ ロ の
浮動小数点値を、 「- 」 で始ま る 出力レ コ ー ド 中に表示 さ せます。 こ のオプシ ョ
ンは ま た、 SIGN 組み込み関数の動作を変更 し ます。 デフ ォ ル ト は
+signedzero です。
+source={fixed|free|default}
+source は、 コ ンパ イ ラ に対 し て ソ ース フ ァ イ ルが固定形式か自由形式か を
指示 し ます。 デフ ォ ル ト (+source=default) は、 .f90 ソ ース フ ァ イ ルの場合
は自由形式で、 .f お よ び .F ソ ース フ ァ イ ルの場合は固定形式です
+[no]srcpos
解析ツール Caliper で使用す る 、 ソ ース の位置情報の生成を制御 し ます。
+srcpos が有効の場合 ( デフ ォ ル ト )、 コ ンパ イ ラ は こ の情報を生成 し ます。
+nosrcpos が有効の場合、 コ ンパ イ ラ は こ の情報を生成せず、 リ ン カーにオ
ブジ ェ ク ト フ ァ イ ル内のその種類の情報をすべて破棄す る よ う 指示 し ます。 こ
のオプシ ョ ンは、 Itanium® プ ラ ッ ト フ ォ ーム でのみサポー ト さ れてい ます。
76
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+[no]strip
+strip を指定す る と 、 リ ン カーは実行可能プ ロ グ ラ ム か ら シ ン ボルテーブル
情報を削除 し ます。 こ のオプシ ョ ンは、 -g オプシ ョ ン と の互換性があ り ませ
ん。 デフ ォ ル ト は +nostrip です。
-s オプシ ョ ンは、 +strip と 同 じ 機能です。
-tx,path
-t は、 x で識別する サブプロ セス を path で検索し 、 デフ ォ ルト のサブプロ セス
に置き 換えま す。 x には、 サブプロ セス を 示す識別子を 1 つ以上指定でき ま す。
こ のオプシ ョ ンは、 次の 2 つのモー ド で機能 し ます。
•
x が単一識別子で、 path が ス ラ ッ シ ュ (/) で終わ る 場合、 path は新規のサ
ブプ ロ セ ス を含むデ ィ レ ク ト リ を表 し 、 サブプ ロ セ ス の名前は標準名 と な
り ます。 path が フ ァ イ ル名で終わ る 場合は、 サブプ ロ セ ス の名前で と な り
ます。
•
x が識別子の集合であれば、 path は x で識別 し たサブプ ロ セ ス を含むデ ィ
レ ク ト リ です。 path のサブプ ロ セ ス には、 標準名が付いてい ます。
表 2-7 は、 x の識別子、 各識別子が示すサブプ ロ セ ス、 お よ び標準サブプ
ロ セ ス名を示 し てい ます。
次の -t オプシ ョ ンの例では、 コ ンパ イ ラ に対 し て、 ソ ース フ ァ イ ルを前
処理のために C プ リ プ ロ セ ッ サの K&R バージ ョ ンに渡す よ う に指示 し て
い ます。
-tp,/usr/ccs/lbin/cpp
表 2-7 -t オプ シ ョ ンの値 と サブ プ ロ セス
値
サブ プ ロ セス
標準名
a
アセ ンブ ラ
as
c
コ ンパ イ ラ
f90com
e
デバ ッ グ フ ァ イ ル
end.o
l
リ ン カー
ld
p
C プ リ プロセッサ
cpp
第2章
77
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-7 -t オプ シ ョ ンの値 と サブ プ ロ セス ( 続き )
値
s
サブ プ ロ セス
起動フ ァ イ ル
標準名
crt0.o, gcrt0.o, mcrt0.o
+trigdacc
コ ンパ イ ラ は、 標準関数 よ り も 正確な cosd、 sind、 tand 組み込み関数を使
用 し ます。 標準の も のは、 境界付近での正確 さ に問題があ る ケース があ り ます
が (cosd(90) は 0.0 でなければな ら ない )、 こ の新 し い組み込み関数はそ う し
た ケース において も 正 し い値を返 し ます。
+[no]ttybuf
+ttybuf は、 バ ッ フ ァ 出力を使用 し て、 tty のバ ッ フ ァ リ ン グ を制御 し ます。
+nottybuf はバ ッ フ ァ を使用 し ない出力を使用 し ます。 デフ ォ ル ト はバ ッ
フ ァ を使用 し て出力 し ます (+ttybuf)。 +ttybuf オプシ ョ ン を指定す る と 、 デ
フ ォ ル ト がバ ッ フ ァ を使用 し ないで出力す る シ ス テ ム上で も 、 強制的にバ ッ
フ ァ を使用 し て出力 さ れます。
+[no]ttybuf オプシ ョ ンが認識 さ れ る のは、 主プ ロ グ ラ ムが Fortran プ ロ グ
ラ ムの場合だけです。 主プ ロ グ ラ ム が別の言語で記述 さ れてい る 場合は、
TTYUNBUF 環境変数を使用 し て く だ さ い (f90(1) を参照 )。
+nottybuf オプシ ョ ン には、 特定の BSD 3F ラ イ ブ ラ リ ルーチン と の互換性
があ り ません。 +U77 オプシ ョ ン と 同 じ コ マ ン ド 行で使用す る と 、 コ ンパ イ ラ
は tty のバ ッ フ ァ リ ン グが衝突す る 可能性があ る こ と を警告 し ます。
-Uname
-U は、 C プ リ プ ロ セ ッ サ (cpp) の name の初期定義を未定義にす る か削除 し ま
す。 詳細は、 『HP-UX リ フ ァ レ ン ス 』 の cpp(1) を参照 し て く だ さ い。
+[no]U77
+U77 オプシ ョ ンは、 BSD 3F ラ イ ブ ラ リ の libU77 のサポー ト 機能を起動 し 、
一部の libc シ ス テ ムルーチンへの HP Fortran の引用仕様を提供 し ます。 こ
の ラ イ ブ ラ リ 内のルーチン を呼び出すには、 +U77 を使用 し て コ ンパ イ ルお よ
び リ ン ク す る 必要があ り ます。 こ れ ら のルーチン についての詳細は、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
78
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+noU77 ( デフ ォ ル ト ) を指定す る か、 ま たは +U77 を指定 し なければ、 コ ンパ
イ ラ は libU77 ルーチン名が名前のマ ッ ピ ン グのない通常の外部名 と し て扱い
ます。 名前が リ ン ク 先 ラ イ ブ ラ リ の 1 つに存在 し なければ、 満た さ れないシ ン
ボルがあ る ため、 リ ン カーか ら エ ラ ー メ ッ セージが発行 さ れます。 libU77 の
名前が libc の名前 と 同 じ であれば、 その名前が libc の名前に変換 さ れ る こ
と があ り ます。 こ の状況では、 コ ンパ イ ル時にエ ラ ーは発生 し ませんが、 予測
不能な結果にな る こ と があ り ます。
+[no]uppercase
+uppercase は、 外部名に大文字を使用す る こ と を指定 し ます。 デフ ォ ル ト の
+nouppercase は、 外部名を小文字に変換す る こ と を指定 し ます。
個別名の大文字 / 小文字を制御す る 必要があれば、 227 ページの 「$HP$
ALIAS 指令」 で説明す る $HP$ ALIAS 指令を使用 し て く だ さ い。
+usage
+usage は、 現在 HP Fortran 90 コ ンパ イ ラ でサポー ト さ れてい る すべての コ
ンパ イ ル行オプシ ョ ン の リ ス ト と 簡単な説明を表示す る こ と を指定 し ます。 コ
ンパ イ ルは行い ません。
-v
-v は、 冗長モー ド を使用可能に し 、 標準エ ラ ー出力に コ ンパ イ ルプ ロ セ ス の
説明を 1 ス テ ッ プずつ生成す る こ と を指定 し ます。
+version
+version は、 コ ンパ イ ラ のバージ ョ ン情報を表示す る こ と を指定す る だけ
で、 コ ンパ イ ルは行い ません。
-w
-w は、 警告 メ ッ セージ を表示 し ない こ と を指定 し ます。 こ のオプシ ョ ン を省
略す る と 、 警告は標準エ ラ ーに送 ら れ ます。
+what
+what は、 Fortran 90 に対 し てバージ ョ ンやパ ッ チ番号を与え てい る 文字列
を印字 し ます。
-Wx,arg1,arg2,...,argN
-W は、 arg1 ~ argN を x が示すサブプ ロ セ ス に渡す こ と を指定 し ます。 各
arg の形式は、 次の と お り です。
-option[,value]
第2章
79
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
こ こ で option は、 サブプ ロ セ ス に認識 さ れ る オプシ ョ ンの名前で、 value は
option に引 き 数が必要な場合の引 き 数です。 x で想定で き る 値については、
表 2-8 を参照 し て く だ さ い。
た と えば、 次のオプシ ョ ンは、 リ ン カーに対 し て各入力フ ァ イ ルの ト レース を
ld に よ っ て処理 さ れ る たびに出力す る よ う に指示 し ます。
-Wl,-t
次の例では、 -a 共有オプシ ョ ン を リ ン カーに渡 し 、 リ ン ク 用の共有 ラ イ ブ ラ
リ を選択 さ せてい ます。
-Wl,-a,shared
表 2-8 -W オプ シ ョ ンの値
値
意味
a
アセ ンブ ラ
c
コ ンパ イ ラ
l
リ ン カー
p
C プ リ プロセッサ
-Y=lang
lang で指定 し た言語での母国語サポー ト を有効に し ます。 こ れは +nls オプ
シ ョ ン と 同 じ 機能です。
+z
こ の章の +pic=short を参照 し て く だ さ い。 64 ビ ッ ト コ ー ド の生成で +z が指
定 さ れ る と 、 +Z に置 き 替え ら れ ます。
+Z
本章の +pic=long を参照 し て く だ さ い。 64 ビ ッ ト 共有実行可能フ ァ イ ルを作
成す る 場合 (+DA2.0W を指定す る 場合な ど ) には、 +Z オプシ ョ ンが、 デフ ォ ル
ト ではオ ンにな っ てい ます。 +Z オプシ ョ ンは、 64 ビ ッ ト 実行可能フ ァ イ ルに
対 し てサポー ト さ れてい る ただ 1 つの PIC オプシ ョ ン です。
注記
80
64 ビ ッ ト 実行可能フ ァ イ ルに対 し て位置独立 コ ー ド を生成 し ない よ う にす る に
は、 -W1, -noshared オプシ ョ ン を指定 し ます。
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
シ ンボルのバイ ンデ ィ ングオプ シ ョ ン
以下に示す -B オプシ ョ ンは、 HP Fortran が認識す る オプシ ョ ン で、 グ ロ ーバルなシ ン ボルへの
参照を、 現在の翻訳単位で定義 さ れてい る シ ン ボルで解決す る か、 ほかの ロ ー ド モジ ュ ールで解
決 さ れ る 可能性があ る も の と みなすのか を指定 し ます。
-B オプシ ョ ンはすべて 「左か ら 右」 の順番で適用 さ れ る ため、 文字列の最後にあ る オプシ ョ ン
は、 それ以前に指定 さ れた内容を上書 き し て し ま い ます。
-Bdefault=symbol[,symbol...]
指定 さ れたシ ン ボルは、 デフ ォ ル ト のエ ク ス ポー ト ク ラ ス に割 り 当て ら れ ま
す。 こ のシ ン ボルは、 現在の ロ ー ド モジ ュ ールの外部で イ ン ポー ト さ れた り エ
ク ス ポー ト さ れた り し ます。 コ ンパ イ ラ は リ ン ケージ テーブルを通 し て仮のシ
ン ボルにア ク セ ス し ます。 ほかの -B オプシ ョ ン に よ っ て別のエ ク ス ポー ト ク
ラ ス に割 り 当て ら れていないシ ン ボルは ( あ る いは、 推奨 さ れていない
+O[no]extern オプシ ョ ン を使っ た場合 )、 グ ロ ーバルな -Bprotected、
-Bhidden、 -Bextern オプシ ョ ン に対す る 例外を指定す る ため、 シ ン ボルご
と にデフ ォ ル ト 値が与え ら れ ます。
-Bdefault:filename
filename が指定す る フ ァ イ ルには、 スペース ま たは改行で区切 ら れた、 シ ン
ボルが含ま れ ます。 こ のシ ン ボルは、 デフ ォ ル ト のエ ク ス ポー ト ク ラ ス に割 り
当て ら れ ます。
-Bextern [=symbol [,symbol...]]
指定 さ れたシ ン ボル、 ま たはシ ン ボルが指定 さ れなければすべての未定義のシ
ン ボルは、 デフ ォ ル ト のエ ク ス ポー ト ク ラ ス に割 り 当て ら れ ます。 さ ら に コ ン
パ イ ラ は、 そのシ ン ボルに対す る 呼び出 し の イ ン ポー ト ス タ ブ を イ ン ラ イ ン化
し ます。 そ う し たシ ン ボルについては、 コ ンパ イ ル時にはバ イ ン ド さ れ ませ
ん。 そのシ ン ボルへの参照はすべて リ ン ケージ テーブルを経由す る ため、 同 じ
ロ ー ド モジ ュ ールで解決 さ れ る シ ン ボルに -Bextern を適用す る と 、 性能に関
す る 不必要なペナルテ ィ が発生 し ます。
-Bextern:filename
filename が指定す る フ ァ イ ルには、 スペース ま たは改行で区切 ら れた、 シ ン
ボルが含ま れ ます。 こ のシ ン ボルは、 デフ ォ ル ト のエ ク ス ポー ト ク ラ ス に割 り
当て ら れ ます。 さ ら に コ ンパ イ ラ は、 そのシ ン ボルに対す る 呼び出 し の イ ン
ポー ト ス タ ブ を イ ン ラ イ ン化 し ます。 そ う し たシ ン ボルについては、 コ ンパ イ
第2章
81
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
ル時にはバ イ ン ド さ れません。 そのシ ン ボルへの参照はすべて リ ン ケージ テー
ブルを経由す る ため、 同 じ ロ ー ド モジ ュ ールで解決 さ れ る シ ン ボルに
-Bextern を適用す る と 、 性能に関す る 不必要なペナルテ ィ が発生 し ます。
-Bhidden [=symbol [,symbol...]]
指定 さ れたシ ン ボル、 ま たはシ ン ボルが指定 さ れなければすべての未定義のシ
ン ボルは、 隠 さ れたエ ク ス ポー ト ク ラ ス に割 り 当て ら れ ます。 隠 さ れたエ ク ス
ポー ト ク ラ ス は、 保護 さ れたエ ク ス ポー ト ク ラ ス と 似てい ます。 こ のシ ン ボル
はほかの ロ ー ド モジ ュ ールのシ ン ボルか ら 先取 り さ れ る こ と はないので、 コ ン
パ イ ラ は コ ー ド と デー タ の参照では リ ン ケージ テーブルを ス キ ッ プ し 、 ロ ーカ
ルで定義 さ れてい る コ ー ド と デー タ のシ ン ボルにバ イ ン ド し ます。 それに加
え、 隠 さ れたシ ン ボルは現在の ロ ー ド モジ ュ ールの外部にエ ク ス ポー ト さ れ る
こ と はあ り ません。 リ ン カーは こ れを共有 ラ イ ブ ラ リ か ら 取 り 除 く こ と があ り
ますが、 実行可能フ ァ イ ルでは、 +Oprocelim が指定 さ れない限 り 、 デバ ッ ガ
か ら ア ク セ ス で き る よ う にな っ てい ます。
シ ン ボルが指定 さ れない場合、 -Bhidden は -W1,-aarchive_shared を自動
的に指定 し 、 リ ン カーに、 使用可能であれば、 共有 ラ イ ブ ラ リ ではな く アーカ
イ ブ ラ イ ブ ラ リ を使用す る よ う 指示 し ます。 こ れは、 -Bhidden オプシ ョ ンに
続けて -W1,-a オプシ ョ ン を指定す る と 変更す る こ と がで き ます。
-Bhidden:filename
filename が指定す る フ ァ イ ルには、 スペース ま たは改行で区切 ら れた、 シ ン
ボルが含ま れ ます。 こ のシ ン ボルは、 隠 さ れたエ ク ス ポー ト ク ラ ス に割 り 当て
ら れます。
-Bprotected [=symbol [,symbol...]]
指定 さ れた シンボル、 ま たはシ ン ボルが指定 さ れなければすべての未定義のシ
ン ボルは、 保護 さ れたエ ク ス ポー ト ク ラ ス に割 り 当て ら れ ます。 こ れは、 こ の
シ ン ボルがほかの ロ ー ド モジ ュ ールのシ ン ボルか ら 先取 り さ れ る こ と はないた
め、 コ ンパ イ ラ は コ ー ド と デー タ の参照では リ ン ケージ テーブルを ス キ ッ プ
し 、 ロ ーカルで定義 さ れてい る コ ー ド と デー タ のシ ン ボルにバ イ ン ド す る 、 と
い う こ と です。
シ ン ボルが指定 さ れない場合、 -Bprotected は -W1, -aarchive_shared を
自動的に指定 し 、 リ ン カーに、 使用可能であれば共有 ラ イ ブ ラ リ ではな く アー
カ イ ブ ラ イ ブ ラ リ を使用す る よ う 指示 し ます。 こ れは、 -Bprotected オプ
シ ョ ンに続けて -W1,-a オプシ ョ ン を指定 し て変更で き ます。
-Bprotected:filename
82
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
filename が指定す る フ ァ イ ルには、 スペース ま たは改行で区切 ら れた、 シ ン
ボルが含ま れ ます。 こ のシ ン ボルは、 保護 さ れたエ ク ス ポー ト ク ラ ス にエ ク ス
ポー ト さ れ ます。
-Bprotected_data
デー タ シ ン ボルにのみ、 保護 さ れたエ ク ス ポー ト ク ラ ス があ る 、 と し てマー ク
し ます。
-Bprotected_def
こ れは -Bprotected と 同 じ ですが、 ロ ーカルに定義 さ れた ( 仮でない ) シ ン
ボルだけが、 保護 さ れたエ ク ス ポー ト ク ラ ス に割 り 当て ら れ ます。
-Bsymbolic
すべてのシ ン ボルが、 保護 さ れたエ ク ス ポー ト ク ラ ス に割 り 当て ら れます。 こ
れは、 シ ン ボルな し で -Bprotected を指定す る の と 等価です。
最適化オプ シ ョ ン を使用する
こ の項で説明す る オプシ ョ ン を使用す る と 、 コ ンパ イ ラ でプ ロ グ ラ ム に適用可能な各種の最適化
を制御で き ます。 こ れ ら のオプシ ョ ンは、 次の 2 つに分類 さ れてい ます。
•
最適化の ク ラ ス を制御す る オプシ ョ ン ( た と えば コ ー ド サ イ ズに影響す る 最適化な ど )
•
特定の最適化を制御す る オプシ ョ ン ( た と えば イ ン ラ イ ン展開な ど )
次の各項では、 両方のオプシ ョ ンについて説明 し ます。 最適化レベルを制御す る オプシ ョ ン につ
いての詳細は、 48 ページの 「オプシ ョ ン説明」 の項の +On の説明を参照 し て く だ さ い。 最適化
プ ロ セ ス に関す る コ ンパ イ ル時情報を提供す る +O[no]info オプシ ョ ンについて も 、 同 じ 項を参
照 し て く だ さ い。
注記
ど の最適化オプシ ョ ン の名前 も 、 下線文字を挿入 ( ま たは削除 ) し て読みやす く
す る こ と がで き ます。 コ ンパ イ ラ は、 下線が付いてい る か ど う かに関係な く オプ
シ ョ ン名を認識 し ます。
一般最適化オプ シ ョ ン を確認する
次のオプシ ョ ンは、 コ ー ド サ イ ズ、 コ ンパ イ ル時間、 実行時のパフ ォ ーマ ン ス、 お よ びユーザー
にはっ き り と わか る 他の効果に最適化が及ぼす影響を制御で き ます。 こ れ ら のオプシ ョ ン の構文
は、 次の と お り です。
+O[no]optimization
第2章
83
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
こ こ で optimization は、 プ ロ グ ラ ム に適用す る 最適化の ク ラ ス を指定す る
パ ラ メ ー タ です。 いろい ろ なパ ラ メ ー タ について次に説明 し ます。 接頭辞 no
を付け る と 、 最適化の効果を否定 し ます。
+Oall 以外のオプシ ョ ン では、 指定 し た最適化レベルを無効にす る こ と はな く 、 特定の レベル も
暗黙に意味 し ません (+Oall オプシ ョ ン を指定す る と 、 自動的に最上位の最適化レベルを起動 し
ます )。 こ れ ら のオプシ ョ ン を使用す る には、 同 じ コ マ ン ド 行で +On オプシ ョ ン も 指定 し なけれ
ばな り ません。 こ こ で n は、 最適化に効果があ る レベルを指定 し ます。 し たが っ て、 コ ー ド サ イ
ズ を大幅に大 き く す る 最適化を除 く 、 レベル 3 で使用可能なすべての最適化を適用す る には、 次
の コ マ ン ド 行を使用 し ます。
f90 +O3 +Osize my_prog.f90
オプシ ョ ン で対応す る 最適化が行われない レベルを誤っ て指定 し ていれば、 コ ンパ イ ラ は警告
メ ッ セージ を発行 し ます。
次の説明で指定 さ れてい る デフ ォ ル ト は、 特に明記 し ない限 り 、 指定 し た最適化レベルでのみ有
効です。
+O[no]aggressive
+Oaggressive オプシ ョ ンは、 パフ ォ ーマ ン ス を大幅に改善で き 、 プ ロ グ ラ ム
の動作を変化す る よ う な最適化 も 使用す る こ と を指定 し ます。 こ のオプシ ョ ン
は、 最適化レベル 2 以上でのみ有効です。
+Oaggressive オプシ ョ ン を指定す る と 、 次のオプシ ョ ン に よ っ て呼び出 さ れ
る 最適化が実行 さ れ ます。
•
+Oentrysched
•
+Onofltacc
•
+Onoinitcheck
•
+Ovectorize
+Oaggressive オプシ ョ ンには、 +Oconservative と の互換性があ り ません。
デフ ォ ル ト は +Onoaggressive です。
+O[no]all
+Oall は、 積極的な最適化、 お よ び、 コ ンパ イ ル時間 と メ モ リ 使用量を大幅に
増加 さ せ る 最適化を含め、 最大限の最適化を行 う こ と を指定 し ます。 +Oall オ
プシ ョ ン に よ っ て、 最上位レベルの最適化が自動的に呼び出 さ れます。
デフ ォ ル ト は +Onoall です。
84
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
こ のオプシ ョ ンは、 HP-UX バージ ョ ン 11i 以降では推奨 さ れ ません。
+O[no]autopar
+O[no]autopar は、 ループ パ ラ レ ラ イ ザが安全で有益 と 判断 さ れ る ループの
自動パ ラ レ ル化を制御 し ます。
こ の自動パ ラ レル化機能では、 プ ロ グ ラ ム中の コ ー ド のシ リ アルループ を マル
チ ス レ ッ ド 化 さ れたパ ラ レ ル コ ー ド に自動的に変換す る こ と で、 アプ リ ケー
シ ョ ンがマルチ コ ア ま たはマルチプ ロ セ ッ サシ ス テ ム上の待機 リ ソ ース を使用
す る こ と が可能にな り ます。
+O[no]autopar オプシ ョ ンは最適化レベル +O3 以上のプ ロ グ ラ ム で使用で き
ます。 コ マ ン ド ラ イ ン上で +Openmp と +Oautopar オプシ ョ ン を両方 と も 指定
し た場合、 +Oautopar 指令は +Oautopar オプシ ョ ン よ り 優先 さ れます。 コ ン
パ イ ラ は、 +Openmp 指令が制御 し ていない コ ー ド のループのみを自動パ ラ レ
ル化 し ます。
HP 9000 シ ス テ ム上で +Oparallel オプシ ョ ン と 併用す る と +O4 は抑止さ れ
ま す。 +O4 で自動パ ラ レ ル化を行 う 場合は、 +Oautopar を 指定し て
+Oparallel は指定し ま せん。
+Oautopar を使用 し てプ ロ グ ラ ム を コ ンパ イ ルす る には、 libcps、 libomp、
お よ び libpthreads の実行時サポー ト ラ イ ブ ラ リ が、 コ ンパ イ ル時お よ び実
行時に必要です。 こ の機能は Integrity シ ス テ ムお よ び HP 9000 シ ス テ ム上で
使用で き ます。
+O[no]conservative
+Oconservative は、 オプテ ィ マ イ ザが最適化時に コ ー ド を保守的に解釈す る
こ と を指定 し ます。 こ のオプシ ョ ンは、 最適化レベル 2 以上でのみ有効です。
+Oconservative オプシ ョ ンに よ っ て、 次のオプシ ョ ンが設定 さ れます。
•
+Onofltacc
•
+Onomoveflops
•
+Oparmsoverlap
+Oconservative は、 規格に合致 し ていないプ ロ グ ラ ムの よ う に、 コ ーデ ィ ン
グ ス タ イ ルの関係で保守的な前提が必要な場合に使用 し ます。 こ のオプシ ョ ン
には、 +Oaggressive と の互換性がないので注意 し て く だ さ い。
+Onoconservative オプシ ョ ン を指定す る と 、 指示先プ ロ グ ラ ム に関す る オ
プテ ィ マ イ ザの前提が緩やかにな り ます。
第2章
85
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
デフ ォ ル ト は +Onoconservative です。
+O[no]limit
+Olimit は、 コ ンパ イ ル時間を大幅に長引かせ る 最適化や、 コ ンパ イ ル時に
大量の メ モ リ を消費す る 可能性のあ る 最適化を抑止す る こ と を指定 し ます。 こ
のオプシ ョ ンは、 最適化レベル 2 以上でのみ有効です。
+Onolimit オプシ ョ ンは、 コ ンパ イ ル時間や メ モ リ 使用量に及ぼす影響に関
係な く 、 最適化を行 う こ と を指定 し ます。
デフ ォ ル ト は +Olimit です。
+O[no]loop_transform
+Oloop_transform は、 以下の変換を使用可能ま たは使用不能に し ます。
ループのア ン ロ ールお よ びジ ャ ム、 ループ分散、 ループ交換、 ループブ ロ ッ キ
ン グ、 ループ融合、 お よ びループア ン ロ ール。
デフ ォ ルト は +Oloop_transform です。
+O[no]size
+Osize は、 コ ー ド サ イ ズ を大幅に増大 さ せ る 最適化を抑止す る こ と を指定 し
ます。 こ のオプシ ョ ンは、 最適化レベル 2 以上でのみ有効です。
+Onosize オプシ ョ ンは、 コ ー ド サ イ ズ を増加 さ せ る よ う な最適化を行 う こ と
を指定 し ます。
デフ ォ ル ト は +Onosize です。
最適化オプ シ ョ ンの微調整
次のオプシ ョ ン を使用す る と 、 オプテ ィ マ イ ザに よ っ てプ ロ グ ラ ムに適用 さ れ る 特定の技法を制
御 し 、 最適化プ ロ セ ス を微調整で き ます。 こ れ ら のオプシ ョ ン の構文は、 次の と お り です。
+O[no]optimization
こ こ で optimization は、 プ ロ グ ラ ム に適用す る 最適化技法を指定す る パ ラ
メ ー タ です。 いろいろ なパ ラ メ ー タ について次に説明 し ます。 接頭辞 no を付
け る と 、 最適化の効果を否定 し ます。
各オプシ ョ ンに よ っ て指定 し た最適化レベルが不正にな る こ と はな く 、 特定の レベルを暗黙に意
味す る こ と も あ り ません。 こ れ ら のオプシ ョ ン を使用す る には、 同 じ コ マ ン ド 行で +On オプシ ョ
ン も 指定 し なければな り ません。 こ こ で n は、 最適化を行 う こ と がで き る レベルを指定 し ます。
86
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
た と えば、 オプテ ィ マ イ ザを実行 し た場合、 プ ロ グ ラ ム に よ っ て生成 さ れ る 浮動小数点の結果が
最適化前のプ ロ グ ラ ム の結果 と 異な る こ と がわか っ た ら 、 次の コ マ ン ド 行を使用 し て、 浮動小数
点演算に影響す る 最適化を抑止で き ます。
f90 +O3 +Onomoveflops +Ofltacc my_prog.f90
対応す る 最適化が行われない レベルを オプシ ョ ン で誤っ て指定 し てい る な ら ば、 コ ンパ イ ラ は警
告 メ ッ セージ を発行 し ます。
次の説明で指定 さ れてい る デフ ォ ル ト は、 特に明記 し ない限 り 、 指定 し た最適化レベルでのみ有
効です。
+O[no]cache_pad_common
+Ocache_pad_common は、 共通ブ ロ ッ ク をパデ ィ ン グ し 、 キ ャ ッ シ ュ の衝突
を回避す る こ と に よ り 、 プ ロ グ ラ ム のパフ ォーマ ン ス を改善す る こ と を指定 し
ます。 2 つのデー タ 点のア ド レ ス間の差が、 キ ャ ッ シ ュ サ イ ズの倍数にな る 場
合にキ ャ ッ シ ュ の衝突が発生 し ます。 オプテ ィ マ イ ザは、 キ ャ ッ シ ュ の衝突の
可能性が高 く な る よ う な近接ア ド レ ス で開始 し ない よ う に、 大 き な変数 ( 配列
な ど ) の間に空の スペース を挿入 し ます。 こ のオプシ ョ ンは、 最適化レベル 3
以上でのみ有効です。
こ のオプシ ョ ン を使用す る 場合は、 次の予防措置に注意 し て く だ さ い。
•
共通ブ ロ ッ ク を引用す る すべてのプ ロ グ ラ ム モジ ュ ールは、
+Ocache_pad_common オプシ ョ ン を使用 し て コ ンパ イ ル し なければな り
ません。
•
プ ロ グ ラ ム内の各共通ブ ロ ッ ク は、 それが宣言 さ れてい る ど のプ ロ グ ラ ム
単位の中で も 同 じ レ イ ア ウ ト でなければな り ません。 レ イ ア ウ ト が異な る
場合は、 完全な独立型でなければな り ません。 つま り 、 共通ブ ロ ッ ク 相互
の間で値を渡 し てはいけ ません。
デフ ォ ル ト の +Onocache_pad_common は、 パデ ィ ン グ を行わない こ と を指定
し ます。
+O[no]cxlimitedrange
コ ンパ イ ル単位での浮動小数点演算を使用可能ま たは使用不能に し ます。
デフ ォ ルト は +Onocxlimitedrange です。
+O[no]cross_region_addressing
第2章
87
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
領域間ア ド レ ス指定を使用可能ま たは使用不能に し ます。 領域間ア ド レ ス指定
は、 ポ イ ン タ (配列ベース な ど) がア ド レ ス指定 さ れてい る デー タ と は異な る
領域を指 し てい る 場合に必要です。 こ れは通常、 領域を越え たオ フ セ ッ ト が原
因 と な り ます。 標準に準拠す る アプ リ ケーシ ョ ン では、 領域間ア ド レ ス指定を
使用す る 必要はあ り ません。
デフ ォ ルト は +onocross_region_addressing です。
+O[no]dataprefetch
+Odataprefetch オプシ ョ ンは、 オプテ ィ マ イ ザに メ モ リ か ら デー タ キ ャ ッ
シ ュ にデー タ を プ リ フ ェ ッ チす る ための命令を一番内側のループに挿入す る こ
と を指定 し ます。 デー タ プ リ フ ェ ッ チ命令が挿入 さ れ る のは、 ア ド レ ス が変動
す る 単純ループ を使用す る 一番内側のループ内 ( つま り 、 単純な算術級数内 )
で引用 さ れ る デー タ 構造体の場合だけです。 こ のオプシ ョ ンは、 最適化レベル
2 以上でのみ有効です。 ま た、 タ ーゲ ッ ト が PA-RISC 1.1 シ ス テ ム の場合には
使用で き ません。
こ のオプシ ョ ンは、 デー タ キ ャ ッ シ ュ 失敗に よ る オーバーヘ ッ ド の大 き いアプ
リ ケーシ ョ ンに使用 し て く だ さ い。
デフ ォ ル ト は +Onodataprefetch です。
+O[no]dataprefetch=[direct|indirect|none]
最 も 内側のループ内で参照 さ れ る デー タ 構造での、 デー タ プ リ フ ェ ッ チ命令の
生成を制御 し ます。 定義済みの値は以下の と お り です。
direct ― 間接的なメ モリ 参照ではなく 直接的なメ モリ 参照を 可能にする 、 デー
タ プリ フ ェ ッ チ命令の生成を 有効にし ま す。
indirect ― 直接的なメ モリ 参照と 間接的なメ モリ 参照の両方を 可能にする デー
タ プリ フ ェ ッ チ命令の生成を 使用可能にし ま す。 こ れは、 最適化レベル +O2 以
上でのデフ ォ ルト 設定です。
none ― データ プリ フ ェ ッ チ命令の生成を 使用不能にし ま す。 こ れは、 最適化レ
ベル +O1 以下でのデフ ォ ルト 設定です。
+O[no]entrysched
+Oentrysched は、 オプテ ィ マ イ ザに副プ ロ グ ラ ム の入口 コ ー ド と 終了 コ ー ド
の列に対 し て命令の ス ケ ジ ュ ー リ ン グ を行 う こ と を指定 し ます。 こ のオプシ ョ
ンは、 最適化レベル 1 以上でのみ有効です。
こ のオプシ ョ ン を使用す る と 、 例外処理、 ま たは非同期割 り 込みを処理す る プ
ロ グ ラ ム の動作を変更で き ます。
88
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
デフ ォ ル ト は +Onoentrysched です。
+O[no]failsafe
フ ェールセーフ最適化を使用可能ま たは使用不能に し ます。 現在の最適化レベ
ルでの コ ンパ イ ルに失敗す る と 、 +Ofailsafe によ り +O2( 特定の高レ ベルの
オプティ マイ ザのエラ ーでは +O3 ま たは +O4) でのコ ン パイ ルが自動で再開さ れ
ま す。 ま た、 Itanium® ベース アーキテク チャ では +O1、 PA-RISC アーキ テ ク
チ ャ では +O0 でのコ ン パイ ルが自動で再開さ れま す。
デフ ォ ルト は +Ofailsafe です。
+Ofast
コ ンパ イ ルす る プ ロ グ ラ ムの実行速度が最適にな る よ う に、 コ ンパ イ ルオプ
シ ョ ンの組み合わせを選択 し ます。 こ れ ら のオプシ ョ ン には、 +O2、
+Olibcalls、 +Onolimit、 +Ofltacc=relaxed、 およ び +FPD が含ま れま す。
ま た、 +Ofast によ っ て +pi4M オプシ ョ ンが リ ン カーに渡 さ れ ます。 こ れ ら の
オプシ ョ ンに加え て、 Itanium® ベース アーキ テ ク チ ャ では、 +DSnative 命令
ス ケ ジ ュ ー リ ン グが選択 さ れ +mergeseg も ま た リ ン カーに渡 さ れ ます。
+Ofaster
PA-RISC ベース のアーキテク チャ での +Ofast オプショ ン を、 最適化レ ベル
+O3 で指定 し ます。 Itanium® ベース アーキ テ ク チ ャ では +Ofaster は +O4 で
実行さ れ -ipo を 暗黙指定 し ます。
+O[no]fenvaccess
プ ロ グ ラ ムが浮動小数点環境を参照 し てい る (ま たは参照 し ていない) こ と
を、 コ ンパ イ ラ に伝え ます。 コ ンパ イ ラ はプ ロ グ ラ ムが浮動小数点環境を参照
し ていない と 分か っ てい る 場合には、 グ ロ ーバルな共通式の除去、 コ ー ド 移
動、 ま たは定数の畳込みな ど の特定の最適化 (分か っ てい る 場合にのみ実行で
き る も の) を実行で き ます。
デフ ォ ルト は +Onofenvaccess です。
+O[no]fastaccess
+Ofastaccess オプシ ョ ンは、 大域デー タ 項目へのア ク セ ス を高速化 し 、 実行
時間を短縮 し ます。 こ のオプシ ョ ンは、 任意の最適化レベルで使用す る こ と が
で き ます。
+Ofastaccess オプシ ョ ン を使用す る と 、 リ ン ク 時間が長 く な る 可能性があ る
ので注意 し て く だ さ い。
第2章
89
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
デフ ォ ル ト は、 最適化レベル 1, 2, お よ び 3 では +Onofastaccess で、 最適化
レベル 4 では +Ofastaccess です。
+O[no]fltacc
+Onofltacc は、 代数の規則には従 う が、 式の評価順序を変更 し て最適化を行
い ます。 た と えば、 a, b, お よ び c が浮動小数点変数の場合、 式 (a + b) + c
と a + (b + c) では、 切 り 捨ての関係で少 し 異な る 結果にな る こ と があ り ま
す。
ま た、 +Onofltacc オプシ ョ ン を使用す る と 、 隣接す る 乗算 と 加算命令を融合
す る こ と も で き ます。 こ れを FMA (Fused Multiply-Add) と 呼びます。 FMA
は、 FMPYFADD お よ び FMPYNFADD 命令に よ っ て実現 さ れ、 PA-RISC 2.0 シ ス
テ ム上でのみ使用可能です ( 最適化レベル 2 以上では、 FMA はデフ ォ ル ト で
発生 し ます )。 FMA を使用す る と パフ ォーマ ン ス は改善 さ れますが、 融合 し
なか っ た コ ー ド と は有効桁数の異な る 結果を生成す る こ と があ り ます。 通常、
その違いはご く わずかです。
+Ofltacc は、 式の評価順序を変更 し 、 結果の有効桁数に影響を及ぼす よ う な
最適化を行い ません。 +Ofltacc も ま た、 融合 も 行い ません。
表 2-9 は、 +Ofltacc ま たは +Onofltacc を指定 し た場合、 ま たはど ち ら のオ
プシ ョ ン も 指定 し なか っ た場合に、 オプテ ィ マ イ ザに よ っ て実行 さ れ る 動作を
示 し てい ます。 ど の場合 も 、 最適化レベル 2 (+O2) 以上で コ ンパ イ ルす る こ と
を前提 と し てい ます。
表 2-9 +O[no]fltacc に よ っ て実行 さ れる最適化
+O[no]fltacc
式の順序変更
FMA
なし
あり
+Ofltacc
なし
なし
+Onofltacc
あり
あり
+O[no]fltacc=[strict|default|limited|relaxed]
コ ンパ イ ラ で実行で き る 浮動小数点最適化の レベルを制御 し ます。 定義済みの
オプシ ョ ン レベルは、 以下の と お り です。
strict ― 数値が変わる 可能性のある 浮動小数点最適化を 許可し ま せん。 こ れは
+Ofltacc の働き と 同じ です。
90
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
default ― FMA (Fused Multiply-Add) な ど の縮小命令を 許可し ま すが、 数
値が変わる 可能性のある 浮動小数点最適化はすべて許可し ま せん。
limited ― default と 似てい ますが、 無限大、 NaN、 お よ びゼ ロ 符号の生成
と 伝播に影響を与え る 浮動小数点最適化を許可 し ます。 ま た、
+Ocxlimitedrange を 暗黙指定し ま す。
relaxed ― limited で許可さ れる 最適化に加え、 丸め誤差に影響を 与える 式の
再順序付け( 丸括弧式の場合も 含む) など の最適化を 許可し ま す。 こ れは、
+Onofltacc の働き と 同じ です。 ま た、 +Ocxlimitedrange を 暗黙指定し ま す。
+Ofrequently_called=function1[,function2...]
指定 さ れた関数が頻繁に呼び出 さ れ る と 仮定 し ます。 こ のオプシ ョ ンは、 プ ロ
フ ァ イ ルデー タ ベース内の情報 よ り 優先 さ れます。
+Ofrequently_called:filename
filename で指定 さ れた フ ァ イ ルは、 空白ま たは改行文字で区切 ら れた関数名
の リ ス ト を含みます。 こ れ ら の関数は、 頻繁に呼び出 さ れ る と 仮定 さ れ ます。
こ のオプシ ョ ンは、 プ ロ フ ァ イ ルデー タ ベース内の情報 よ り 優先 さ れ ます。
+O[no]info
+Oinfo は、 最適化プ ロ セ ス に関す る 情報 メ ッ セージ を表示 し ます。 +Oinfo オ
プシ ョ ン に よ っ て提供 さ れ る フ ィ ー ド バ ッ ク 情報を見れば、 コ ンパ イ ラ に よ っ
てプ ロ グ ラ ム時間を重視す る 部分が最適化 さ れたか ど う か を判別で き ます。 こ
のオプシ ョ ンは、 ど の最適化レベルで も 使用で き ますが、 レベル 3 で使用す る
と 最 も 有効です。
現在、 こ のオプシ ョ ン を指定す る と 、 次の最適化に関す る フ ィ ー ド バ ッ ク を表
示 し ます。
•
ク ロ ーン生成つま り ク ロ ーン の呼び出 し でルーチン呼び出 し を置換。 こ れ
は、 その呼び出 し 側に固有の変更を含むルーチン の複製です。
•
イ ン ラ イ ン展開
•
キ ャ ッ シ ュ パフ ォ ーマ ン ス改善のためのループ変形
•
ベ ク ト ル化
デフ ォ ル ト の +Onoinfo を使用す る と 、 最適化に関す る 情報 メ ッ セージは表示
さ れ ません。
+O[no]initcheck
第2章
91
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
オプテ ィ マ イ ザの初期化チ ェ ッ ク 機能には、 オ ン、 オ フ、 お よ び未指定 と い う
3 つの状態が考え ら れ ます。 こ のオプシ ョ ン を オ ン状態 (+Oinitcheck) に指
定す る と 、 オプテ ィ マ イ ザは変数の使用に先行す る 最低 1 つのパ ス に関 し て、
初期化 さ れていない局所変数、 非配列、 非静的変数を ゼ ロ に初期化 し ます。
+Onoinitcheck を指定す る と 、 オプテ ィ マ イ ザは、 明確に初期化 さ れていな
い変数を見つけ る と 警告 メ ッ セージ を発行 し ますが、 その変数は初期化 さ れ ま
せん。
こ のオプシ ョ ン を未指定にす る と 、 オプテ ィ マ イ ザは、 変数の使用に先行す る
すべてのパ ス に関 し て、 明確に初期化 さ れていない局所変数、 ス カ ラ 変数、 お
よ び非静的変数をゼ ロ に初期化 し ます。
こ のオプシ ョ ンは、 最適化レベル 2 以上でのみ有効です。
+O[no]inline
+Oinline は、 すべての副プ ロ グ ラ ムに イ ン ラ イ ン展開の対象であ る こ と を示
すマー ク を設定 し ます。 こ のオプシ ョ ンは、 最適化レベル 3 以上でのみ有効で
す。
+Onoinline オプシ ョ ンは、 プ ロ グ ラ ム内のすべての副プ ロ グ ラ ム を イ ン ラ イ
ン不可 と し ます。
デフ ォ ル ト は、 最適化レベル 3 では +Oinline で、 それ以下の レベルでは
+Onoinline です。
+O[no]inline:filename
filename で指定 さ れた フ ァ イ ルは、 空白ま たは改行文字で区切 ら れた関数名
の リ ス ト を含みます。 こ のオプシ ョ ンは、 指定 さ れた関数のオプテ ィ マ イ ザに
よ る イ ン ラ イ ン化を使用可能 (ま たは使用不可) に し ます。 こ の最適化は最適
化レベル 3 お よ び 4 で有効です。
デフ ォ ルト は +Oinline です。
+O[no]inline=function1[,function2...]
指定 さ れた関数のオプテ ィ マ イ ザに よ る イ ン ラ イ ン化を使用可能 (ま たは使用
不可) に し ます。 こ の最適化は最適化レベル 3 お よ び 4 で有効です。
デフ ォ ルト は +Oinline です。
+Oinline_budget=n
+Oinline_budget は、 オプテ ィ マ イ ザで さ ら に積極的な イ ン ラ イ ン展開を行
う こ と を可能に し ます。
92
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
こ のオプシ ョ ン の構文は、 次の と お り です。
+Oinline_budget=n
こ こ で n は、 表 2-10 の よ う に、 積極レベルを指定す る 範囲 1 ~ 1000000 の整
数です。
+Onolimit お よ び +Osize オプシ ョ ン も 、 イ ン ラ イ ン展開に影響 し ます。
+Onolimit オプシ ョ ン を指定 し た場合の効果は、 +Oinline_budget=200 を
指定 し た場合 と 同 じ です。 +Osize オプシ ョ ン には、 +Oinline_budget=1 と
同 じ 効果があ り ます。
ただ し 、 こ の 2 つのオプシ ョ ン よ り +Oinline_budget オプシ ョ ンの方が優先
さ れ る ので注意 し て く だ さ い。 こ れは、 同 じ コ マ ン ド 行で +Oinline_budget
オプシ ョ ン を指定すれば、 +Onolimit ま たは +Osize イ ン ラ イ ン展開に対す
る オプシ ョ ンの効果を無効にで き る こ と を意味 し ます。
こ のオプシ ョ ンは、 最適化レベル 3 以上でのみ有効です。
表 2-10 +Oinline_budget オプ シ ョ ンの値
n の値
意味
= 100
デフ ォ ル ト レベルの イ ン ラ イ ン展開を行 う 。
> 100
よ り 積極的な イ ン ラ イ ン展開を行 う 。 オプテ ィ マ イ ザに と っ ては、 イ ン ラ
イ ン展開の対象 と な る ルーチン を検索す る と き に、 コ ンパ イ ル時間 と コ ー
ド サ イ ズに よ る 制限が緩和 さ れ る 。
2 - 99
保守的な イ ン ラ イ ン展開を行 う 。 オプテ ィ マ イ ザでは、 イ ン ラ イ ン展開す
る か ど う か を判別す る 場合に、 コ ンパ イ ル時間 と コ ー ド サ イ ズが重視 さ れ
る。
=1
コ ー ド サ イ ズが小 さ く な る 場合にのみ イ ン ラ イ ン展開を行 う 。
+O[no]libcalls
+Olibcalls オプシ ョ ンは、 頻繁に呼び出 さ れ る 多数の組み込み関数の ミ リ
コ ー ド バージ ョ ン を呼び出 し ます ( 表 2-11 を参照 )。 ミ リ コ ー ド ルーチンは、
呼び出 し に よ る オーバーヘ ッ ド が き わめて小 さ く 、 エ ラ ー処理は行い ません。
プ ロ グ ラ ムが例外処理に依存 し ない場合にのみ、 こ のオプシ ョ ン を使用 し て、
選択 し た ラ イ ブ ラ リ ルーチン のパフ ォ ーマ ン ス を改善 し て く だ さ い。
第2章
93
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
最適化レベル 0 お よ び 1 では、 デフ ォ ル ト は +Onolibcalls です。 最適化レ
ベル 2 以上では、 デフ ォ ル ト は +Olibcalls です。
表 2-11 組み込み関数の ミ リ コ ー ド バージ ョ ン
acos
cos
pow
asin
exp
sin
atan
log
tan
atan2
log10
+o[no]libmerrno
libm 関数での errno のサポート を 使用可能ま たは使用不能にし ま す。
デフ ォ ルト は +Onolibmerrno です。
+O[no]loop_block
+O[no]loop_block は、 キ ャ ッ シ ュ 性能向上のため対象 と な る ループのブ
ロ ッ ク 化を使用可能ま たは使用不能に し ます。 +Onoloop_block オプシ ョ ン
は、 自動お よ び指令指定の両方のループのブ ロ ッ ク 化を使用不能に し ます。
+O[no]loop_transform
+O[no]loop transform は、 キ ャ ッ シ ュ 性能向上のため適切なループ変形を
使用可能ま たは使用不能に し ます。 最 も 重要なループ変形は、 入れ子のループ
の交換であ り 、 内側のループ単位を外に出 し 、 キ ャ ッ シ ュ の ミ ス を少な く し ま
す。 +Onoloop_transform は、 対象 と な る ループの変形を使用不能に し ます。
デフ ォ ル ト は、 +Oloop_transform です。
+O[no]loop_unroll[=factor]
+Oloop_unroll は、 ループのア ン ロ ー リ ン グ を行い ます。 factor は、 コ ー
ド の展開を制御す る ア ン ロ ール因子です。 デフ ォ ル ト のア ン ロ ール因子は 4
で、 ループ本体は 4 回複製 さ れ ます。 さ ま ざ ま な因子を試 し てみれば、 プ ロ グ
ラ ムのパフ ォ ーマ ン ス を改善で き る 場合があ り ます。 こ のオプシ ョ ンは、 最適
化レベル 2 以上でのみ有効です。
デフ ォ ル ト は +Oloop_unroll=4 です。
+O[no]loop_unroll_jam
94
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+O[no]loop_unroll_jam は、 ループのア ン ロ ールお よ びジ ャ ム を使用可能ま
たは使用不能に し ます。 +Onoloop_unroll_jam ( デフ ォ ル ト ) は、 自動お よ
び指令指定の両方のループのア ン ロ ールお よ びジ ャ ム を使用不能に し ます。
ループのア ン ロ ールお よ びジ ャ ムは、 レ ジ ス タ を頻繁に活用 し ます。
+O[no]moveflops
+Omoveflops は、 条件付 き の浮動小数点命令を移動 し て、 他の最適化を行 う
こ と を可能に し ます。 こ のオプシ ョ ンは、 最適化レベル 2 以上でのみ有効で
す。
こ のオプシ ョ ン に よ っ て、 浮動小数点の例外処理の動作が変化す る 可能性があ
る ので注意 し て く だ さ い。
+Onomoveflops は、 浮動小数点 ト ラ ッ プが使用可能にな っ てお り 、 浮動小数
点命令を再配置 し て浮動小数点例外の動作を変更 さ せた く ない場合に使用す る
こ と を推奨 し ます。 た と えば、 ON 文を使用す る プ ロ グ ラ ム の場合な ど です。
デフ ォ ル ト は +Omoveflops です。
+O[no]multiprocessor
+O[no]multiprocessor は、 マルチプ ロ セ ッ サ マシ ン上の複数の異な る プ ロ
セ ス の最適化を適切に行 う よ う に コ ンパ イ ラ に指示 し ます。 こ の最適化は、 実
行可能フ ァ イ ルま たは共有 ラ イ ブ ラ リ 、 あ る いはその両方に適切です。 デフ ォ
ル ト の +Onomultiprocessor は、 マルチプ ロ セ ッ サ マシ ン上で実行中の複数
のプ ロ セ ス の最適化を使用不能に し ます。
+O[no]openmp
+Oopenmp は OpenMP 指令を使用可能に し ます。 +Onoopenmp は OpenMP を
使用不能に し ます。 +O[no]openmp はすべての最適化レ ベルで使用でき ま す。
デフ ォ ルト は +Onoopenmp です。
+O[no]parallel
+Oparallel オプシ ョ ン に よ っ て、 コ ンパ イ ラ はマルチプ ロ セ ッ サマシ ン での
パ ラ レル実行用に対象 と な る ループ を変形 し ます。 こ のオプシ ョ ンは、 最適化
レベル 3 以上の場合にだけ有効です。 こ のオプシ ョ ンは HP 9000 シ ス テ ム上
でのみ使用可能です。
コ マ ン ド 行 と は別に リ ン ク さ せ、 +Oparallel オプシ ョ ン でプ ロ グ ラ ム を コ ン
パ イ ルす る 場合、 実行時に正 し く 動作 さ せ る ためには、 f90 コ マ ン ド で リ ン ク
さ せ、 +Oparallel オプシ ョ ン を指定 し なければな り ません。
+Onoparallel オプシ ョ ンは指示先プ ロ グ ラ ム に対 し てパ ラ レ ル化を使用不能
に し ます。 最適化のすべての レベルでのデフ ォ ル ト にな り ます。
第2章
95
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
HP Fortran バージ ョ ン 3.2 以降では、 Integrity シ ス テ ム上で +Oparallel オ
プシ ョ ン を使用で き せんが、 代わ り に +Oautopar オプシ ョ ン を使用で き ます。
注記
+Oparallel オプシ ョ ンは、 カーネル ス レ ッ ド ラ イ ブ ラ リ に対 し て明示的な呼び
出 し を行 う プ ロ グ ラ ムには使用で き ません。
+Oparallel_intrinsics
+Oparallel_intrinsics は、 libF90 パ ラ レルにあ る 、 パ ラ レルバージ ョ ン
の Fortran 組み込み関数の多 く に リ ン ク し てい ます。
+O[no]parmsoverlap
+Oparmsoverlap オプシ ョ ンは、 オプテ ィ マ イ ザに、 関数呼び出 し の実引 き 数
が メ モ リ 内で重複す る も の と 解釈 し 、 こ の解釈に反す る 最適化は回避す る こ と
を指定 し ます。 こ のオプシ ョ ンは、 最適化レベル 2 以上でのみ有効です。
+Onoparmsoverlap オプシ ョ ンは、 パ ラ メ ー タ の重複を禁止す る 標準要件に
準拠す る プ ロ グ ラ ムに使用 し て く だ さ い。
デフ ォ ル ト は +Onoparmsoverlap です。
+O[no]pipeline
+Opipeline は、 ソ フ ト ウ ェ ア パ イ プ ラ イ ニ ン グ を行い ます。 こ のオプシ ョ ン
は、 最適化レベル 2 以上でのみ有効です。
+Onopipeline ( ソ フ ト ウ ェ ア パ イ プ ラ イ ニ ン グ を行わない ) は、 コ ー ド ス
ペース を節約す る と き に使用 し て く だ さ い。
デフ ォ ル ト は +Opipeline です。
+Oprefetch_latency=cycle
コ ンパ イ ラ がデー タ プ リ フ ェ ッ チ命令を生成す る ループに対 し て適用 さ れ ま
す。 個々のループについて、 コ ンパ イ ラ は推定 し たループ長で “cycles” を割
り 、 事前のプ リ フ ェ ッ チ命令を生成す る ためのループ繰 り 返 し 処理の回数を求
め ます。 ループのデフ ォ ル ト 値は、 浮動小数点ア ク セ ス を含む場合は 480 回、
浮動小数点ア ク セ ス を含ま ない場合は 150 回です。 チ ュ ーニ ン グのためには、
い く つかの異な る プ リ フ ェ ッ チ レ イ テ ン シ設定を使用 し て アプ リ ケーシ ョ ン の
パフ ォ ーマ ン ス を計測 し 、 最適な値を調べ る こ と をお勧め し ます。 一部の浮動
小数点 コ ー ド では、 こ の間隔を 960 ま で増やす こ と で良い結果 と な る 場合が
あ り ます。 並列アプ リ ケーシ ョ ン では、 150 と い っ た よ り 短いプ リ フ ェ ッ チ間
隔を使用す る こ と で良い結果 と な り ます。
96
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+O[no]procelim
+Oprocelim は、 アプ リ ケーシ ョ ン で引用 さ れない手続 き を実行可能フ ァ イ ル
の出力か ら 削除 し ます。 +Onoprocelim は、 アプ リ ケーシ ョ ン で引用 さ れない
手続 き を、 実行可能フ ァ イ ルか ら 削除 し ません。 こ のオプシ ョ ンは、 任意の最
適化レベルで使用す る こ と がで き ます。
+Oprocelim は、 実行可能フ ァ イ ルのサ イ ズ を縮小す る と き 、 特に、 レベル 3
と 4 で最適化す る と き 、 イ ン ラ イ ン展開に よ っ て一部のルーチン の呼び出 し を
すべて削除で き る と き に使用 し ます。
デフ ォ ル ト は、 最適化レベル 0 ~ 3 では +Onoprocelim で、 レベル 4 では
+Oprocelim です。
+Oprofile=use:filename
プ ロ フ ァ イ ルデー タ ベース フ ァ イ ルの名前 と し て フ ァ イ ル名を指定 し ます。 こ
のオプシ ョ ンは、 +P オプシ ョ ン と +dffilename オプシ ョ ン を同時に指定 し た
場合 と 同義です。 引 き 数 :filename は省略可能です ( こ の場合のデフ ォ ル ト の
フ ァ イ ル名は flow.data にな り ます )。 こ のオプシ ョ ンは、 Itanium® ベース の
アプ リ ケーシ ョ ン でのみ有効です。
+Oprofile=collect[:<qualifiers>]
+Oprofile=collect は、 修飾子を指定 し ない場合は +I と 同義です。
<qualifiers> はプ ロ フ ァ イ ル収集修飾子で、 複数指定す る 場合は コ ン マで区
切 り ます。 サポー ト さ れてい る プ ロ フ ァ イ ル収集修飾子は以下の と お り です。
arc— アー ク 数を収集 し ます (+Oprofile=collect と 同義 )。 こ れがデフ ォ ル
ト 値です。
stride— ス ト ラ イ ド デー タ を収集 し ます。
all— 全 タ イ プのプ ロ フ ァ イ ルデー タ を収集 し ます。 こ れは
+Oprofile=collect:arc,stride と 同義です。
+Oprofile=collect はアプ リ ケーシ ョ ン のプ ロ フ ァ イ ルベース の最適化を実
装 し ます。
こ のオプシ ョ ンは、 Itanium® ベース のアプ リ ケーシ ョ ン でのみ有効です。
+O[no]promote_indirect_calls
第2章
97
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
間接呼び出 し か ら 直接呼び出 し へのプ ロ モー ト を有効 [ ま たは無効 ] に し ま
す。 間接呼び出 し はポ イ ン タ が関数を指 し てい る 場合に発生 し ます。 こ のオプ
シ ョ ンは最適化レベル 3 と 4 で使用で き ます。 デフ ォ ル ト は
+Onopromote_indirect_calls です。
+O[no]ptrs_to_globals[=name1,name2,...,nameN]
ポ イ ン タ を通 じ て グ ロ ーバル変数が変更 さ れてい る か [ ま たは変更 さ れていな
いか ] ど う か を オプテ ィ マ イ ザに知 ら せます。 こ の最適化は レベル 2、 3、 お
よ び 4 で発生 し ます。 デフ ォ ル ト は +Optrs_to_globals です。
+Orarely_called=function1[,function2...]
指定 し た関数は呼び出 し 頻度が低い も の と みな さ れ ます。 こ のオプシ ョ ンは、
プ ロ フ ァ イ ルデー タ ベース内の情報を上書 き し ます。
+Orarely_called:filename
filename が指定す る フ ァ イ ルには、 スペース ま たは改行で区切 ら れた関数名
が含まれます。 こ れ ら の関数は呼び出 し 頻度が低い も の と みな さ れ ます。 こ の
オプシ ョ ンは、 プ ロ フ ァ イ ルデー タ ベース内の情報を上書 き し ます。
+O[no]recovery
制御スペキ ュ レーシ ョ ンへの リ カバ リ コ ー ド の生成を有効 [ ま たは無効 ] に し
ます。 デフ ォ ル ト は +Onorecovery です。
+O[no]regreassoc
+Onoregreassoc は、 レ ジ ス タ の再関連付け を使用不可に し ます。 こ のオプ
シ ョ ンは、 最適化レベル 2 以上でのみ有効です。
レ ジ ス タ の再関連付けに よ っ てパフ ォ ーマ ン ス が低下す る のは ま れですが、 低
下す る 場合は +Onoregreassoc を使用 し て、 こ の最適化を使用不能に し て く
だ さ い。
デフ ォ ル ト は +Oregreassoc です。
+O[no]report
+Oreport は、 最適化 リ ポー ト の内容を指定 し ます。
+Oshortdata[=size]
指定 し たバ イ ト サ イ ズ と 同 じ 、 ま たはそれ以下のバ イ ト サ イ ズのオブジ ェ ク ト
はすべて シ ョ ー ト デー タ 領域に置かれ、 こ れ ら のデー タ の参照時にはシ ョ ー ト
デー タ 領域にそのデー タ があ る と みな さ れ ます。 n の有効な値は 0 ま たは 8 ~
4,194,304 (4MB) の間の 10 進数です。 サ イ ズが指定 さ れていない場合は、
98
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
すべてのデー タ がシ ョ ー ト デー タ 領域に置かれ ます。 サ イ ズ を 0 で指定 し た場
合は、 ど のデー タ も シ ョ ー ト デー タ 領域には置かれ ません。 ま た、 すべての
デー タ 参照時には、 ロ ン グオ フ セ ッ ト が使用 さ れ ます。
デフ ォ ル ト は +Oshortdata=8 です。
注記
+Oshortdata オプショ ン で大き すぎる 値を 指定し たり サイ ズを 指
定し ない場合に +Ofast を 同時に指定する と 4MB 以上のショ ート
データ がある 場合に、 リ ン カーで fixup のエ ラ ーが発生す る こ と
があ り ます。
注記
リ ン ク に関係す る すべてのオブジ ェ ク ト フ ァ イ ルは、 同一の
+Oshortdata オプシ ョ ン を使用 し て コ ンパ イ ルす る 必要があ り
ます。 +Ofaster オプシ ョ ンお よ び +Ofast オプシ ョ ンは
+Oshortdata を暗黙指定す る ため、 他の コ モ ン ブ ロ ッ ク を参照
す る Fortrun のオブジ ェ ク ト フ ァ イ ル も 、 明示的に
+Oshortdata を使用 し て コ ンパ イ ルす る 必要があ り ます。 あ る
いは、 +Ofaster や +Ofast を使用 し て コ ンパ イ ルす る 場合は、
コ マ ン ド 行に +Oshortdata=8 を追加 し て コ ンパ イ ルす る こ と
も で き ます。
+O[no]sideeffects=name1, name2,...nameN
指定 さ れたサブプ ロ グ ラ ムはグ ロ ーバル変数を変更す る (ま たは、 変更 し な
い) と 仮定 し て、 最適化を行い ます。 こ のオプシ ョ ンは最適化レベル 2 以上で
使用で き ます。 デフ ォ ル ト では、 オプテ ィ マ イ ザがそのサブプ ロ グ ラ ム に副作
用はない と 確認で き る 場合を除いて、 すべてのサブプ ロ グ ラ ム に副作用があ る
と 仮定 し ます。
+O[no]static_prediction
条件分岐を決定す る ための静的分岐予測を使用可能ま たは使用不能に し ます。
こ れは、 局所性があ ま り ない大 き なプ ロ グ ラ ム での使用に、 よ り 適 し てい ま
す。 こ のオプシ ョ ンは最適化レベル 3 以上で使用で き ます。
+O[no]store_ordering
複数の ス レ ッ ド か ら ア ク セ ス可能な メ モ リ に、 元のプ ロ グ ラ ム順序を保持 し ま
す (ま たは保持 し ません)。 こ のオプシ ョ ン では、 強い順序付けの暗黙指定は
あ り ません。 デフ ォ ル ト は +Onostore_ordering です。
第2章
99
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
+O[no]vectorize
+Ovectorize は、 コ ンパ イ ラ に よ っ て特定のループ を数学 ラ イ ブ ラ リ の呼び
出 し に置 き 換え ます。 こ のオプシ ョ ンは、 最適化レベル 3 以上でのみ有効で
す。
コ マ ン ド 行 と は別途に リ ン ク す る と き に、 +Ovectorize オプシ ョ ン を指定 し
て コ ンパ イ ル し た場合は、 リ ン ク 行で数学 ラ イ ブ ラ リ が検索 さ れ る か ど う か を
確認 し なければな り ません。
デフ ォ ル ト は +Onovectorize です。
+O[no]whole_program_mode
こ のオプシ ョ ン を使用 し て コ ンパ イ ル さ れた フ ァ イ ルのみが、 こ れ ら の フ ァ イ
ルで定義 さ れてい る すべてのグ ロ ーバル変数お よ びプ ロ シージ ャ を参照す る こ
と を指定 し ます (ま たは、 指定 し ません)。 こ のオプシ ョ ン に よ り 最適化が使
用可能 と な り 、 グ ロ ーバルに認識 さ れないア ク セ ス はない と みな さ れ ます。 こ
のオプシ ョ ンは最適化レベル 4 で使用で き ます。
デフ ォ ルト は +Onowhole_program_mode です。
フ ァ イル名
f90 コ マ ン ド は、 表 2-12 に リ ス ト さ れてい る 拡張子を持つフ ァ イ ルを認識 し ます。 こ の表では、
f90 コ マ ン ド に対す る 拡張子の意味 も 説明 し てい ます。 表に リ ス ト さ れていない拡張子を持つ
フ ァ イ ルは、 リ ン カーに渡 さ れます。
表 2-12 f90 が認識する フ ァ イル名
フ ァ イル名
意味
file.f90
自由形式の Fortran ソ ース フ ァ イ ル。 コ ンパ イ ラ が処理 し ます。
file.f
固定形式の Fortran ソ ース フ ァ イ ル。 コ ンパ イ ラ が処理 し ます。
file.F
固定形式の Fortran ソ ース フ ァ イ ル。 最初に C プ リ プ ロ セ ッ サ (cpp)、 次に コ
ンパ イ ラ が処理 し ます。
file.i90
C プ リ プ ロ セ ッ サが出力 し た自由形式の出力フ ァ イ ル ( ソ ース フ ァ イ ルの拡張
子が .f90 の場合 )。 コ ンパ イ ラ が処理 し ます。
file.i
C プ リ プ ロ セ ッ サが出力 し た固定形式の出力フ ァ イ ル ( ソ ース フ ァ イ ルの拡張
子が .F ま たは .f の場合 )。 コ ンパ イ ラ が処理 し ます。
100
第2章
コ ンパイル と リ ン ク
f90 コ マ ン ド を使用 し た コ ンパイル
表 2-12 f90 が認識する フ ァ イル名 ( 続き )
フ ァ イル名
意味
file.o
オブジ ェ ク ト フ ァ イ ル。 リ ン カー (ld) に渡 さ れます。
file.s
アセ ンブ リ 言語の ソ ース フ ァ イ ル。 アセ ン ブ ラ (as) に渡 さ れます。
注記
第2章
コ ンパ イ ラ は、 定義 し てい る Fortran モ ジ ュ ールご と に .mod フ ァ イ ルを生成 し
ます。 モジ ュ ールを使用す る ソ ース フ ァ イ ルの コ ンパ イ ル時には、 .mod フ ァ イ ル
も 読み込みます。 コ マ ン ド 行には .mod フ ァ イ ルを指定 し ないで く だ さ い。 指定
す る と 、 コ ンパ イ ラ は リ ン カーに こ の フ ァ イ ルを渡 し 、 リ ン カーは実行可能フ ァ
イ ルに リ ン ク さ せ よ う と し て失敗 し ます。 .mod フ ァ イ ルについての詳細は、 109
ページの 「モジ ュ ールを使用 し てプ ロ グ ラ ム を コ ンパ イ ルす る 」 の項を参照 し て
く だ さ い。
101
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
本項では、 次の よ う な、 オブジ ェ ク ト フ ァ イ ルの リ ン ク 方法について説明 し ます。
•
f90 コ マ ン ド で リ ン ク と コ ンパ イ ルを行 う 利点
•
共有 ラ イ ブ ラ リ を初め と す る 、 ラ イ ブ ラ リ を リ ン ク す る 方法
•
ラ イ ブ ラ リ の検索時に、 リ ン カーが使用す る 検索規則を設定す る 方法
リ ン カーについての詳細は、 『Programming on HP-UX』 お よ び ld(1) のマ ンページ を参照 し て
く だ さ い。
f90 または ld で リ ン ク する
f90 コ マ ン ド は、 デフ ォ ル ト で コ ンパ イ ル と リ ン ク を行い、 実行可能プ ロ グ ラ ム を生成 し ます。
-c オプシ ョ ン を指定す る と 、 f90 は コ ンパ イ ルだけ を行い ます。 コ ンパ イ ルが成功す る と 、 オ
ブジ ェ ク ト フ ァ イ ルを現在の ワー ク デ ィ レ ク ト リ に書 き 込みます。 コ マ ン ド 行にオブジ ェ ク ト
フ ァ イ ルだけ を書 く と 、 f90 はオブジ ェ ク ト フ ァ イ ルを リ ン カー (ld) に渡 し 、 実行可能プ ロ グ ラ
ムに リ ン ク し ます。 つま り 、 f90 コ マ ン ド では、 1 行の コ マ ン ド 行で コ ンパ イ ル と リ ン ク を両方
実行す る こ と も 、 行を分けて個別に指定す る こ と も で き ます。 ld コ マ ン ド を個別に呼び出す必
要はあ り ません。
HP Fortran オブジ ェ ク ト フ ァ イ ルを リ ン ク す る と き は必ず f90 コ マ ン ド を使用す る こ と 、 お よ
び、 リ ン ク は コ ンパ イ ル と 同 じ コ マ ン ド 行で指定す る こ と を推奨 し ます。
f90 コ マ ン ド を使用 し て、 同 じ コ マ ン ド 行で コ ンパ イ ル と リ ン ク を実行す る と 、 ド ラ イ バは、 検
索パ ス、 ラ イ ブ ラ リ 名、 オプシ ョ ン な ど、 特定の情報を リ ン カーに渡 し ます。 ld コ マ ン ド を使
用 し て、 リ ン ク を個別に実行す る 場合は、 同 じ 情報を ld コ マ ン ド 行に指定す る 必要があ り ます。
必要な情報がない と 、 リ ン ク は失敗 し ます。 コ ンパ イ ル時に同 じ コ マ ン ド 行で リ ン ク も 指定 し て
お く と 、 リ ン カーに渡す情報が不足 し た り 、 不正だっ た り す る 問題が避け ら れ ます。
f90 が リ ン カーに渡す情報を表示す る には、 -v オプシ ョ ン ( 冗長モー ド ) で コ ンパ イ ル し ます。
こ こ では、 44 ページの 「f90 コ マ ン ド を使用 し た コ ンパ イ ル」 の項で紹介 し た hello.f90 プ ロ
グ ラ ム を冗長モー ド で コ ンパ イ ル し てみます。 プ ロ グ ラ ム を見やす く す る ために、 行頭には番号
を振っ て あ り ます。
1
2
102
$ f90 -v hello.f90
/opt/fortran90/lbin/f90com -cm -w90 -nbs -auto
-WB -hp\”-Oq00,al,ag,cn,Lm,sz,Ic,vo,lc,mf,po,es,rs,sp,
in,vc,pi,fa,pe,Rr,Fl,pv,pa,nf,cp,lx,st,ap,Pg,
ug,lu,dp,fs,bp,wp\!\” hello.f90
第2章
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
3
4
5
hello.f90
program MAIN
external subroutine HELLO
6
7
7 Lines Compiled
LPATH is: /opt/fortran90/lib/pa1.1:/usr/lib/pa1.1:
/opt/fortran90/lib:/usr/lib:/opt/langtools/lib
/usr/ccs/bin/ld -x /opt/langtools/lib/crt0.o hello.o
/opt/fortran90/lib/libF90.a -lcl -lc -lisamstub
8
•
第 1 行は、 f90 の コ マ ン ド 行です。
•
第 2 行は、 f90 が コ ンパ イ ラ に渡 し た情報です。 コ ンパ イ ラ の絶対パ ス、 ソ ース フ ァ イ ル名
( hello.f90)、 デフ ォ ル ト で設定 さ れてい る オプシ ョ ン の内部名、 お よ び、 f90 コ マ ン ド
行が表示 さ れてい ます。
•
第 3 ~ 6 行ま では、コ ンパ イ ルの進行状況が示 さ れてい ます。第 6 行は コ ンパ イ ルが成功 し た
こ と を通知 し てい ます。
•
第7行には、 f90が環境変数LPATHで定義 し た値が表示 さ れてい ます。ld コ マ ン ド を使用 し て、
hello.f90 を リ ン ク す る 場合は、 リ ン カーを呼び出す前に、 コ マ ン ド 行で LPATH を定義す
る 必要があ り ます。 詳細は、 124 ページの 「LPATH 環境変数」 の項を参照 し て く だ さ い。
•
第 8 行は、 f90 が リ ン カー (ld) に渡す コ マ ン ド 行です。 ld コ マ ン ド を使用 し て、 hello.f90
を リ ン ク す る 場合は、 コ マ ン ド 行を こ の と お り に指定す る 必要があ り ます。
第 7 行 と 8 行について説明 し た よ う に、 f90 と ld の両方の コ マ ン ド を使用 し て hello.f90 を コ
ンパ イ ル と リ ン ク す る には、 次の 4 行が必要にな り ます。
$ f90 -c hello.f90
# compile
$ export LPATH=/opt/fortran90/lib/pa1.1:/usr/lib/pa1.1:\
/opt/fortran90/lib:/usr/lib:/opt/langtools/lib
# set LPATH
$ ld -x /opt/langtools/lib/crt0.o hello.o \
/opt/fortran90/lib/libF90.a -lcl -lc -lisamstub
# link
csh で LPATH を設定す る コ マ ン ド 行は、 次の と お り です。
$ setenv LPATH
/opt/fortran90/lib/pa1.1:/usr/lib/pa1.1:\
/opt/fortran90/lib:/usr/lib:/opt/langtools/lib
第2章
# set LPATH
103
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
リ ン カーについての詳細は、 ld(1) のマ ンページ を参照 し て く だ さ い。 リ ン カーを制御す る f90
オプシ ョ ンの リ ス ト については、 表 1-6 を参照 し て く だ さ い。 f90 コ マ ン ド 行か ら リ ン カーのオ
プシ ョ ン を リ ン カーに渡すには、 -Wl オプシ ョ ン を使用 し ます ( 使用例については、 107 ページ
の 「共有 ラ イ ブ ラ リ へ リ ン ク す る 」 の項を参照 )。 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 では、
-Wl オプシ ョ ン について説明 し てい ます。
ラ イ ブ ラ リ に リ ン ク する
f90 コ マ ン ド を使用 し て、 実行可能プ ロ グ ラ ム を生成す る 場合、 リ ン カーは引用を解決す る ため
に表 2-13 で リ ス ト し てい る ラ イ ブ ラ リ を検索 し ます。 リ ン カーは、 デフ ォ ル ト で使用可能な共
有 ラ イ ブ ラ リ を使用 し ます。 共有 ラ イ ブ ラ リ についての詳細は、 107 ページの 「共有 ラ イ ブ ラ リ
へ リ ン ク す る 」 の項を参照 し て く だ さ い。
libisamstub ラ イ ブ ラ リ は、 ISAM ルーチン を呼び出す HP FORTRAN 77 プ ロ グ ラ ム を移行す
る ための ツール と し て提供 さ れてい ます。 ISAM ラ イ ブ ラ リ は、 HP Fortran で使用で き ません
が、 ス タ ブ ラ イ ブ ラ リ を使用す る と 、 リ ン カーは HP FORTRAN 77 プ ロ グ ラ ム の ISAM ルーチ
ンへの引用を解決 し ます。
表 2-13 PA-RISC において デ フ ォル ト で リ ン ク さ れる ラ イ ブ ラ リ
ライブラ リ
種類
/usr/lib/libcl.a
HP Fortran 実行時 ラ イ ブ ラ リ のアーカ イ ブバー
ジョン
/usr/lib/libcl.sl
HP Fortran 実行時 ラ イ ブ ラ リ の共有バージ ョ ン
/opt/fortran90/lib/libF90.a
配列組み込み手続 き のアーカ イ ブバージ ョ ン
/usr/lib/libc.a
組み込み手続 き お よ びシ ス テ ムルーチン のアーカ
イブラ イブラ リ
/usr/lib/libc.sl
組み込み手続 き お よ びシ ス テ ムルーチン の共有 ラ
イブラ リ
/opt/fortran90/lib/libisamstub.a
ISAM 引用を満足 さ せ る ス タ ブのアーカ イ ブ ラ イ
ブラ リ
/opt/fortran90/lib/libisamstubs.a
/usr/lib/libisamstub.sl
104
ISAM 引用を満足 さ せ る ス タ ブの共有 ラ イ ブ ラ リ
第2章
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
プ ロ グ ラ ム で定義 さ れていない名前 ( た と えば、 DOT_PRODUCT 組み込み関数 ) への引用が検出 さ
れ る と 、 リ ン カーは引用を解決す る ためにデフ ォ ル ト の ラ イ ブ ラ リ を検索 し ます。 デフ ォ ル ト の
ラ イ ブ ラ リ で名前が検出で き なか っ た場合、 コ マ ン ド 行でデフ ォ ル ト 以外の ラ イ ブ ラ リ が追加指
定 さ れていない限 り 、 リ ン ク は失敗 し ます。 本項では、 共有 ラ イ ブ ラ リ を初め と す る デフ ォ ル ト
以外の ラ イ ブ ラ リ を リ ン ク す る 方法、 お よ び ラ イ ブ ラ リ 検索規則について説明 し ます。
デ フ ォ ル ト 以外のラ イ ブ ラ リ に リ ン ク する
-l オプシ ョ ン を使用す る と 、 表 2-13 で リ ス ト し たデフ ォ ル ト の ラ イ ブ ラ リ に加え、 他の ラ イ ブ
ラ リ を リ ン ク 先に指定で き ます。 こ のオプシ ョ ン の構文は、 次の と お り です。
-lx
こ こ で x は、 /lib/libx.a ま たは /usr/lib/libx.a の ラ イ ブ ラ リ 名を指定す る 文字の並びで
す。 た と えば、 -lm は数学 ラ イ ブ ラ リ /usr/lib/libm.a を指定 し ます。 拡張子 .a は、 アー カ
イ ブ ラ イ ブ ラ リ を表 し ます。 拡張子が .sl の共有 ラ イ ブ ラ リ に も リ ン ク で き ます。 詳細は、 107
ページの 「共有 ラ イ ブ ラ リ へ リ ン ク す る 」 の項を参照 し て く だ さ い。
-l オプシ ョ ンは、 指定す る 順番に意味があ り ます。 デフ ォ ル ト の ラ イ ブ ラ リ で解決で き ないオ
ブジ ェ ク ト フ ァ イ ルの引用先が検出 さ れ る と 、 リ ン カーは コ マ ン ド 行で フ ァ イ ルの 後に 指定 さ れ
てい る ラ イ ブ ラ リ があれば、 それを検索 し ます。 た と えば、 次の コ マ ン ド 行は、 リ ン カーに対 し
て、 未解決の引用をデフ ォ ル ト ラ イ ブ ラ リ と 数学 ラ イ ブ ラ リ で検索す る よ う 指定 し てい ます。
$ f90 prog.f90 -lm
次の よ う に、 ソ ース フ ァ イ ルが引用す る ラ イ ブ ラ リ 名を ソ ース フ ァ イ ル名の 次に 指定 し て も 、 ラ
イ ブ ラ リ を プ ロ グ ラ ム に リ ン ク で き ます。
$ f90 prog.f90 /usr/lib/libm.a
コ マ ン ド 行を こ の形式で使用す る と 、 -l オプシ ョ ン が要求す る フ ァ イ ル命名規則に合致 し ない
ラ イ ブ ラ リ を リ ン ク し た り 、 /lib ま たは /usr/lib 以外のデ ィ レ ク ト リ に置かれてい る ラ イ ブ
ラ リ を リ ン ク す る のに有用です。 -l オプシ ョ ン と 同様、 ラ イ ブ ラ リ 名は、 その ラ イ ブ ラ リ を引
用す る ソ ース フ ァ イ ル名の後に指定す る 必要があ り ます。 た と えば、 次の コ マ ン ド 行は、 現在の
ワー ク デ ィ レ ク ト リ に置かれてい る prog.f90 と ラ イ ブ ラ リ my_routines を リ ン ク し ます。
$ f90 prog.f90 my_routines
プ ロ グ ラ ムが呼び出 し てい る ラ イ ブ ラ リ ルーチン の引用を リ ン カーが解決で き ない場合、
-Wl,-v オプシ ョ ン で コ ンパ イ ル し ます。 f90 コ マ ン ド は、 -v を リ ン カーに渡す こ と で、 冗長
モー ド で処理 し ます。 冗長モー ド では、 次の情報が表示 さ れ ます。
•
リ ン カーが検索 し てい る ラ イ ブ ラ リ の名前。 こ の情報に よ っ て、 リ ン カーが適切な ラ イ ブ ラ
リ を検索 し てい る こ と を確認で き ます。
第2章
105
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
•
引用を解決す る ために、 リ ン カーが選択 し たオブジ ェ ク ト フ ァ イ ルの名前。 リ ン カーは、 別
の ラ イ ブ ラ リ で同 じ 名前を検出す る と 、 そ こ で引用を解決 し ます。
ラ イ ブ ラ リ に関連す る 問題の多 く は、 コ マ ン ド 行で -l を書 く 位置を間違え たために発生 し てい
ます。 -L オプシ ョ ン も 書 く 順番に意味があ る ため、 同 じ よ う な問題が発生 し ます (108 ページの
「 ラ イ ブ ラ リ の検索規則」 の項を参照 )。
HP Fortrun 90 のルーチ ンの リ ン ク
HP 9000 PA-PRISC シ ス テ ム上で HP Fotrun 90 のルーチン を呼び出す と き には、 プ ロ グ ラ ム の
リ ン ク 時に aCC コ マ ン ド で適切な ラ ン タ イ ム ラ イ ブ ラ リ を含め る 必要があ り ます。 こ れ ら の引
き 数は、 Fortrun 90 のルーチン の コ ンパ イ ル方法に応 じ て以下の よ う に決ま り ます。
32 ビ ッ ト PA-RISC 1.1 用の コ ー ド
-L/opt/fortran90/lib/ -lF90 -lisamstub
32 ビ ッ ト PA-RISC 2.0 用の コ ー ド
-L/opt/fortran90/lib/pa2.0/ -lF90 -lisamstub
64 ビ ッ ト PA-RISC 2.0 用の コ ー ド
-L/opt/fortran90/lib/pa20_64/ -lF90 -lisamstub
HP Fortran 追加ラ イ ブ ラ リ
HP Fortran では、 次に説明す る よ う に、 Fortran プ ロ グ ラ ムに リ ン ク で き る 2 種類の ラ イ ブ ラ
リ がサポー ト さ れてい ます。
•
/opt/fortran90/lib/libU77.a: BSD 3F (libU77) ラ イ ブ ラ リ です。 こ の ラ イ ブ ラ リ は、
一部の libc シ ス テ ムルーチン に Fortran イ ン タ フ ェース を提供 し ます。 こ の ラ イ ブ ラ リ の
ルーチン を引用す る プ ロ グ ラ ムは、 +U77 オプシ ョ ン で コ ンパ イ ルす る 必要があ り ます。
libU77 ルーチン を引用す る Fortran プ ロ グ ラ ム の移植についての詳細は、 237 ページの
「HP Fortran への移行」 の項を参照 し て く だ さ い。
•
/opt/fortran90/lib/libblas.a: BLAS (Basic Linear Algebra Subroutine) ラ イ ブ ラ
リ です。 こ の ラ イ ブ ラ リ は、 ベ ク ト ル と 行列に よ る 共通演算を実行す る ルーチン を サポー ト
し ます。 こ の ラ イ ブ ラ リ のルーチン を引用す る プ ロ グ ラ ムは、 +lblas オプシ ョ ン で コ ンパ イ
ルす る 必要があ り ます。 詳細は、 189 ページの 「BLAS ラ イ ブ ラ リ ルーチン を呼び出す」 の
項を参照 し て く だ さ い。
106
第2章
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
libU77 お よ び BLAS ラ イ ブ ラ リ については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 で説明 し てい
ます。
共有 ラ イ ブ ラ リ へ リ ン ク する
多 く の HP Fortran ラ イ ブ ラ リ と HP-UX ラ イ ブ ラ リ は、 ラ イ ブ ラ リ の拡張子 (.sl ま たは .a) が
示す よ う に、 共有バージ ョ ンお よ びアーカ イ ブバージ ョ ン と し て格納 さ れてい ます。 た と えば、
HP Fortran の実行時 ラ イ ブ ラ リ には、 /usr/lib/libcl.sl お よ び /usr/lib/libcl.a の共有
バージ ョ ン と アーカ イ ブバージ ョ ン があ り ます。
共有 ラ イ ブ ラ リ と アーカ イ ブ ラ イ ブ ラ リ を比べ る と 、 共有 ラ イ ブ ラ リ の場合、 リ ン カーは コ ー ド
を プ ロ グ ラ ムに リ ン ク し ません。 その代わ り 、 共有 ラ イ ブ ラ リ への引用は、 ラ イ ブ ラ リ が実行可
能プ ロ グ ラ ムのア ド レ ス空間に ロ ー ド さ れ る と き に解決 さ れ ます。 こ れに対 し て、 アーカ イ ブ ラ
イ ブ ラ リ の コ ー ド は、 実行可能プ ロ グ ラ ム に コ ピー さ れ ます。
共有 ラ イ ブ ラ リ を リ ン ク す る 利点は、 次の と お り です。
•
実行可能フ ァ イ ルは 「不完全」 であ り 、 ラ イ ブ ラ リ の コ ー ド を含ま ないため、 アーカ イ ブ
フ ァ イ ルを リ ン ク し た場合 と 比較 し て、 実行可能プ ロ グ ラ ムのサ イ ズが小 さ く な り ます。
•
共有 ラ イ ブ ラ リ を使用す る と 、 最新バージ ョ ンの ラ イ ブ ラ リ が常に入手で き ます。 アーカ イ
ブバージ ョ ンに リ ン ク し た場合、 リ ン ク 時に使用可能だ っ たバージ ョ ン を使用す る こ と にな
り ます。 後にな っ て、 最新バージ ョ ンの ラ イ ブ ラ リ が必要にな っ た場合は、 プ ロ グ ラ ム を そ
の ラ イ ブ ラ リ に再 リ ン ク す る 必要があ り ます。
共有 ラ イ ブ ラ リ に リ ン ク す る 問題点は、 ラ イ ブ ラ リ と プ ロ グ ラ ム と の間に依存が発生す る ため、
共有 ラ イ ブ ラ リ と プ ロ グ ラ ムは、 常に同 じ シ ス テ ムに イ ン ス ト ール し ておかねばな り ません。 こ
れに対 し て、 アーカ イ ブ ラ イ ブ ラ リ に リ ン ク すれば、 実行可能プ ロ グ ラ ムは リ ン ク 先の ラ イ ブ ラ
リ に依存 し な く な り ます。 ま た、 ラ イ ブ ラ リ ルーチン を頻繁に呼び出すプ ロ グ ラ ム を共有 ラ イ ブ
ラ リ に リ ン ク す る と 、 実行速度が遅 く な り ます。
共有 ラ イ ブ ラ リ が利用で き れば、 リ ン カーはデフ ォ ル ト で共有バージ ョ ンの ラ イ ブ ラ リ を選択 し
ます。 共有 ラ イ ブ ラ リ が利用で き ない と 、 アーカ イ ブバージ ョ ン を選択 し ます。
注記
libF90、 libU77、 お よ び libIO77 (Itanium® のみ) では、 アーカ イ ブ ラ イ ブ ラ
リ がデフ ォ ル ト で選択 さ れてい ます (詳細は +sharedlibF90、 +sharedlibU77、
お よ び +sharedlibIO77 オプシ ョ ン を参照 し て く だ さ い)。
リ ン カーに対 し て アーカ イ ブ ラ イ ブ ラ リ を強制的に選択 さ せ る には、 f90 コ マ ン ド 行で
-Wl,-a,archive オプシ ョ ン を指定 し ます。 f90 は、 -Wl オプシ ョ ン の引 き 数 (-a お よ び
archive) を リ ン カーに渡 し ます。 こ のオプシ ョ ンは、 コ マ ン ド 行で指定 し た ラ イ ブ ラ リ 名の 前
第2章
107
コ ンパイル と リ ン ク
HP Fortran プ ロ グ ラ ムの リ ン ク
に書 く 必要があ り ます。 次の コ マ ン ド 行では、 prog.f90 を コ ンパ イ ル し た後、 -lm オプシ ョ ン
に よ っ て、 デフ ォ ル ト の ラ イ ブ ラ リ と 数学 ラ イ ブ ラ リ のアーカ イ ブバージ ョ ン を リ ン ク し てい ま
す。
$ f90 -Wl,-a,archive prog.f90 -lm
リ ン カーの -a オプシ ョ ン については、 ld(1) のマ ンページ を参照 し て く だ さ い。 共有 ラ イ ブ ラ リ
についての詳細は、 115 ページの 「共有 ラ イ ブ ラ リ を作成す る 」 の項を参照 し て く だ さ い。
ラ イ ブ ラ リ の検索規則
-l オプシ ョ ン を使用 し て、 ラ イ ブ ラ リ 名を指定す る と 、 リ ン カーは環境変数 LPATH で指定 さ れ
たデ ィ レ ク ト リ で ラ イ ブ ラ リ を検索 し ます。 f90 コ マ ン ド は こ の変数を設定す る ため、 リ ン カー
は最初に /opt/fortran90/lib デ ィ レ ク ト リ 、 次に /usr/lib デ ィ レ ク ト リ を検索 し ます。
LPATH を設定す る こ と に よ っ て、 別のデ ィ レ ク ト リ を検索対象に指定で き ます (124 ページの
「LPATH 環境変数」 の項を参照 )。
ま たは、 -Ldirectory オプシ ョ ン を使用す る と 、 リ ン カーが引用先を解決す る と き に、 最初に
検索す る directory を指定で き ます。 た と えば、 次の よ う に書 き ます。
$ f90 -L/my_libs prog.f90 -lstuff
リ ン カーは、 libstuff.sl と libstuff.a を含む ラ イ ブ ラ リ を まず /my_libs で検索 し 、 次に
/opt/fortran90/lib お よ び /usr/lib で検索 し ます。
108
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
特殊な目的のためのコ ンパイル
HP Fortran コ ンパ イ ラ は、 デフ ォ ル ト では通常の コ ンパ イ ルを実行す る よ う 設計 さ れてい ます。
ほ と ん ど のアプ リ ケーシ ョ ンは、 数個の f90 オプシ ョ ン を使用 し て コ ンパ イ ルを実行 し ます ( 通
常使用す る オプシ ョ ン の リ ス ト は、 表 2-1 を参照 し て く だ さ い )。
ただ し 、 よ り 高度な コ ンパ イ ルに も 対応 し てい ます。 本項では、 次の よ う な目的で f90 コ マ ン ド
を使用す る 場合の方法について説明 し ます。
•
Fortran モジ ュ ールを含むプ ロ グ ラ ム を コ ンパ イ ルす る 。
•
異な る PA-RISC マシ ン で実行す る プ ロ グ ラ ム を コ ンパ イ ルす る 。
•
共有 ラ イ ブ ラ リ のオブジ ェ ク ト フ ァ イ ルを作成す る 。
•
C プ リ プ ロ セ ッ サの指令を含む ソ ース フ ァ イ ルを処理す る 。
•
デマ ン ド ロ ー ド 可能なプ ロ グ ラ ム を作成す る 。
•
共有可能な実行可能プ ロ グ ラ ム を作成す る 。
•
32 ビ ッ ト のプ ロ グ ラ ム を 64 ビ ッ ト モー ド で コ ンパ イ ルす る 。
モ ジ ュ ールを使用 し て プ ログ ラ ムを コ ンパイルする
Fortran 規格では、 デー タ や手続 き への共通のア ク セ ス を容易にす る プ ロ グ ラ ム単位 と し て、 モ
ジ ュール を採用 し てい ます。 モジ ュ ールについての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』
を参照 し て く だ さ い。
モジ ュ ールを使用す る 利点は、 引用仕様情報が コ ンパ イ ラ に渡 さ れ る こ と です。 た と えば、 仮引
き 数 と 実引 き 数の不一致エ ラ ーな ど を検出で き ます。 HP Fortran コ ンパ イ ラ は、 モジ ュ ールを
定義 し てい る フ ァ イ ルを コ ンパ イ ルす る と 、 引用仕様情報を含む .mod フ ァ イ ルを生成 し ます。
モジ ュ ールを参照す る フ ァ イ ルを後で コ ンパ イ ルす る と き 、 コ ンパ イ ラ は .mod フ ァ イ ルを読み
込み、 参照 し てい る フ ァ イ ルで引用 さ れ る モジ ュ ール要素が、 .mod フ ァ イ ルの情報 と 正確に一
致 し てい る こ と を確認 し ます。
.mod フ ァ イ ルを コ ンパ イ ラ に使用可能にす る には、 モジ ュ ールを参照 し てい る フ ァ イ ルを コ ン
パ イ ルす る 前に、 モジ ュ ールを定義 し てい る フ ァ イ ルを コ ンパ イ ルす る 必要があ り ます。 ま た、
モジ ュ ールを定義 し てい る フ ァ イ ルを変更 し た場合は、 その定義フ ァ イ ルお よ びモジ ュ ールを参
照す る フ ァ イ ルを こ の順番で再 コ ンパ イ ルす る 必要があ り ます。
第2章
109
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
ま た、 モジ ュ ールが同 じ フ ァ イ ルで定義 さ れ使用 さ れてい る 場合、 定義は、 辞書順でモジ ュ ール
を引用す る USE 文の前になければな り ません。 こ れに よ っ て、 コ ンパ イ ラ は最初に .mod フ ァ イ
ルを生成で き 、 USE 文の引用を解決で き ます。
本項では、 次の項目について説明 し ます。
•
モジ ュ ールを使用す る プ ロ グ ラ ム を コ ンパ イ ルす る 方法
•
モジ ュ ールで作業す る ために メ イ ク フ ァ イ ルを作成す る 方法
•
.mod フ ァ イ ルを管理す る ために、 -I オプシ ョ ンお よ び +moddir オプシ ョ ン を使用す る 方法
例
こ こ では、 main.f90, code.f90, data.f90 と い う 3 つの フ ァ イ ルで構成 さ れ る プ ロ グ ラ ム を例
に解説 し ます。 主プ ロ グ ラ ムは、 次の よ う に、 main.f90 にあ り ます。
例 2-2
main.f90
PROGRAM keep_stats
! stats_code contains module procedures for operating
!
on statistical database
USE stats_code
INTEGER :: n
! print prompt, using nonadvancing I/O
WRITE (*, FMT='(A)', ADVANCE='NO') 'Enter an integer '// &
'(hint: 77 is current average): '
READ *, n
IF (n == 0) THEN
PRINT *, 'But not that one.'
ELSE
CALL update_db(n)
IF (n >= get_avg()) THEN ! get_avg is in stats_code
PRINT *, 'Average or better.'
ELSE
PRINT *, 'Below average.'
END IF
END IF
END PROGRAM keep_stats
主プ ロ グ ラ ム では最初の宣言文 (USE) でモジ ュ ール stats_code を参照す る こ と を宣言 し てい ま
す。 こ のモジ ュ ールは、 code.f90 で次の よ う に定義 さ れてい ます。
110
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
例 2-3
code.f90
! stats_code: a (partial!) package of module procedures for
!
performing statistical operations
MODULE stats_code ! shared data to be used by procedures declared below
USE stats_db
CONTAINS
! module procedures
! update_db: updates shared variables in module stats_db
SUBROUTINE update_db (new_item)
INTEGER :: new_item
n_items = n_items +1
item(n_items) = new_item
sum = sum + new_item
END SUBROUTINE update_db
! get_avg: returns arithmetic mean
INTEGER FUNCTION get_avg ()
get_avg = sum / n_items
END FUNCTION get_avg
END MODULE stats_code
こ のプ ロ グ ラ ム単位 も USE 文で始ま っ てお り 、 stats_db を モジ ュ ール と し て参照す る こ と を宣
言 し てい ます。 こ のモジ ュ ールは、 data.f90 で次の よ う に定義 さ れてい ます。
例 2-4
data.f90
! stats_db: shared data declared here
MODULE stats_db
INTEGER, PARAMETER :: size = 100 ! max number of items in array
! n_items, sum, and item hold the data for statistical analysis
INTEGER :: n_items, sum
INTEGER, DIMENSION(size) :: item
! the initializations are just to start the program going
DATA n_items, sum, item/3, 233, 97, 22, 114, 97*0/
END MODULE stats_db
第2章
111
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
こ のプ ロ グ ラ ム では、 モジ ュ ールを参照す る こ と で、 フ ァ イ ル間に依存が生ま れてい ます。 フ ァ
イ ルが別の フ ァ イ ルで定義 さ れてい る モジ ュ ールを参照す る ため、 他の フ ァ イ ルに依存 し てい ま
す。 こ う し た依存に よ り 、 プ ロ グ ラ ム フ ァ イ ルを コ ンパ イ ルす る 順番が決ま り ます。 見本プ ロ グ
ラ ム では、 次の依存があ り ます。
•
main.f90 は、 code.f90 に依存 し てい ます。
•
code.f90 は、 data.f90 に依存 し てい ます。
依存があ る ため、 data.f90 は code.f90 よ り 前に、 code.f90 は main.f90 よ り 前に コ ンパ イ
ルす る 必要があ り ます。 こ の順番で コ ンパ イ ルす る こ と に よ り 、 コ ンパ イ ラ は各 .mod フ ァ イ ル
を生成 し 、 後で読み込め る よ う にな り ます。
コ マ ン ド 行に ソ ース フ ァ イ ルを次に示す順番で書 く と 、 コ ンパ イ ル と リ ン ク は成功 し ます。
$ f90 -o do_stats data.f90 code.f90 main.f90
f90 は コ ンパ イ ルの実行中に STATS_CODE.mod お よ び STATS_DB.mod を作成 し ます。 こ れ ら の
フ ァ イ ルは、 オブジ ェ ク ト フ ァ イ ルお よ び実行可能プ ロ グ ラ ム do_stats と と も に、 現在の ワ ー
ク デ ィ レ ク ト リ に格納 さ れ ます。 次に、 実行可能プ ロ グ ラ ムの実行例を示 し ます。
$ do_stats
Enter an integer (hint:
Average or better.
77 is current average):
77
前述の コ マ ン ド 行ではな く 、 プ ロ グ ラ ム を次に示す順番で コ ンパ イ ルす る 場合、
$ f90 -o do_stats main.f90 data.f90 code.f90
コ ンパ イ ルは失敗 し 、 f90 は次の よ う なエ ラ ー メ ッ セージ を出力 し ます。
Error FCE37 : Module STATS_CODE not found
コ ンパ イ ルが失敗 し たのは、 コ ンパ イ ラ は STATS_CODE.mod がない と main.f90 を処理で き な
いためです。 コ マ ン ド 行に書かれてい る プ ロ グ ラ ム フ ァ イ ルの順番では、 コ ンパ イ ラ は
main.f90 の処理を 完了す る ま で 、 code.f90 を処理で き ません ( し たが っ て、 STATS_CODE.mod
も 作成で き ません )。
make で コ ンパイルする
make ユーテ ィ リ テ ィ を使用 し て、 Fortran プ ロ グ ラ ム を コ ンパ イ ルす る 場合、 メ イ ク フ ァ イ ル
はモジ ュ ールに よ る 依存を考慮 し て作成す る 必要があ り ます。 た と えば、 make ユーテ ィ リ テ ィ
で do_stats プ ロ グ ラ ム を コ ンパ イ ルす る 場合、 メ イ ク フ ァ イ ルでは依存を次の よ う に書 き ま
す。
112
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
例 2-5
makefile
# description for building do_stats
do_stats :
main.o code.o data.o
f90 -o do_stats main.o code.o data.o
# main.o is
main.o :
f90
# code.o is
code.o :
f90
# data.o is
data.o :
f90
dependent on main.f90 and code.f90
main.f90 code.o
-c main.f90
dependent on code.f90 and data.f90
code.f90 data.o
-c code.f90
dependent only its source, data.f90
data.f90
-c data.f90
ソ ース フ ァ イ ルの指定順に対応 し た依存は、 f90 コ マ ン ド 行で次の よ う に指定 さ れ る こ と に注意
し て く だ さ い。
$ f90 -o do_stats data.f90 code.f90 main.f90
メ イ ク フ ァ イ ルを makefile に し た場合、 make でプ ロ グ ラ ム を コ ンパ イ ルす る には、 次の コ マ
ン ド 行を使用 し ます。
$ make
.mod フ ァ イルを管理する
HP Fortran 90 コ ンパ イ ラ は、 デフ ォ ル ト で .mod フ ァ イ ルを現在の ワー ク デ ィ レ ク ト リ に格納
し 、 フ ァ イ ルを読み込む と き は こ のデ ィ レ ク ト リ を検索 し ます。 +moddir=directory と -I
directory オプシ ョ ン を使用す る と 、 別なデ ィ レ ク ト リ を指定で き ます。 +moddir オプシ ョ ン
は、 コ ンパ イ ラ に対 し て、 directory で指定 さ れてい る デ ィ レ ク ト リ に .mod フ ァ イ ルを書 き 込
む よ う 要求 し ます。 ま た、 -I オプシ ョ ンは、 コ ンパ イ ラ に対 し て、 .mod フ ァ イ ルを読み込む と
き 、 フ ァ イ ルを検索す る デ ィ レ ク ト リ に directory を指定 し ます (-I と directory の間に挿入
す る 空白文字は省略可能です )。
見本プ ロ グ ラ ム do_stats を例に し て説明 し ます。 コ マ ン ド 行を次の よ う に書 く と 、 data.f90
は リ ン ク さ れずに コ ンパ イ ル さ れ、 .mod フ ァ イ ルはサブデ ィ レ ク ト リ mod_files に格納 さ れま
す。
$ f90 -c +moddir=mod_files data.f90
コ マ ン ド 行を次の よ う に指定 し た場合、
$ f90 -c +moddir=mod_files -I mod_files code.f90
第2章
113
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
+moddir お よ び -I オプシ ョ ンは、 次の よ う に処理 さ れます。
•
+moddir オプシ ョ ン が指定 さ れてい る ため、f90 は、code.f90 の .mod フ ァ イ ルを サブデ ィ レ
ク ト リ mod_files に書 き 込みます。
•
-I オプシ ョ ン が指定 さ れてい る ため、 f90 は code.f90 を コ ンパ イ ルす る と き 、 .mod フ ァ イ
ルを同 じ サブデ ィ レ ク ト リ で検索 し ます。
コ マ ン ド 行を次の よ う に指定 し た場合、
$ f90 -odo_stats -I mod_files main.f90 code.o data.o
f90 は、 main.f90 を コ ンパ イ ル し 、 サブデ ィ レ ク ト リ mod_files で .mod フ ァ イ ルを検索 し 、
すべてのオブジ ェ ク ト フ ァ イ ルを実行可能プ ロ グ ラ ム do_stats に リ ン ク し ます。
異な る PA-RISC マシ ン用に コ ンパイルする
HP Fortran 90 プ ロ グ ラ ム を コ ンパ イ ルす る と き 、 コ ンパ イ ラ がデフ ォ ル ト で生成す る オブジ ェ
ク ト コ ー ド は、 コ ンパ イ ラ が動作 し てい る マシ ン の PA-RISC モデルを基準に し てい ます。
PA-RISC モデルが異な る マシ ン でプ ロ グ ラ ム を実行す る と 、 コ ー ド は効率が低下す る 可能性が
あ り ます。 PA1.1 マシ ン で実行す る PA2.0 コ ー ド は、 ま っ た く 動かない こ と も あ り ます。
ま た、 数学 ラ イ ブ ラ リ な ど の一部の ラ イ ブ ラ リ は、 バージ ョ ン が異な る PA-RISC で使用で き ま
す。 デフ ォ ル ト では、 コ ンパ イ ラ は コ ンパ イ ル し てい る マシ ン の PA-RISC モデルを基準 と す る
バージ ョ ン を選択 し ます。 プ ロ グ ラ ム を モデルが異な る マシ ン で実行す る 場合、 適切な ラ イ ブ ラ
リ を リ ン ク で き ない可能性があ り ます。
+DAmodel オプシ ョ ン を付けて コ ンパ イ ルす る と 、 コ ンパ イ ラ は model で指定 さ れてい る アーキ
テ ク チ ャ を基準 と し た コ ー ド を生成 し 、 リ ン カーは model と 互換性のあ る ラ イ ブ ラ リ を選択 し
ます。 model は、 次のいずれかでなければな り ません。
•
PA-RISC バージ ョ ン番号 (1.1,2.0, ま たは 2.0W)。 64 ビ ッ ト モー ド で コ ンパ イ ルす る には、
+DA2.0W を使用 し ます (121 ページの 「64 ビ ッ ト モー ド で コ ンパ イ ルす る 」 の項を参照 )。
•
モデル番号 ( た と えば、 750 ま たは 870)
•
PA-RISC のプ ロ セ ッ サ名 ( た と えば、 PA7100 ま たは PA8000)
•
portable ( すべてのモデルで互換性が確保で き る コ ー ド )
プ ロ グ ラ ム を別なモデルで も 実行可能にす る 場合だけ、 +DAportable オプシ ョ ン を使用 し ま
す。
マシ ンのモデル番号を調べ る には、 uname -m コ マ ン ド を次の よ う に使用 し ます。
114
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
$ uname -m
9000/879
ま たは、 grep コ マ ン ド を使用 し て、 /opt/langtools/lib/sched.models フ ァ イ ルに書かれて
い る モデル番号を検索 し て、 アーキ テ ク チ ャ タ イ プ を調べ る こ と がで き ます。 次の よ う に使用 し
ます。
$ grep 879 /opt/langtools/lib/sched.models
879
2.0
PA8000
+DSmodel オプシ ョ ン を使用 し て、 アーキ テ ク チ ャ 固有の命令ス ケ ジ ュ ー ラ を指定す る こ と も で
き ます。 こ こ で model は、 +DA オプシ ョ ン の場合 と 同 じ 意味を持ち ます。 プ ロ グ ラ ム を コ ンパ
イ ル し たマシ ン と 同 じ マシ ン で実行す る 場合、 +DA オプシ ョ ン と 同 じ く 、 +DS オプシ ョ ンは必要
あ り ません。 ま た、 +DAmodel オプシ ョ ン を指定 し て コ ンパ イ ル し た場合、 +DS オプシ ョ ン で別
な アーキ テ ク チ ャ を指定 し ていない限 り 、 コ ンパ イ ラ は同 じ アーキ テ ク チ ャ を基準 と し た ス ケ
ジ ュ ー リ ン グ アルゴ リ ズ ム を選択 し ます。
注記
PA1.1 シ ス テ ム用に生成 し た コ ー ド は PA2.0 シ ス テ ム で実行で き ますが、 PA2.0
シ ス テ ム用に生成 し た コ ー ド は PA1.1 シ ス テ ム では実行で き ません。 ロ ーダー
は、 PA2.0 用の コ ー ド を PA1.1 シ ス テ ム で実行す る こ と を許可 し ません。
共有ラ イ ブ ラ リ を作成する
107 ページの 「共有 ラ イ ブ ラ リ へ リ ン ク す る 」 の項で説明 し た よ う に、 多 く の HP-UX ラ イ ブ ラ
リ と HP Fortran ラ イ ブ ラ リ は、 共有バージ ョ ン と アーカ イ ブバージ ョ ンが使用で き ます。 共有
ラ イ ブ ラ リ を リ ン ク す る と 、 実行可能プ ロ グ ラ ム のサ イ ズが小 さ く な り 、 最新バージ ョ ン の ラ イ
ブ ラ リ が常に使用で き ます。
共有バージ ョ ン の ラ イ ブ ラ リ を作成す る には、 +pic コ マ ン ド 行オプシ ョ ン、 お よ び -b リ ン カー
オプシ ョ ン を使用 し ます。 次の項では、 オプシ ョ ンの使用方法を説明 し 、 共有 ラ イ ブ ラ リ の作成
方法の例を示 し ます。
+pic 指定で コ ンパイルする
+pic オプシ ョ ン を指定す る と 、 コ ンパ イ ラ は共有 ラ イ ブ ラ リ で使用す る PIC ( 位置独立 コ ー
ド ) を生成 し ます。 PIC には、 絶対ア ド レ ス が書かれていないため、 プ ロ セ ス のア ド レ ス空間
を再配置 し な く て も 、 任意の位置に配置で き ます。 PIC は こ う し た特性があ る ため、 複数のプ
ロ セ ス で共有で き ます。
+pic オプシ ョ ンの構文は、 次の と お り です。
+pic={short|long|no}
第2章
115
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
+pic=short と +pic=long のいずれで コ ンパ イ ル し て も 、 PIC が生成 さ れ ますが、 基本的には
+pic=short オプシ ョ ン を使用す る こ と を推奨 し ます。 リ ン カーがエ ラ ー メ ッ セージ を表示 し
て、 共有 ラ イ ブ ラ リ の引用シ ン ボル数が限界値を超え てい る こ と を通知 し た場合は、 +pic=long
で再 コ ンパ イ ル し ます。 こ の場合、 コ ンパ イ ラ は よ り 大 き いシ ン ボルテーブル用に空間を割 り 当
て ます。
+pic=no はデフ ォ ル ト です。 こ の場合、 コ ンパ イ ラ は実行可能プ ロ グ ラ ム な ど で使用す る 絶対
コ ー ド を生成 し ます。
コ マ ン ド 行を次の よ う 書 く と 、 3 つのオブジ ェ ク ト フ ァ イ ル (x.o, y.o, z.o) が生成 さ れます。 各
フ ァ イ ルの コ ー ド は PIC にな り ます。
$ f90 -c +pic=short x.f90 y.f90 z.f90
+pic オプシ ョ ンについての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
-b 指定で リ ン ク する
-b オプシ ョ ンは、 リ ン カーのオプシ ョ ン です。 こ のオプシ ョ ン を指定す る と 、 リ ン カーは、 通
常の実行可能プ ロ グ ラ ム を生成す る 代わ り に、 PIC オブジ ェ ク ト フ ァ イ ルを共有 ラ イ ブ ラ リ にバ
イ ン ド し ます。 -b オプシ ョ ンは、 ld コ マ ン ド と 一緒に使用 し なければな り ません。 f90 を使っ
て共有 ラ イ ブ ラ リ を作成す る こ と はで き ません。 ま た、 ld コ マ ン ド 行で指定 し たオブジ ェ ク ト
フ ァ イ ルは、 PIC で構成す る 必要があ り ます。 つま り 、 +pic=short ま たは +pic=long を指定
し て作成す る 必要があ り ます。
次の コ マ ン ド 行は、 オブジ ェ ク ト フ ァ イ ル x.o, y.o, z.o を共有 ラ イ ブ ラ リ my_lib.sl と し て リ
ン ク し ます。
$ ld -b -o my_lib.sl x.o y.o z.o
こ の ld コ マ ン ド 行は、 実行可能フ ァ イ ルを リ ン ク す る ld コ マ ン ド 行 と 比べてかな り 単純に
な っ てい る こ と に注意 し て く だ さ い ( た と えば、 102 ページの 「f90 ま たは ld で リ ン ク す る 」 の
項を参照 )。
例
本項では、 共有 ラ イ ブ ラ リ を作成 し て リ ン ク す る 例を示 し ます。 共有 ラ イ ブ ラ リ は、 ソ ース フ ァ
イ ル hi.f90 と bye.f90 を コ ンパ イ ル し て作成 し た PIC オブジ ェ ク ト フ ァ イ ルか ら 構成 さ れま
す。 ラ イ ブ ラ リ my_lib.sl は、 greet.f90 を コ ンパ イ ル し て作成す る 実行可能プ ロ グ ラ ムに リ
ン ク し ます。 次に、 HP Fortran の 3 つの ソ ース フ ァ イ ルの コ ー ド を示 し ます。
116
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
例 2-6
hi.f90
SUBROUTINE say_hi()
PRINT *, 'Hi!'
END SUBROUTINE say_hi
例 2-7
bye.f90
SUBROUTINE say_bye()
PRINT *, 'Bye!'
END SUBROUTINE say_bye
例 2-8
greet.f90
PROGRAM main
CALL say_hi()
CALL say_bye()
END PROGRAM main
次に、 -c オプシ ョ ン を指定 し て、 リ ン ク を実行せずに、 PIC オブジ ェ ク ト フ ァ イ ルを生成す る
コ マ ン ド 行を示 し ます。
$ f90 -c +pic=short bye.f90 hi.f90
次の コ マ ン ド 行は、 オブジ ェ ク ト フ ァ イ ルを共有 ラ イ ブ ラ リ に リ ン ク し ます。
$ ld -b -o my_lib.sl bye.o hi.o
最後の コ マ ン ド 行は、 ソ ース フ ァ イ ル greet.f90 を コ ンパ イ ル し 、 共有 ラ イ ブ ラ リ を オブジ ェ
ク ト コ ー ド に リ ン ク し て実行可能プ ロ グ ラ ム a.out を生成 し ます。
$ f90 greet.f90 my_lib.sl
次に、 見本プ ロ グ ラ ム の実行結果を示 し ます。
$ a.out
Hi!
Bye!
C プ リ プ ロ セ ッ サを使用する
f90 コ マ ン ド を使用す る と 、 コ ンパ イ ルす る 前の ソ ース フ ァ イ ルを C プ リ プ ロ セ ッ サ (cpp) に渡
す こ と がで き ます。 ソ ース フ ァ イ ルに C プ リ プ ロ セ ッ サ指令が書かれてい る と 、 cpp は指令に
従っ て動作 し 、 ソ ース テ キ ス ト を修正 し ます。 f90 ド ラ イ バは、 次に、 前処理 し た ソ ース テ キ ス
第2章
117
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
ト を コ ンパ イ ラ に渡 し ます。 プ ロ グ ラ ムの ソ ース フ ァ イ ルに cpp 指令を追加 し 、 cpp コ マ ン ド を
使用 し て、 ソ ース フ ァ イ ルを前処理す る と 、 デバ ッ グ バージ ョ ンや製品バージ ョ ン な ど のプ ロ
グ ラ ムの各バージ ョ ン を 1 組の フ ァ イ ルで効率的に管理で き ます。
cpp 指令は、 デバ ッ グ行 と 同様に、 多数の Fortran 製品に実装 さ れてい ます (153 ページの 「デ
バ ッ グ行の使用方法」 の項を参照 )。 デバ ッ グ行を使用す る と 、 cpp 指令 と 同様、 コ ンパ イ ラ は
ソ ース行を コ ンパ イ ル対象の文ま たは注釈 と 解釈 し て、 コ ンパ イ ル前に削除 し ます。 ただ し 、 デ
バ ッ グ行については規格に定 ら れていないため、 固定形式の ソ ース だけでサポー ト さ れてい ま
す。 ま た、 cpp 指令ほ ど強力で も あ り ません。 cpp 指令は、 Fortran 規格の機能ではあ り ません
が、 cpp は UNIX シ ス テ ムの事実上の標準にな っ てい ます。
本項では、 次の方法について説明 し ます。
•
f90 コ マ ン ド 行か ら の cpp の呼び出 し 方法
•
-D オプシ ョ ン を使用 し て、 cpp マ ク ロ を定義す る 方法
•
cpp が前処理 し た出力の保存方法
cpp コ マ ン ド お よ び cpp コ マ ン ド がサポー ト し てい る 指令についての詳細は、 cpp(1) のマ ンペー
ジ を参照 し て く だ さ い。
cpp 指令を処理する
f90 コ マ ン ド は、 デフ ォ ル ト で拡張子が .F の ソ ース フ ァ イ ルを cpp に渡 し ます。 +cpp=yes オ
プシ ョ ン を付けて コ ンパ イ ルす る と 、 デフ ォ ル ト の動作が変更 さ れ、 f90 ド ラ イ バはすべての
ソ ース フ ァ イ ルを cpp に渡 し ます。 +cpp=yes オプシ ョ ン を付けずに コ ンパ イ ルす る か、 ソ ース
フ ァ イ ルの拡張子が .F でない と 、 コ ンパ イ ラ はすべての cpp 指令 ( 文字定数中を除 く ) を注釈
と 解釈 し て無視 し ます (HP Fortran では、 言語拡張機能 と し て、 # 文字で始ま る 行を注釈 と 解釈
し ます。 ま た、 # 文字は、 すべての cpp 指令の接頭文字 と し て も 使用で き ます )。
次の例について説明 し ます。
例 2-9
cpp_direct.f90
PROGRAM main
REAL :: x
WRITE (6, FMT=’(A)’, ADVANCE=’NO’) ‘Enter a real number: ‘
READ *, x
#ifdef DEBUG
PRINT *, ‘The value of x in main: ‘, x
#endif
PRINT *, ‘x =’, double_it(x)
118
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
END PROGRAM main
REAL FUNCTION double_it(arg)
REAL :: arg
#ifdef DEBUG
PRINT *, ‘The value of x in double_it: ‘, arg
#endif
double_it = 2.0 * arg
END FUNCTION double_it
こ のプ ロ グ ラ ム では、 PRINT 文の前後で #ifdef と #endif の指令が使用 さ れてい ます。 DEBUG
マ ク ロ が定義 さ れていれば、 cpp は コ ンパ イ ラ に渡す ソ ース フ ァ イ ル中の PRINT 文を残 し ます。
マ ク ロ が定義 さ れていなければ、 cpp は こ の文を削除 し ます。 ソ ース テ キ ス ト 中でマ ク ロ を定義
す る には、 #define 指令を使用 し ます。 コ マ ン ド 行でマ ク ロ を定義す る 場合は、 -D コ マ ン ド 行
オプシ ョ ン を使用 し ます。 こ のオプシ ョ ン を使用す る と 、 ソ ース フ ァ イ ルを編集 し な く て も 、 マ
ク ロ を定義ま たは未定義にで き ます。
次の コ マ ン ド 行では、 -D オプシ ョ ン を使用 し て、 DEBUG マ ク ロ を定義 し てい ます (-D と DEBUG
の間にあ る 空白は省略可能です )。
$ f90 +cpp=yes -D DEBUG cpp_direct.f90
次に、 前述の コ マ ン ド 行で作成 し た実行可能プ ロ グ ラ ム を実行 し た結果を示 し ます。
$ a.out
Enter a real number: 3
The value of x in main: 3.0
The value of x in double_it:
x = 6.0
3.0
次の コ マ ン ド 行では、 -D オプシ ョ ン が使用 さ れてい ません。 そのため、 DEBUG は未定義 と な り 、
cpp は、 コ ンパ イ ラ に渡す ソ ース テ キ ス ト か ら PRINT 文を削除 し ます。
$ f90 +cpp=yes cpp_direct.f90
次に、 プ ロ グ ラ ムの非デバ ッ グ バージ ョ ンの出力結果を示 し ます。
$ a.out
Enter a real number: 3.3
x = 6.6
第2章
119
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
cpp 出力 フ ァ イルを保存する
f90 コ マ ン ド は、 デフ ォ ル ト で cpp が処理 し た ソ ース テ キ ス ト を コ ンパ イ ル後に破棄 し ます。 た
だ し 、 ソ ース テ キ ス ト は、 +cpp_keep オプシ ョ ン を付けて コ ンパ イ ルす る と 保存 さ れ ます。
ソ ース フ ァ イ ルの拡張子が .F ま たは .f の場合、 cpp の出力フ ァ イ ルは、 拡張子を .i に変え
て、 同 じ 名前で保存 さ れ ます。 ま た、 ソ ース フ ァ イ ルの拡張子が .f90 の場合は、 出力フ ァ イ ル
の拡張子は .i90 にな り ます。
次に、 前述の コ マ ン ド 行に +cpp_keep オプシ ョ ン を指定 し て、 cpp_direct.f90 を前処理お よ
び コ ンパ イ ルす る 例を示 し ます。
$ f90 +cpp_keep +cpp=yes cpp_direct.f90
PRINT 文が削除 さ れた後、 出力フ ァ イ ルは、 次の よ う にな り ます。
$ cat cpp_direct.i90
# 1 "cpp_direct.f90"
PROGRAM main
REAL :: x
WRITE (6, FMT='(A)', ADVANCE='NO') 'Enter a real number:'
READ *, x
PRINT *, 'x =', double_it(x)
END PROGRAM main
REAL FUNCTION double_it(arg)
REAL :: arg
double_it = 2.0 * arg
END FUNCTION double_it
デマ ン ド ロー ド 可能な実行可能コ ー ド を作成する
ロ ーダーは、 デフ ォ ル ト で実行可能プ ロ グ ラ ムのすべての コ ー ド を仮想 メ モ リ に ロ ー ド し ます。
そのため、 サ イ ズが大 き なプ ロ グ ラ ム では、 起動時間が長 く な り ます。 リ ン カーを使用 し て、 プ
ロ グ ラ ム に 「デマ ン ド ロー ド 」 と し てマー ク す る と 、 こ のデフ ォ ル ト の動作が無効にで き ます。
デマ ン ド ロ ー ド 可能なプ ロ グ ラ ムは、 ア ク セ ス時に 1 ページずつ メ モ リ に ロ ー ド さ れ ます。
120
第2章
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
プ ロ グ ラ ム をデマ ン ド ロ ー ド 可能に設定す る には、 +demand_load オプシ ョ ン を次の よ う に使用
し ます。
$ f90 +demand_load prog.f90
f90 コ マ ン ド は、 こ のオプシ ョ ン を リ ン カーに渡 し ます。 リ ン カーは、 プ ロ グ ラ ムに 「デマ ン ド
ロ ー ド 」 と し てマー ク し ます。
デマ ン ド ロ ー ド を使用す る と 、 ページの ロ ー ド が実行時全体に拡散す る ため、 起動時間が高速に
な り ます。 デマ ン ド ロ ー ド の問題点は、 実行時のパフ ォ ーマ ン ス が低下す る こ と です。
共有実行可能コ ー ド を作成する
リ ン カーは、 デフ ォ ル ト で実行可能プ ロ グ ラ ムに 「共有」 と し てマー ク し ます。 共有実行可能プ
ロ グ ラ ムは、 プ ロ グ ラ ム を使用す る すべてのプ ロ セ ス で共有 さ れ ます。 プ ロ グ ラ ム を実行す る 最
初のプ ロ セ ス は、 コ ー ド を仮想 メ モ リ に ロ ー ド し ます。 他のプ ロ セ ス がすでにプ ロ グ ラ ム を ロ ー
ド し てい る と 、 別なプ ロ セ ス は他のプ ロ セ ス と コ ー ド を共有 し ます。
+noshared オプシ ョ ン を使用す る と 、 デフ ォ ル ト の動作が無効にな り 、 リ ン カーは実行可能
コ ー ド に 「非共有」 と し てマー ク し て、 プ ロ グ ラ ムの コ ー ド を共有不能に し ます。 次に、 リ ン
カーが prog.f90 に 「非共有」 と し てマー ク す る 例を示 し ます。
$ f90 +noshared prog.f90
プ ロ グ ラ ム を共有不能に設定す る と 、 状況に よ っ ては、 デバ ッ グが容易にな っ た り 、 実行時のパ
フ ォ ーマ ン ス が向上す る こ と があ り ます。 し か し 、 プ ロ グ ラ ム を共有不能に設定す る と 、 メ モ リ
リ ソ ース に対す る 要求が大 き く な る ため、 共有不能に設定す る こ と は推奨 し ません。
64 ビ ッ ト モー ド で コ ンパイルする
HP Fortran プ ロ グ ラ ム を +DA2.0W オプシ ョ ン (PA-RISC の場合のみ。 Itanium® では +DD64 を
使用。) を付けて コ ンパ イ ルす る と 、 f90 は 64 ビ ッ ト の実行可能プ ロ グ ラ ム を生成 し ます。
PA-RISC V2.0 シ ス テ ム を対象 と し てプ ロ グ ラ ム を作成 し てい る 場合、 プ ロ グ ラ ム が次の条件に
該当すれば、 64 ビ ッ ト モー ド での コ ンパ イ ルを検討 し て く だ さ い。
•
1.75GB 以上の大規模な共有 メ モ リ 、 ま たは、1GB 以上 (EXEC_MAGIC を使用 し てい る 場合は、
1.9GB 以上 ) のデー タ スペース にア ク セ スす る 場合
•
32 ビ ッ ト 長以上の大 き なデー タ 要素を使用す る 場合
•
64 ビ ッ ト アプ リ ケーシ ョ ン で使用す る オブジ ェ ク ト や ラ イ ブ ラ リ を提供す る 場合
HP Fortran 言語では、 32 ビ ッ ト と 64 ビ ッ ト のプ ロ グ ラ ム に文法上の相違はあ り ません。 再 コ
ンパ イ ルす る だけで、 32 ビ ッ ト の Fortran プ ロ グ ラ ム を 64 ビ ッ ト プ ロ グ ラ ム と し て実行で き ま
す。
第2章
121
コ ンパイル と リ ン ク
特殊な目的のための コ ンパイル
ただ し 、 C 言語の場合は、 デー タ 型の大 き さ が少 し 変化 し ます。 Fortran プ ロ グ ラ ムが C 言語で
作成 さ れた関数を呼び出 し 、 64 ビ ッ ト モー ド で コ ンパ イ ル さ れた場合は、 大 き さ が違 う ために、
C 関数 と 受け渡すデー タ 項目を プ ロ モー ト す る 必要があ る か も し れません。 64 ビ ッ ト モー ド で
コ ンパ イ ルす る 場合の Fortran と C 言語のデー タ 型の大 き さ の違いについては、 表 8-2 お よ び
表 8-3 を参照 し て く だ さ い。
注記
64 ビ ッ ト モー ド で実行す る 必要がないプ ロ グ ラ ムは、 64 ビ ッ ト モー ド で コ ンパ
イ ル し て も 利点があ り ません。 実際、 64 ビ ッ ト モー ド で コ ンパ イ ル し た実行可能
プ ロ グ ラ ムは、 32 ビ ッ ト モー ド で コ ンパ イ ル し た場合 と 比べて、 実行速度が遅 く
な る こ と があ り ます。
122
第2章
コ ンパイル と リ ン ク
環境変数の使用方法
環境変数の使用方法
環境変数は、 シ ス テ ム のオペレーテ ィ ン グ環境で定義 さ れ る 変数であ り 、 各種のシ ス テ ム成分に
よ っ て使用可能です。 た と えば、 プ ロ グ ラ ム を起動す る と 、 ksh や csh な ど のシ ェ ルは、 プ ロ グ
ラ ムが ど こ にあ る か を決定す る ために PATH 変数で検索 し ます。 表 2-14 では、 HP Fortran プ ロ
グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る 動作を制御す る 環境変数を リ ス ト し て、 各変数について
簡単に説明 し てい ます。
表 2-14 HP Fortran の環境変数
環境変数
説明
HP_F90OPTS
f90 が HP Fortran コ ンパ イ ラ を呼び出 し て、 コ マ ン ド 行に
挿入す る コ マ ン ド 行オプシ ョ ン の並びを指定 し ます。
LPATH
リ ン カーが ラ イ ブ ラ リ を検索す る デ ィ レ ク ト リ の並びを指定
し ます。
MP_NUMBER_OF_THREADS
パ ラ レ ル実行を前提 と し て コ ンパ イ ル し た HP Fortran プ ロ
グ ラ ム を実行す る ために必要なプ ロ セ ッ サの数を指定 し ます。
TMPDIR
デフ ォ ル ト の /var/tmp デ ィ レ ク ト リ の代わ り に、 一時フ ァ
イ ルを格納す る デ ィ レ ク ト リ を指定 し ます。
TTYUNBUF
tty バ ッ フ ァ リ ン グ を制御 し ます。 tty バ ッ フ ァ リ ン グ を使用
可能にす る には、 TTYUNBUF を 0 に設定 し ます。 tty バ ッ フ ァ
リ ン グ を使用不能にす る には、 ゼ ロ 以外の値を設定 し ます。
次の項では、 環境変数 HP_F90_OPTS, LPATH, MP_NUMBER_OF_THREADS の使用方法について説明
し ます。 シ ス テ ム レベルの環境変数については、 environ(5) のマ ンページ を参照 し て く だ さ い。
HP_F90OPTS 環境変数
HP_F90OPTS 環境変数は、 コ マ ン ド 行に挿入す る オプシ ョ ン と し て、 f90 ド ラ イ バが読み込みま
す。 こ の変数は、 f90 コ マ ン ド を起動す る たびに同 じ オプシ ョ ンや引 き 数を使用す る 場合に有用
です。 た と えば、 HP_F90OPTS に -v オプシ ョ ン を設定 し た場合、
$ f90 +list hello.f90
こ の コ マ ン ド 行は、 次の コ マ ン ド 行 と 同 じ 意味にな り ます。
$ f90 -v +list hello.f90
第2章
123
コ ンパイル と リ ン ク
環境変数の使用方法
HP_F90OPTS 変数の構文では、 縦線文字 ( | ) の使用が認め ら れてい ます。 こ の文字を使用す る
と 、 |の前に書かれたオプシ ョ ン を コ マ ン ド 行のオプシ ョ ンの中で一番最初に認識す る こ と 、 お
よ び、 | の後に書いたオプシ ョ ン を コ マ ン ド 行オプシ ョ ンのなかで一番最後に認識す る よ う に指
定で き ます。 た と えば、 次の よ う に コ マ ン ド を入力 し た場合、
$ export HP_F90OPTS="-O|-lmylib"
$ f90 -v hello.f90
次の コ マ ン ド と 同 じ 意味にな り ます。
$ f90 -O -v hello.f90 -lmylib
csh でプ ロ グ ラ ム を作成 し てい る 場合、 次の コ マ ン ド 行で HP_F90OPTS を定義 し ます。
% setenv HP_F90OPTS "-O|-lmylib"
LPATH 環境変数
LPATH 環境変数は、 リ ン カーに よ っ て読み込まれ、 プ ロ グ ラ ム のオブジ ェ ク ト フ ァ イ ル と リ ン ク
す る ラ イ ブ ラ リ を検索す る デ ィ レ ク ト リ を決定 し ます。 LPATH が設定 さ れてい る か ど う かに よ っ
て、 次の よ う な動作が生 じ ます。
•
LPATH がすでに設定 さ れてい る 場合、 リ ン カーは LPATH の リ ス ト に書かれてい る デ ィ レ ク ト
リ だけ を検索 し ます。 LPATH がユーザーの .kshrc や .cshrc フ ァ イ ルで設定 さ れてい る 場
合、 ま たは、 LPATH を コ マ ン ド 行で定義 し た後ではそ う な り ます。
•
LPATH が設定 さ れていない場合、f90 はデフ ォ ル ト の LPATH を設定 し て、f90 コ マ ン ド 行に書
かれてい る オブジ ェ ク ト フ ァ イ ルを リ ン ク す る と き に使用 し ます。
f90 コ マン ド は、 リ ン カ ーを 呼び出す前に LPATH を 設定する ため、 ほと んど のコ ン パイ ルでは、
こ の変数を 設定する 必要はあ り ま せん。 ただし 、 ld コ マン ド を 使用し てリ ン ク する と き など 、 こ
の変数を 設定する 必要があ る 場合は、 次のディ レ ク ト リ を LPATH の先頭に書く 必要があ り ま す。
•
/opt/fortran90/lib
•
/usr/lib
•
/opt/langtools/lib
次に、 ksh と csh の構文を使用 し て、 前述のデ ィ レ ク ト リ を LPATH に設定す る コ マ ン ド 行を示
し ます。
$ export LPATH:/opt/fortran90/lib:/usr/lib:/opt/langtools/lib
% setenv LPATH "/opt/fortran90/lib:/usr/lib:/opt/langtools/lib"
124
第2章
コ ンパイル と リ ン ク
環境変数の使用方法
リ ン カーを呼び出す前に f90 が設定 し た LPATH を確認す る には、 冗長出力を指定す る -v オプ
シ ョ ン を使用 し ます。 例については、 102 ページの 「f90 ま たは ld で リ ン ク す る 」 の項を参照 し
て く だ さ い。
MP_NUMBER_OF_THREADS 環境変数
MP_NUMBER_OF_THREADS 環境変数は、 パ ラ レ ル実行を前提 と し て コ ンパ イ ル し たプ ロ グ ラ ム を
実行す る ために必要なプ ロ セ ッ サの数を設定 し ます。 こ の変数を設定 し ない と 、 デフ ォ ル ト 値 と
し て実行マシ ン のプ ロ セ ッ サ数が指定 さ れ ます。
次の コ マ ン ド 行は、 パ ラ レル実行を前提 と し て コ ンパ イ ル し たプ ロ グ ラ ム を プ ロ セ ッ サ 2 台で実
行す る よ う に MP_NUMBER_OF_THREADS を設定 し てい ます。
$ export MP_NUMBER_OF_THREADS=2
# ksh syntax
% setenv MP_NUMBER_OF_THREADS 2
# csh syntax
パ ラ レル実行についての詳細は、 182 ページの 「パ ラ レル実行用の コ ンパ イ ル」 の項を参照 し て
く だ さ い。
第2章
125
コ ンパイル と リ ン ク
環境変数の使用方法
126
第2章
3 デー タ 記憶領域の制御
本章では、 HP Fortran プ ロ グ ラ ム のデー タ を制御す る コ マ ン ド 行オプシ ョ ン、 指令、 その他の
言語機能の使用方法について説明 し ます。 特に、 次の項目について説明 し ます。
•
暗黙の型宣言の使用不能
•
自動割 り 付け変数 と 静的変数
•
定数の精度拡張
•
基本精度の拡張
•
プ ロ グ ラ ム間でのデー タ 共有
•
モジ ュ ール と 共通ブ ロ ッ ク の比較
注記
第3章
HP Fortran に よ る デー タ の割 り 付け境界については、『HP Fortran リ フ ァ レ ン ス
ガ イ ド 』 を参照 し て く だ さ い。
127
デー タ 記憶領域の制御
暗黙の型宣言の使用不能
暗黙の型宣言の使用不能
デフ ォ ル ト で、 HP Fortran は、 「暗黙の型宣言」 を使用 し て型宣言文で宣言 さ れていない変数や
関数の型を決定 し ます。 つま り 、 宣言 さ れていない言語要素の型は、 名前の先頭文字で決ま り ま
す。 先頭の文字が I ~ N の場合、 言語要素は整数型にな り ます。 それ以外の場合、 実数型にな り
ます。
暗黙の型宣言は規格に定め ら れてい ますが、 こ の型宣言では宣言 し ていない変数や関数を誤っ て
使用で き る ため、 実行時にバグが発生す る 原因にな り ます。 次に、 例 と し て非組み込み ラ イ ブ ラ
リ 関数 (foo) を呼び出すプ ロ グ ラ ムについて説明 し ます。 こ のプ ロ グ ラ ムは、 次の項目を前提 と
し ます。
•
デフ ォ ル ト の型宣言規則に従っ てい ます。
•
foo は整数を返 し ます。
•
foo の戻 り 値の型を指定 し ないで、 戻 り 値に実数型の変数を割 り 当て ます。
プ ロ グ ラ ミ ン グの経験か ら 判断 し て も 、 こ の よ う な条件が重な る こ と は まれですが、 プ ロ グ ラ ム
を実行す る と 予期せぬ結果 と な り ます。
規格には、 暗黙の型宣言を無効にす る ために、 IMPLICIT NONE 文があ り ます。 し か し 、
IMPLICIT NONE 文は、 書かれてい る プ ロ グ ラ ム単位の範囲に限定 さ れます。 コ マ ン ド 行で指定
す る すべての フ ァ イ ルに 「明示の型宣言」 を強制す る には、 +implicit_none オプシ ョ ン を使用
し ます。 こ のオプシ ョ ンは、 暗黙の型宣言を使用不能に し ます。 つま り 、 すべての変数、 配列、
名前付 き 定数、 関数副プ ロ グ ラ ム、 ENTRY 名、 文関数 ( 組み込み関数は除 く ) は、 明示的に宣言
す る 必要があ り ます。
こ のオプシ ョ ン の使用は、 f90 コ マ ン ド 行で指定 し た各フ ァ イ ルの各プ ロ グ ラ ム単位に
IMPLICIT NONE を指定す る こ と と 等価にな り ます。 ただ し 、 +implicit_none オプシ ョ ン を指
定 し て も 、 ソ ース フ ァ イ ルの IMPLICIT 文は無効にな り ません。 『HP Fortran リ フ ァ レ ン ス ガ
イ ド 』 には、 暗黙の型宣言規則、 IMPLICIT NONE 文、 +implicit_none オプシ ョ ンに関す る 説
明が記載 さ れてい ます。
128
第3章
デー タ 記憶領域の制御
自動割 り 付け変数 と 静的変数
自動割 り 付け変数 と 静的変数
デフ ォ ル ト で、 HP Fortran はプ ロ グ ラ ム の変数を ス タ ッ ク 記憶領域に割 り 当て ます。 こ の変数
は、 変数が宣言 さ れてい る プ ロ グ ラ ムが起動 さ れ る たびに割 り 付け ら れ る ため、 自動割 り 付け変
数 と 呼ばれ ます。
静的変数は、 プ ロ グ ラ ム を メ モ リ に最初に ロ ー ド し た と き に、 静的記憶領域に割 り 付け ら れ ま
す。 静的変数は、 プ ロ グ ラ ム が終了す る ま で メ モ リ 内に残 り ます。
HP Fortran は、 次の変数に静的記憶領域を割 り 付け ます。
•
COMMON 文ま たは EQUIVALENCE 文で指定 さ れた変数
•
型宣言文ま たは DATA 文で初期化 さ れた変数
•
SAVE 文ま たは STATIC 文で指定 さ れた変数。変数並びを持たない SAVE 文は、有効域内のすべ
ての変数を静的記憶領域に指定 し ます。
•
コ マ ン ド 行オプシ ョ ン の +save ま たは +Oinit_check を指定 し て コ ンパ イ ル し たプ ロ グ ラ ム
フ ァ イ ルの変数。 こ れ ら のオプシ ョ ン を移植時に使用す る 方法については、 261 ページの
「初期化 さ れていない変数」 の項を参照 し て く だ さ い。
静的変数では、 次の 2 つの特徴に注意 し て く だ さ い。
•
ロ ー ド 時に 0 ( ゼ ロ ) ま たは空値に設定 さ れます。
•
プ ロ グ ラ ム単位が呼び出 さ れ る たびに再初期化を要求す る こ と はあ り ません。
静的変数には欠点 も い く つかあ り ます。 再帰処理を使用す る Fortran プ ロ グ ラ ム では、 静的変数
が再帰処理の目的の 1 つ ( 再帰呼び出 し ご と に局所変数を新 し く 割 り 付け る こ と ) を無効に し ま
す。 ま た、 プ ロ グ ラ ム で静的変数を広範に使用す る と パフ ォ ーマ ン ス が低下 し ます。 つま り 、 静
的変数は レ ジ ス タ の割 り 付けな ど、 基本的な最適化には不向 き であ り 、 静的変数を使用す る プ ロ
グ ラ ム単位の最適化を制限 し ます。
次に紹介す る 見本プ ロ グ ラ ムは、 自動割 り 付け変数 と 静的変数の違い を示 し てい ます。 プ ロ グ ラ
ムは、 再帰的な内部サブルーチン を呼び出す主プ ロ グ ラ ム で構成 さ れてい ます。 サブルーチンは
2 つの変数 (stat_val と auto_val) を増分 し て、 更新 し た変数を表示 し た後、 再帰的に こ のサ
ブルーチン自体を呼び出 し ます。 2 つの変数は明示的に初期化 さ れてい ませんが、 stat_val は
SAVE 属性を付けて宣言 さ れてい ます。 つま り 、 静的な記憶領域に割 り 付け ら れて、 コ ンパ イ ラ
が事前に 0 ( ゼ ロ ) に初期化 し てい ます。
第3章
129
デー タ 記憶領域の制御
自動割 り 付け変数 と 静的変数
例 3-1
recursive.f90
PROGRAM main
! This program calls a recursive internal subroutine.
CALL recurse
CONTAINS
! This subroutine calls itself four times.
!
Each time it is called, it adds 1 to the values in
!
stat_val and auto_val and displays the result.
!
stat_val has the SAVE attribute and therefore is
!
pre-initialized and retains its value between calls.
!
auto_val is an automatic variable and therefore has
!
an unpredictable value (plus 1) at each call.
RECURSIVE SUBROUTINE recurse
INTEGER(KIND=1), SAVE :: stat_val
INTEGER(KIND=1) :: auto_val
stat_val = stat_val + 1
auto_val = auto_val + 1
PRINT *, ‘stat_val = ‘, stat_val
PRINT *, ‘auto_val = ‘, auto_val
IF (stat_val < 4) THEN
CALL recurse()
END IF
END SUBROUTINE recurse
END PROGRAM main
次に、 こ のプ ロ グ ラ ム を コ ンパ イ ル し た コ マ ン ド 行、 お よ び、 実行結果を示 し ます。 stat_val
は、 呼び出 さ れ る たびに値が増え てい る こ と に注意 し て く だ さ い。 静的変数は次に呼び出 さ れ る
ま で値を保持す る ためです。 一方、 auto_val は値が増え てい ません。 こ れは自動割 り 付け変数
であ り 、 呼び出 さ れ る たびに、 メ モ リ が フ レ ッ シ ュ さ れてい ます ( 初期化は さ れてい ません )。
つま り 、 サブルーチンは、 呼び出 し の起動時に auto_val に割 り 付け ら れた メ モ リ 位置の値に 1
を付加 し てい ます。
$ f90 recursive.f90
$ a.out
stat_val = 1
auto_val = 124
stat_val = 2
130
第3章
デー タ 記憶領域の制御
自動割 り 付け変数 と 静的変数
auto_val
stat_val
auto_val
stat_val
auto_val
注記
=
=
=
=
=
1
3
65
4
65
HP Fortran では、 移植拡張機能 と し て、 AUTOMATIC 文 と STATIC 文が用意 さ れ
てい ます。 STATIC 文は、 機能面では SAVE 文 と 同 じ です。 ま た、 AUTOMATIC 文
は、 変数を自動割 り 付け と し て宣言す る ために使用 さ れ ます。 ただ し 、 HP
Fortran で コ ンパ イ ル し た変数はデフ ォ ル ト で自動割 り 付け変数に設定 さ れ る た
め、 こ う し た宣言は重要ではあ り ません。
『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 では、 AUTOMATIC 文、 SAVE 文、 STATIC 文、 お よ び +save
オプシ ョ ンについての詳細を説明 し てい ます。
第3章
131
デー タ 記憶領域の制御
定数の精度拡張
定数の精度拡張
デフ ォ ル ト で、 HP Fortran はすべての浮動小数点実数を単精度 と し て扱い ます。 た と えば、 次
の定数の場合、
3.14159265358979323846
コ ンパ イ ラ は次の よ う に指定 さ れた も の と し て扱い ます。
3.1415927
精度の損失は、 単精度変数に代入す る 場合は受け入れ ら れ ますが、 倍精度変数に代入す る か、 精
度損失が大 き な切 り 捨て誤差を生 じ る 式の浮動小数点定数を使用す る 場合、 受け入れ ら れ ませ
ん。
注記
HP Fortran には、 個々の定数の基本精度を無効に し て変更す る 方法が 2 つあ り
ます。 種別型パ ラ メ ー タ と 指数形式です。 種別型パ ラ メ ー タ は、 浮動小数点定数
の精度を示 し ます。 単精度は 4、 倍精度は 8、 4 倍精度は 16 で表 し ます。
次の例では、 種別型パ ラ メ ー タ _8 を使用 し て、 定数を倍精度に評価す る よ う 指定 し てい ます。
3.14159265358979323846_8
種別型パ ラ メ ー タ を付けた浮動小数点を除いたすべての浮動小数点の精度を変更す る には、
+real_constant オプシ ョ ン を使用 し ます。 こ のオプシ ョ ンには、 +real_constant=double お
よ び +real_constant=single の 2 つの形式があ り ます。 こ のオプシ ョ ン を指定 し た フ ァ イ ル
の コ ンパ イ ルは、 フ ァ イ ル内の浮動小数点定数に対 し て、 それぞれ倍精度お よ び単精度を指定 さ
れます。 デフ ォ ル ト は +real_constant=single です。 種別型パ ラ メ ー タ で精度を持つ定数に
は、 いずれのオプシ ョ ンの形式 も 影響を与え ません。
ソ ース フ ァ イ ル x.f, y.f, z.f のすべての浮動小数点定数の精度を倍精度にプ ロ モー ト す る には、
次の よ う に、 コ マ ン ド 行で コ ンパ イ ル し ます。
$ f90 +real_constant=double x.f y.f z.f
+real_constant=single オプシ ョ ンは、 フ ァ イ ルのすべての浮動小数点定数が単精度 ( デフ ォ
ル ト ) と し て処理 さ れ る よ う に指定 し ます。 次の コ マ ン ド 行は、 ソ ース フ ァ イ ル a.f, b.f, c.f
内のすべての浮動小数点定数を単精度に し ます。
$ f90 +real_constant=single a.f b.f c.f
+real_constant=single を使用 し て も 、 種別型パ ラ メ ー タ や指数形式 ( た と えば、 4.0D0) で精
度を指定 し た定数を単精度にで き ないので注意 し て く だ さ い。
132
第3章
デー タ 記憶領域の制御
定数の精度拡張
変数の精度を拡張す る 方法については、 134 ページの 「基本精度の拡張」 の項を参照 し て く だ さ
い。 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 では、 種別型パ ラ メ ー タ と 指数形式の構文、 お よ び
+real_constant オプシ ョ ン について説明 し てい ます。 浮動小数点演算を HP 9000 コ ン ピ ュ ー
タ に実装す る 方法、 お よ び浮動小数点の動作がプ ロ グ ラ マーに与え る 影響についての詳細は、
『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ い。
第3章
133
デー タ 記憶領域の制御
基本精度の拡張
基本精度の拡張
+autodbl オプシ ョ ン と +autodbl4 オプシ ョ ン を使用す る と 、 基本の数値型 と 論理型の定数 と
変数の基本精度 ( 記憶領域のバ イ ト 数 ) を拡張で き ます。 +real_constant オプシ ョ ン と は異な
り 、 +autodbl オプシ ョ ン と +autodbl4 オプシ ョ ンは、 実数型 と 整数型の定数 と 変数の両方に
影響を与え ます (+real_constant オプシ ョ ンの使用方法については、 132 ページの 「定数の精
度拡張」 の項を参照 )。
+autodbl オプシ ョ ン と +autodbl4 オプシ ョ ン を付けて コ ンパ イ ルす る と 、 定数は、 評価時に
使用す る デフ ォ ル ト のバ イ ト 数 (4) の 2 倍の記憶領域が割 り 当て ら れた も の と し て扱われ ます。
こ のオプシ ョ ンは、 基本整数 と 基本実数の精度を拡張 し ます。
+autodbl オプシ ョ ン と +autodbl4 オプシ ョ ンは、 CHARACTER 文、 BYTE 文、 ま たは DOUBLE
COMPLEX 文で宣言 し た言語要素の大 き さ 、 お よ び大 き さ を明示的に指定 し た要素には影響を与え
ません。 つま り 、 変数が種別型パ ラ メ ー タ で宣言 さ れていた り 、 定数が種別型パ ラ メ ー タ を持っ
てい る 場合、 +autodbl ま たは +autodbl4 は、 大 き さ を変更 し ません。
注記
HP Fortran では、 種別型パ ラ メ ー タ を、 変数に割 り 当て る 記憶領域のバ イ ト 数 と
解釈 し ます。 実数型の変数 と 定数を使用す る 場合、 種別型パ ラ メ ー タ は精度 も 示
し ます。 つま り 、 単精度を 4、 倍精度を 8、 4 倍精度を 16 でそれぞれ表 し ます。
倍精度変数を 4 倍精度変数にプ ロ モー ト す る こ と は、 4 倍精度演算を行 う 命令が ソ フ ト ウ ェ アで
実装 さ れてい る ため、 パフ ォ ーマ ン ス に大 き な影響を与え ます。 パフ ォーマ ン ス を考慮 し て、 基
本精度を拡張す る には、 +autodbl4 オプシ ョ ン を使用 し て く だ さ い。 こ のオプシ ョ ンは、
DOUBLE PRECISION 文で宣言 し た変数を プ ロ モー ト し ません。 こ の点を除けば、 +autodbl と
+autodbl4 の機能は同 じ です。
こ れ ら のオプシ ョ ンは、 コ マ ン ド 行で指定 し たすべての フ ァ イ ルに影響を与え ます。 特定の変数
や定数の大 き さ ま たは精度を拡張す る には、 種別型パ ラ メ ー タ を使用 し ます。
134
第3章
デー タ 記憶領域の制御
基本精度の拡張
図 3-1 は、 +autodbl オプシ ョ ン と +autodbl4 オプシ ョ ン で変更 し た大 き さ を示 し てい ます。
図 3-1
基本精度の拡張
バイ ト
0
4
8
16
整数型
論理型
実数型
倍精度型
複素数型
凡例
= +noautodbl および +noautodbl4 ( デ フ ォル ト )
= +autodbl
= +autodbl4
次のプ ロ グ ラ ムは、 +autodbl オプシ ョ ン と +autodbl4 オプシ ョ ンの影響が異な る こ と を示 し
てい ます。 プ ロ グ ラ ム では、 3 つの変数に同 じ 4 倍精度定数を代入 し てい ます。
•
x は、 単精度の ( 基本 ) 実数です。
•
y は、 種別型パ ラ メ ー タ で倍精度 と し て宣言 し てい る 実数です。
•
z は、 DOUBLE PRECISION 文で宣言 し てい る 倍精度実数です。
第3章
135
デー タ 記憶領域の制御
基本精度の拡張
次のプ ロ グ ラ ム には、 格納 し た値を出力す る PRINT 文が書かれてい ます。
例 3-2
precision.f90
PROGRAM main
REAL x
REAL(KIND=16) y
DOUBLE PRECISION z
! Assign a quad-precision constant to a default real:
x = 3.14159265358979323846_16
PRINT 10, ‘Stored in x: ‘, x
! Assign a quad-precision constant to a variable that
! has been explicitly sized for quad-precision:
y = 3.14159265358979323846_16
PRINT 10, ‘Stored in y: ‘, y
! Assign a quad-precision constant to a variable
!
declared with the DOUBLE PRECISION statement:
z = 3.14159265358979323846_16
PRINT 10, ‘Stored in z: ‘, z
10 FORMAT (A, F22.20)
END PROGRAM main
次に、 こ のプ ロ グ ラ ム を コ ンパ イ ル し て実行す る 3 種類の コ マ ン ド 行を示 し ます。 こ の中には、
コ ンパ イ ルご と の見本出力が含まれ ます。 コ ンパ イ ル し て も 、 変数 y が同 じ 値であ る こ と に注意
し て く だ さ い。 コ ンパ イ ラ は、 種別型パ ラ メ ー タ で大 き さ を指定 さ れた変数を プ ロ モー ト し てい
ません。
最初に、 オプシ ョ ン を付けずにプ ロ グ ラ ム を コ ンパ イ ル し ます。
$ f90 precision2.f90
$ a.out
Stored in x: 3.14159274101257320000
Stored in y: 3.14159265358979323846
Stored in z: 3.14159265358979310000
次に、 +autodbl オプシ ョ ン を指定 し てプ ロ グ ラ ム を コ ンパ イ ル し ます。 出力結果が示す よ う
に、 x は倍精度に、 z は 4 倍精度にそれぞれプ ロ モー ト さ れてい ます。
136
第3章
デー タ 記憶領域の制御
基本精度の拡張
$ f90 +autodbl precision2.f90
$ a.out
Stored in x: 3.14159265358979310000
Stored in y: 3.14159265358979323846
Stored in z: 3.14159265358979323846
最後に、 +autodbl4 オプシ ョ ン を指定 し て コ ンパ イ ル し ます。 出力結果が示す よ う に、 x はプ ロ
モー ト さ れてい ますが、 z は さ れてい ません。
$ f90 +autodbl4 precision2.f90
$ a.out
Stored in x: 3.14159265358979310000
Stored in y: 3.14159265358979323846
Stored in z: 3.14159265358979310000
数値デー タ の範囲 と 精度を増やす こ と は有用ですが、 +autodbl オプシ ョ ン と +autodbl4 オプ
シ ョ ンは、 移植時に特に有用です (262 ページの 「大 き な語サ イ ズ」 の項を参照 )。 こ れ ら のオプ
シ ョ ンについての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。 浮動小数
点演算を HP 9000 コ ン ピ ュ ー タ に実装す る 方法、 お よ び浮動小数点動作がプ ロ グ ラ マーに与え
る 影響についての詳細は、 『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ い。
第3章
137
デー タ 記憶領域の制御
プ ロ グ ラ ム間でのデー タ 共有
プ ログ ラ ム間でのデー タ 共有
複数のス レ ッ ド で同 じ デー タ の共有を制御す る アプ リ ケーシ ョ ン を作成す る 場合、 次の 2 つのい
ずれかの形式にな り ます。
•
次の ス レ ッ ド ラ イ ブ ラ リ を呼び出すプ ロ グ ラ ム。
/usr/lib/libpthread.sl
こ のプ ロ グ ラ ムは、 単一のプ ロ セ ス で実行す る 複数の ス レ ッ ド を作成す る ため、 同 じ ア ド レ
ス空間を共有 し ます。
•
別のプ ロ セ ス で同時に実行 さ れ、 HP-UX 共有 メ モ リ セグ メ ン ト にア ク セ スす る 複数のプ ロ グ
ラ ム で構成 さ れ る アプ リ ケーシ ョ ン。
最初の方法は、 本マニ ュ アルの範囲を越え てい ます。 ス レ ッ ド ラ イ ブ ラ リ の呼び出 し 方を理解す
る 必要があ り ます1。 こ こ では、 2 番目の方法について説明 し ます。
別のプ ロ セ ス で同時に実行 し てい る 複数の HP Fortran プ ロ グ ラ ム間でデー タ を共有す る には、
$HP$ SHARED_COMMON 指令を使用 し ます。 こ の指令を使用す る と 、 共通ブ ロ ッ ク を作成で き ま
す。 異な る プ ロ セ ス で実行中の HP Fortran プ ロ グ ラ ムは、 こ の共通ブ ロ ッ ク にア ク セ ス で き ま
す。
$HP$ SHARED_COMMON 指令を使用す る と 、 コ ンパ イ ラ は、 共有 メ モ リ を操作す る ために HP-UX
シ ス テ ム の呼び出 し を挿入 し ます。 プ ロ グ ラ マーには、 メ モ リ セ グ メ ン ト を共有 し てい る プ ロ グ
ラ ムが、 同 じ プ ロ グ ラ ム内のプ ロ グ ラ ム単位が一連の共通ブ ロ ッ ク の変数にア ク セ ス し てい る よ
う に見え ます。
次に紹介す る 2 つのプ ロ グ ラ ムは、 $HP$ SHARED_COMMON 指令の機能を示 し てい ます。
•
1 つ目のプ ロ グ ラ ム go_to_sleep.f90 は、 最初に実行す る 必要があ り ます。 最初に実行す る
と 、 共有 メ モ リ セ グ メ ン ト を作成 し 、 DO ループに入 り ます。 DO ループで、 2 つ目のプ ロ グ ラ
ム が起動す る ま で待機 し ます。 ipcs -m コ マ ン ド を使用す る と 、 共有 メ モ リ セ グ メ ン ト が作
成 さ れた こ と が確認で き ます。
•
2 番目のプ ロ グ ラ ム wake_up.f90 が起動す る と 、 共有の共通ブ ロ ッ ク の変数に書 き 込みま
す。 その結果、 go_to_sleep.f90 は DO ループ を抜けて実行を完了 し ます。
1. +Oparallel オプシ ョ ン を指定す る と 、 コ ンパ イ ラ は HP Fortran プ ロ グ ラ ム の該当
す る ループ を HP 9000 シ ス テ ム上でのパ ラ レル実行用に変形 し ます。 パ ラ レ ル実行
プ ロ グ ラ ムの コ ンパ イ ルについては、 182 ページの 「パ ラ レル実行用の コ ンパ イ ル」
の項を参照 し て く だ さ い。
138
第3章
デー タ 記憶領域の制御
プ ロ グ ラ ム間でのデー タ 共有
$HP$ SHARED_COMMON 指令は、 メ モ リ セ グ メ ン ト を共有す る 各プ ロ グ ラ ムの主プ ロ グ ラ ム単位
の宣言部の先頭に書 く 必要があ り ます。 ま た、 共有を指定 さ れた共通ブ ロ ッ ク は、 宣言 し たすべ
ての フ ァ イ ルで配置を統一す る 必要があ り ます。
ipcs -m コ マ ン ド を使用す る と 、 HP-UX が共有 メ モ リ セグ メ ン ト を作成 し て、 プ ロ グ ラ ム の実
行後に共有 メ モ リ セ グ メ ン ト を開放 し た こ と を確認で き ます。
次の 2 つの例では、 こ れ ら の概念について示 し ます。
例 3-3
go_to_sleep.f90
PROGRAM main
! This program, go_to_sleep.f90, and its companion, wake_up.f90,
!
share data in a common block, using the $HP$ SHARED_COMMON
!
directive. Execute this program first. After it starts to
!
execute, use ipcs(1) to confirm that a shared memory segment
!
has been created. In a separate process, run wake.f90.
!
When it executes, it assigns to alarm, ending this program.
LOGICAL :: alarm
CHARACTER(LEN=8) :: message
! Declare a common block, shared_data, for sharing among
!
multiple, simultaneously executing programs. Each program
!
that shares the common block must reference it by the same
!
key, 'scb1'.
!$HP$ SHARED_COMMON KEY=’scb1’ /shared_data/
! Declare a common block with two variables: alarm and message.
!
when alarm is set by wake_up.f90, this program breaks out
!
of the DO loop, prints message (which wake_up.f90 has
!
written to), and exits.
COMMON /shared_data/ alarm, message
alarm = .FALSE.
! Wait for alarm to be set...
DO WHILE (alarm .EQ. .FALSE.)
! sleep(1) is an HP-UX system call that suspends a process
!
for the number of seconds specified by the argument.
!
The %VAL function tells Fortran that sleep expects its
!
argument to be passed by value.
CALL sleep(%VAL(1))
END DO
第3章
139
デー タ 記憶領域の制御
プ ロ グ ラ ム間でのデー タ 共有
! Message from wake.f90:
PRINT *, message
! The shared memory segment is destroyed when this program halts.
END
重要
上記の例では、 Fortran ラ イ ブ ラ リ 中で正 し い休眠状態にア ク セ スす る には、
+U77 を使用 し なければな り ません。 +U77 を使用 し た場合、 上記の行は下記の よ
う にな り ます。
CALL sleep (%VAL(1))
CALL sleep (1)
例 3-4
wake_up.f90
PROGRAM main
! This program, wake_up.f90, should be run just after its
!
companion, go_to_sleep.f90, starts to execute but in a
!
separate process. The $HP$ SHARED_COMMON directive
!
enables both programs to share the same memory.
! Directive puts the common block in shared memory.
$HP$SHARED_COMMON KEY=’scb1’ /shared_common/
LOGICAL :: alarm
CHARACTER(LEN=8) :: message
! Declare a named common block for shared memory. It must
!
be laid out n exactly the same way in both programs.
COMMON /shared_common/ alarm, message
! Write to message, sleep reads it.
message = "I'm up!"
! Set alarm to wake up sleep.
alarm = .TRUE.
! The shared memory segment will now be detached.
!
However, because go_to_sleep is still running,
!
the segment will still be present in memory until
140
第3章
デー タ 記憶領域の制御
プ ロ グ ラ ム間でのデー タ 共有
!
it stops executing, too.
END
次に、 各プ ロ グ ラ ム を コ ンパ イ ルす る コ マ ン ド 行を示 し ます。
$ f90 -o go_to_sleep go_to_sleep.f
$ f90 -o wake_up wake_up.f
最初のプ ロ グ ラ ム を、 次の よ う に指定す る こ と に よ っ て任意のプ ロ セ ス で実行 し ます。
$ go_to_sleep
別なプ ロ セ ス で、 次の コ マ ン ド 行を使用 し て、 共有 メ モ リ セ グ メ ン ト がプ ロ グ ラ ム用に作成 さ れ
た こ と を確認 し ます。 リ ス ト の最終行は、 新 し く 作成 さ れたセグ メ ン ト を表 し てい ます。
$ ipcs -m
IPC status from /dev/kmem as of Fri Mar 21 15:55:29 1997
T
ID
KEY
MODE
OWNER
GROUP
Shared Memory:
m
0 0x4119c72b --rw-rw-rwroot
root
m
1 0x4e180002 --rw-rw-rwroot
root
m
2 0x41187bf4 --rw-rw-rwroot
root
m
3 0x00000000 --rw------root
sys
m
7004 0x43186ea0 --rw-rw-rwdaemon
daemon
m
6005 0x73636231 --rw-rw-rwed
lang
2 番目のプ ロ グ ラ ム を別のプ ロ セ ス で実行 し ます。
$ wake_up
こ の時点で、 最初のプ ロ セ ス で実行 し ていたプ ロ グ ラ ムは、 次の結果を出力 し て実行を完了 し ま
す。
I'm up!
次の コ マ ン ド 行は、 共有 メ モ リ セ グ メ ン ト が開放 さ れた こ と を確認 し てい ます。
$ ipcs -m
IPC status from /dev/kmem as of Fri Mar 21 15:55:29 1997
T
ID
KEY
MODE
OWNER
GROUP
Shared Memory:
m
0 0x4119c72b --rw-rw-rwroot
root
m
1 0x4e180002 --rw-rw-rwroot
root
m
2 0x41187bf4 --rw-rw-rwroot
root
m
3 0x00000000 --rw------root
sys
m
7004 0x43186ea0 --rw-rw-rwdaemon
daemon
第3章
141
デー タ 記憶領域の制御
プ ロ グ ラ ム間でのデー タ 共有
1 つのプ ロ グ ラ ム内で Fortran プ ロ グ ラ ム単位 と C 関数間のデー タ の共有については、 221 ペー
ジの 「デー タ の共有」 の項を参照 し て く だ さ い。 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 では、
COMMON 文、 お よ び $HP$ SHARED_COMMON 指令について説明 し てい ます。 HP-UX におけ る 共有
メ モ リ の操作については、 shmop(2) のマ ンページ を参照 し て く だ さ い。
142
第3章
デー タ 記憶領域の制御
モ ジ ュ ール と 共通ブ ロ ッ クの比較
モ ジ ュ ール と 共通ブ ロ ッ ク の比較
共通ブ ロ ッ ク は、 Fortran 言語の開発当初か ら プ ロ グ ラ ム の重要な機能の 1 つで し た。 共通ブ
ロ ッ ク は現在で も Fortran で使用 さ れてい ます。 共通ブ ロ ッ ク は、 プ ロ グ ラ ム単位間でデー タ を
共有す る 場合に便利な手段です。 デー タ を共有す る プ ロ グ ラ ム単位が他に情報の受け渡 し 手段を
持っ ていない場合は、 特に有用です。 共通ブ ロ ッ ク は、 同時に実行 し てい る Fortran プ ロ グ ラ ム
間でデー タ を共有す る 場合 (138 ページの 「プ ロ グ ラ ム間でのデー タ 共有」 の項を参照 )、 お よ び
同 じ プ ロ グ ラ ム に リ ン ク さ れた Fortran プ ロ グ ラ ム単位 と C 関数がデー タ を共有す る 場合 (221
ページの 「デー タ の共有」 の項を参照 ) に使用 さ れ ます。
し か し 、 共通ブ ロ ッ ク には、 デー タ を共有す る 各プ ロ グ ラ ム単位で COMMON 宣言を正確に複写 し
なけれな ら ない と い う 問題があ り ます。 共通変数の 1 つで も 記述す る 順番を間違え た り 型や大 き
さ が異な る と 、 プ ロ グ ラ ム単位は同 じ デー タ にア ク セ ス で き な く な り ます。 記述が一致 し ていな
く て も 、 コ ンパ イ ラ は指摘 し ません。 不一致が見落 と し に よ る も のであ っ て も 、 プ ロ グ ラ マーが
1 つのプ ロ グ ラ ム単位に別な観点の共有す る 記憶領域を与え てい る と 、 コ ンパ イ ラ は解釈 し ま
す。
こ の問題を解決す る ために、 FORTRAN 77 の実装の多 く が INCLUDE 拡張機能を提供 し て き ま し
た。 こ の拡張機能を使用す る と 、 共通ブ ロ ッ ク の定義を 1 つの フ ァ イ ルに ま と めて書 く こ と がで
き ます。 コ ンパ イ ル時に、 コ ンパ イ ラ はその フ ァ イ ルを INCLUDE 行が書かれてい る プ ロ グ ラ ム
単位に読み込みます。 こ の方法を採用す る こ と で、 矛盾 し た共通ブ ロ ッ ク の問題が解消 さ れ ま し
たが、 新たな問題が発生 し ま し た。 INCLUDE 機能は FORTRAN 77 規格に定め ら れていないた
め、 移植性があ り ませんで し た。
移植性に関す る 問題を解決す る ために、 Fortran 規格では、 INCLUDE 行が定義 さ れ ま し た。 不幸
な こ と に、 規格の定義は、 詳細を各実装に委ねていたため、 Fortran プ ロ グ ラ ム で INCLUDE 行
を使用 し て も 、 移植で き ない可能性が残 り ま し た。
共通ブ ロ ッ ク の も う 1 つの問題は、 特に EQUIVALENCE 結合で使用 さ れた場合、 最適化がで
き ない こ と です。 共通ブ ロ ッ ク の変数は、 レ ジ ス タ に割 り 付け る こ と がで き ず、 共通ブ ロ ッ ク の
エ イ リ ア シ ン グ変数が、 別名の変数を使用 し てい る プ ロ グ ラ ム単位の最適化を阻害 し ます。
モジ ュ ールプ ロ グ ラ ム単位は、 共通ブ ロ ッ ク に伴 う 問題を解決す る Fortran の解決策です。 共有
可能な変数を モジ ュ ールで宣言 し 、 変数にア ク セ スす る プ ロ グ ラ ム では、 USE 文でモジ ュ ール名
を引用 し ます。 モジ ュ ールの概念を導入 し た こ と で、 INCLUDE 行を使用 し て、 共通の変数を再宣
言す る 必要がな く な り ま し た。
さ ら に、 モジ ュ ールは、 モジ ュ ールデー タ へのア ク セ ス を次の よ う に制御 し ます。
•
PUBLIC 文お よ び PRIVATE 文を使用 し て、モジ ュ ール外でア ク セ ス可能なモジ ュ ール変数 と ア
ク セ ス不能なモジ ュ ール変数を宣言 し ます。
第3章
143
デー タ 記憶領域の制御
モ ジ ュ ール と 共通ブ ロ ッ ク の比較
•
USE 文の ONLY 句を使用す る と 、特定のプ ロ グ ラ ム単位でア ク セ ス で き る モジ ュ ール変数を制
限で き ます。
•
USE 文では、 局所変数 と モジ ュ ール変数 と の名前の競合を解決す る 名称変更機能が使用で き
ます。
モジ ュ ールに手続 き を含む こ と も で き ます。 こ の機能は、 デー タ と そのデー タ を操作す る 手続 き
をパ ッ ケージ化す る 方法を提供 し ます。 プ ロ グ ラ ム単位は、 USE 文を使用 し て、 モジ ュ ールデー
タ と 同 じ 方法で、 モジ ュ ール手続 き にア ク セ ス し ます。 モジ ュ ール手続 き の引用仕様を コ ンパ イ
ラ が使用で き 、 コ ンパ イ ラ は、 モジ ュ ール手続 き に渡す実引 き 数を コ ンパ イ ル時にチ ェ ッ ク し ま
す。
モジ ュ ールは、 共通ブ ロ ッ ク に完全に取っ て代わ っ たわけではあ り ませんが ( た と えば、 138
ページの 「プ ロ グ ラ ム間でのデー タ 共有」 の項を参照 )、 共通ブ ロ ッ ク に代わ る 、 安全で柔軟な
解決策 と し て使用で き ます。
モジ ュ ールを使用 し てデー タ を共有す る 見本プ ロ グ ラ ム については、 109 ページの 「モジ ュ ール
を使用 し てプ ロ グ ラ ム を コ ンパ イ ルす る 」 の項を参照 し て く だ さ い。 『HP Fortran リ フ ァ レ ン ス
ガ イ ド 』 には、 モジ ュ ールプ ロ グ ラ ム単位について、 お よ び MODULE 文 と USE 文について詳細に
説明 し てい ます。
144
第3章
4 デバ ッ グ
本章では、 HP Fortran でプ ロ グ ラ ム をデバ ッ グす る ための各種機能について説明 し ます。 デ
バ ッ グ機能には、 コ ンパ イ ル行オプシ ョ ン、 コ ンパ イ ラ 指令、 お よ びプ ロ グ ラ ムのエ ラ ーを検出
す る プ ロ グ ラ ミ ン グ ツールな ど があ り ます。 本章では、 次の項目について説明 し ます。
•
HP WDB デバ ッ ガの使用方法
•
デバ ッ グ情報の削除
•
実行時例外の処理
•
デバ ッ グ行の使用方法
第4章
145
デバ ッ グ
HP WDB デバ ッ ガの使用方法
HP WDB デバ ッ ガの使用方法
HP WDB デバ ッ ガは、 HP Fortran プ ロ グ ラ ム をデバ ッ グす る 主要ツールです。 こ のデバ ッ ガ
は、 プ ロ グ ラ ム制御、 プ ロ セ ス制御、 プ ロ グ ラ ム と デー タ のモニ タ リ ン グ、 式の評価な ど、 基本
的なデバ ッ グ機能を サポー ト し てい ます。 こ のデバ ッ ガには、 グ ラ フ ィ ッ ク イ ン タ フ ェースお
よ び ラ イ ン モー ド イ ン タ フ ェ ース があ り ます。
デバ ッ ガ ソ フ ト ウ ェ アには、 各種の言語、 タ ーゲ ッ ト マシ ン、 オブジ ェ ク ト フ ァ イ ル形式、 ユー
ザー形式を処理す る 各種マネージ ャ があ り ます。 Fortran 言語マネージ ャ を使用す る と 、 デバ ッ
ガの コ マ ン ド 行に式を入力す る と き に、 Fortran の構文を使用で き ます。
デバ ッ グセ ッ シ ョ ン を開始す る には、 -g コ ンパ イ ル行オプシ ョ ン を指定 し て、 プ ロ グ ラ ム を コ
ンパ イ ル し てお く 必要があ り ます。 コ ンパ イ ル と リ ン ク を個別に実行す る 場合は、 両方の コ マ ン
ド 行に -g オプシ ョ ン を指定す る 必要があ り ます。 こ のオプシ ョ ン を指定す る と 、 コ ンパ イ ラ は、
デバ ッ ガが必要 と す る 追加情報を生成 し て、 出力 コ ー ド に挿入 し ます。
-g オプシ ョ ン を付けた コ ンパ イ ルが完了 し た ら 、 wdb コ マ ン ド でデバ ッ ガ を起動 し 、 引 き 数 と
し て実行可能プ ロ グ ラ ムの名前を指定 し ます。 た と えば、 prog.f90 をデバ ッ グ用に コ ンパ イ ル
す る コ マ ン ド 行を次に示 し ます。
$ f90 -g prog.f90 -o db_prog
次に、 実行可能プ ロ グ ラ ムのデバ ッ グ を開始す る コ マ ン ド を示 し ます。
$ wdb db_prog
こ のデバ ッ ガ を使用す る と 、 レベル 0, 1, 2 で最適化 し た コ ー ド をデバ ッ グで き ます。 最適化 し
た コ ー ド をデバ ッ グす る には、 -g お よ び +Oopt-level オプシ ョ ン を指定 し ます。 こ こ で
opt-level は、 0, 1, ま たは 2 です。 次に、 prog.f90 をデバ ッ グ用に最適化レベル 2 で コ ンパ
イ ルす る コ マ ン ド 行を示 し ます。
$ f90 +O2 -g prog.f90 -o db_prog
-g オプシ ョ ン を付けて コ ンパ イ ルす る と 、 オブジ ェ ク ト フ ァ イ ル と 実行可能フ ァ イ ルのサ イ ズ
が大 き く な り ます。 プ ロ グ ラ ムのデバ ッ グが完了 し 、 製品バージ ョ ン を構築す る 準備が整っ た
ら 、 -g オプシ ョ ン を付けずに再 コ ンパ イ ル し ます。
HP WDB デバ ッ ガについての詳細は、 http://www.hp.com/go/wdb ( 英語 ) を参照 し て く だ さ い。
印字用お よ びオ ン ラ イ ンの文書が こ こ にあ り ます。
146
第4章
デバ ッ グ
デバ ッ グ情報の削除
デバ ッ グ情報の削除
HP Fortran で コ ンパ イ ル し たプ ロ グ ラ ムは、 実行可能プ ロ グ ラ ムに最小限のデバ ッ グ情報だけ
を付け ます。 こ の情報は、 プ ロ グ ラ ム内のシ ン ボル と そのオ フ セ ッ ト ア ド レ ス を リ ス ト し た シ ン
ボルテーブルで構成 さ れてい ます。 シ ン ボルテーブルには、 手続 き ト レース バ ッ ク の生成に必要
な情報が記述 さ れてい ます。 シ ン ボルテーブルは、 デバ ッ ガお よ び CXperf パフ ォ ーマ ン ス解析
ツールで も 使用 さ れ ます。
ただ し 、 シ ン ボルテーブルは、 -g オプシ ョ ン を指定 し て コ ンパ イ ル し たプ ロ グ ラ ムに付加 さ れ
る デバ ッ グ情報 と 同 じ 内容ではあ り ません。 シ ン ボルテーブルは、 -g オプシ ョ ン を指定せずに
コ ンパ イ ル し て も 、 実行可能プ ロ グ ラ ムに付加 さ れ ます。
実行可能プ ロ グ ラ ムのサ イ ズ を小 さ く す る こ と がアプ リ ケーシ ョ ンに と っ て重要な場合、
+strip オプシ ョ ン を使用す る と 、 プ ロ グ ラ ム の製品バージ ョ ン か ら シ ン ボルテーブルを削除で
き ます。 コ ンパ イ ル と リ ン ク を個別に実行す る 場合、 両方の コ マ ン ド 行に +strip オプシ ョ ン を
指定 し ます。 +strip で再 コ ンパ イ ルす る 代わ り に、 strip ユーテ ィ リ テ ィ を使用す る と 、 シ ン
ボルテーブルを初め と す る すべてのデバ ッ グ情報を削除で き ます。
実行可能プ ロ グ ラ ムのサ イ ズが重要でなければ、 シ ン ボルテーブルを プ ロ グ ラ ムの製品バージ ョ
ン に残 し てお き ます。 デバ ッ ガ を使用 し て、 こ のシ ン ボルテーブルに よ り 、 最小限のデバ ッ グ を
行 う こ と がで き ます。 -g オプシ ョ ン を付けずにプ ロ グ ラ ム を コ ンパ イ ル し 、 シ ン ボルテーブル
を生成 し なか っ た場合、 デバ ッ ガ を使用で き ません。 ま た、 シ ン ボルテーブルか ら 情報が提供 さ
れない と 、 手続 き ト レース バ ッ ク は仮想ア ド レ ス だけ を表示 し ます。
シ ン ボルテーブルが実行可能プ ロ グ ラ ムに付加す る コ ー ド の量は、 -g オプシ ョ ン で コ ンパ イ ル
し た と き に付加 さ れ る 情報に比べて、 かな り 少な く な り ます。 -g お よ び +strip オプシ ョ ン に
ついての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。 strip ユーテ ィ リ
テ ィ についての詳細は、 strip(1) のマ ンページ を参照 し て く だ さ い。
第4章
147
デバ ッ グ
実行時例外の処理
実行時例外の処理
広義の例外 と は、 プ ロ グ ラ ム の結果に悪い影響を与え る エ ラ ーやフ ォ ル ト の状態を意味 し ます。
例外は、 浮動小数点演算での比較的軽度な不正確な結果か ら 、 暴走 し たプ ロ グ ラ ム が割 り 当て ら
れていない メ モ リ にア ク セ スす る と き に発生す る よ り 深刻な セグ メ ン テーシ ョ ン違反ま であ り ま
す。
オペレーテ ィ ン グ シ ス テ ムの完全性を脅かす例外が発生す る と 、 HP-UX は例外シグナル ( た と
えば、 セグ メ ン テーシ ョ ン違反の場合 SIGSEGV) を出 し ます。 そのため、 プ ロ セ ス は例外か ら 回
復す る 適切な措置を取 る こ と がで き ます。 例外を検出 し たプ ロ グ ラ ムは中断 し ますが、 すべての
プ ロ グ ラ ムがそ う な る わけではあ り ません。 例外が発生 し た場合にプ ロ グ ラ ム を中断す る よ う に
設定 し てお く と 、 プ ロ グ ラ ムは、 例外を ト ラ ッ プ ( つま り シ グナルを キ ャ ッ チ ) す る こ と で、 例
外を処理で き ます。
オペレーテ ィ ン グ シ ス テ ムの完全性は脅か さ ない も のの、 浮動小数点数を ゼ ロ で除算す る な ど
定義 さ れた浮動小数点例外があ り ます。 HP 9000 コ ン ピ ュ ー タ では、 浮動小数点例外の ト ラ ッ
プはデフ ォ ル ト で使用不能に設定 さ れてい ますが、 +fp_exception お よ び +FP オプシ ョ ン を使
用す る と 使用可能に設定で き ます。 ON 文を使用 し て も 浮動小数点例外の ト ラ ッ プ を使用可能に
設定で き ます。
+fp_exception オプシ ョ ン を指定 し て コ ンパ イ ル し たプ ロ グ ラ ムは、 表 4-1 に リ ス ト し た例外
を ト ラ ッ プで き ます。 2 列目にあ る 例外が発生す る と 、 オペレーテ ィ ン グ シ ス テ ムは 1 列目にあ
る シ グナルを生成 し ます。 +FP オプシ ョ ン を付けて コ ンパ イ ル し たプ ロ グ ラ ムは、 特定の浮動小
数点例外 (SIGFPE) を ト ラ ッ プで き ます。
表 4-1 +fp_exception が認識する シグナル
シグナル
例外
SIGBUS
バ ス エ ラ ー命令
SIGFPE
浮動小数点例外
SIGILL
不正命令
SIGSEGV
セグ メ ン テーシ ョ ン違反ま たは メ モ リ フ ォ ル ト
SIGSYS
カーネルのシ ス テ ム コ ールに対す る 不正な引 き 数
+fp_exception で コ ンパ イ ル し たプ ロ グ ラ ムが例外を検出す る と 、 次の イ ベン ト が発生 し ます。
•
148
プ ロ グ ラ ムが例外を ト ラ ッ プ し ます。
第4章
デバ ッ グ
実行時例外の処理
•
手続 き ト レース バ ッ ク が標準エ ラ ーに表示 さ れます。 手続 き ト レース バ ッ ク にはルーチン名
と オ フ セ ッ ト が表示 さ れ る ため、 例外を発生 し た コ ー ド が簡単に検出で き ます。
•
プ ロ グ ラ ム を中断 し ます。
次の項では、 表 4-1 に リ ス ト し た例外について個々に説明 し ます。 シ グナルについての詳細は、
signal(2) お よ び signal(5) のマ ンページ を参照 し て く だ さ い。
注記
Fortran 90 規格では、 入出力実行時エ ラ ーを処理す る 指定子 と し て、 IOSTAT お
よ び ERR がサポー ト さ れてい ます。 こ れ ら の指定子についての詳細は、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 の入出力文 ( た と えば、 OPEN や READ) に関す る 説
明を参照 し て く だ さ い。 IOSTAT が返すエ ラ ー メ ッ セージの説明については、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
バスエ ラ ー例外
バ ス エ ラ ー例外は、 プ ロ グ ラ ムがア ク セ ス不能な メ モ リ 位置を引用す る と 発生 し ます。 境界が正
し く ないか、 存在 し ないア ド レ ス を引用す る か、 ハー ド ウ ェ アが故障す る と 発生 し ます。
バ ス エ ラ ーは通常、 境界が正 し く ないデー タ 引用に よ っ て発生 し ます。 (KIND=1) 要素で構成す
る 配列を、 (KIND=4) 要素 と し て ア ク セ スす る ルーチンに渡す と 、 バ ス エ ラ ー例外が発生す る こ
と があ り ます。 ま たは、 (KIND=1) 要素で構成す る 配列が共通ブ ロ ッ ク で宣言 さ れてい る 場合、
(KIND=4) 変数 と し て引用す る ルーチン に第 3 要素を渡 し た場合 も バ ス エ ラ ー例外を発生 し ま
す。 HP Fortran デー タ の種類に よ る デー タ の割 り 付け境界については、 『HP Fortran リ フ ァ レ
ン ス ガ イ ド 』 を参照 し て く だ さ い。
バ ス エ ラ ーは、 他の例外 と 同 じ よ う に、 不正な ア ド レ ス引用を生成す る すべてのプ ロ グ ラ ム で発
生 し ます。 Fortran 90 規格のポ イ ン タ を使用 し てい る 場合は、 あ ま り 問題にな り ませんが、 ク レ
イ 形式のポ イ ン タ 拡張を誤用 し た り 、 Fortran プ ロ グ ラ ム単位が値渡 し の引 き 数を、 ポ イ ン タ と
し て使用す る C ルーチンに渡す と 、 不正な ア ド レ ス引用が起 こ り ます。
浮動小数点例外
HP 9000 コ ン ピ ュ ー タ では、 IEEE Posix 規格に従っ て、 浮動小数点例外は使用不能に設定 さ れ
てい ます。 し たがっ て、 プ ロ グ ラ ム が次の演算を実行 し た場合、
x = 1.0/0.0
例外 と し て ト ラ ッ プ し ないため、 プ ロ グ ラ ムは中断 し ません。 代わ り に、 x には、 正の無限大値
(+INF) が代入 さ れ ます。
第4章
149
デバ ッ グ
実行時例外の処理
HP Fortran では、 浮動小数点例外の ト ラ ッ プ を使用可能にす る コ ンパ イ ル行オプシ ョ ン +FP と
+fp_exception がサポー ト さ れてい ます。 両者の違いは、 次の と お り です。
•
+fp_exception オプシ ョ ン を使用す る と 、 次の IEEE 浮動小数点例外を ト ラ ッ プで き ます。
❏
無効演算
❏
ゼロ除算
❏
オーバー フ ロー
❏
ア ン ダー フ ロー
+FP オプシ ョ ンは、 不正確な演算例外の ト ラ ッ プに も 使用で き ます。 不正確な演算例外につ
いての詳細は、 『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ い。
•
+FP オプシ ョ ン では、 +fp_exception オプシ ョ ン と は異な り 、 特定の例外を使用可能にす る
flags 引 き 数を使用で き ます。
•
+FP オプシ ョ ン を使用す る と 、 主 と し て PA2.0 シ ス テ ム をサポー ト し てい る シ ス テ ム で高速
ア ン ダー フ ローが使用可能にな り ます。
•
両方のオプシ ョ ン と も 、 例外を ト ラ ッ プす る と 、 プ ロ グ ラ ム を中断 さ せます。 ただ し 、
+fp_exception は、 発生 し た例外の種類、 お よ び例外を発生 さ せた文の仮想ア ド レ ス を識
別 し ます。 さ ら に、 +FP を使用す る と 、 コ アダ ン プが出力 さ れ ますが、 +fp_exception では
出力 さ れ ません。
ON 文を使用 し て も 、 浮動小数点例外が ト ラ ッ プで き ます。 ON 文を使用す る には、 ソ ース コ ー ド
を修正す る 必要があ り ますが、 ト ラ ッ プ手続 き を書け る ので、 プ ロ グ ラ ム を例外か ら 回復で き ま
す。 ON 文の使用についての詳細は、 155 ページの第 5 章 「ON 文の使用方法」 を参照 し て く だ
さ い。
+FP オプシ ョ ン と +fp_exception オプシ ョ ンについての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ
イ ド 』 を参照 し て く だ さ い。 ま た、 『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 には、 両方の
オプシ ョ ンの詳 し い説明 と 、 浮動小数点例外 と その処理についての詳細な情報が掲載 さ れてい ま
す。
不正命令例外
不正命令例外は、 プ ロ グ ラ ム が命令 コ ー ド 以外の ビ ッ ト パ タ ーン を実行す る と 発生 し ます。 こ の
例外は、 主 と し て ス タ ッ ク の上書 き が原因です。 プ ロ グ ラ ムが、 復帰ア ド レ ス を格納 し た ス タ ッ
ク の一部を上書 き す る と 、 間違っ た新 し いア ド レ ス を引用す る こ と で、 実行制御がデー タ を含む
メ モ リ 位置や存在 し ない ビ ッ ト パ タ ーンの メ モ リ 位置に移行 し ます。 こ の メ モ リ 位置を実行す る
と 、 不正命令例外が発生 し ます。
150
第4章
デバ ッ グ
実行時例外の処理
こ の例外は、 プ ロ グ ラ ムに不正な ラ イ ブ ラ リ を リ ン ク し た場合に も 発生 し ます。 特に、 アセ ン ブ
ラ で書いた コ ー ド を含む ラ イ ブ ラ リ 、 ま たは、 フ ァ イ ル転送中に破損 し た ラ イ ブ ラ リ にア ク セ ス
す る と 、 例外が発生 し ます。
こ の例外は、 コ ンパ イ ラ のエ ラ ーを示す こ と も あ り ます。 例外が発生 し た原因が分か ら ない場合
は、 HP 社のサポー ト 担当にお問い合わせ く だ さ い。
セグ メ ン テーシ ョ ン違反例外
プ ロ グ ラ ムの実行を開始す る 前に、 プ ロ グ ラ ムが使用す る メ モ リ 領域を定義 し た メ モ リ セグ メ ン
ト を割 り 当て ら れ ます。 プ ロ グ ラ ム がセ グ メ ン ト 外の メ モ リ 位置にア ク セ スす る と 、 オペレー
テ ィ ン グ シ ス テ ムは SIGSEGV シ グナルを出 し て、 セグ メ ン テーシ ョ ン違反ま たは メ モ リ フ ォ ル
ト を通知 し ます。
宣言 し た配列の範囲を超え て添え字付け をす る な ど、 セグ メ ン ト 外のア ド レ ス引用を生成 し たプ
ロ グ ラ ムは、 セグ メ ン テーシ ョ ン違反を犯 し ます。 C プ ロ グ ラ ム では通常、 不正なポ イ ン タ が こ
の例外を起 こ し ます。 Fortran 90 規格のポ イ ン タ は、 C 言語のポ イ ン タ よ り も 保護機能が優れて
い ますが、 誤用 さ れ る こ と があ り 、 いわゆ る 要注意状態を招 く こ と があ り ます (Cooper
Redwine1 のみが認識。 “I’ve got those segmentation violation, core dumped blues.”)。 ク レ イ 形
式のポ イ ン タ 拡張は、 C のポ イ ン タ に似てい る ため、 乱用す る と セ グ メ ン テーシ ョ ン違反が発生
し やす く な り ます。
カーネルの処理能力を上回 る 局所変数を ス タ ッ ク に割 り 当て た り 、 無限再帰に入っ た り す る と 、
ス タ ッ ク オーバー フ ローが発生 し て、 セグ メ ン テーシ ョ ン違反にな り ます。 プ ロ グ ラ ムに大 き
な ス タ ッ ク が必要な場合は、 SAM ( シ ス テ ム管理マネージ ャ ) を使用 し て、 maxssiz パ ラ メ ー タ
を増や し ます。 カーネルの再構成については、 『HP-UX シ ス テ ム管理者ガ イ ド 』 を参照 し て く だ
さ い。
セグ メ ン テーシ ョ ン違反は、 Fortran プ ロ グ ラ ムか ら C 関数を呼び出す と 、 よ く 発生 し ます。 関
数に渡す引 き 数の数、 型、 ま たは呼び出 し 規約が一致 し ない と 、 呼び出 し は例外にな り ます。 た
と えば、 引 き 数を値渡 し と し て宣言す る ために、 組み込み関数 %VAL を使用 し ていて も 、 C 関数
がポ イ ン タ を期待 し てい る 場合、 セグ メ ン テーシ ョ ン違反が発生 し ます (%VAL お よ び %REF は、
HP Fortran の拡張機能です。 Fortran プ ロ グ ラ ム か ら の C ルーチンの呼び出 し についての詳細
は、 206 ページの 「引 き 数渡 し 規約」 の項を参照 )。
デバ ッ グ作業では通常、 セ グ メ ン テーシ ョ ン違反の原因 と な っ た コ ー ド を検索 し て、 書 き 直 し ま
す。 こ のエ ラ ーでプ ロ グ ラ ム が中断 し た場合は、 +fp_exception オプシ ョ ン を付けて再 コ ンパ
イ ル し ます。 こ のオプシ ョ ン で コ ンパ イ ル し たプ ロ グ ラ ム では、 中断時に手続 き ト レース バ ッ ク
が表示 さ れ ます。 手続 き ト レース バ ッ ク では、 例外が発生 し た コ ー ド の手続 き 名 と オ フ セ ッ ト ア
ド レ ス を リ ス ト し ます。
1. 同氏の 『Upgrading to Fortran 90』 (New York 1995) を参照 し て く だ さ い。
第4章
151
デバ ッ グ
実行時例外の処理
配列外引用のためにセグ メ ン テーシ ョ ン違反が発生 し た と 考え ら れ る 場合は、 +fp_exception
オプシ ョ ン ではな く 、 +check=all オプシ ョ ン を使用 し ます。 +check=all オプシ ョ ン を指定 し
て コ ンパ イ ル し たプ ロ グ ラ ムは、 宣言 さ れた配列の境界を超え た配列要素を引用す る と 、 その引
用が行われた行番号を示すエ ラ ー メ ッ セージ を表示 し て、 プ ロ グ ラ ム を中断 し ます。
+check=all を使用す る と 、 部分列の境界お よ び整数オーバー フ ローの実行時チ ェ ッ ク を行い ま
す。 詳細は、 160 ページの 「 ト ラ ッ プ手続 き を呼び出す」 の項を参照 し て く だ さ い。 +check オ
プシ ョ ン についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
不正な引き数によ る例外
こ の例外は、 引 き 数の値が範囲外であ る 場合な ど、 不正な引 き 数を カーネルのシ ス テ ムルーチン
に渡す と 発生 し ます。 ま た、 こ の例外は、 カーネルの ス レ ッ ド ラ イ ブ ラ リ
/usr/lib/libpthread.sl を明示的に呼び出 し て不正な引 き 数を渡すプ ロ グ ラ ム で も 発生 し ま
す。
152
第4章
デバ ッ グ
デバ ッ グ行の使用方法
デバ ッ グ行の使用方法
固定形式の場合、 HP Fortran プ ロ グ ラ ム にデバ ッ グ行を書 く こ と がで き ます。 デバ ッ グ行は、 1
桁目に D ま たは d を付け ます。 +dlines オプシ ョ ン を指定 し て コ ンパ イ ルす る と 、 デバ ッ グ行
は文 と 解釈 さ れて コ ンパ イ ル さ れ ます。 オプシ ョ ンがない場合は、 注釈 と 見な さ れ、 無視 さ れ ま
す。 デバ ッ グ行が書かれたプ ロ グ ラ ムは ま た、 固定形式で コ ンパ イ ルす る 必要があ り ます。 つま
り 、 フ ァ イ ル名の拡張子には、 .f ま たは .F を使用 し ます。 ま たは、 +source=fixed オプシ ョ
ン を指定 し て、 プ ロ グ ラ ム を コ ンパ イ ルす る 必要があ り ます。
+dlines オプシ ョ ン を使用す る と 、 ソ ース フ ァ イ ルに WRITE 文をデバ ッ グ行 と し て書 く こ と が
で き ます。 ま た、 ソ ース コ ー ド を修正 し な く て も 、 製品バージ ョ ンのプ ロ グ ラ ム か ら デバ ッ グ行
を削除す る こ と がで き ます。 製品バージ ョ ン を作成す る と き 、 WRITE 文を削除せずに、 +dlines
オプシ ョ ン な し 、 ま たは +nodlines オプシ ョ ン を付けて再 コ ンパ イ ル し ます。
デバ ッ グ行は、 FORTRAN 77 を初め と す る 多数の Fortran 実装でサポー ト さ れてい ますが、 規
格に定め ら れていないため移植で き ません。 ま た、 こ の機能は自由形式 と の互換性がないため、
使用が さ ら に制限 さ れてい ます。 デバ ッ グ行を含んだ Fortran 90 プ ロ グ ラ ム を自由形式で コ ン
パ イ ルす る と 、 コ ンパ イ ルは構文エ ラ ーを発生 し て失敗 し ます。
C プ リ プ ロ セ ッ サ (cpp) には、 デバ ッ グ行 と 同 じ 機能の指令セ ッ ト がサポー ト さ れてい る だけで
な く 、 機能的に優れ、 自由形式で も 固定形式で も コ ンパ イ ルで き ます。 cpp 指令は、 Fortran 90
規格には組み込まれてい ませんが、 HP-UX な ど のほ と ん ど の UNIX シ ス テ ム で使用で き ます。
cpp 指令については、 cpp(1) のマ ンページ を参照 し て く だ さ い。 HP Fortran プ ロ グ ラ ムお よ び
+dlines オプシ ョ ンの ソ ース については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ
さ い。
第4章
153
デバ ッ グ
デバ ッ グ行の使用方法
154
第4章
5 ON 文の使用方法
実行時エ ラ ーが発生 し た場合、 プ ロ グ ラ ムはエ ラ ーの種類に よ っ てデフ ォ ル ト の動作を決定 し ま
す。 エ ラ ーが浮動小数点例外の場合、 プ ロ グ ラ ムは実行を継続 し ます。 他のエ ラ ーが発生す る
と 、 プ ロ グ ラ ムは実行を中断 し ます。
148 ページの 「実行時例外の処理」 の項で説明 し た よ う に、 +fp_exception お よ び +FP オプ
シ ョ ン を使用す る と 、 実行時エ ラ ー発生時のプ ロ グ ラ ム の動作を制御で き ます。 ON 文は、 浮動小
数点例外、 整数例外、 Ctrl-C 割 り 込みの処理を プ ロ グ ラ ムに対 し て使用可能にす る こ と に よ っ て
制御レベルを追加 し ます。 例外処理が発生す る 前に、 次の項目を指定す る ON 文に制御の流れを
渡す必要があ り ます。
•
例外の種類
•
次のいずれかの動作
❏
ト ラ ッ プ手続 き の実行
❏
割 り 込みの無視
❏
プ ロ グ ラ ムの中断
ON 文で指定 し た動作は、 その例外に対 し て、 別の ON 文で指定 し 直 さ ない と 変更で き ません。
本章では、 ON 文の使用方法について説明 し ます。 ON 文の構文については、 『HP Fortran リ フ ァ
レ ン ス ガ イ ド 』 で説明 し てい ます。 数学エ ラ ーの ト ラ ッ プについての詳細は、 『HP-UX フ ロ ー
テ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ い。
注記
第5章
レベル 2 以上で最適化 し たプ ロ グ ラ ム に ON 文を指定 し て、 例外を ト ラ ッ プ し た
場合、 最適化 さ れていないプ ロ グ ラ ム、 ま たは、 ON 文が指定 さ れていないプ ロ グ
ラ ムに比べて結果が変わ る こ と があ り ます。
155
ON 文の使用方法
ON 文で処理する例外
ON 文で処理する例外
ON 文は、 +fp_exception オプシ ョ ン と 同様、 浮動小数点例外の ト ラ ッ プ を使用可能に し ます
(HP 9000 コ ン ピ ュ ー タ の場合、 浮動小数点例外の ト ラ ッ プはデフ ォ ル ト で使用不能に設定 さ れ
てい ます )。 ト ラ ッ プが使用可能な場合、 ON 文で異な る 動作を指定 し ない限 り 、 次の例外を検出
し たプ ロ グ ラ ム が中断 し ます。
•
ゼ ロ 除算
•
オーバーフ ロ ー
•
ア ン ダーフ ロ ー
•
不正確な結果
•
不正ま たは無効演算
こ れ ら の例外は、 浮動小数点演算に関す る IEEE 規格で定義 さ れてい ます。 例外を利用者記述
コ ー ド で検出す る か、 ラ イ ブ ラ リ ルーチン の呼び出 し で検出す る かに関係な く 、 ON 文は、 例外
ト ラ ッ プ を使用可能に し ます。 さ ら に、 ON 文は、 整数のゼ ロ 除算 、 整数のオーバーフ ロ ー、
Ctrl-C 割 り 込み ト ラ ッ プ も 使用可能に し ます。 Ctrl-C 割 り 込みは、 プ ロ グ ラ ムの実行中に
[Ctrl-C] を押す と 発生 し ます。
表 5-1 には、 ON 文が処理す る 例外、 お よ び、 処理す る 例外を指定す る ために ON 文の中で使用す
る キー ワー ド を記載 し てい ます。 1 列目は例外の種類、 2 列目は、 ON 文の中で ON の後に続けて
書 く キー ワー ド です。 3 例目は、 2 例目のキー ワ ー ド の代わ り に使用す る 代替キー ワ ー ド です。
た と えば、 次の よ う に ON 文を書 く と 、 8 バ イ ト の浮動小数点演算に よ る ゼ ロ 除算が ト ラ ッ プ さ
れます。
ON REAL(8) DIV 0 CALL div_zero_trap
次の例は、 前の例 と 同 じ 内容ですが、 表の 3 列目にあ る 代替キー ワー ド を使用 し てい ます。
ON DOUBLE PRECISION DIV 0 CALL div_zero_trap
156
第5章
ON 文の使用方法
ON 文で処理する例外
表 5-1 ON 文で処理する例外
例外
ゼ ロ 除算
オーバーフ ロ ー
ア ン ダーフ ロ ー
不正確な結果
不正ま たは無効演算
Ctrl-C 割 り 込み
第5章
例外のキーワー ド
代替キーワー ド
REAL(4) DIV 0
REAL DIV 0
REAL(8) DIV 0
DOUBLE PRECISION DIV 0
REAL(16) DIV 0
( なし )
INTEGER(2) DIV 0
INTEGER*2 DIV 0
INTEGER(4) DIV 0
INTEGER DIV 0
REAL(4) OVERFLOW
REAL OVERFLOW
REAL(8) OVERFLOW
DOUBLE PRECISION OVERFLOW
REAL(16) OVERFLOW
( なし )
INTEGER(2) OVERFLOW
INTEGER*2 OVERFLOW
INTEGER(4) OVERFLOW
INTEGER OVERFLOW
REAL(4) UNDERFLOW
REAL UNDERFLOW
REAL(8) UNDERFLOW
DOUBLE PRECISION UNDERFLOW
REAL(16) UNDERFLOW
( なし )
REAL(4) INEXACT
REAL INEXACT
REAL(8) INEXACT
DOUBLE PRECISION INEXACT
REAL(16) INEXACT
( なし )
REAL(4) ILLEGAL
REAL ILLEGAL
REAL(8) ILLEGAL
DOUBLE PRECISION ILLEGAL
REAL(16) ILLEGAL
( なし )
CONTROLC
( なし )
157
ON 文の使用方法
ON 文で指定する動作
ON 文で指定する動作
例外を ト ラ ッ プ し た後の動作は、 同 じ 例外に対 し て前に実行 さ れた ON 文が指定 し た動作に依存
し ます。 動作を指定す る 場合、 ON 文には、 ABORT, IGNORE, ま たは CALL の う ちのいずれかの
キー ワ ー ド を指定す る 必要があ り ます。 各キー ワ ー ド の意味は次の と お り です。
•
ABORT を指定す る と 、 標準エ ラ ー メ ッ セージ を出力 し て、 プ ロ グ ラ ム を中断 し ます。
•
IGNORE を指定す る と 、 処理を継続 し て、 次の命令を実行 し ます。
例外が整数のゼ ロ 除算であ る 場合、 結果はゼ ロ に設定 さ れます。 他の例外が発生 し た場合
は、 タ ーゲ ッ ト レ ジ ス タ の直前の内容が結果 と し て使用 さ れ ます。
IGNORE は、 プ ロ グ ラ ムの実行中に都合の悪い タ イ ミ ン グで発生 し た Ctrl-C 割 り 込みを防止
す る と き に有用です。
•
CALL を指定す る と 、 通常の (ABORT) エ ラ ー メ ッ セージが抑止 さ れ、 指定 し た ト ラ ッ プ手続 き
に制御が移行 し ます。
ト ラ ッ プ手続 き には、 ゼ ロ 個ま たは 1 個の引 き 数が渡 さ れ ます。 引 き 数を指定 し てい る と 、
それは、 例外を検出 し た演算の結果にな り ます。 手続 き は、 こ の値を分析 し て正確な情報を
取得 し 、 別な値を引 き 数に代入 し 、 エ ラ ーか ら 回復 し ます。 引 き 数の型は、 キー ワ ー ド で指
定 し た型 と 同 じ でなければな り ません。
指定 し た ト ラ ッ プ手続 き は通常、 外部手続 き にな り ます。 し か し 、 仮手続 き を指定す る こ と
も で き ます。
次の項では、 例外の発生時に ON 文を使用 し て、 さ ま ざ ま な動作を指定す る 方法について説明 し
ます。
実行プ ログ ラ ムを終了する
例外の発生時にプ ロ グ ラ ム を終了す る には、 CALL 文の ABORT 形式を使用 し ます。 次の例では、
ゼ ロ 除算を実行 し よ う と し てい ます。 ABORT 句を使用す る と 、 プ ロ グ ラ ムは例外を検出 し た直後
に手続 き ト レース バ ッ ク を発行 し ます。
例 5-1
abort.f90
PROGRAM main
REAL :: x, y, z
! The next statement enables traps for floating-point exceptions
!
and specifies the action to take for divide by zero.
! ON REAL DIV 0 ABORT
158
第5章
ON 文の使用方法
ON 文で指定する動作
x = 10.0
y = 0.0
z = x / y
PRINT *, y
END PROGRAM main
次に、 コ マ ン ド 行 と 見本プ ロ グ ラ ム の実行結果を示 し ます。
$ f90 abort.f90
$ a.out
PROGRAM ABORTED :
IEEE divide by zero
PROCEDURE TRACEBACK:
( 0)
0x0000248c
_start + 0x6c
[./a.out]
ON 文を注釈行に し 、 +fp_exception オプシ ョ ン を付けて コ ンパ イ ル し て も 、 同 じ 結果にな り ま
す。
エ ラ ーを無視する
例外を無視す る には、 ON 文に IGNORE キー ワー ド を指定 し ます。 次に、 ON 文を使用 し て無効演
算を無視す る プ ロ グ ラ ム ignore.f90 を示 し ます。
例 5-2
ignore.f90
PROGRAM main
REAL :: x, y, z
! The following ON statement enables traps for floating-point
!
exceptions and causes the program to ignore an invalid
!
operation exception.
ON REAL ILLEGAL IGNORE
! The next two statements pass a negative argument to the LOG
!
intrinsic, resulting in an invalid operation. This
!
exception is ignored, as specified by the ON statement.
x = -10.0
y = LOG(x)
PRINT *, y
! The next three statements attempt to divide by zero.
!
trap for this exception is enabled by the previous
第5章
The
159
ON 文の使用方法
ON 文で指定する動作
!
ON statement but no action is specified.
!
the program will abort execution.
x = 9.0
y = 0
z = x/y
Therefore,
PRINT *, z
END PROGRAM main
IEEE 規格で定義 さ れてい る よ う に、 NaN で終わ る 浮動小数点演算は、 無効演算 と 呼ばれ る 例
外です。 見本プ ロ グ ラ ム では、 負の引 き 数を LOG 組み込み関数に渡す と き 、 無効演算が実行 さ れ
る ため、 組み込み関数は NaN を返 し てい ます。 次の よ う に ON 文を書 く 場合、
ON REAL INVALID IGNORE
プ ロ グ ラ ムは こ の例外を無視 し て、 実行を継続 し ます。
プ ロ グ ラ ムはゼ ロ 除算 も 実行 し てい ます。 ON 文はゼ ロ 除算例外に よ る ト ラ ッ プ を使用可能に し
てい ますが、 他の機能は設定 し てい ません。 その結果、 例外に よ り プ ロ グ ラ ム が中断 し ます。 ゼ
ロ 除算を無視す る には、 ON 文 (ON REAL DIV 0 IGNORE) を追加す る 必要があ り ます。
ON REAL DIV 0 IGNORE
次に、 こ のプ ロ グ ラ ム を コ ンパ イ ルす る コ マ ン ド 行 と 見本プ ロ グ ラ ム の実行結果を示 し ます。
$ f90 ignore.f90
$ a.out
NaN
PROGRAM ABORTED :
IEEE divide by zero
PROCEDURE TRACEBACK:
( 0)
0x00002504
_start + 0xbc
[./a.out]
ト ラ ッ プ手続き を呼び出す
ON 文で呼び出 し て、 利用者記述 コ ー ド や ラ イ ブ ラ リ ルーチン の算術エ ラ ーを処理す る ト ラ ッ プ
手続 き を作成で き ます。 ト ラ ッ プ手続 き には、 引 き 数な し か引 き 数を 1 つ指定 し ます。 引 き 数を
指定 し た場合、 引 き 数は結果 と な り 、 例外キー ワ ー ド で指定 し た型にす る 必要があ り ます。 た と
えば、 次の ON 文を プ ロ グ ラ ムに書 く 場合、
ON DOUBLE PRECISION OVERFLOW CALL trap
手続 き trap は、 DOUBLE PRECISION 型の引 き 数を 1 つ宣言で き ます。 引 き 数が省略可能であ る
こ と に注意 し て く だ さ い。 ま た、 例外に よ っ ては、 引 き 数の内容は必ず し も 意味を持ち ません。
160
第5章
ON 文の使用方法
ON 文で指定する動作
次の項では、 ON 文を使用 し て、 浮動小数点例外 と 整数例外の ト ラ ッ プ手続 き を呼び出す見本プ
ロ グ ラ ム を 2 つ紹介 し ます。
浮動小数点例外を ト ラ ッ プする
次のプ ロ グ ラ ム call_fptrap.f90 では、 無効演算例外が発生 し てい ますが、 プ ロ グ ラ ム には例
外を処理す る ON 文が書かれてい ます。 ON 文は、 ト ラ ッ プ手続 き trap_illegal を呼び出 し 、 ト
ラ ッ プ手続 き が異な る 値を結果の引 き 数に代入 し ます。 プ ロ グ ラ ムは結果を出力 し ます。 次にプ
ロ グ ラ ム を示 し ます。
例 5-3
call_fptrap.f90
PROGRAM main
REAL :: x, y
ON REAL ILLEGAL CALL trap_illegal
x = -10.0
y = LOG(x) ! causes an invalid operation
PRINT *, y
END PROGRAM main
SUBROUTINE trap_illegal(res)
! res is the result value of the invalid operation
!
trapped by the ON statement
REAL :: res
res = 99.87
! assign another value to the result argument
END SUBROUTINE trap_illegal
次に、 コ マ ン ド 行 と 見本プ ロ グ ラ ム の実行結果を示 し ます。
$ f90 call_fptrap.f90
$ a.out
99.87
ト ラ ッ プ手続 き を抜け る と 、 ト ラ ッ プ を起動 し た命令の後に制御が戻 り ます。 こ の場合、 不正命
令が利用者記述 コ ー ド ま たは ラ イ ブ ラ リ ルーチン にあ る か ど う かは関係あ り ません。
ON 文を書かない と 、 こ のプ ロ グ ラ ムは ト ラ ッ プ手続 き を実行 し ないため、 159 ページの 「エ
ラ ーを無視す る 」 の項で紹介 し たプ ロ グ ラ ム と 同 じ よ う に、 出力は NaN にな り ます。
整数オーバー フ ロー例外を ト ラ ッ プする
本項では、 ON 文を使用 し て、 整数オーバーフ ロ ー例外の ト ラ ッ プ手続 き を呼び出す見本プ ロ グ
ラ ム を紹介 し ます。
第5章
161
ON 文の使用方法
ON 文で指定する動作
整数オーバーフ ロ ーは、 整変数の演算結果に範囲外の値を割 り 当て る と き に発生 し ます。 HP
Fortran は、 デフ ォ ル ト では こ の例外を ト ラ ッ プ し ません。 し か し 、 ON と $HP$
CHECK_OVERFLOW 指令を組み合わせ る と 、 整数オーバーフ ロ ーを ト ラ ッ プで き ます。 次の見本プ
ロ グ ラ ム call_itrap.f90 で具体的に示 し ます。
例 5-4
call_itrap.f90
PROGRAM main
!$HP$ CHECK_OVERFLOW INTEGER ON
INTEGER :: i
ON INTEGER OVERFLOW CALL trap_oflow
! assign to i the biggest number it can hold
i = 2147483647
! now add 1
i = i + 1
PRINT *, i
END PROGRAM main
SUBROUTINE trap_oflow(n)
INTEGER :: n
! write error message to standard error
WRITE (7, *) 'integer overflow occurred, assigning 0 to result'
n = 0
END SUBROUTINE trap_oflow
次に、 コ マ ン ド 行 と 見本プ ロ グ ラ ム の実行結果を示 し ます。
$ f90 call_itrap.f90
$ a.out
integer overflow occurred, assigning 0 to result
0
ON 文を注釈行に し て、 指令を残す と 、 プ ロ グ ラ ムは手続 き ト レース バ ッ ク と コ ア ダ ンプ を実行
し て中断 し ます。 +check=all オプシ ョ ン を指定 し て コ ンパ イ ル し て も 同 じ 結果にな り ます。
162
第5章
ON 文の使用方法
Ctrl-C 割 り 込みの ト ラ ッ プ
Ctrl-C 割 り 込みの ト ラ ッ プ
Ctrl-C 割 り 込みは、 次の場合に発生 し ます。
•
プ ロ グ ラ ムの実行中ま たは入力待ち状態で、 割 り 込み コ ー ド を入力 し た と き
•
PAUSE 文の実行時
Ctrl-C 割 り 込みの ト ラ ッ プ手続 き には、 正式な引 き 数はあ り ません。 割 り 込み コ ー ド は、
HP-UX の stty(1) コ マ ン ド が intr パ ラ メ ー タ に定義 し た文字です。 intr のシ ス テ ムデフ ォ ル
ト は Ctrl-C です。
割 り 込みシ グナル 2 を処理す る には、 ON 文の Ctrl-C 形式を使用 し ます。 次の例では、 割 り 込み
が発生す る と 、 プ ロ グ ラ ムが ス テー タ ス情報を標準出力に出力 し 、 プ ロ グ ラ ム が引 き 続 き DO
ループ を実行中であ る こ と を確認で き ます。 プ ロ グ ラ ムは ON 文を使用 し て、 Ctrl-C 割 り 込みに
よ っ て ト ラ ッ プハン ド ラ status を呼び出す よ う に設定 し てい ます。
PROGRAM main
COMMON i
ON CONTROLC CALL status
DO i = 1, 100000
...
END DO
END
! Long computation
SUBROUTINE status
COMMON i
PRINT *, 'Currently on iteration ', i
END SUBROUTINE status
こ のプ ロ グ ラ ム を実行す る と 、 Ctrl-C 割 り 込みに よ っ て、 status ルーチンが呼び出 さ れ、 繰 り
返 し 数を出力 し ます。 その後、 プ ロ グ ラ ムは DO ループの実行を再開 し ます。
第5章
163
ON 文の使用方法
コ アダ ン プの許可
コ アダ ン プの許可
プ ロ グ ラ ムが ON 文を含み、 例外キー ワ ー ド で指定 し ていない例外 も 検出す る と 、 プ ロ グ ラ ムは
手続 き ト レース バ ッ ク と と も に中断 し ますが、 コ ア ダ ン プは出力 し ません。 ON 文を含んだプ ロ
グ ラ ム で 1 つ以上のシ グナルに コ ア ダ ン プ を許可す る には、 各シ グナルご と にプ ロ グ ラ ム を修正
す る 必要があ り ます。
た と えば、 浮動小数点例外を ON 文で処理 し 、 バ ス エ ラ ーな ど の他のシ グナルに対 し て コ ア ダ ン
プ を許可 し たい場合です。 次の見本プ ロ グ ラ ムは、 libU77 ラ イ ブ ラ リ の SIGNAL ルーチン を使
用 し て、 バ ス エ ラ ーシ グナルに対す る デフ ォ ル ト の動作を リ セ ッ ト し ます。 プ ロ グ ラ ムは ON 文
を使用 し て浮動小数点例外を処理 し てい ますが、 バ ス エ ラ ー発生時の コ ア ダ ン プ も 許可 し てい ま
す。
例 5-5
allow_core.f90
PROGRAM main
ON REAL OVERFLOW IGNORE
CALL take_err
END PROGRAM main
SUBROUTINE take_err
DOUBLE PRECISION :: d
POINTER (ip, d) ! Cray-style pointer
REAL :: x, y
INTEGER, PARAMETER :: sigbus=10, sigdfl=0
INTEGER :: sigrtn, SIGNAL
! Set the action for bus error to be the default (DUMP CORE),
!
overriding the action of issuing a procedure traceback
!
that is established by using the ON statement.
! To suppress the core dump and enable a procedure traceback,
!
comment out the next statement
sigrtn = SIGNAL(sigbus, 0, sigdfl)
x = 1.0E38
x = y * 10.0
! causes a real overflow
! Bus error is caused by the next statements
ip = MALLOC(40)
164
第5章
ON 文の使用方法
コ アダ ン プの許可
ip = ip + 4
! ip is now 4-byte aligned
d = 99.0
! bus error
END SUBROUTINE take_err
こ のプ ロ グ ラ ムは、 +U77 オプシ ョ ン を付けて コ ンパ イ ル し 、 libU77 ラ イ ブ ラ リ を リ ン ク す る 必
要があ り ます。 次に、 コ マ ン ド 行 と 見本プ ロ グ ラ ムの実行結果を示 し ます。
$ f90 +U77 allow_core.f90
$ a.out
Bus error(coredump)
$ ls core
core
第5章
165
ON 文の使用方法
コ アダ ン プの許可
166
第5章
6 パフ ォ ーマ ン スおよび最適化
本章では、 HP Fortran の各種機能を使用 し て、 プ ロ グ ラ ム を調整 し 、 最適なパフ ォ ーマ ン ス を
達成す る 方法について説明 し ます。 最 も 重要な機能は、 オプテ ィ マ イ ザです。 プ ロ グ ラ ム の コ ン
パ イ ル時に、 +On ( こ こ で n は、 プ ロ グ ラ ム に適用 さ れ る 最適化レベルを表 し ます )、 ま たはデ
フ ォ ル ト レベルの最適化 ( レベル 2) については -O オプシ ョ ン を指定 し て、 オプテ ィ マ イ ザを呼
び出 し ます。 -O オプシ ョ ンは、 POSIX 規格 と の互換性のために提供 さ れ る も ので、 +O2 オプ
シ ョ ン と 同 じ 機能を備え てい ます。
次の コ マ ン ド 行は、 デフ ォ ル ト レベルの最適化を使用 し て prog.f90 を コ ンパ イ ル し ます。
$ f90 -O prog.f90
ほ と ん ど のアプ リ ケーシ ョ ン の場合、 -O で有効な最適化が行われ ます。 し か し 、 アプ リ ケー
シ ョ ンに よ っ ては、 高い最適化レベルに よ っ て、 ま たはオプテ ィ マ イ ザのその他の機能を使用す
る こ と に よ っ て、 パフ ォ ーマ ン ス の著 し い向上を実現で き る も のがあ り ます。 本章では、 こ う し
た機能や次の項目について説明 し ます。
•
プ ロ フ ァ イ ラ の使用方法
•
最適化を制御す る オプシ ョ ン の使用方法
•
保守的な最適化 と 積極的な最適化の対比
•
HP Fortran プ ロ グ ラ ム のパ ラ レ ル化
•
ベ ク ト ル化
•
パフ ォ ーマ ン ス用の コ ー ド 生成の制御
HP-UX 上で実行す る 浮動小数点多用形のアプ リ ケーシ ョ ン で最高のパフ ォ ーマ ン ス を獲得す る
には、 『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照 し て く だ さ い。
第6章
167
パ フ ォ ーマ ン スお よび最適化
プ ロ フ ァ イ ラ の使用方法
プ ロ フ ァ イ ラの使用方法
プ ロ フ ァ イ ラ は、 実行時にプ ロ グ ラ ム を サン プ リ ン グす る ツールであ り 、 プ ロ グ ラ ム が ど こ で最
も 時間を費や し てい る か を判別す る こ と がで き ます。 プ ロ フ ァ イ ラ が提供す る デー タ を調べ る
と 、 パフ ォ ーマ ン ス を向上す る ためにプ ロ グ ラ ム の ど のセ ク シ ョ ン を再設計す る のか、 ま たは最
適化オプシ ョ ン に よ り プ ロ グ ラ ム を再 コ ンパ イ ルす る か ど う か を決め る こ と がで き ます。 た と え
ば、 プ ロ グ ラ ム に手続 き の呼び出 し を行っ てい る ループがあ り 、 プ ロ フ ァ イ リ ン グに よ り プ ロ グ
ラ ムがそのループ中で大半の時間を費や し てい る こ と が分か っ た場合、 手続 き 呼び出 し を イ ン ラ
イ ン展開す る こ と がで き ます。
次の項では、 UNIX プ ロ フ ァ イ ラ の gprof お よ び prof の他に、 HP Fortran でバン ド ル さ れて
い る HP Caliper パフ ォ ーマ ン ス解析ツールについて説明 し ます。
注記
147 ページの 「デバ ッ グ情報の削除」 の項で説明 し た よ う に、 HP Fortran で コ ン
パ イ ル し たすべてのプ ロ グ ラ ムには、 実行可能フ ァ イ ル中にシ ン ボルテーブル情
報が格納 さ れてい ます。 ただ し 、 +strip オプシ ョ ン で コ ンパ イ ルをす る か、 ま た
は strip ユーテ ィ リ テ ィ でシ ン ボルテーブルを削除 し た場合を除 き ます。 プ ロ
フ ァ イ リ ン グ ツールを使用す る には、 こ の情報が実行可能フ ァ イ ル中に存在 し な
ければな り ません。
HP Caliper
HP Caliper は コ ンパ イ ラ と 協調 し て、 プ ロ フ ァ イ ルベース の最適化 (PBO: Profile Based
Optimization) を行い ます。
コ ンパ イ ラ を +Oprofile=collect オプシ ョ ン で実行す る と 、 HP Caliper がバ ッ ク グ ラ ウ ン ド
で実行 さ れ、 アプ リ ケーシ ョ ン全体のプ ロ フ ァ イ ル情報が収集 さ れます。 こ れは、 HP PA-RISC
での +I オプシ ョ ン と 等価です。
コ ンパイ ラ か ら HP Caliper を起動 し て プ ロ グ ラ ムを最適化する
HP Caliper を使用す る 最 も 簡単な方法は、 PBO モー ド を使用 し て フ ロ ーデー タ フ ァ イ ルを作成
す る こ と です。 以降の最適化で、 コ ンパ イ ラ が こ の フ ァ イ ルを使用す る よ う にで き ます。
手順
1. +Oprofile=collect オプシ ョ ン でプ ロ グ ラ ム を コ ンパ イ ル し ます。
/opt/ansic/bin/cc -Aa +O3 -o program +Oprofile=collect program.c
ロ ーダーはプ ロ グ ラ ムに、 自動的に HP Caliper を起動す る よ う ラ ン タ イ ム フ ラ グ を
設定 し ます。
168
第6章
パ フ ォ ーマ ン スおよび最適化
プ ロ フ ァ イ ラ の使用方法
HP Caliper は、 任意の コ ンパ イ ラ オプシ ョ ン で作成 し たプ ロ グ ラ ム をサポー ト し ま
す。 ただ し 、 +Oprofile=collect オプシ ョ ン を使用 し た場合、 コ ンパ イ ラ はプ ロ グ ラ
ムの性能を完全に計測す る ため、 +01 の最適化を強制的に実行 し ます。
手順
2. プ ロ グ ラ ム を実行 し て、 フ ロ ーデー タ フ ァ イ ルを作成 し ます。
program [program_arguments]
HP Caliper は自動的に実行 さ れ、 生成 し た フ ロ ーデー タ 情報を保存す る ための フ ァ イ
ルを、 flow.data と い う 名前で現在のデ ィ レ ク ト リ に作成 し ます。
こ の手順を、 program_arguments の値を変更 し て何度 も 繰 り 返 し 、 flow.data フ ァ
イ ルにプ ロ フ ァ イ ル情報を集約 し て、 プ ロ グ ラ ムの最適化を改善 し ます。
プ ロ グ ラ ム を実行 し た時、 flow.data フ ァ イ ルが現在のデ ィ レ ク ト リ にすでにあ る 場
合、 HP Caliper はフ ァ イ ルに結果を追加 し てい き ます。 デ ィ レ ク ト リ を変更 し てプ ロ
グ ラ ム を何度 も 実行す る と 、 HP Caliper は別々の flow.data フ ァ イ ルを それぞれの
デ ィ レ ク ト リ に作成 し ます。 フ ァ イ ルは、 fdm(1) ユーテ ィ リ テ ィ プ ロ グ ラ ム を使っ
て結合で き ます。 こ れは、 HP C、 HP aC++、 Fortran 90 コ ンパ イ ラ にバン ド ル さ れ
てい ます。
PBO デー タ を収集す る 場合は、 プ ロ グ ラ ムが実際に使用 さ れ る 場面に近いシナ リ オ を
使用す る と 、 実際に使用 さ れ る 状態に適 し た最適化が行われ ます。
ソ ース フ ァ イ ルを変更 し た場合には、 プ ロ グ ラ ムの PBO デー タ を収集す る 前に、
flow.data フ ァ イ ルを削除 し ます。
手順
3. 次に再 コ ンパ イ ルす る 際には +Oprofile=use オプシ ョ ン を指定 し 、 flow.data フ ァ
イ ルを コ ンパ イ ラ の入力 と し て使用 し ます。
/opt/ansic/bin/cc -Aa +O3 -o program +Oprofile=use program.c
コ ンパ イ ラ は HP Caliper の情報を使っ て、 プ ロ グ ラ ム最適化の手がか り と し ます。
プ ロ フ ァ イ ルベース の最適化の効果は、 アプ リ ケーシ ョ ン に よ っ て異な る こ と に注意 し て く だ さ
い。 プ ロ グ ラ ム に よ っ て、 改善 さ れない も のや、 劇的に改善す る も のがあ り ます。
プ ロ グ ラ ムの性能の比較
HP Caliper には、 PBO に よ る 結果を明示的に見 る こ と がで き る 計測機能 も あ り ます。
た と えば、 性能比較の手順は次の よ う にな り ます。
1. +Oprofile=collect オプシ ョ ン を指定 し てプ ロ グ ラ ム を コ ンパ イ ル し 、 最適化す る 実行可
能フ ァ イ ルを作成 し ます。
第6章
169
パ フ ォ ーマ ン スお よび最適化
プ ロ フ ァ イ ラ の使用方法
2. プ ロ グ ラ ム を実行 し てプ ロ フ ァ イ ルデー タ フ ァ イ ルを作成 し ます。 代表的なプ ロ フ ァ イ ル
デー タ を収集す る ため、 で き る かぎ り 多 く のシナ リ オ を使用 し ます。
3. プ ロ グ ラ ム を、 +O3 で コ ンパ イ ル し 、 完全に最適化 し た場合 と の比較に使用す る 、 基準の実
行可能フ ァ イ ルを作成 し ます。
4. +O3 で作成 し た実行可能フ ァ イ ルに、total_cpu な ど の設定フ ァ イ ルを使用 し て HP Caliper
を実行 し 、 性能を計測 し ます。
5. 手順 2 で収集 し たプ ロ フ ァ イ ル デー タ を入力 と し て使用 し 、+O3 の最適化 と +Oprofile=use
オプシ ョ ン でプ ロ グ ラ ム を コ ンパ イ ル し ます。
6. HP Caliper を、手順 5 の完全に最適化 し た実行可能フ ァ イ ルで、手順 4 と 同 じ 設定フ ァ イ ルを
使用 し て実行 し 、 その レ ポー ト を、 手順 4 の レ ポー ト の結果 と 比較 し ます。
デー タ 収集を制御する オプ シ ョ ンの使用
プ ロ グ ラ ムのプ ロ フ ァ イ ル情報を収集す る 方法を制御す る ための、 様々なオプシ ョ ン が用意 さ れ
てい ます。
た と えば、 次のオプシ ョ ンが使用で き ます。
•
特定の ロ ー ド モジ ュ ールの情報を収集す る 。
•
プ ロ フ ァ イ ルを得 る 必要のない ロ ー ド モジ ュ ールを対象か ら はず し て、 HP Caliper の性能を
改善す る 。
•
特定のプ ロ セ ス の情報を収集す る 。
HP Caliper のデー タ 収集オプシ ョ ンは、 環境変数 CALIPER_OPTS に指定 し ます。 Makefile やビ
ル ド 用ス ク リ プ ト で、 使用 し たいオプシ ョ ン を CALIPER_OPTS に設定 し ます。 コ ンパ イ ラ か ら 起
動 さ れ る と 、 HP Caliper は こ のオプシ ョ ン を使用 し ます。
HP Caliper が最適化情報を収集す る 方法を制御す る 例を次に挙げ ます。
特定のモ ジ ュ ールを計測の対象外にする HP Caliper が測定す る ロ ー ド モジ ュ ールの数を減 ら す
こ と に よ り 、 プ ロ グ ラ ム を計測す る 際の リ ソ ース要求を軽減 し 、 時間を短縮す る こ と がで き ま
す。
た と えば、 変更で き ないシ ス テ ム ラ イ ブ ラ リ 使用 し てい る 場合は、 それを明示的に除外 し ます。
複数のモジ ュ ールを除外す る には、 名前を コ ロ ン で区切っ て指定 し ます。 た と えばつぎの よ う に
な り ます。
--module-exclude=libc:libcurses:liboci
同 じ よ う に、 デ ィ レ ク ト リ 全体を除外す る こ と も で き ます。
170
第6章
パ フ ォ ーマ ン スおよび最適化
プ ロ フ ァ イ ラ の使用方法
--module-exclude=/usr/lib/
計測対象を特定のロー ド モ ジ ュ ールに限定する 大規模で複雑なプ ロ グ ラ ム では、 特定のプ ロ グ
ラ ムや共有 ラ イ ブ ラ リ だけ を測定 し たい場合があ り ます。
HP Caliper では、 計測す る フ ァ イ ルを指定す る こ と がで き ます。
--module-default=none を指定す る と 、 HP Caliper は --module-include の一覧に指定 さ れ
た フ ァ イ ルのみを計測 し ます。
た と えば、 wordplay のみを計測 し たい場合には、 次の設定を使用 し ます。
--module-default=none --module-include=wordplay
PBO の フ ァ イル名 と 場所を指定する
HP Caliper は、 プ ロ フ ァ イ ルベース の最適化を実行す る 際、 フ ァ イ ルを 2 つ作成 し ます。
flow.data
プ ロ フ ァ イ ル デー タ を保存す る フ ァ イ ル。
flow.log
診断 メ ッ セージ を記録す る フ ァ イ ル。
環境変数 FLOW_DATA と FLOW_LOG で、 フ ァ イ ル名を指定で き ます。
FLOW_DATA 変数に既存の フ ァ イ ルを指定 し てプ ロ グ ラ ム を実行す る と 、 HP Caliper は、 実行結
果を既存の フ ァ イ ルに追加 し ます。
注意
別のプ ロ グ ラ ム のプ ロ フ ァ イ ル情報を、 1 つの flow.data フ ァ イ ルに統合す る こ
と はで き ません。 複数のプ ロ グ ラ ム のプ ロ フ ァ イ ル情報を統合す る と 、
flow.data フ ァ イ ルが破損 し ます。 こ の フ ァ イ ルは、 1 つのプ ロ グ ラ ムに異な る
入力を設定 し て複数回実行 し た場合のデー タ を保存 し て、 最適化の結果を改善で
き る よ う 、 設計 さ れてい ます。
gprof
gprof プ ロ フ ァ イ ラ を使用す る と 、 最 も 頻繁に呼び出 さ れ る 副プ ロ グ ラ ム と 、 各副プ ロ グ ラ ムに
費や さ れ る 時間を確認で き ます。 gprof を使用す る には、 次の と お り 行い ます。
1. +gprof オプシ ョ ン でプ ロ グ ラ ム を コ ンパ イ ル し ます。 た と えば、 次の と お り です。
$ f90 -o prog +gprof prog.f90
2. プ ロ グ ラ ム を実行 し ます。 現在のデ ィ レ ク ト リ に フ ァ イ ル gmon.out が作成 さ れ ます。 た と
えば、 次の と お り です。
第6章
171
パ フ ォ ーマ ン スお よび最適化
プ ロ フ ァ イ ラ の使用方法
$ prog
$ ls gmon.out
gmon.out
3. プ ロ グ ラ ム名を引 き 数 と し て指定 し 、 gprof を実行 し ます。標準出力に 2 つのテーブルが表示
さ れます。 フ ラ ッ ト プ ロ フ ァ イ ル と 呼び出 し グ ラ フ プ ロ フ ァ イ ルです。 こ れ ら のテーブルは
極めて大 き いため、 次の よ う に、 出力を gprof か ら リ ダ イ レ ク ト す る こ と も で き ます。
$ gprof prog >gprof.out
フ ラ ッ ト プ ロ フ ァ イ ル では、 各副プ ロ グ ラ ムが呼び出 さ れた回数お よ び各副プ ロ グ ラ ムが実
行 し た時間の割合が リ ス ト さ れます。 呼び出 し グ ラ フ プ ロ フ ァ イ ル には、 呼び出 し グ ラ フ中
の関数の イ ンデ ッ ク ス、 ルーチン と その子孫別に集計 し たプ ロ グ ラ ム合計時間の割合、 お よ
びルーチン自身で費や さ れた秒数な ど の情報が含ま れ ます。
4. い っ たん gprof が終了すれば、エデ ィ タ を使用 し て出力テーブルを表示す る こ と がで き ます。
gprof についての詳細は、 gprof(1) のマ ンページ を参照 し て く だ さ い。
prof
prof プ ロ フ ァ イ ラ は、 プ ロ フ ァ イ リ ン グに も 使用す る こ と がで き ます。 gprof プ ロ フ ァ イ ラ と
は違っ て、 prof は呼び出 し グ ラ フ プ ロ フ ァ イ ルを生成 し ません。 prof を使用す る には、 次の と
お り 行い ます。
1. +prof オプシ ョ ン でプ ロ グ ラ ム を コ ンパ イ ル し ます。 た と えば、 次の と お り です。
$ f90 -o prog +prof prog.f90
2. プ ロ グ ラ ム を実行 し ます。 こ れで、 現在のデ ィ レ ク ト リ に mon.out と い う 名前の フ ァ イ ルが
作成 さ れ ます。 た と えば、 次の と お り です。
$ prog
$ ls mon.out
mon.out
3. 次の よ う に、 プ ロ グ ラ ム名を引 き 数 と し て与え て、 prof を実行 し ます。
$ prof prog
prof は、 各ルーチン で費や さ れた時間を示す リ ス ト を標準出力に作成 し ます。
prof についての詳細は、 prof(1) のマ ンページ を参照 し て く だ さ い。
172
第6章
パ フ ォ ーマ ン スおよび最適化
最適化を制御する オプ シ ョ ンの使用方法
最適化を制御する オプ シ ョ ンの使用方法
HP Fortran には、 最適化を制御す る ための豊富な コ マ ン ド 行オプシ ョ ン セ ッ ト があ り ます。 ほ
と ん ど のアプ リ ケーシ ョ ンについては、 デフ ォ ル ト レベルの最適化を使用可能にす る -O での最
適化を推奨 し ます ( デフ ォ ル ト レベルの最適化については、 表 6-1 の 1 列目の +O2 を参照 )。
+Oopt-level オプシ ョ ン で最適化の レベルを変更で き ます。 +Ooptimaization オプシ ョ ン を使
用 し て各レベルで使用可能な最適化の種類を制御す る こ と がで き ます。
次の項では、 +Oopt-level お よ び +Ooptimaization オプシ ョ ン の使用方法を説明 し ます。 最
適化オプシ ョ ン についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
最適化レベルの設定に +O を使用する
HP Fortran は、 4 つの レベルの最適化を提供 し てい ます。 各高水準は、 低水準の スーパーセ ッ
ト にな り ます。 レベル 4 は最高水準で、 プ ロ グ ラ ム パフ ォ ーマ ン ス を著 し く 向上 さ せ る こ と が
で き ます。 レベル 2 は、 デフ ォ ル ト レベルの最適化です。
+Oopt-level オプシ ョ ン で コ ンパ イ ルす る こ と で、 最適化を行い ます。 こ こ で opt-level は、
範囲 0 ~ 4 の整数です。 次の コ マ ン ド 行では、 最高水準のオプテ ィ マ イ ザが呼び出 さ れ ます。
$ f90 +O4 file.f90
-O オプシ ョ ン を指定す る こ と に よ り 、 レベル 2 ( デフ ォ ル ト レベル ) の最適化を行 う こ と がで き
ます。
表 6-1 は、 各レベルを要約 し 、 その レベルの最適化を行 う オプシ ョ ン、 利点、 問題点お よ び推奨
方法を示 し ます。 各レベルの特定の最適化については、 『HP PA-RISC Compiler Optimization
Technology White Paper』 を参照 し て く だ さ い。 こ のマニ ュ アルの PostScript バージ ョ ンは、
フ ァ イ ル /opt/langtools/newconfig/white_papers/optimize.ps です。
注記
レベル 2 ま での最適化 さ れたプ ロ グ ラ ムはデバ ッ グで き ます。 最適化プ ロ グ ラ ム
のデバ ッ グ を準備す る には、 次の コ マ ン ド 行を使用 し ます。
$ f90 -g +Oopt-level prog.f90
第6章
173
パ フ ォ ーマ ン スお よび最適化
最適化を制御する オプ シ ョ ンの使用方法
こ こ で opt-level は、 範囲 0 ~ 2 の整数です。 -g オプシ ョ ン を よ り 高い最適化
レベルで使用す る と 、 コ ンパ イ ラ は レベルを 2 に下げ、 デバ ッ グ用に コ ンパ イ ル
し ます。
表 6-1 最適化レ ベル
オプ シ ョ ン
実行 さ れる最適化
特長
問題点
推奨使用
+O0,
デフ ォ ル ト
定数の畳み込み と 条件
判定の部分評価。
最速の コ ンパ
イ ル、 デバ ッ
ガオプシ ョ ン
-g と の互換。
最適化を ほ と ん ど
行わない。
プ ロ グ ラ ム開発
中。
+O1
レベル 0 の最適化、 分
岐の最適化、 デ ッ ド
コ ー ド の除去、 レ ジ ス
タ の効率的な使用、 命
令の ス ケ ジ ュ ー リ ン
グ、 ピープホールの最
適化。
レベル 0 よ り
プ ロ グ ラ ムの
生成が、 レベ
ル 2 よ り コン
パ イ ルが速い。
デバ ッ ガオプ
シ ョ ン -g と の
互換。
レベル 0 よ り コ ン
パ イ ルが遅い。
プ ロ グ ラ ム開発
中。
+O2, -O
デフ ォ ル ト レベルの最
適化、 レベル 1 の最適
化、 カ ラ ー リ ン グ レ ジ
ス タ 割 り 付け、 誘導変
数除去 と 強度の縮小、
共通式の除去、 不変式
のループ外への移動、
ス ト ア / コ ピーの最適
化、 未使用定義の除
去、 ソ フ ト ウ ェ ア パ
イ プ ラ イ ニ ン グ、 レ ジ
ス タ の再関連付け。
レベル 1 よ り
パフ ォ ーマ ン
ス の著 し い向
上が可能。 デ
バ ッ ガオプ
シ ョ ン -g で動
作。
レベル 0 お よ び 1
よ り コ ンパ イ ルが
遅い。
プ ロ グ ラ ム開発
中お よ び製品
バージ ョ ン の構
築時。 浮動小数
点の大 き な配列
で算術演算を実
行す る ループの
最適化時に特に
有効。
174
第6章
パ フ ォ ーマ ン スおよび最適化
最適化を制御する オプ シ ョ ンの使用方法
表 6-1 最適化レ ベル ( 続き )
オプ シ ョ ン
実行 さ れる最適化
特長
問題点
推奨使用
+O3
レベル 2 の最適化、
ループ変形、 パ ラ レ ル
化、 ベ ク ト ル化、 ク
ロ ーン生成、 フ ァ イ ル
内の イ ン ラ イ ン展開。
あ る 種の最適化には、
追加オプシ ョ ン が必要
にな る こ と も あ り ま
す。 175 ページの 「最
適化オプシ ョ ン を使用
す る 」 の項を参照 し て
く だ さ い。
C レベル 2 よ
り 、 パフ ォ ー
マ ン ス の著 し
い向上が可能。
コ ンパ イ ルが低水
準 よ り 遅い。 オブ
ジ ェ ク ト コー ド
サ イ ズの拡張。 デ
バ ッ ガオプシ ョ ン
-g と の非互換。
製品バージ ョ ン
の構築時。 頻繁
に実行す る ルー
プお よ び副プ ロ
グ ラ ムが入っ て
い る ソ ース フ ァ
イ ル上で使用す
る と き に特に有
効。
+O4
レベル 3 の最適化が
+O4 で コ ンパ イ ル さ れ
たすべてのプ ロ グ ラ ム
フ ァ イ ルに適用。
最高レベルの
最適化を提供。
レベル 3 よ り
パフ ォ ーマ ン
ス の著 し い向
上が可能。
大容量のシ ス テ ム
リ ソ ース を使用。
リ ン ク 時間 と オブ
ジ ェ ク ト コー ド
サ イ ズが大 き く な
る 。 デバ ッ ガオプ
シ ョ ン -g と の非
互換性。
製品バージ ョ ン
の構築時。 頻繁
に実行す る ルー
プお よ び副プ ロ
グ ラ ムが入っ て
い る ソ ース フ ァ
イ ル上で使用す
る と き に特に有
効。
最適化オプ シ ョ ン を使用する
+Ooptiomaization オプシ ョ ン を使用す る と 、 各レベルでプ ロ グ ラ ムに適用 さ れ る 最適化の種
類を制御す る こ と がで き ます。 表 6-2 お よ び表 6-3 では、 オプシ ョ ン を リ ス ト し てい ます。 各表
の 1 列目には各オプシ ョ ン を リ ス ト し 、 2 列目にはオプシ ョ ン が使用可能な最適化レベル、 3 列
目にはオプシ ョ ンに よ り 行われ る 機能を示 し てい ます。 +Oall を除いた こ れ ら の任意のオプシ ョ
ン を使用す る と 、 +On オプシ ョ ン も 使用 し て、 表の 2 列目に リ ス ト さ れてい る 最適化レベルを指
定 し なければな り ません。 +Oall オプシ ョ ンは、 自動的に最高水準でオプテ ィ マ イ ザを呼び出 し
ます。
表 6-2 には、 「パ ッ ケージ」 オプシ ョ ンが リ ス ト さ れてい ます。 こ れ ら のオプシ ョ ンは、 コ ー ド
サ イ ズ を拡張 さ せない最適化な ど、 関連す る 最適化セ ッ ト を使用可能ま たは使用不能に し ます。
表 6-3 には、 特定の最適化を使用可能ま たは使用不能にす る オプシ ョ ン を リ ス ト し てい ます。
第6章
175
パ フ ォ ーマ ン スお よび最適化
最適化を制御する オプ シ ョ ンの使用方法
ど ち ら の表のオプシ ョ ン も 、 注記 さ れていない限 り 同 じ コ マ ン ド 行で組み合わせ る こ と がで き ま
す。 た と えば、 次の コ マ ン ド 行は、 コ ー ド サ イ ズ を拡張 さ せない レベル 2 の積極的な最適化を要
求 し ます。
$ f90 +02 +Oaggressive +Osize prog.f90
ほ と ん どすべての最適化オプシ ョ ン を使用 し て、 最適化ま たは最適化のパ ッ ケージ を使用可能ま
たは使用不能にす る こ と がで き ます。 た と えば、 次の コ マ ン ド 行は、 結果的に切 り 捨て エ ラ ーに
な ら ない レベル 4 の積極的な最適化を要求 し ます。
$ f90 +O4 +Oaggressive +Ofltacc prog.f90
すべての最適化オプシ ョ ンについては、 f90.1 のマ ンページ を参照 し て く だ さ い。
表 6-2 実装最適化オプ シ ョ ン
オプ シ ョ ン
レ ベル
機能
+O[no]aggressive
+O2 以上
規格合致プ ロ グ ラ ムのパフ ォ ーマ ン ス を著 し く 向上可
能な最適化を使用可能 [ ま たは、 使用不能 ] に し ます。
デフ ォ ル ト は、 +Onoaggressive です。 こ のオプシ ョ
ン についての詳細は、 180 ページの 「保守的な最適化
と 積極的な最適化の対比」 の項を参照 し て く だ さ い。
+O[no]all
最高水準
最高水準の最適化を使用可能 [ ま たは、 使用不能 ] に
し ます。 デフ ォ ル ト は、 +Onoall です。
+O[no]autopar
ループパ ラ ラ イ ザが安全で有効であ る と 認識 し たルー
プ を自動的にパ ラ レ ル化 し ます。 [ パ ラ レ ル化 し ませ
ん。 ] デフ ォ ル ト は +Onoautopar です。 +Onoautopar
オプシ ョ ンは最適化レベル +O3 以上のプ ロ グ ラ ム で使
用で き ます。
コ マ ン ド ラ イ ン上で +Oopenmd と +Oautopar オプ
シ ョ ン を両方 と も 指定 し た場合、 OpenMP 指令は
+Oautopar オプシ ョ ン よ り 優先 さ れ ます。 コ ンパ イ ラ
は OpenMP 指令が制御 し ていない コ ー ド のループの
みを自動パ ラ レル化 し ます。
+Oautopar を使用 し てプ ロ グ ラ ム を コ ンパ イ ルす る に
は、 libcps、 libomp お よ び libpthreads の実行時
サポー ト ラ イ ブ ラ リ が、 コ ンパ イ ル時お よ び実行時に
必要です。 こ の機能は Integrity シ ス テ ムお よ び HP
9000 シ ス テ ム上で使用で き ます。
176
第6章
パ フ ォ ーマ ン スおよび最適化
最適化を制御する オプ シ ョ ンの使用方法
表 6-2 実装最適化オプ シ ョ ン ( 続き )
オプ シ ョ ン
レ ベル
機能
+O[no]conservative
+O2 以上
Fortran 90 規格に厳密に合致す る こ と を仮定 し てい る
最適化を抑止 し ます [ ま たは、 抑止 し ません ] 。 デ
フ ォ ル ト は、 +Onoconservative です。 こ のオプシ ョ
ン についての詳細は、 180 ページの 「保守的な最適化
と 積極的な最適化の対比」 の項を参照 し て く だ さ い。
+O[no]limit
+O2 以上
シ ス テ ム リ ソ ース に対 し て大 き な負担を かけない最適
化を使用可能 [ ま たは、 使用不能 ] に し ます。 デフ ォ
ル ト は、 +Onolimit です。
+O[no]size
+O2 以上
コ ー ド サ イ ズ を著 し く 拡張 さ せない最適化を使用可能
[ ま たは、 使用不能 ] に し ます。 デフ ォ ル ト は、
+Onosize です。
表 6-3 最適化オプ シ ョ ン を微調整する
オプ シ ョ ン
レ ベル
機能
+O[no]cache_pad_co
mmon
+O3 以上
キ ャ ッ シ ュ の衝突を避け る ために、 共通ブ ロ ッ ク を補
い ます [ ま たは、 補い ません ]。 デフ ォ ル ト は、
+Onocache_pad_common です。
+O[no]dataprefetch
+O2 以上
メ モ リ か ら デー タ キ ャ ッ シ ュ へデー タ を明示的にプ リ
フ ェ ッ チす る ために、 一番内側のループ中に命令を挿
入 し ます [ ま たは、 挿入 し ません ]。 デフ ォ ル ト は、
+Onodataprefetch です。
+O[no]entrysched
全レベル
入口 コ ー ド お よ び出口 コ ー ド で命令の ス ケ ジ ュ ー リ ン
グ を実行 し ます [ ま たは、 実行 し ません ]。 デフ ォ ル ト
は、 +Onoentrysched です。
+O[no]fastaccess
全レベル
大域デー タ の高速ア ク セ ス を使用可能 [ ま たは、 使用
不能 ] に し ます。 デフ ォ ル ト は、 レベル 1, 2, 3 では
+Onofastaccess であ り 、 レベル 4 では
+Ofastaccess です。
第6章
177
パ フ ォ ーマ ン スお よび最適化
最適化を制御する オプ シ ョ ンの使用方法
表 6-3 最適化オプ シ ョ ン を微調整する ( 続き )
オプ シ ョ ン
レ ベル
機能
+O[no]fltacc
+O2 以上
数値の変わ る 可能性のあ る 浮動小数点の最適化を使用
可能 [ ま たは、 使用不能 ] に し ます。 デフ ォ ル ト では、
オプテ ィ マ イ ザは こ の よ う な最適化を実行 し ません。
こ のオプシ ョ ン がプ ロ グ ラ ム に与え る 影響については、
『HP-UX フ ロ ーテ ィ ン グ ・ ポ イ ン ト ・ ガ イ ド 』 を参照
し て く だ さ い。
+O[no]info
全レベル
最適化プ ロ セ ス に関す る 情報を表示 し ます [ ま たは、
表示 し ません ]。 こ のオプシ ョ ンは、 レベル 3 以上で
最 も 有効です。 デフ ォ ル ト は、 +Onoinfo です。
+O[no]initcheck
+O2 以上
初期化 さ れていない任意の局所変数、 ス カ ラ 変数、 自
動割 り 付け変数の初期化を使用可能 [ ま たは、 使用不
能 ] に し ます。 デフ ォ ル ト では、 変数がその使用に至
る すべてのパ ス に関 し て初期化 さ れていない場合、 初
期化 さ れます。 こ のオプシ ョ ンについての詳細は、
261 ページの 「初期化 さ れていない変数」 の項を参照
し て く だ さ い。
+O[no]inline
+O3 以上
イ ン ラ イ ン展開を使用可能 [ ま たは、 使用不能 ] に し
ます。 デフ ォ ル ト は、 +Oinline です。
+Oinline_budget=n
+O3 以上
n で指定 さ れた よ う に、 よ り 積極的な イ ン ラ イ ン展開
を実行 し ます。 デフ ォ ル ト は、 +Oinline_budget=100
です。
+O[no]libcalls
全レベル
特定の組み込み関数を ミ リ コ ー ド バージ ョ ンに置 き 換
え ます [ ま たは、 置 き 換え ません ]。 デフ ォ ル ト は、
+Olibcalls です。
+O[no]loop_unroll=
n
+O2 以上
n の係数でプ ロ グ ラ ム のループ を ア ン ロ ール し ます
[ ま たは、 ア ン ロ ール し ません ]。 デフ ォ ル ト は、
+Oloop_unroll=4 です。
+O[no]moveflops
+O2 以上
条件付 き 浮動小数点命令のループ外への移動を使用可
能 [ ま たは、 使用不能 ] に し ます。 デフ ォ ル ト は、
+Omoveflops です。
178
第6章
パ フ ォ ーマ ン スおよび最適化
最適化を制御する オプ シ ョ ンの使用方法
表 6-3 最適化オプ シ ョ ン を微調整する ( 続き )
オプ シ ョ ン
レ ベル
+O3 以上
機能
パ ラ レル実行の対象ループ を変形 し ます [ ま たは、 変
形 し ません ]。 デフ ォ ル ト は、 +Onoparallel です。
こ のオプシ ョ ンは HP 9000 シ ス テ ム上でのみ使用で き
ます。 Integrity シ ス テ ム上では、 パ ラ レル化ループの
代わ り に +Oautopar オプシ ョ ン を使用で き ます。
+O[no]parmsoverlap
+O2 以上
引 き 数が同 じ メ モ リ 位置を引用す る と 仮定す る [ ま た
は、 仮定 し ない ] 最適化を抑止 し ます。 デフ ォ ル ト は、
+Onoparmsoverlap です。
+O[no]pipeline
+O2 以上
ソ フ ト ウ ェ ア パ イ プ ラ イ ニ ン グ を使用可能 [ ま たは、
使用不能 ] に し ます。 デフ ォ ル ト は、 +Opipeline で
す。
+O[no]procelim
全レベル
実行可能プ ロ グ ラ ム か ら 引用 さ れていない手続 き を削
除 し ます [ ま たは、 削除 し ません ]。 デフ ォ ル ト は、 レ
ベル 0 ~ 3 では +Onoprocelim であ り 、 レベル 4 では
+Oprocelim です。
+O[no]regreassoc
+O2 以上
レ ジ ス タ 割 り 付け を使用可能 [ ま たは、 使用不能 ] に
し ます。 デフ ォ ル ト は、 +Oregreassoc です。
+O[no]vectorize
+O3 以上
対象ループ を数学 ラ イ ブ ラ リ への呼び出 し と 置 き 換え
ます [ ま たは、 置 き 換え ません ]。 詳細は、 187 ページ
の 「+Ovectorize オプシ ョ ン を使用す る 」 の項を参照
し て く だ さ い。 デフ ォ ル ト は、 +Onovectorize です。
第6章
179
パ フ ォ ーマ ン スお よび最適化
保守的な最適化 と 積極的な最適化の対比
保守的な最適化 と 積極的な最適化の対比
最適化レベル 2 以上では、 オプテ ィ マ イ ザは最適化 し てい る プ ロ グ ラ ム に関 し てい く つ も の仮定
を行っ てい ます。 た と えば、 命令の ス ケ ジ ュ ー リ ン グ を改善す る ために式の順序を変更 し て も そ
の結果は変わ ら ない こ と です。 一般には、 こ れ ら の仮定は、 タ ーゲ ッ ト プ ロ グ ラ ム が Fortran 90
規格に どれだけ密接に合致 し てい る かに関連 し ます。 規格に合致 し てい る プ ロ グ ラ ム の場合、 オ
プテ ィ マ イ ザはパフ ォ ーマ ン ス を著 し く 向上 さ せ る 最適化を適用 し て も 安全です。 規格に合致 し
ていないプ ロ グ ラ ムについては、 同 じ 最適化に よ っ て、 プ ロ グ ラ マーには受け入れ ら れない よ う
なプ ロ グ ラ ムの結果ま たは動作が も た ら さ れ る こ と があ り ます。
+Oconservative オプシ ョ ンお よ び +Oaggressive オプシ ョ ン を使用す る と 、 オプテ ィ マ イ ザ
が ど の最適化を プ ロ グ ラ ムに適用で き 、 ど の最適化を適用で き ないかについてのオプテ ィ マ イ ザ
の仮定を設定す る こ と がで き ます。 各オプシ ョ ンは、 タ ーゲ ッ ト プ ロ グ ラ ム の コ ーデ ィ ン グ ス タ
イ ルに従っ て、 安全 と パフ ォ ーマ ン ス のバ ラ ン ス を と る 微調整オプシ ョ ンのサブセ ッ ト を有効に
し ます。 最適化レベル 2 以上では、 いずれかのオプシ ョ ン を使用す る こ と がで き ます。
注記
+Oaggressive お よ び +Oconservative は非互換であ り 、 同 じ コ マ ン ド 行に書 く
こ と はで き ません。
表 6-4 には、 +Oconservative ま たは +Oaggressive のオプシ ョ ン を付けて、 ま たはど ち ら の
オプシ ョ ン も 付けずに ( デフ ォ ル ト ) コ ンパ イ ル し た と き に、 オプテ ィ マ イ ザが行 う プ ロ グ ラ ム
に関す る 仮定を リ ス ト し ます。 表では、 +Oconservative お よ び +Oaggressive に よ っ て呼び出
さ れ る 微調整オプシ ョ ン も リ ス ト し てい ます。 デフ ォ ル ト 用に リ ス ト さ れてい る オプシ ョ ンは、
+Oconservative お よ び +Oaggressive に よ っ て有効にな る オプシ ョ ンのサブセ ッ ト です。 3 列
目に リ ス ト し てい る 微調整オプシ ョ ンについては、 表 6-3 を参照 し て く だ さ い。
表 6-4 保守的な最適化、 積極的な最適化、 デ フ ォル ト の最適化
指定オプ シ ョ ン
+Onoconservative
+Onoaggressive
( デフ ォ ル ト )
仮定
•
規格に合致 し てい ます。
有効にな る オプ シ ョ ン
+Onoentrysched
+Omoveflops
+Onoparmsoverlap
+Onovectorize
180
第6章
パ フ ォ ーマ ン スおよび最適化
保守的な最適化 と 積極的な最適化の対比
表 6-4 保守的な最適化、 積極的な最適化、 デ フ ォル ト の最適化 ( 続き )
指定オプ シ ョ ン
+Oconservative
+Oaggressive
第6章
仮定
有効にな る オプ シ ョ ン
•
規格に定め ら れてい ません。
+Ofltacc
•
丸め誤差に敏感です。
+Onomoveflops
•
指定 さ れた順序で評価 さ れなければな
ら ない浮動小数点式を含みます。
+Oparmsoverlap
•
手続 き の引 き 数は重複で き ます。
•
規格に合致 し てい ます。
+Oentrysched
•
最適化のために再順序付け を許す浮動
小数点式を含みます。
+Onofltacc
•
初期化 さ れていない変数は含みません。
+Onoinitcheck
+Ovectorize
181
パ フ ォ ーマ ン スお よび最適化
HP Fortran プ ロ グ ラ ムのパ ラ レル化
HP Fortran プ ロ グ ラ ムのパラ レル化
次の項では、 パ ラ レル実行用 HP Fortran プ ロ グ ラ ム の準備時 と コ ンパ イ ル時の +Oparallel オ
プシ ョ ン と パ ラ レ ル指令の使用方法について説明 し ます。 後の項では、 コ ンパ イ ラ がパ ラ レル化
を実行 し ない場合の理由について も 説明 し ます。 最後の項では、 パ ラ レル実行プ ロ グ ラ ム に特有
な実行時の警告 と エ ラ ー メ ッ セージについて説明 し ます。
+Oparallel オプシ ョ ン については、 「最適化オプシ ョ ン の微調整」 を参照 し て く だ さ い。
注記
HP Fortran バージ ョ ン 3.2 以降では、 Integrity シ ス テ ム上で +Oparallel オプ
シ ョ ン を使用で き ませんが、 代わ り に +Oautopar オプシ ョ ン を使用で き ます。
パラ レル実行用のコ ンパイル
次の コ マ ン ド 行は、 x.f90, y.f90, お よ び z.f90 の 3 つの ソ ース フ ァ イ ルを ( リ ン ク な し で ) コ
ンパ イ ル し ます。 フ ァ イ ル x.f90 お よ び y.f90 は、 パ ラ レル実行用に コ ンパ イ ル さ れ ます。
フ ァ イ ル z.f90 は、 そのオブジ ェ ク ト フ ァ イ ルが x.o お よ び y.o と リ ン ク さ れていて も 、 シ リ
アル実行用に コ ンパ イ ル さ れ ます。
f90 +O3 +Oparallel -c x.f90 y.f90
f90 +O3 -c z.f90
次の コ マ ン ド 行は、 3 つのオブジ ェ ク ト フ ァ イ ルを リ ン ク し 、 実行可能フ ァ イ ル para_prog を
生成 し ます。
f90 +O3 +Oparallel -o para_prog x.o y.o z.o
こ の コ マ ン ド 行で分か る よ う に、 別々に リ ン ク と コ ンパ イ ルを行 う 場合、 ld ではな く 、 f90 を
使用 し なければな り ません。 リ ン ク 用の コ マ ン ド 行には、 パ ラ レル実行ルーチン を リ ン ク さ せ る
ために、 +Oparallel オプシ ョ ンお よ び +O3 オプシ ョ ン を指定す る 必要があ り ます。
パフ ォ ーマ ン ス と パラ レル化
マルチプ ロ セ ッ サ マシ ン で、 パ ラ レル実行用に コ ンパ イ ル し たプ ロ グ ラ ム に最高の実行時パ
フ ォ ーマ ン ス を保証す る には、 同時に複数のパ ラ レルプ ロ グ ラ ム を実行 し ない よ う に し ます。 複
数のパ ラ レ ルプ ロ グ ラ ム を同時に実行す る と 、 同 じ プ ロ セ ッ サが共有 さ れ、 パフ ォ ーマ ン ス が劣
化 し ます。 パ ラ レ ル実行プ ロ グ ラ ムは、 その他のユーザープ ロ グ ラ ム よ り 高い優先順位で実行す
る 必要があ り ます。 リ アル タ イ ム優先順位の設定については、 rtprio(1) を参照 し て く だ さ い。
パ ラ レルプ ロ グ ラ ム を負荷の重いシ ス テ ムで実行 し て も 、 パフ ォーマ ン ス は遅 く な り ます。
182
第6章
パ フ ォ ーマ ン スおよび最適化
HP Fortran プ ロ グ ラ ムのパラ レル化
パラ レル化 さ れたプ ログ ラ ムを プ ロ フ ァ イルする
パ ラ レル実行用に コ ンパ イ ル し たプ ロ グ ラ ム を非パ ラ レルプ ロ グ ラ ム と ほ と ん ど同 じ 方法でプ ロ
フ ァ イ ルす る こ と がで き ます。
1. プ ロ グ ラ ム を +gprof オプシ ョ ン で コ ンパ イ ル し ます。
2. プ ロ グ ラ ム を実行 し て、 プ ロ フ ァ イ リ ン グ デー タ を生成 し ます。
3. プ ロ グ ラ ムに対 し て gprof を実行 し ます。
4. gprof か ら の出力を表示 し ます。
違いは、 次の と お り です。
•
手順 2 では、すべての ス レ ッ ド を実行す る CPU 時間を含む gmon.out フ ァ イ ルが生成 さ れ ま
す。
•
手順 4 では、 表示 し た フ ラ ッ ト プ ロ フ ァ イ ルが、 次の記述法を使用 し てパ ラ レル化 さ れた DO
ループ を表記 し ます。
routine_name##pr_line_nnnn
こ こ で routine_name は、 ループが入っ てい る ルーチンの名前であ り 、 pr ( パ ラ レル部分 )
はループがパ ラ レ ル化 さ れてい る こ と を示 し 、 nnnn は最初のループの行番号です。
パラ レル化を阻害する条件
次の項では、 コ ンパ イ ラ がパ ラ レ ル実行を行わない条件について説明 し ます。 説明す る 項目は、
次の と お り です。
•
副作用があ る ルーチン を呼び出す
•
不確定な繰 り 返 し 数
•
デー タ の依存
副作用があ るルーチ ン を呼び出す
コ ンパ イ ラ は、 副作用のあ る ルーチンに対す る 呼び出 し を含むループ をパ ラ レル化 し ません。
ルーチン が次の よ う な動作を行 う 場合、 副作用があ り ます。
•
引 き 数の変更
•
大域変数、 共通ブ ロ ッ ク 変数、 ま たは SAVE 属性変数の変更
•
呼び出 し 側ルーチンに対す る 局所変数の再定義
第6章
183
パ フ ォ ーマ ン スお よび最適化
HP Fortran プ ロ グ ラ ムのパ ラ レル化
•
入出力の実行
•
前述のいずれか を実行す る 別のサブルーチン ま たは関数の呼び出 し
ループ をパ ラ レル化す る か ど う かの決定時に、 DIR$ NO SIDE EFFECTS 指令を使用 し て、 副作
用を無視 さ せ る こ と がで き ます。
注記
サブルーチン ( 関数ではな く ) は、 常に副作用があ る と 仮定 さ れてい ます。 こ の
指令を サブルーチン呼び出 し に適用す る と 、 オプテ ィ マ イ ザは、 呼び出 し がプ ロ
グ ラ ム結果に何の影響 も も た ら さ ない と 仮定 し て、 呼び出 し を削除 し てパフ ォー
マ ン ス を向上 さ せ る こ と がで き ます。
不確定な繰 り 返 し 数
コ ンパ イ ラ は、 ループの実行を開始す る 前に繰 り 返 し 数の判別がで き ない場合、 ループ をパ ラ レ
ル化 し ません。 こ う し た予防措置の理由は、 繰 り 返 し 数を判別 し て実行プ ロ セ ッ サに分散す る た
めに、 実行時 コ ー ド が繰 り 返 し 数を計算で き なければな ら ないか ら です。
次の条件は実行時のカ ウ ン ト を妨げ る 可能性があ り ます。
•
ループが無限 DO ループ構文であ る こ と 。
•
EXIT 文がループ中にあ る こ と 。
•
ループに、 ループ を終了す る 条件付 き GO TO 文があ る こ と 。
•
ループがループ制御変数かループ制限変数を変更す る こ と 。
•
ループが DO WHILE 構文であ り 、 判定条件がループ中で定義 さ れてい る こ と 。
デー タ の依存
ループがパ ラ レル化 さ れてい る と き 、 繰 り 返 し は異な る プ ロ セ ッ サで独立に実行 さ れ、 単一のプ
ロ セ ッ サで実行す る と 、 シ リ アルの順序 と 実行順序は異な り ます。 こ の相違は、 繰 り 返 し が結果
に影響を与え る こ と な く ど んな順序にせ よ 発生す る 場合は、 問題にはな り ません。 デー タ の依存
がない場合、 ループの繰 り 返 し を異な る プ ロ セ ッ サに割 り 当て、 結果は変えずに任意の順序で実
行す る こ と がで き ます。 次のループについて説明 し ます。
DO I = 1, 5
A(I) = A(I) * B(I)
END DO
こ の例では、 配列 A は、 実行順序が 1-2-3-4-5, 5-4-3-2-1, 3-1-4-5-2, ま たはその他の順序であ る
か ど う かに関わ ら ず、 同 じ 結果にな り ます。 各繰 り 返 し がその他 と 独立 し てい る こ と で、 ループ
がパ ラ レル実行の対象候補にな り ます。
184
第6章
パ フ ォ ーマ ン スおよび最適化
HP Fortran プ ロ グ ラ ムのパラ レル化
次のループでは当ては ま り ません。
DO I = 2, 5
A(I) = A(I-1) * B(I)
END DO
こ こ では、 実行順序が問題にな り ます。 繰 り 返 し I で使用 さ れ る デー タ は、 前回の繰 り 返 し
(I-1) で生成 さ れたデー タ に依存 し ます。 配列 A は、 実行順序が 2-3-4-5 以外であれば、 かな り
異っ た結果にな り ます。 こ のループにおけ る デー タ の依存に よ っ て、 ループはパ ラ レル化の対象
にはな り ません。
すべてのデー タ の依存がパ ラ レ ル化を禁止す る わけではあ り ません。 次のパ ラ グ ラ フ では、 い く
つかの例外を説明 し ます。
入れ子のループ と 行列 行列を操作す る 入れ子のループの中には、 内側のループにだけデー タ の
依存があ り 、 外側のループ をパ ラ レル化で き る も のがあ り ます。 次の例について説明 し ます。
DO I = 1, 10
DO J = 2, 100
A(J,I) = A(J-1,I) + 1
END DO
END DO
こ の入れ子のループにおけ る デー タ の依存は、 内側の (J) ループで発生 し ます。 A(J,I) の各行
へのア ク セ ス は、 前回の繰 り 返 し で代入 さ れてい る 前の行 (J-1) に依存 し ます。 J ループの繰 り
返 し を単一プ ロ セ ッ サで実行す る と き と 異な る 順序で実行す る 場合、 行列には異な る 値が代入 さ
れます。 そのため、 内側のループをパ ラ レル化 し てはいけ ません。
し か し 、 外側のループにはその よ う なデー タ の依存はあ り ません。 各列へのア ク セ ス は、 その他
すべての列へのア ク セ ス と 独立 し てい ます。 し たがっ て、 コ ンパ イ ラ は、 行列の列全体を安全に
分散 し て異な る プ ロ セ ッ サで実行で き ます。 デー タ の代入は、 行がシ リ アルに実行 さ れ る 限 り 、
列の実行順序に関わ ら ず、 同 じ も の と な り ます。
仮定 さ れる依存 ループ を解析す る と き 、 コ ンパ イ ラ は安全な部分でエ ラ ーにな り 、 デー タ 依存
と 思われ る も のが実際にそ う であ る と 仮定 し た場合に、 ループ をパ ラ レル化 し ません。 次の例に
ついて説明 し ます。
DO I = 101, 200
A(I) = A(I-K)
END DO
前回の繰 り 返 し で定義 さ れたデー タ を後の繰 り 返 し で使用 し てい る こ と か ら 、 コ ンパ イ ラ は、 こ
のループにデー タ の依存が存在す る も の と 仮定 し ます。 こ の仮定では、 コ ンパ イ ラ はループ をパ
ラ レ ル化 し ません。
第6章
185
パ フ ォ ーマ ン スお よび最適化
HP Fortran プ ロ グ ラ ムのパ ラ レル化
し か し 、 K の値が 100 の場合、 A(I-K) がループ外で定義 さ れてい る ので、 依存関係はない と 考
え ら れ ます。 実際に依存関係があ る 場合は、 プ ロ グ ラ マーはループの直前に次の よ う な指令のい
ずれか を挿入 し 、 コ ンパ イ ラ がパ ラ レル化に関 し てループ を解析す る と き に、 仮定 さ れ る 依存を
無視 さ せます。
•
DIR$ IVDEP
•
FPP$ NODEPCHK
•
VD$ NODEPCHK
こ れ ら の指令についての詳細は、 234 ページの 「互換性指令」 の項を参照 し て く だ さ い。
186
第6章
パ フ ォ ーマ ン スおよび最適化
ベ ク ト ル化
ベ ク ト ル化
ベ ク ト ル化が使用可能な と き 、 オプテ ィ マ イ ザは、 対象のループ を数学 ラ イ ブ ラ リ の特別に調整
さ れたルーチンへの呼び出 し と 置 き 換え ます。 +Ovectorize オプシ ョ ン で コ ンパ イ ルす る と 、
オプテ ィ マ イ ザは、 安全で実行可能だ と 判断 し た と こ ろ でベ ク ト ル化を行い ます。 ただ し 、 指令
を使用 し てベ ク ト ル化を制限す る こ と がで き ます。 オプテ ィ マ イ ザの自動ベ ク ト ル化の代替 と し
て、 BLAS (Basic Linear Algebra Subroutine) ラ イ ブ ラ リ を明示的に呼び出 し て、 共通のベ ク ト
ルお よ び共通の行列操作を実行す る こ と がで き ます。
次の項では、 オプテ ィ マ イ ザのベ ク ト ル化機能の使用方法を説明 し ます。
+Ovectorize オプ シ ョ ン を使用する
ベ ク ト ル化を使用可能にす る には、 プ ロ グ ラ ム を最適化レベル 3 以上で コ ンパ イ ル し 、 次の例の
コ マ ン ド 行の よ う に +Ovectorize オプシ ョ ン を指定 し なければな り ません。
f90 +O3 +Ovectorize prog.f90
ベ ク ト ル化が使用可能な と き 、 オプテ ィ マ イ ザはパ タ ーン マ ッ チン グ アルゴ リ ズ ム を使用 し 、
プ ロ グ ラ ムのループ をベ ク ト ル化の対象 と し て識別 し ます。 オプテ ィ マ イ ザが次の よ う に判断 し
た場合、
•
ベ ク ト ル化がオ リ ジナルのループ と 同 じ 結果を生成
•
よ り 良いパフ ォ ーマ ン ス を生む最適化が他にない
オプテ ィ マ イ ザは、 そのループ を表 6-5 に リ ス ト さ れてい る 数学 ラ イ ブ ラ リ ルーチン の 1 つへの
呼び出 し と 置 き 換え ます。
表 6-5 ベ ク ト ルルーチ ンの +Ovectorize によ る呼び出 し
ベ ク ト ルルーチ ン
説明
daxpy
倍精度演算を使用 し て、 ベ ク ト ルの ス カ ラ 乗算をベ ク ト ルに追加 し ます。
ddot
2 つの倍精度ベ ク ト ルの内積を計算 し ます。
memcpy
memory(1) のマ ンページ を参照 し て く だ さ い。
memmove
memory(1) のマ ンページ を参照 し て く だ さ い。
memset
memory(1) のマ ンページ を参照 し て く だ さ い。
第6章
187
パ フ ォ ーマ ン スお よび最適化
ベ ク ト ル化
表 6-5 ベ ク ト ルルーチ ンの +Ovectorize によ る呼び出 し ( 続き )
ベ ク ト ルルーチ ン
説明
saxpy
単精度演算を使用 し て、 ベ ク ト ルの ス カ ラ 乗算をベ ク ト ルに追加 し ます。
sdot
2 つの単精度ベ ク ト ルの内積を計算 し ます。
vec_damax
倍精度ベ ク ト ル中で最大の絶対値を検索 し ます。
vec_dmult_add
ス カ ラ にベ ク ト ルを乗算 し 、 倍精度演算を使用 し て、 結果を結果ベ ク ト
ルに加え ます。
vec_dsum
倍精度ベ ク ト ルの要素を合計 し ます。
PA2.0 アプ リ ケーシ ョ ン が非常に大 き な配列を使用 し てい る 場合、 +Ovectorize お よ び
+Odataprefetch の両方で コ ンパ イ ルす る と パフ ォ ーマ ン ス が向上 し ます。 数学 ラ イ ブ ラ リ に
は、 両方のオプシ ョ ン を指定 し た場合に呼び出 さ れ る 、 ベ ク ト ルルーチンの特殊なプ リ フ ェ ッ チ
ン グ バージ ョ ンがあ り ます。
+Ovectorize お よ び +Oinfo オプシ ョ ン で コ ンパ イ ルす る と 、 オプテ ィ マ イ ザはど のループ を
ベ ク ト ル化 し たか を識別 し ます。 ベ ク ト ル化の部分が意味がない場合、 パ ラ レル化な ど その他い
く つかの最適化を検討す る こ と も あ り ます。
ベ ク ト ル化を局所的に制御する
+Ovectorize オプシ ョ ン で コ ンパ イ ルす る と き 、 オプテ ィ マ イ ザは、 ソ ース フ ァ イ ル中のすべ
てのループ をベ ク ト ル化の候補 と し て考慮 し ます。 *$* [no]VECTORIZE 指令に よ っ て、 ベ ク ト
ル化を制限で き ます。 こ の指令の *$* NOVECTORIZE 形式を使用 し てベ ク ト ル化を使用不能に
し 、 *$* VECTORIZE 形式を使用 し て、 こ れを使用可能に し ます。 こ の指令は、 次のループの最
初に適用 さ れ、 残 り のプ ロ グ ラ ム単位の間ま たは後の指令が取っ て代わ る ま で効力を持ち ます。
+Ovectorize オプシ ョ ン で コ ンパ イ ルせずに、 3 以上の最適化を指定 し た場合、 こ の指令は無
視 さ れます。
た と えば、 次の コ ー ド セ グ メ ン ト を含むフ ァ イ ルを +Ovectorize で コ ンパ イ ル し た場合、 1 つ
のループだけがベ ク ト ル化の候補 と 考え ら れ ます。
! This is line 1 of the source file.
!*$* NOVECTORIZE
.
.
.
!*$* VECTORIZE
188
第6章
パ フ ォ ーマ ン スおよび最適化
ベ ク ト ル化
DO i = 1, 100
.
.
.
END DO
!*$* NOVECTORIZE
.
.
.
*$* VECTORIZE 指令はベ ク ト ル化を強制 し ない こ と に注意 し て く だ さ い。 オプテ ィ マ イ ザは、
次の場合にだけベ ク ト ル化を行い ます。
•
ループがオプテ ィ マ イ ザに よ っ てその範疇であ る と 認識 さ れたベ ク ト ル操作を実行す る 場
合。
•
ループが安全にベ ク ト ル化で き る 場合。 パ ラ レ ル化を妨げ る こ と がで き る 同 じ 条件 ( た と え
ば、 184 ページの 「デー タ の依存」 の項を参照 ) に よ っ て も 、 ベ ク ト ル化を妨げます。
•
オプテ ィ マ イ ザがパフ ォ ーマ ン ス を さ ら に向上 さ せ る その他の変形を見つけ ら れない場合。
ベ ク ト ル化を保証す る 唯一の方法は、 プ ロ グ ラ マーが ソ ース フ ァ イ ルを編集 し 、 188 ページの
「ベ ク ト ル化を局所的に制御す る 」 の項で説明 し てい る よ う に、 ループ を BLAS ラ イ ブ ラ リ への
適切な呼び出 し に置 き 換え る こ と です
*$* [no]VECTORIZE 指令についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く
だ さ い。
BLAS ラ イ ブ ラ リ ルーチ ン を呼び出す
HP Fortran コ ンパ イ ラ は、 BLAS (Basic Linear Algebra Subroutine) ラ イ ブ ラ リ をバン ド ル し
てい ます。 こ の ラ イ ブ ラ リ は、 低レベルのベ ク ト ルお よ び低レベルの行列操作を実行す る 特別に
調整 さ れたルーチンか ら 構成 さ れ ます。 こ れ ら の操作は、 事実上の業界標準1 に合致 し ます。
BLAS ルーチンは広範に使用可能であ り 、 Fortran の各種実装方法に移植可能にな っ てい ます。
HP Fortran には、 PA-RISC マシ ンのパフ ォ ーマ ン ス用に特別に調整 さ れた BLAS ルーチン の ラ
イ ブ ラ リ があ り ます。 -lblas オプシ ョ ン で コ ンパ イ ルす る こ と で、 HP Fortran プ ロ グ ラ ム か ら
ど のルーチン で も 呼び出す こ と がで き ます。
1. 『LAPACK User's Guide』 (J. Dongarra お よ び他に よ る 編集、 Philadelphia, 1992) を
参照 し て く だ さ い。 各 BLAS ルーチンには、 それぞれマ ンページがあ り ます。 概要に
ついては、 blas(3X) を参照 し て く だ さ い。 ま た、 http://www.netlib.org ( 英語 )
も 参照 し て く だ さ い。
第6章
189
パ フ ォ ーマ ン スお よび最適化
ベ ク ト ル化
次のプ ロ グ ラ ム について説明 し ます。 注釈にあ る よ う に、 2 つの配列上で、 BLAS ラ イ ブ ラ リ 中
の saxpy ルーチン と 同一の操作を実行す る ループがあ り ます。
例 6-1
saxpy.f90
PROGRAM main
INTEGER :: i, inc_x, inc_y, dim_num
REAL, DIMENSION(5) :: x, y
REAL :: b
b = 3.0
dim_num = 5
inc_x = 1
inc_y = 1
! initialize the two arrays x and y
DO i = 1, 5
y(i) = i
x(i) = i + 3.0
END DO
PRINT *, y
! add a scalar multiple of x to y
DO i = 1, 5
y(i) = y(i) + b * x(i)
END DO
PRINT *, y
END PROGRAM main
次に、 こ のプ ロ グ ラ ム を コ ンパ イ ルす る コ マ ン ド 行 と 、 実行結果を示 し ます。
$ f90 saxpy.f90
$ a.out
1.0 2.0 3.0 4.0 5.0
13.0 17.0 21.0 25.0 29.0
代替 と し て、 2 番目のループ を BLAS ラ イ ブ ラ リ 中の saxpy ルーチンに対す る 次に示す呼び出
し で置 き 換え る こ と がで き ます。
CALL saxpy(dim_num, b, x, inc_x, y, inc_y)
改訂 し たプ ロ グ ラ ム を コ ンパ イ ルす る と き 、 -lblas オプシ ョ ン を コ マ ン ド 行の最後に追加 し 、
BLAS ラ イ ブ ラ リ を リ ン ク し なければな り ません。 次に、 改訂プ ロ グ ラ ム を コ ンパ イ ルす る コ マ
ン ド 行 と 、 実行結果を示 し ます。
190
第6章
パ フ ォ ーマ ン スおよび最適化
ベ ク ト ル化
$ f90 saxpy_blas.f90 -lblas
$ a.out
1.0 2.0 3.0 4.0 5.0
13.0 17.0 21.0 25.0 29.0
関数であ る BLAS ルーチン を呼び出す場合、 必ずデー タ 宣言文でルーチンの戻 り 値を宣言 し 、
次の よ う に、 EXTERNAL 属性を指定 し ます。
REAL, EXTERNAL :: sdot
Fortran は、 デフ ォ ル ト で暗黙の型宣言を使用 し ます。 関数は明示的にあ る 種の型を持つ と 宣言
さ れていない限 り 、 BLAS ルーチンの最初の文字に よ っ て型が決定 し ます。 その文字が戻 り 値以
外の型を暗黙に宣言 し てい る 場合、 結果は意味を持ち ません。
BLAS ラ イ ブ ラ リ については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第6章
191
パ フ ォ ーマ ン スお よび最適化
パ フ ォ ーマ ン ス用の コ ー ド 生成の制御
パフ ォ ーマ ン ス用のコ ー ド 生成の制御
パフ ォ ーマ ン ス を最適にす る には、 実行可能プ ロ グ ラ ム を実行す る マシ ンのハー ド ウ ェ ア機能を
活用す る コ ー ド で構成す る 必要があ り ます。 プ ロ グ ラ ム を実行す る マシ ンが コ ンパ イ ルに使用 し
た も の と 同 じ であれば、 コ ー ド 生成は問題にな り ません。 デフ ォ ル ト では、 HP Fortran コ ンパ
イ ラ は、 コ ンパ イ ラ を実行す る マシ ンのモデルを対象 と す る コ ー ド を生成 し ます。
ただ し 、 プ ロ グ ラ ム を実行す る マシ ン と 異な る マシ ン で コ ンパ イ ルす る 場合、 +DAmodel オプ
シ ョ ン を使用 し て、 コ ンパ イ ラ が タ ーゲ ッ ト アーキ テ ク チ ャ に基づいて確実に コ ー ド を生成す
る 必要があ り ます。 こ のオプシ ョ ン の使用方法については、 114 ページの 「異な る PA-RISC マ
シ ン用に コ ンパ イ ルす る 」 の項を参照 し て く だ さ い。
192
第6章
7 HP-UX ア プ リ ケーシ ョ ンの作成
本章では、 HP-UX オペレーテ ィ ン グ シ ス テ ム上で実行中の HP Fortran アプ リ ケーシ ョ ンが次
の項目について実行す る 場合の、 シ ス テ ム リ ソ ース の使用方法を説明 し ます。
•
コ マ ン ド 行引 き 数の参照
•
HP-UX シ ス テ ムお よ び ラ イ ブ ラ リ ルーチン の呼び出 し
•
HP-UX フ ァ イ ル入出力の使用方法
第7章
193
HP-UX ア プ リ ケーシ ョ ンの作成
コ マ ン ド 行引き数の参照
コ マ ン ド 行引き数の参照
HP Fortran 実行可能プ ロ グ ラ ム を起動す る と 、 コ マ ン ド 行に 1 つ以上の引 き 数を指定す る こ と
がで き ます。 オペレーテ ィ ン グ シ ス テ ムはプ ロ グ ラ ムに対 し て こ れ ら の引 き 数を使用可能に し
ます。 た と えば、 次の コ マ ン ド 行はプ ロ グ ラ ム fprog を起動 し 、 プ ロ グ ラ ム に 3 つの文字引 き
数を渡 し ます。
$ fprog arg1 "another arg" 222
arg1
another arg
222
HP Fortran プ ロ グ ラ ムは、 IGETARG 組み込み関数お よ び IARGC 組み込み関数を呼び出す こ と
で、 内部で使用す る ために こ れ ら の引 き 数を参照す る こ と がで き ます。 IGETARG は、 関数ま たは
サブルーチン と し て使用可能です。 IGETARG 組み込み関数は、 指定 さ れた コ マ ン ド 行引 き 数を取
得 し ます。 IARGC は、 コ マ ン ド 行の引 き 数の数を返 し ます。 次の見本プ ロ グ ラ ム と 同様に、 コ マ
ン ド 行引 き 数を返す組み込みサブルーチン GETARG を使用す る こ と も で き ます。
例 7-1
get_args.f90
PROGRAM get_args
INTEGER, PARAMETER :: arg_num = 1
! arg_str is the character array to be written to
!
by IGETARG
CHARACTER(LEN=30) :: arg_str
! IGETARG returns number of characters read within
! the specified parameter
!
arg_num is the position of the desired argument in the
!
the command line (the name by which the program
!
was invoked is 0)
!
arg_str is the character array in which the argument
!
will be written
!
30 is the number of characters to write to arg_str
PRINT *, IGETARG(arg_num, arg_str, 30)
PRINT *, arg_str
! IARGC returns the total number of arguments on the
194
第7章
HP-UX ア プ リ ケーシ ョ ンの作成
コ マ ン ド 行引き数の参照
!
command line
PRINT *, IARGC()
END PROGRAM get_args
次の コ マ ン ド 行で コ ンパ イ ル し て起動 し た場合、
$ f90 get_args.f90
$ a.out perambulation of a different sort
プ ロ グ ラ ムは次の出力結果を示 し ます。
13
perambulation
5
IGETARG 組み込み関数お よ び IARGC 組み込み関数についての詳細は、 『HP Fortran リ フ ァ レ ン
ス ガ イ ド 』 を参照 し て く だ さ い。 GETARG は、 libU77 ルーチン と し て も 使用可能です。 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第7章
195
HP-UX ア プ リ ケーシ ョ ンの作成
HP-UX シ ス テムお よび ラ イ ブ ラ リ ルーチ ンの呼び出 し
HP-UX シ ス テムおよび ラ イ ブ ラ リ ルーチ ンの呼び出 し
シ ス テ ム コ ールには、 write シ ス テ ムルーチン な ど のカーネルレベル リ ソ ース に対す る 低水準
参照があ り ます。 write ルーチン を呼び出す見本プ ロ グ ラ ム については、 219 ページの 「フ ァ イ
ル処理」 の項を参照 し て く だ さ い。 シ ス テ ム コ ールについては、 『HP-UX リ フ ァ レ ン ス 』 を参照
し て く だ さ い。
HP-UX ラ イ ブ ラ リ ルーチンは、 シ ス テ ム情報の取得、 フ ァ イ ル ス ト リ ーム処理な ど の多 く の機
能を提供 し ます。 ラ イ ブ ラ リ ルーチンについては、 『HP-UX リ フ ァ レ ン ス 』 を参照 し て く だ さ
い。
BSD 3F ラ イ ブ ラ リ libU77.a を使用す る と 、 HP Fortran プ ロ グ ラ ムか ら 多 く の HP-UX シ ス
テ ム コ ールお よ び ラ イ ブ ラ リ ルーチン を参照す る こ と がで き ます。 HP Fortran で提供 さ れ る も
う 一つの ラ イ ブ ラ リ は、 BLAS (Basic Linear Algebra Subroutine) ラ イ ブ ラ リ libblas.a です。
こ れ ら のサブルーチンは、 最高のパフ ォ ーマ ン ス を生み出す よ う に調整 さ れた低水準のベ ク ト ル
操作お よ び行列操作を実行 し ます。 こ れ ら の ラ イ ブ ラ リ への リ ン ク については、 106 ページの
「HP Fortran 追加 ラ イ ブ ラ リ 」 の項を参照 し て く だ さ い。 両 ラ イ ブ ラ リ についての詳細は、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
196
第7章
HP-UX ア プ リ ケーシ ョ ンの作成
HP-UX フ ァ イル入出力の使用方法
HP-UX フ ァ イル入出力の使用方法
HP-UX フ ァ イ ル処理ルーチン を Fortran フ ァ イ ル入出力ルーチン と し て代用す る こ と がで き ま
す。 本項では、 HP-UX ス ト リ ーム入出力ルーチンお よ び入出力シ ス テ ム の呼び出 し について説
明 し ます。
FSTREAM を使用 し たス ト リ ーム入出力
HP-UX オペレーテ ィ ン グ シ ス テ ム では、 「ス ト リ ーム」 と い う 用語を、 フ ァ イ ルをバ イ ト の連
続 し た集合 と し て表す場合に使用 し ます。 ス ト リ ーム入出力を実行す る HP-UX ルーチンはた く
さ んあ り ます。 『HP-UX リ フ ァ レ ン ス 』 の stdio(3S) を参照 し て く だ さ い。
フ ァ イ ルを探査す る のに論理装置番号を必要 と す る Fortran 入出力 と 異な り 、 ス ト リ ーム入出力
ルーチンは、 ス ト リ ーム ポ イ ン タ 、 つま り FILE 型の C 言語構造体ア ド レ ス (C 言語ヘ ッ ダ フ ァ
イ ル /usr/include/stdio.h で定義 し た も の ) を格納す る 整変数を必要 と し ます。
次の Fortran 文は、 HP Fortran が変数を ス ト リ ーム ポ イ ン タ と し て使用す る こ と を宣言 し てい
ます。
INTEGER(4) :: stream_ptr
ス ト リ ーム ポ イ ン タ を取得す る には、 Fortran 組み込み関数 FSTREAM を使用 し ます。 こ れは、
次の よ う に フ ァ イ ルの Fortran 論理装置番号を指定す る と 、 開いてい る フ ァ イ ルに ス ト リ ーム ポ
イ ン タ を返 し ます。
stream-ptr = FSTREAM(logical-unit)
logical-unit パ ラ メ ー タ は Fortran フ ァ イ ルを開いて得 ら れた論理装置番号でなければな ら
ず、 stream-ptr は整数型でなければな り ません。 stream-ptr が整数型でない場合、 型変換で
予期 し ない結果が も た ら さ れ ます。 stream-ptr を、 整数型 と し て操作 し てはいけ ません。
stream-ptr を取得 し た ら 、 ALIAS 指令を使用 し て、 値 と し て ス ト リ ーム入出力ルーチンに渡 し
ます (ALIAS 指令の使用方法の例については、 219 ページの 「フ ァ イ ル処理」 の項を参照 )。 すべ
ての HP Fortran 指令については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第7章
197
HP-UX ア プ リ ケーシ ョ ンの作成
HP-UX フ ァ イル入出力の使用方法
HP-UX シ ス テム コ ールを使用 し た入出力を実行する
フ ァ イ ル入出力は、 HP-UX カーネルへの低水準参照を行 う HP-UX シ ス テ ム コ ール ( た と えば、
open, read, write, お よ び close) に よ っ て も 実行で き ます。 こ れ ら のルーチンについては、
『HP-UX リ フ ァ レ ン ス 』 を参照 し て く だ さ い。 ま た、 こ れ ら のルーチンについては、 オ ン ラ イ ン
のマ ンページ も 参照 し て く だ さ い。 write ルーチンの呼び出 し 方法を示す見本プ ロ グ ラ ム につい
ては、 219 ページの 「フ ァ イ ル処理」 の項を参照 し て く だ さ い。
フ ァ イルへの接続を設定する
HP-UX 入出力シ ス テ ム コ ールは、 ア ク セ ス さ れ る フ ァ イ ルへの接続を設定す る HP-UX フ ァ イ
ル記述子を必要 と し ます。 フ ァ イ ル記述子は、 Fortran 論理装置番号 と 似た働 き をす る 整数で
す。 た と えば、 C 言語プ ロ グ ラ ム か ら 呼び出 さ れた次の open シ ス テ ム コ ールは、 フ ァ イ ル
DATA.DAT を編集用に開 き 、 HP-UX フ ァ イ ル記述子の値を返 し ます。
#include <fcntl.h> /* definition of O_RDWR contained here */
...
fildes = open("DATA.DAT", O_RDWR)
HP-UX フ ァ イル記述子を取得する
Fortran 組み込み関数 FNUM は、 任意の論理装置に対 し て HP-UX フ ァ イ ル記述子を返 し ます。
FNUM 組み込み関数の呼び出 し 方法の例については、 219 ページの 「フ ァ イ ル処理」 の項のプ ロ
グ ラ ム を参照 し て く だ さ い。 FNUM については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て
く だ さ い。
198
第7章
8 HP Fortran からの C ルーチ ンの呼び出 し
本章では、 HP Fortran プ ロ グ ラ ム か ら の C ルーチンの呼び出 し に影響を与え る 、 C と HP
Fortran 間の言語上の相違について説明 し ます。 説明す る 項目は、 次の と お り です。
•
デー タ 型
•
引 き 数渡 し 規約
•
大文字 と 小文字の区別
•
配列
•
C の文字列
•
フ ァ イ ル処理
•
デー タ の共有
第8章
199
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ 型
デー タ 型
表 8-1 では、 32 ビ ッ ト アプ リ ケーシ ョ ン と し て コ ンパ イ ルす る と き の、 HP Fortran お よ び C
の対応す る デー タ 型を リ ス ト し てい ます。
表 8-1 HP Fortran および C のデー タ 型の対応
HP Fortran 90
C
CHARACTER
char ( の配列 )
ホ レ リ ス (CHARACTER と 同義 )
char ( の配列 )
BYTE, LOGICAL(KIND=1), INTEGER(KIND=1)
char
LOGICAL(KIND=2)
short
INTEGER(KIND=2)
short
LOGICAL, LOGICAL(KIND=4)
long ま たは int
INTEGER, INTEGER(KIND=4)
long ま たは int
INTEGER(KIND=8)
long long
REAL, REAL(KIND=4)
float
DOUBLE PRECISION, REAL(KIND=8)
double
REAL(KIND=16)
long double
COMPLEX, COMPLEX(KIND=4)
struct
DOUBLE COMPLEX, COMPLEX(KIND=8)
struct
構造型
struct
+DA2.0W オプシ ョ ン を使用 し て HP Fortran プ ロ グ ラ ム を 64 ビ ッ ト モー ド で コ ンパ イ ル し て も 、
Fortran のデー タ 型には何の影響 も 与え ません。 121 ページの 「64 ビ ッ ト モー ド で コ ンパ イ ルす
る 」 の項を参照 し て く だ さ い。 ただ し 、 い く つかの C デー タ 型の大 き さ が変わ り ます。 プ ロ グ
ラ ムが C で書かれた関数を呼び出 し てお り 、 64 ビ ッ ト モー ド で コ ンパ イ ル さ れてい る 場合、 大
200
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ 型
き さ の相違について了承 し 、 個別のデー タ 項目を プ ロ モー ト す る か、 +autodbl オプシ ョ ン で再
コ ンパ イ ル し てすべての基本整数型、 実数型お よ び論理型を 64 ビ ッ ト にプ ロ モー ト す る 必要が
あ り ます。
表 8-2 では、 32 ビ ッ ト モー ド お よ び 64 ビ ッ ト モー ド で コ ンパ イ ル し た と き の、 HP Fortran お
よ び C での対応す る デー タ 型の相違を示 し ます。 表 8-3 では、 Fortran プ ロ グ ラ ム を +autodbl
オプシ ョ ン で コ ンパ イ ル し た と き の相違を示 し ます。 明示的に大 き さ が指定 さ れた Fortran デー
タ 項目 ( た と えば、 INTEGER*4) は、 32 ビ ッ ト モー ド 、 64 ビ ッ ト モー ド 、 ま たは +autodbl オプ
シ ョ ン で コ ンパ イ ル し たか ど う かに関係な く 、 同 じ 大 き さ の ま ま であ る こ と に注意 し て く だ さ
い。
表 8-2 HP Fortran および C デー タ 型の大き さ の相違
HP Fortran デー タ 型
C デー タ 型
大き さ
( ビ ッ ト 単位 )
32 ビ ッ ト モー ド
64 ビ ッ ト モー ド
INTEGER
int ま たは long
int
32
INTEGER*4
int ま たは long
int
32
INTEGER*8
long long
long ま たは
long long
64
REAL
float
float
32
DOUBLE PRECISION
double
double
64
REAL*16
long double
long double
128
表 8-3 +autodbl で コ ンパイル し た結果の大き さ の相違
HP Fortran デー タ 型
C デー タ 型
大き さ
( ビ ッ ト 単位 )
32 ビ ッ ト モー ド
64 ビ ッ ト モー ド
INTEGER
long long
long
64
INTEGER*4
int ま たは long
int
32
INTEGER*8
long long
long
64
REAL
float
float
64
第8章
201
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ 型
表 8-3 +autodbl で コ ンパイル し た結果の大き さ の相違 ( 続き )
HP Fortran デー タ 型
C デー タ 型
大き さ
( ビ ッ ト 単位 )
32 ビ ッ ト モー ド
64 ビ ッ ト モー ド
DOUBLE PRECISION
long double
long double
128
REAL*16
long double
long double
128
次の項では、 次に示すデー タ 型に対す る 言語の相違についての詳細を説明 し ます。
•
符号な し 整数
•
論理型
•
複素数
•
構造型
符号な し 整数
Fortran と 異な り 、 C は整数型 (char, int, short, お よ び long) を符号付 き ま たは符号な し で宣
言す る こ と を許 し ます。 Fortran プ ロ グ ラ ム が符号付 き 整数を、 符号な し 整数の引 き 数が渡 さ れ
る こ と を前提 と し て C 関数に渡 し た場合、 C はその ビ ッ ト パ タ ーン を符号な し 値 と し て解釈 し ま
す。
C の符号な し 整数は、 HP Fortran の同 じ 大 き さ の整数の 2 倍の正の値を表す こ と がで き ます。
HP Fortran プ ロ グ ラ ム が符号な し 整数を返す C 関数を呼び出 し 、 戻 り 値が符号付 き 整数で表 さ
れ る も の よ り 大 き い場合、 HP Fortran はそのビ ッ ト パ タ ーン を負の数 と し て解釈 し ます。
論理型
C は整数を論理型に対 し て使用 し ます。 HP Fortran では、 2 バ イ ト の論理型は C の short と 等
価であ り 、 4 バ イ ト の論理型は long ま たは int と 等価です。 C お よ び HP Fortran では、 ゼ ロ
は偽であ り 、 ゼ ロ 以外のすべての値は真です。 HP Fortran は、 真に対 し て値 1 を設定 し ます。
202
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ 型
複素数
C には複素数はあ り ませんが、 簡単にシ ミ ュ レー ト で き ます。 こ れを例証す る ために、 正 し い大
き さ の 2 つの浮動少数点 メ ンバーを含む struct を作成 し ます。 複素数型に対 し て 2 つの
float、 お よ び倍精度複素数型に対 し て 2 つの double です。 次の例では、 typedef COMPLEX が
作成 さ れます。
typedef struct
{
float real;
float imag;
} COMPLEX;
次の 2 つの ソ ース フ ァ イ ルか ら 構成 さ れ る プ ロ グ ラ ムについて説明 し ます。
•
Fortran ソ ース フ ァ イ ル。 主プ ロ グ ラ ム単位を定義 し ます。
•
C ソ ース フ ァ イ ル。 次に示す よ う なプ ロ ト タ イ プ宣言をす る 関数 sqr_complex を定義 し ま
す。
COMPLEX sqr_complex(COMPLEX cmx_val);
主プ ロ グ ラ ムは、 sqr_complex を呼び出 し て、 複素数を渡 し ます。 こ の C 関数は数値を平方 し 、
結果を返 し ます。 C には複素数型はあ り ませんが、 こ の例では C の typedef 機能を使用 し て作
成 し ます。
次に示す見本プ ロ グ ラ ム pass_complex.f90 では、 Fortran ソ ース フ ァ イ ルを示 し ます。
例 8-1
pass_complex.f90
PROGRAM main
! This program passes a complex number to a C function
!
that squares it and returns the result. The C
!
function has the following declaration prototype:
!
!
complex sqr_complex(complex cmx_val);
!
!
"complex" is not an intrinsic type for C but it
!
creates a typedef for one, using a struct.
COMPLEX :: result, cmx_num = (2.5, 3.5)
! We have to declare the C function because we’re calling it
!
as a function rather than a subroutine. If we didn’t
!
declare it, Fortran would use the implicit typing rules
第8章
203
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ 型
!
by default and assume from the name, sqr_complex, that it
!
returns a real.
COMPLEX sqr_complex
PRINT *, 'C will square this complex number: ', cmx_num
! Use the %VAL built-in function to indicate that cmx_num
!
is being passed by value, as C expects it to be, and
!
and not by reference, as Fortran does by default
result = sqr_complex(%VAL(cmx_num))
PRINT *, 'The squared result is:
', result
END PROGRAM main
次に、 C ソ ース フ ァ イ ルを示 し ます。
例 8-2
sqr_complex.c
#include <stdio.h>
/* simulate Fortran’s complex number */
typedef struct
{
float real;
float imag;
}COMPLEX;
/* returns the square of the complex argument */
COMPLEX sqr_complex(COMPLEX cmx_val)
{
COMPLEX result;
float a, b;
/* copy both parts of the complex number into locals */
a = cmx_val.real;
b = cmx_val.imag;
/* square the complex number and store the results into
* the return variable
*/
result.imag = 2 * (a * b);
a = a * a;
b = b * b;
204
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ 型
result.real = a - b;
return result;
}
次に、 プ ロ グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る ための コ マ ン ド 行 と 、 実行結果を示 し ます。
$ cc -Aa -c sqr_complex.c
$ f90 pass_complex.f90 sqr_complex.o
$ a.out
C will square this complex number: (2.5,3.5)
The squared result is:
(-6.0,17.5)
構造型
Fortran の構造型の構文は C の構造体 と 異な り ますが、 両言語にはデフ ォ ル ト で類似のパデ ィ ン
グお よ びデー タ 境界規則があ り ます。 HP Fortran は、 HP C が構造体に対 し て使用す る メ モ リ
中の構造型のオブジ ェ ク ト を配置す る と き 、 同 じ パデ ィ ン グ規則お よ びデー タ 境界規則を使用 し
ます。
ポイ ン タ
Fortran のポ イ ン タ は、 い く つかの点で C ポ イ ン タ と 異な り ますが、 Fortran か ら C 関数に渡 さ
れ る ポ イ ン タ は、 C と 同 じ よ う な動作を し ます。 唯一の注意点は、 ポ イ ン タ が配列に対す る も の
( こ れがほ と ん ど の場合 ) であ る と き 、 両言語の配列の割 り 付け と 参照方法が異な る こ と です。
211 ページの 「配列」 の項を参照 し て く だ さ い。
割 り 付け配列は、 両言語間の配列の相違に注意すれば、 その他すべての配列 と 同 じ よ う に
Fortran か ら C に渡す こ と がで き ます。 文字列 (C では文字の配列 ) は別です。 Fortran か ら C
への文字列渡 し については、 215 ページの 「C の文字列」 の項を参照 し て く だ さ い。
第8章
205
HP Fortran か ら の C ルーチ ンの呼び出 し
引き数渡 し 規約
引き数渡 し 規約
HP C お よ び HP Fortran の引 き 数渡 し 規約の重要な相違は、 Fortran が引用に よ っ て引 き 数を
渡す こ と です。 一方、 C は値に よ っ て非配列お よ び非ポ イ ン タ の引 き 数を渡 し ます。 つま り 、 こ
れは引 き 数の コ ピーを渡 し ます。 こ の相違は、 C の利用者記述ルーチン だけでな く 、 C 関数 と し
て参照 さ れ る すべての HP-UX シ ス テ ム コ ールお よ びサブルーチンに対す る 呼び出 し に影響を与
え ます。
HP Fortran では、 2 つの組み込み関数 %VAL お よ び %REF が用意 さ れてい ます。 こ れ ら は、
Fortran のデフ ォ ル ト の引 き 数渡 し 規約を無効に し 、 C に合致 さ せます。 こ れ ら の関数は、 呼び
出 し ルーチンの引 き 数並びか $HP$ ALIAS 指令で、 渡そ う と す る 実際の引 き 数に適用 さ れ ます。
%REF 関数は、 C で配列ま たはポ イ ン タ を渡す と き の よ う に、 引 き 数を引用に よ っ て渡す よ う に
Fortran に指示 し 、 %VAL 関数は、 C でのデフ ォ ル ト の場合の よ う に、 その引 き 数を値に よ っ て
渡す よ う に Fortran に指示 し ます。
次の よ う なプ ロ ト タ イ プ宣言を行 う C 関数について説明 し ます。
void foo(int *ptr, int iarray[100], int i);
Fortran では、 foo に渡す実際の引 き 数を、 次の よ う に宣言 し ます。
INTEGER :: ptr, i
INTEGER, DIMENSION(100) :: iarray
%VAL お よ び %REF の組み込み関数を使用 し て Fortran か ら C 関数を呼び出すには、 次の よ う に
し ます。
CALL foo(%REF(ptr), %REF(iarray), %VAL(i))
Fortran プ ロ グ ラ ム で異な る 呼び出 し 場所か ら foo に対 し て何回か呼び出 し を し なければな ら な
い場合、 %VAL お よ び %REF の組み込み関数を指定 し た $HP$ ALIAS 指令を使用す る と 便利です。
$HP$ ALIAS 指令を使用す る こ と に よ っ て、 各呼び出 し 場所で %VAL お よ び %REF を使用せずに、
指令を 1 回使用す る だけで特定のルーチン中の各パ ラ メ ー タ に対 し て引 き 数渡 し モー ド を設定す
る こ と がで き ます。 次に、 foo を呼び出す Fortran プ ロ グ ラ ム におけ る $HP$ ALIAS 指令を示 し
ます。
!$HP$ ALIAS foo(%REF, %REF, %VAL)
引 き 数な し で関数が使用 さ れてい る こ と に注意 し て く だ さ い。 引 き 数並びでの位置は、 それぞれ
が適用 さ れ る パ ラ メ ー タ を示 し ます。
$HP$ ALIAS 指令を使用 し て、 C お よ び HP Fortran の大文字 と 小文字の区別の相違を処理す る
こ と も で き ます。 208 ページの 「大文字 と 小文字の区別」 の項には、 $HP$ ALIAS 指令、 %VAL 組
み込み関数お よ び %REF 組み込み関数を使用 し て C 関数を呼び出す見本プ ロ グ ラ ム を記載 し てい
206
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
引き数渡 し 規約
ます。 その他の例については、 203 ページの 「複素数」 の項お よ び 219 ページの 「フ ァ イ ル処
理」 の項を参照 し て く だ さ い。 211 ページの 「配列」 の項の Fortran 見本プ ロ グ ラ ム では、
Fortran お よ び C の両方 と も 引用に よ っ て配列を渡すので、 組み込み関数を必要 と し ない こ と に
注意 し て く だ さ い。
$HP$ ALIAS 指令、 %VAL 組み込み関数お よ び %REF 組み込み関数についての詳細は、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第8章
207
HP Fortran か ら の C ルーチ ンの呼び出 し
大文字 と 小文字の区別
大文字 と 小文字の区別
HP Fortran と 異な り 、 C は大文字 と 小文字の区別をす る 言語です。 HP Fortran はすべての外部
名を小文字に変換 し 、 内部名の大文字 と 小文字の区別を無視 し ます。 た と えば、 foo お よ び FOO
と い う 名前は Fortran では同 じ も のです。 し か し 、 C では大文字 と 小文字の区別す る ので、 foo
と FOO は、 違 う も のにな り ます。 HP Fortran プ ロ グ ラ ム が C のオブジ ェ ク ト フ ァ イ ルに リ ン ク
さ れ、 名前に大文字を使用す る C 関数を引用す る 場合、 リ ン カーは引用を解決で き ません。
HP Fortran プ ロ グ ラ ム か ら C 関数を呼び出す と き に、 大文字 と 小文字の区別が問題にな る 場
合、 次の 2 つの選択肢があ り ます。
•
Fortran プ ロ グ ラ ム を +uppercase オプシ ョ ン で コ ンパ イ ル し ます。 こ れに よ っ て、 Fortran
は外部名に大文字を使用す る よ う に強制 さ れ ます。
•
$HP$ ALIAS 指令を使用 し て、外部名を呼び出す と き に Fortran が使用す る 文字が大文字か小
文字か を指定 し ます。
通常は、 +uppercase オプシ ョ ンの使用を正当化す る 、 C ソ ース フ ァ イ ル中のすべての名前が大
文字であ る こ と はあ り ません。 し たがっ て、 $HP$ ALIAS 指令を使用す る こ と を推奨 し ます。 こ
の指令に よ っ て、 外部名に大文字が使用 さ れていて も 、 外部名を接続す る こ と がで き ます。
$HP$ ALIAS 指令を %REF 組み込み関数 と %VAL 組み込み関数を指定 し て使用す る と 、 すべての
呼び出 し 場所で繰 り 返 さ な く て も 、 引 き 数の渡 し 方を指定で き ます。
整数の配列を ソ ー ト す る ための関数が書かれてい る 、 次の よ う な C ソ ース フ ァ イ ルについて説
明 し ます。
例 8-3
sort_em.c
#include <stdio.h>
void BubbleSort(int a[], int size)
{
int i, j, temp;
for (i = 0; i < size - 1; i++)
for (j = i + 1; j < size; j++)
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
208
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
大文字 と 小文字の区別
a[j] = temp;
}
}
Fortran プ ロ グ ラ ムが こ の関数を正 し く 呼び出す前に、 次の 2 つの問題を解決 し なければな り ま
せん。
1. C 関数の名前に大文字お よ び小文字の両方を使用 し てい る 。
2. 関数が 2 番目の引 き 数 ( 配列の大 き さ ) を値に よ っ て渡す こ と を前提 と し てい る 。
次の $HP$ ALIAS 指令は こ れ ら 両方の問題を処理 し ます。
!$HP$ ALIAS bubblesort = 'BubbleSort'(%REF, %VAL)
名前 bubblesort は、 C 関数を引用す る ために Fortran が使用す る 別名であ り 、 %REF 組み込み
関数お よ び %VAL 組み込み関数は、 Fortran の引 き 数渡 し 規約を変更 し て C 関数が前提 と す る 引
き 数の渡 し 方に合致す る よ う に し ます。
次に、 $HP$ ALIAS 指令を使用 し て C 関数を正 し く 呼び出す、 HP Fortran プ ロ グ ラ ム を示 し ま
す。
例 8-4
test_sort.f90
PROGRAM main
! This program is linked with an object file that contains
!
a C function with the following prototype declaration:
!
!
void BubbleSort(int a[], int size);
!
!
The ALIAS directive takes care of the differences
!
between C and Fortran regarding case sensitivity
!
and argument-passing conventions.
!$HP$ ALIAS bubblesort = 'BubbleSort'(%REF, %VAL)
INTEGER, PARAMETER :: n = 10
INTEGER, DIMENSION(n) :: num=(/5,4,7,8,1,0,9,3,2,6/)
PRINT *, 'Before sorting: ', num
CALL bubblesort(num, n)
PRINT *, 'After sorting: ', num
END PROGRAM main
次に、 プ ロ グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る ための コ マ ン ド 行 と 、 実行結果を示 し ます。
第8章
209
HP Fortran か ら の C ルーチ ンの呼び出 し
大文字 と 小文字の区別
$ cc -Aa -c sort_em.c
$ f90 test_sort.f90 sort_em.o
$ a.out
Before sorting: 5 4 7 8 1 0 9 3 2 6
After sorting:
0 1 2 3 4 5 6 7 8 9
Fortran ソ ース フ ァ イ ルの多 く では、 $HP$ ALIAS 指令を使用す る 場合、 すべての指令を 1 つの
フ ァ イ ルで定義 し 、 +pre_include=file オプシ ョ ン を指定 し て、 すべての Fortran ソ ース フ ァ イ
ルに対 し て こ の フ ァ イ ルを取 り 込む よ う にすれば便利にな り ます。 こ のオプシ ョ ンは、 引 き 数
file だけ を指定 し ます。 こ れは取 り 込む対象 と な る フ ァ イ ル名です。 file 中のすべてのテ キ ス ト
は、 コ ンパ イ ラ に渡 さ れ る 前に、 コ マ ン ド 行に指定 し た各 ソ ース フ ァ イ ルに挿入 さ れます。
$HP$ ALIAS 指令を使用す る その他の見本プ ロ グ ラ ム については、 219 ページの 「フ ァ イ ル処
理」 の項を参照 し て く だ さ い。 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 では、 %VAL 組み込み関数お
よ び %REF 組み込み関数、 +uppercase オプシ ョ ンお よ び +pre_include オプシ ョ ン、 $HP$
ALIAS 指令について詳述 し てい ます。 $HP$ ALIAS 指令については、 227 ページの 「$HP$
ALIAS 指令」 の項を参照 し て く だ さ い。
210
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
配列
配列
HP Fortran お よ び C には、 配列を Fortran か ら C に渡す と き に考慮 し なければな ら ない相違が
2 つあ り ます。
•
HP Fortran では、 配列の添え字はデフ ォ ル ト で 1 か ら 始ま り 、 C では、 常に 0 か ら 始ま り ま
す。
•
HP Fortran では、 多次元配列は C と は違っ た方法で メ モ リ に配置 さ れます。
添え字の採番の相違は、 結果的には大 き さ の相違にはな り ません。 Fortran の 10 要素の配列は、
C で も 10 要素です。 し か し 、 Fortran の添え字は 1 ~ 10 で採番 さ れますが、 C では 0 ~ 9 で採
番 さ れます。 こ の相違に よ る C ま たは Fortran の通常の コ ーデ ィ ン グ慣例に対す る 変更は必要
あ り ません。
多次元配列の配置方法の相違は よ く 知 ら れてい ますが、 よ り 顕著な も のは次の と お り です。
Fortran では多次元配列を列順で配置す る ので、 最左端 の次元が最初に変更 さ れ ます。 一方、 C
は多次元配列を行順で配置す る ので、 最右端の次元が最初に変更 さ れ ます。
図 8-1 には、 行数 と 列数が同 じ 2 次元の整数配列に対す る Fortran お よ び C の宣言を示 し ます。
各配列宣言の下には、 配列の各要素が格納 さ れてい る メ モ リ 位置を表 し ます。 図に示す よ う に、
各言語は 6 つの要素を異な る 順で表 し ます。 1 行目 と 2 列目に格納 さ れてい る 値は、 Fortran と
C では異な り ます。
図 8-1
Fortran および C での 2 次元配列の メ モ リ 配置
INTEGER, DIMENSION(2,3) :: a
a(1,1)
a(2,1)
a(1,2)
a(2,2)
a(1,3)
a(2,3)
a[0][2]
a[1][0]
a[1][1]
a[1][2]
int a[2][3];
a[0][0]
a[0][1]
こ の相違を補 う には、 C ま たは Fortran コ ー ド の ど ち ら かの配列の次元を他方の逆の順に宣言す
る 必要があ り ます。 た と えば、 配列を Fortran で次の よ う に宣言 し た場合、
INTEGER, DIMENSION(3,6) :: my_array
第8章
211
HP Fortran か ら の C ルーチ ンの呼び出 し
配列
C では、 配列を次の よ う に宣言す る 必要があ り ます。
int my_array[6][3];
配列宣言の変更は、 ど ち ら の言語で も 簡単です。 重要な こ と は、 合致す る ために次元は逆順に し
なければな ら ない と い う こ と です。
次に、 3 次元配列の例を示 し ます。 最初は、 Fortran の宣言です。
REAL, DIMENSION(2,3,4) :: x
次に、 同 じ 宣言を C で宣言 し ます。
int x[4][3][2];
例 8-5
pass_array.f90
PROGRAM main
! This program initializes a multi-dimensional array,
!
displays its contents, then passes it to a C function,
!
which displays its contents. The C function has the
!
following declaration prototype:
!
!
void get_array(int a[4][2]);
!
!
Note that the dimensions are declared in reverse order
!
in C from the way they are declared in Fortran.
INTEGER, DIMENSION(2,4) :: my_array = &
RESHAPE(SOURCE = (/1,2,3,4,5,6,7,8/), SHAPE = (/2,4/))
PRINT *, 'Here is how Fortran stores the array:'
DO i = 1, 4
DO j = 1, 2
PRINT 10, j, i, my_array(j,i)
END DO
END DO
! There’s no need to use the %VAL or %REF built-in functions
!
because both C and Fortran pass arrays by reference.
CALL get_array(my_array)
10 FORMAT(‘my_array(', I1, ',', I1, ') =', I2)
END PROGRAM main
次の例は、 C 関数を呼び出 し て整数の 2 次元配列を渡す、 HP Fortran プ ロ グ ラ ム の ソ ース フ ァ
イ ルです。
212
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
配列
次に、 C 関数の ソ ース フ ァ イ ルを示 し ます。
例 8-6
get_array.c
#include <stdio.h>
/* get_array: displays the contents of the array argument */
void get_array(int a[4][2])
{
int i, j;
printf("\nHere is the same array as accessed from C:\n\n");
for (i = 0; i < 4; i++)
for (j = 0; j < 2; j++)
printf(“a[%d][%d] = %d\n”, i, j, a[i][j]);
}
次に、 プ ロ グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る ための コ マ ン ド 行 と 、 実行結果を示 し ます。
$ cc -Aa -c get_array.c
$ f90 pass_array.f90 get_array.o
$ a.out
Here is how Fortran stores the array:
my_array(1,1) = 1
my_array(2,1) = 2
my_array(1,2) = 3
my_array(2,2) = 4
my_array(1,3) = 5
my_array(2,3) = 6
my_array(1,4) = 7
my_array(2,4) = 8
Here is the same array as accessed from C:
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[3][0]
a[3][1]
第8章
=
=
=
=
=
=
=
=
1
2
3
4
5
6
7
8
213
HP Fortran か ら の C ルーチ ンの呼び出 し
配列
こ の例では、 C ルーチン にすでに配列の大 き さ に関す る 情報が コ ー ド 化 さ れてい る と 仮定 し てい
ます。 そ う でない場合、 Fortran プ ロ グ ラ ムは大 き さ を別個の引 き 数 と し て渡 し 、 C ルーチンは
2 番目の引 き 数を受け入れ る よ う に変更 し なければな り ません。
配列お よ びその大 き さ を引 き 数 と し て C 関数に渡す Fortran プ ロ グ ラ ムの例については、 208
ページの 「大文字 と 小文字の区別」 の項を参照 し て く だ さ い。 文字配列の引 き 数を C に渡す
Fortran プ ロ グ ラ ムの例については、 216 ページの 「文字列を渡す」 の項を参照 し て く だ さ い。
214
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
C の文字列
C の文字列
C の文字列は、 次の 2 つの点で、 Fortran 文字変数 と 異な り ます。
•
C は、 文字列が ヌル終了す る こ と を前提 と し ます。
•
Fortran が C ルーチンに渡す各文字変数ま たは文字定数については、隠 し 長 さ 引 き 数 も 渡 し ま
す。
次の項では、 こ れ ら の相違 と コ ーデ ィ ン グ方法を説明 し ます。 最後の項には、 見本プ ロ グ ラ ム を
紹介 し ます。
C のヌル終了文字列
HP Fortran と 異な り 、 C で書かれたプ ロ グ ラ ムは文字列が ヌ ル終了す る こ と を前提 と し てい ま
す。 つま り 、 文字列の最後の文字は ヌ ル文字 ('\0') でなければな り ません。 Fortran か ら C に文
字列を渡すには、 次の よ う に し なければな り ません。
•
ヌ ル文字を含めた大 き さ で、 文字変数を宣言 し ます。
•
ヌ ル文字を文字配列の最終要素に明示的に割 り 当て る か、 ま たは次の例の よ う に連結演算子
を使用 し ます。
CALL csub ('a string'//CHAR(0))
Fortran プ ロ グ ラ ムが C か ら 渡 さ れた文字列を使用す る 場合、 C 関数ま たは Fortran 副プ ロ グ ラ
ム で、 Fortran がその文字列を使用す る 前に ヌ ル文字を削除す る 必要があ り ます。 C で ヌ ル文字
を削除す る 方法については、 216 ページの 「文字列を渡す」 の項の見本プ ロ グ ラ ム を参照 し て く
だ さ い。
Fortran の隠 し 長 さ 引き数
Fortran 副プ ロ グ ラ ムに渡 さ れ る 各 CHARACTER*n 引 き 数については、 実際には次の よ う な 2 つ
の項目が引 き 数 と し て渡 さ れます。
•
メ モ リ 中の文字引 き 数のア ド レ ス ( つま り 、 引 き 数のポ イ ン タ )。
•
引 き 数のバ イ ト 単位の長 さ 。 こ れは、 副プ ロ グ ラ ムに対 し て ス タ ッ ク か ら 使用可能な 「隠
し 」 長 さ 引 き 数です。
第8章
215
HP Fortran か ら の C ルーチ ンの呼び出 し
C の文字列
文字列引 き 数を Fortran か ら C に渡すには、 文字列ア ド レ ス の引 き 数お よ び隠 し 引 き 数を受け
取 る ために C 関数を明示的に準備 し なければな り ません。 引 き 数並び中のア ド レ ス引 き 数の順
序は、 C で も Fortran と 同 じ です。 ただ し 、 隠 し 長 さ 引 き 数は、 こ の並びの最後に置かれ ます。
複数の文字列引 き 数を渡す場合、 長 さ 引 き 数はア ド レ ス引 き 数 と 同 じ 順序にな り ますが、 C の引
き 数並びの後にな り ます。
C お よ び Fortran は、 両方 と も 文字列を引用に よ っ て渡す こ と に注意 し て く だ さ い。 つま り 、
Fortran が文字列引 き 数だけ を C に渡す場合、 %VAL 組み込み関数お よ び %REF 組み込み関数を
使用 し て引 き 数を渡す方法を示す必要はあ り ません。 こ れ ら の関数については、 206 ページの
「引 き 数渡 し 規約」 の項を参照 し て く だ さ い。
文字列を渡す
本項の見本プ ロ グ ラ ム では、 文字列 (Fortran では、 文字変数ま たは定数 ) を C 関数に渡す方法
を示 し ます。 ま た、 C 文字列の処理方法を説明 し 、 Fortran で も 操作で き る よ う に し ます。
プ ロ グ ラ ムは、 次の 2 つの ソ ース フ ァ イ ルか ら 構成 さ れ ます。
•
Fortran ソ ース フ ァ イ ル。 こ れは、 2 つの初期化 さ れた文字変数を宣言 し て C 関数に渡す主プ
ロ グ ラ ム か ら 構成 さ れます。
•
C ソ ース コ ー ド 。 こ れは次の 2 つの関数か ら 構成 さ れます。
❏
get_string: 2 つの文字配列引 き 数を Fortran か ら 受け取 り 、配列に よ る 文字列を新 し い
文字列で上書 き し ます。
❏
fix_string_for_f90: 文字列を その文字配列引 き 数中で処理 し 、 ヌ ル終了文字を空白
文字で置 き 換え、 残 り の文字を空白で埋め ます。 こ の処理は、 文字変数を操作 し なけれ
ばな ら ない場合に必要です。
get_string 関数には、 引 き 数並び中に 2 つの引 き 数が追加 さ れ ます。 こ れ ら の引 き 数は、
Fortran が暗黙に各文字列引 き 数で渡す、 隠 し 文字列長 さ 引 き 数を取得 し ます。
次に、 Fortran お よ び C ソ ース フ ァ イ ルを示 し ます。
例 8-7
pass_chars.f90
PROGRAM main
! This program passes to character variables to a C routine,
!
which overwrites them. This program displays the
!
character variables before and after the call.
! Initialize the character variables and append null
!
characters so that C can process them.
216
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
C の文字列
CHARACTER(LEN=10) :: first_name = "Pete"//CHAR(0)
CHARACTER(LEN=15) :: last_name = "Seeger"//CHAR(0)
! Note that character variables, like arrays, are passed by
!
reference in both languages. There’s no need to use the
!
%REF built-in function, so long as the C routine
!
provides an extra argument for the "hidden" length
!
parameter. To suppress passing that parameter, use %REF.
CALL get_string(first_name, last_name)
PRINT 20, first_name, last_name
20 FORMAT(/, 'The names passed back to Fortran:
', A, 1X, A)
END PROGRAM main
例 8-8
get_string.c
#include <stdio.h>
#include <string.h>
void fix_string_for_f90(char s[], int len);
/* get_string: overwrites the string arguments fname and lname;
* fname_len and lname_len are the hidden length arguments, which
* are implicitly passed by Fortran with each string argument.
*/
void get_string(char fname[], char lname[], int fname_len,
int lname_len)
{
printf(“The names passed to C: %s %s\n", fname, lname);
printf(“\nEnter the first and last names of a banjo player: ");
scanf(“%s%s”, fname, lname);
fix_string_for_f90(fname, fname_len);
fix_string_for_f90(lname, lname_len);
}
/* fix_string_for_f90: replaces the null at the end of the string
* in the character array and th a blank and blank fills the
* remaining elements up to len; this processing is necessary if
* the character variable is to be manipulated by Fortran
*/
void fix_string_for_f90(char s[], int len)
第8章
217
HP Fortran か ら の C ルーチ ンの呼び出 し
C の文字列
{
int i;
for (i = strlen(s); i < len; i++)
s[i] = ' ';
}
次に、 プ ロ グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る ための コ マ ン ド 行 と 、 実行結果を示 し ます。
$ cc -Aa -c get_string.c
$ f90 pass_chars.f90 get_string.o
$ a.out
The names passed to C: Pete Seeger
Enter the first and last names of a banjo player:
The names passed back to Fortran:
218
Wade
Wade Ward
Ward
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
フ ァ イル処理
フ ァ イル処理
Fortran 装置番号を C ルーチン に渡 し て も 、 接続 し た フ ァ イ ルの入出力を実行す る こ と はで き ま
せん。 ま た、 C フ ァ イ ルポ イ ン タ を Fortran ルーチンが使用す る こ と も で き ません。 ただ し 、 ど
ち ら かの言語で書かれたプ ロ グ ラ ム に よ っ て作成 さ れた フ ァ イ ルは、 フ ァ イ ルがそれを使用す る
プ ロ グ ラ ム中で宣言 さ れ開かれた も のであ る な ら ば、 他方の言語のプ ロ グ ラ ム で使用す る こ と が
で き ます。
C は、 HP-UX 入出力サブルーチンお よ び組み込み関数を使用 し て、 フ ァ イ ルを探査 し ます。
Fortran 入出力を使用す る 代わ り に、 こ の フ ァ イ ル探査方法を Fortran か ら 使用す る こ と も で き
ます。
FNUM 組み込み関数お よ び FSTREAM 組み込み関数に よ っ て、 フ ァ イ ル記述子お よ びフ ァ イ ルポ イ
ン タ を Fortran か ら C に渡す こ と がで き ます。 FNUM は、 Fortran 装置番号を引 き 数 と し て渡す
と 、 対応す る HP-UX フ ァ イ ル記述子を返 し ます。 フ ァ イ ル記述子については、 198 ページの
「フ ァ イ ルへの接続を設定す る 」 の項を参照 し て く だ さ い。 FSTREAM は、 Fortran 装置番号を引
き 数 と し て渡す と 、 対応す る C の フ ァ イ ルポ イ ン タ を返 し ます。
次の Fortran プ ロ グ ラ ムは、 write シ ス テ ムルーチン を呼び出 し 、 フ ァ イ ル上での入出力を実行
し 、 FNUM が返 し た フ ァ イ ル記述子を渡 し ます (write シ ス テ ムルーチン と Fortran の WRITE 文
と の名前の競合のために、 プ ロ グ ラ ムは ALIAS 指令を使用 し て write を IWRITE と し て引用す
る こ と で、 競合を避け ます )。
例 8-9
fnum_test.f90
PROGRAM fnum_test
! Use the ALIAS directive to rename the "write" system routine.
! The built-in functions %VAL and %REF indicate how the
! arguments are to be passed.
!$HP$ ALIAS IWRITE = 'write' (%VAL, %REF, %VAL)
CHARACTER*1 :: a(10)
INTEGER :: i, fd, status
! fill the array with x's
a = 'x'
! open the file for writing
OPEN(1, FILE='file1', STATUS='UNKNOWN')
第8章
219
HP Fortran か ら の C ルーチ ンの呼び出 し
フ ァ イル処理
! pass in the unit number and get back a file descriptor
fd = FNUM(1)
!
!
!
!
!
!
!
call IWRITE (the alias for the "write" system routine),
passing in three arguments:
fd = the file descriptor returned by FNUM
a = the character array to write
10 = the number of elements (bytes) to write
the return value, status, is the number of bytes actually
written; if the write was successful, it should be 10
status=IWRITE(fd, a, 10)
CLOSE (1, STATUS=’KEEP’)
! open the file for reading; we want to see if the write was
! successful
OPEN (1, FILE='file1', STATUS='UNKNOWN')
READ (1, 4) (a(i), i = 1, 10)
4 FORMAT (10A1)
CLOSE (1, STATUS='DELETE')
DO i = 1, 10
! if we find anything other than x's, the write failed
IF (a(i) .NE. 'x') STOP 'FNUM_TEST failed'
END DO
! check write's return value; it should be 10
IF (status .EQ. 10) PRINT *, 'FNUM_TEST passed'
END
次に、 プ ロ グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る ための コ マ ン ド 行 と 、 実行結果を示 し ます。
$ f90 fnum_test.f90
$ a.out
FNUM_TEST passed
『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 では、 FNUM 組み込み関数 と FNUM 組み込み関数お よ び
ALIAS 指令について説明 し てい ます。 write シ ス テ ムルーチン については、 write(2) のマ ン
ページ を参照 し て く だ さ い。
220
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ の共有
デー タ の共有
Fortran プ ロ グ ラ マーは、 異な る プ ロ グ ラ ム単位間で大量のデー タ を共有す る ために、 従来、 共
通ブ ロ ッ ク に依存 し てい ま し た。 共通ブ ロ ッ ク の利点は、 共通ブ ロ ッ ク がなければお互いにや り
と り をす る こ と がで き ない よ う なプ ロ グ ラ ム単位に対 し 、 別々の フ ァ イ ルに存在 し ていた と し て
も 、 記憶領域の参照がで き る こ と です。1
C には共通ブ ロ ッ ク はあ り ませんが、 「外部変数」 が提供 さ れ ます。 外部変数を使用 し て、 C プ
ロ グ ラ ム の異な る 場所でデー タ を共有す る こ と も で き ます。 関数外で定義 さ れた場合、 変数は外
部変数 と な り ます。 関数に参照可能にす る ためには、 外部変数は、 それを参照す る 関数中で定義
せずに宣言 し なければな り ません (C での変数の 「定義」 は記憶領域を割 り 付け る こ と を、 変数
の 「宣言」 は記憶領域を割 り 付けず、 その名前 と 型のみを指定す る こ と を意味 し ます )。 C で定
義せずに変数を宣言す る には、 extern 文を使用 し ます。 こ れは、 リ ン カーに定義の場所を探す
よ う に指示 し ます。
た と えば、 関数外で行われ る と 仮定 し た次の文は、 外部変数 some_data を宣言 し 定義 し ます。
int some_data;
次の文は、 定義せずに some_data を宣言 し 、 宣言が行われてい る と こ ろの関数で使用で き る よ
う に し ます。
extern int some_data;
Fortran の共通ブ ロ ッ ク お よ び C の extern 文の両方を使用す る こ と に よ っ て、 Fortran プ ロ グ
ラ ム単位が HP C 関数 と デー タ を共有で き る よ う に し ます。 記憶領域は実際には Fortran ソ ース
フ ァ イ ル中に割 り 付け ら れ (C の用語では定義 さ れ ) ます。 C ソ ース フ ァ イ ルは、 extern 文を使
用 し て、 共通ブ ロ ッ ク の名前を定義す る のではな く 、 宣言 し ます。 リ ン カーは、 リ ン ク 時に引用
を解決 し ます。
次の Fortran 文について説明 し ます。 こ れは、 整数の配列を宣言 し 、 globals と い う 名前の共
通ブ ロ ッ ク に配列を配置 し ます。
INTEGER, DIMENSION(100) :: global_array
COMMON /globals/global_array
次の extern 文は、 共通ブ ロ ッ ク を引用 (C の用語では、 「宣言」 ) し 、 それを C のオブジ ェ ク ト
フ ァ イ ル中の関数が使用で き る よ う に し ます。
extern int globals[100];
1. ただ し 、 共通ブ ロ ッ ク への過剰依存は、 プ ロ グ ラ ム の保守を難 し く し ます。 共通ブ
ロ ッ ク よ り Fortran モジ ュ ールが良い点については、 127 ページの第 3 章 「デー タ 記
憶領域の制御」 を参照 し て く だ さ い。
第8章
221
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ の共有
extern 文は、 配列名ではな く 、 共通ブ ロ ッ ク globals 名を引用す る こ と に注意 し て く だ さ い。
C の観点か ら 見 る と 、 共通ブ ロ ッ ク はあ たか も 配列であ る かの よ う に処理 さ れ ます。
C 関数 と 共有す る 共通ブ ロ ッ ク には、 複数のデー タ 項目を指定す る こ と がで き ます。 そ う す る た
めには、 C ソ ース フ ァ イ ルが構造体を宣言 し 、 その メ ンバーが共通のデー タ 項目 と 一致 し なけれ
ばな り ません。 共通の項目を参照す る 必要のあ る すべての C 関数は、 extern 文を使用 し て、 構
造型の変数を宣言 し ます。 変数名は共通ブ ロ ッ ク 名です。 個別のデー タ 項目を参照す る には、 関
数は C 表記を使用 し て構造体の メ ンバーを引用 し ます。
HP Fortran は、 HP C が構造体用に使用す る メ モ リ 中に共通ブ ロ ッ ク を配置す る と き 、 同 じ パ
デ ィ ン グ規則 と デー タ 境界規則を使用 し ます。 ただ し 、 プ ロ グ ラ マーは、 共通ブ ロ ッ ク と 同 じ 順
序で構造体 メ ンバーの数、 型お よ び大 き さ を宣言す る よ う に し なければな り ません。 両言語の
デー タ 型の対応については、 表 8-1 を参照 し て く だ さ い。
次に、 2 つの ソ ース フ ァ イ ルか ら 構成 さ れ る 見本プ ロ グ ラ ム を示 し ます。 こ の フ ァ イ ルには、
Fortran 主プ ロ グ ラ ムお よ び Fortran か ら 呼び出 さ れ る C 関数が書かれてい ます。 主プ ロ グ ラ ム
は、 2 つの倍精度変数を持つ共通ブ ロ ッ ク を指定 し てい ます。 こ れは変数の 1 つに書 き 込みを行
い、 C 関数を呼び出 し ます。 C 関数は Fortran が書 き 込んだ変数を読み込み、 別の変数に書 き 込
みを行い ます。 呼び出 し か ら 戻 る と 、 Fortran は両変数を読み込みます。
次に、 Fortran お よ び C ソ ース フ ァ イ ルの例を示 し ます。
例 8-10
shared_common.f90
PROGRAM main
! This program uses the common block to share data with
!
the C function get_nlog. C uses a structure type to
!
declare the same items in common.
REAL(KIND=8) :: num, nlog_of_num
COMMON /globals/num, nlog_of_num
! a header for the table that is printed by the following
!
DO loop
PRINT *, 'Number
Natural Log of Number'
PRINT *, '-------+-----------------------'
! At each iteration, write a value to the common block
!
variable num, call the C function get_nlog, and
!
print the contents of both common block variables
!
to the screen.
DO num = 2.0, 10.0
CALL get_nlog()
222
第8章
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ の共有
PRINT 10, num, ‘|’, nlog_of_num
END DO
10 FORMAT(3X, F3.0, 2X, A, 8X, F5.2)
END PROGRAM main
例 8-11
shared_struct.c
#include <stdio.h>
#include <math.h>
/* declare a structure whose members match the data items
* in the Fortran common block
*/
struct glob
{
double num;
double nlog_of_num;
} globals;
/* get_nlog: reads the value in globals.num, passes it
* to log() in the math library, and writes the write the
* return value to globals.nlog_of_num
*/
void get_nlog(void)
{
/* declare the name of the common block defined in the
* Fortran file
*/
extern struct glob globals;
globals.nlog_of_num = log(globals.num);
}
次に、 プ ロ グ ラ ム を コ ンパ イ ル、 リ ン ク 、 実行す る ための コ マ ン ド 行 と 、 実行結果を示 し ます。
2 行目の コ マ ン ド 行の終わ り の -lm オプシ ョ ンは、 リ ン カーに数学 ラ イ ブ ラ リ で log 関数を検索
す る よ う に指示 し てい ます。
$ cc -Aa -c shared_struct.c
$ f90 shared_common.f90 shared_struct.o -lm
$ a.out
Number
Natural Log of Number
-------+-----------------------
第8章
223
HP Fortran か ら の C ルーチ ンの呼び出 し
デー タ の共有
2.
3.
4.
5.
6.
7.
8.
9.
10.
|
|
|
|
|
|
|
|
|
0.69
1.10
1.39
1.61
1.79
1.95
2.08
2.20
2.30
COMMON 文の詳細については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
224
第8章
9 Fortran 指令の使用方法
コ ンパ イ ラ 指令は、 プ ロ グ ラ ムの コ ンパ イ ル方法に影響す る ソ ース プ ロ グ ラ ム内の コ マ ン ド の こ
と です。 コ ンパ イ ラ 指令の機能は コ マ ン ド 行オプシ ョ ン に似てい ますが、 一般には さ ら に局所的
な制御を提供 し ます。 HP Fortran に用意 さ れてい る 指令は、 他の処理系に移植す る 場合や、 正
し く 編集 さ れない場合に、 注釈 と し て処理 さ せ る ( し たがっ て無視 さ せ る ) よ う な構文を使用 し
ます。 後述の項では、 HP Fortran の指令について説明 し ます。
ま た、 HP Fortran は C プ リ プ ロ セ ッ サ (cpp) 指令 も 認識 し ます。 +cpp=yes オプシ ョ ン を指定
し て コ ンパ イ ルす る 場合、 ま たは ソ ース名に .F 拡張子が付いてい る 場合、 ソ ース フ ァ イ ルは最
初に C プ リ プ ロ セ ッ サに渡 さ れ処理 さ れます。 C プ リ プ ロ セ ッ サの詳細は、 cpp(1) を参照 し て
く だ さ い。
第9章
225
Fortran 指令の使用方法
指令の構文
指令の構文
HP Fortran ソ ース フ ァ イ ルで指令を指定す る 場合の構文は、 指令の種類に よ っ て次の よ う に異
な り ます。
C プ リ プ ロ セ ッ サの指令です。 次の形式で指定 し ます。
#[line]cpp-directive
こ こ で cpp-line-directive は、 ANSI C 準拠の指令です。 ただ し 、 line
キーワ ー ド は省略可能で、 こ のキー ワー ド を指定す る と HP C コ ンパ イ ラ と の
互換性が得 ら れ ます。
HP Fortran の指令です。 次の形式で指定 し ます。
comment-character $HP$ directive-name
こ こ で comment-character は、 自由形式の !、 ま たは固定形式の C, !、 * で
す。 directive-name は、 本章で説明す る 指令のいずれかです。
comment-character と $HP$ の間には、 空白を入れないで く だ さ い。 固定形
式では、 comment-character を 1 桁目に指定 し なければな り ません。
226
第9章
Fortran 指令の使用方法
HP Fortran 指令の使用方法
HP Fortran 指令の使用方法
HP Fortran は、 ソ ース フ ァ イ ル内の特定の関数の制御 ( た と えば最適化な ど ) に役立つ多 く の
コ ンパ イ ラ 指令を用意 し てい ます。 表 9-1 は、 こ れ ら の指令名の説明を し てお り 、 各指令は後述
す る 順番に記載 し てい ます。
表 9-1 HP Fortran の指令
指令
機能
$HP$ ALIAS
サブルーチン、 関数、 エ ン ト リ ま たは共通ブ ロ ッ ク の名前を
外部名 と 結合す る 。
$HP$ CHECK_OVERFLOW
整数のオーバーフ ロ ーを ト ラ ッ プす る コ ー ド を生成す る 。
$HP$ LIST
リ ス ト 出力 さ れ る フ ァ イ ル内の ソ ース行の出力を制御す る 。
$HP$ OPTIMIZE
ソ ース フ ァ イ ル内の最適化を制御す る 。
自由形式を使用す る フ ァ イ ルの場合は、 指令を注釈文字 ! で始めなければな り ません。 固定形式
の場合は、 1 桁目を注釈文字 C, * ま たは ! で始めなければな り ません。 キー ワ ー ド と 引 き 数は、
次の よ う に 1 つ以上の空白文字で区切 ら なければな り ません。
!$HP$ OPTIMIZE ON
指令の接頭辞 と し て注釈文字を使用す る と 、 コ ンパ イ ラ が特に指令を探 し ていないのであれば、
指令は注釈 と し て処理 さ れ無視 さ れ ます。
後述の項では、 HP Fortran の個々の指令について説明 し ます。
$HP$ ALIAS 指令
ALIAS 指令は、 サブルーチン、 関数、 エ ン ト リ ま たは共通ブ ロ ッ ク の名前を外部名 と 結合 し 、 他
の言語で記述 さ れたルーチン のパ ラ メ ー タ 渡 し 規約を指定 し ます。
構文
!$HP$ ALIAS name [= external-name ] [(arg-pass-mode-list)]
name
第9章
227
Fortran 指令の使用方法
HP Fortran 指令の使用方法
内部サブルーチン ではない、 サブルーチン、 関数ま たは手続 き の入口点の名前
を参照す る ためにプ ロ グ ラ ム で使用 さ れ る 名前。 name を ス ラ ッ シ ュ で囲む と 、
共通ブ ロ ッ ク 名にな り ます。
external-name
標準の名前を指定す る 文字定数。
arg-pass-mode-list
name に対 し て引 き 数を指定す る 手続 き 名の場合にだけ使用 し ます。 対応す る
実引 き 数の渡 し 方を項目の並びで指定 し ます。 項目には、 次の組み込ま れた関
数の ど ち ら か を指定 し ます。
•
%VAL: 実引 き 数の値を渡す
•
%REF: 実引 き 数のア ド レ ス を渡す
並びには手続 き の引 き 数 と 同数の項目がなければな り ません。 ま た、 各項目は
コ ン マで区切 り 、 引 き 数 と 対応す る 位置で指定 し なければな り ません。
説明および制限事項
$HP$ ALIAS 指令には、 次の 2 つの効果があ り ます。
•
サブルーチン、 関数、 エ ン ト リ ま たは共通ブ ロ ッ ク を参照す る ためにプ ロ グ ラ ム で使用 さ れ
る 名前を、 個々の外部名 と 結合で き ます。 こ の機能は、 さ ま ざ ま なハー ド ウ ェ ア構成を サ
ポー ト で き る よ う に、 同 じ ソ ース コ ー ド か ら 多様な グ ラ フ ィ ッ ク ス デバ イ ス ド ラ イ バを使用
し たい場合に特に役立ち ます。
•
組み込ま れてい る 関数 %VAL お よ び %REF を併用す る と 、 他の高水準言語で記述 さ れたルーチ
ン と 適切なパ ラ メ ー タ 渡 し 規約を使用 し てや り と り す る よ う に、 コ ンパ イ ラ に対 し て指示で
き ます。
external-name は、 HP-UX シ ス テ ムルーチン ( 『HP-UX リ フ ァ レ ン ス 』 の第 2 項お よ び第 3
項を参照 ) や Fortran の ラ イ ブ ラ リ ルーチン (OPEN, READ ま たは CLOSE な ど ) と 一致 さ せないで
く だ さ い。 $HP$ ALIAS 指令は、 外部で使用 さ れ る サブルーチン、 エ ン ト リ お よ び関数に適用 さ
れます。 主プ ロ グ ラ ム単位には適用 さ れ ません。
%VAL は、 呼び出 さ れた手続 き に実引 き 数の値を渡す よ う に指定す る ために組み込まれた関数で
す。 こ のパ ラ メ ー タ には、 すべての型の引 き 数を指定で き ます。 ただ し 、 手続 き 名を指定 し た場
合は不正にな り 、 手続 き のポ イ ン タ がその ま ま渡 さ れ ます。
%REF は、 呼び出 さ れた手続 き に実引 き 数のア ド レ ス を渡す こ と を指定 し ます。 文字型でない引
き 数の場合、 こ れはデフ ォ ル ト です。 文字型引 き 数の場合、 %REF は隠れた長 さ パ ラ メ ー タ を無
効に し ます。
228
第9章
Fortran 指令の使用方法
HP Fortran 指令の使用方法
%VAL お よ び %REF を CALL 文で使用 し た場合、 $HP$ ALIAS 指令での指定が不正にな り ます。 こ
れ ら の組み込ま れた関数について と CALL 文での使用についての詳細は、 『HP Fortran リ フ ァ レ
ン ス ガ イ ド 』 を参照 し て く だ さ い。
次の制限事項に注意 し て く だ さ い。
•
$HP$ ALIAS の名前を再定義す る と 、 警告 メ ッ セージ を表示 し ます。
•
コ ンパ イ ラ は、 external-name を常に入力 さ れた と お り 正確に使用 し ます。大文字 / 小文字の
変換は発生せず、 下線は追加 さ れ ません。 +ppu お よ び +uppercase コ マ ン ド 行オプシ ョ ン
は、 $HP$ ALIAS 指令で指定 し た外部名には適用 さ れ ません。
局所使用 と 大域使用
$HP$ ALIAS 指令は、 次の よ う に局所的ま たは大域的に使用す る こ と がで き ます。
•
$HP$ ALIAS 指令は局所的に適用 し ます。 つま り 、 特定のプ ロ グ ラ ム単位の境界内で使用す
る と 、 その効果はそのプ ロ グ ラ ム単位に限定 さ れ ます。 局所的にのみ適用す る には、 こ の指
令を指示先のプ ロ グ ラ ム単位内で PROGRAM, SUBROUTINE ま たは FUNCTION 文の後に最初に
現れ る name の前に も 指定 し なければな り ません。
•
$HP$ ALIAS 指令は、 大域的に適用 し ます。 つま り 、 適用 さ れ る プ ロ グ ラ ム単位の境界の外
側や境界の手前で指定す る と 、 後続のすべてのプ ロ グ ラ ム単位に適用 さ れ ます。
例
$HP$ ALIAS 指令は、 Fortran と 異な る 規約を使用す る 言語でルーチン を呼び出す場合に特に役
立ち ます。 後述の例は、 $HP$ ALIAS 指令を使用 し て次の よ う な違い を解決す る 方法を示 し てい
ます。
•
大文字 と 小文字の区別
•
引 き 数渡 し 規約
•
文字列
大文字 と 小文字の区別
HP Fortran では、 名前の大文字 と 小文字は区別 さ れ ません。 つま り 、 コ ンパ イ ラ は、 すべての
名前を小文字に変換 し ます。 こ れは、 大文字 / 小文字が区別 さ れ る 言語でルーチン を参照 し 、 そ
のルーチン名に大文字が含ま れてい る 場合に、 そのルーチン を HP Fortran 内で呼び出す と 、 参
照が解決 さ れない こ と を意味 し ます。 こ の問題を解決す る には、 次の例の よ う に、 $HP$ ALIAS
指令で、 小文字だけ を使用 し て名前を再定義 し ます。
!$HP$ ALIAS printnames = 'PrintNames'
第9章
229
Fortran 指令の使用方法
HP Fortran 指令の使用方法
引き数渡 し 規約
HP Fortran では、 デフ ォ ル ト でサブルーチン ま たは関数呼び出 し のすべてのパ ラ メ ー タ は参照
に よ り 渡 し ます。 つま り 、 パ ラ メ ー タ の値ではな く ア ド レ ス が渡 さ れます。 こ れに対 し て、 C
コ ー ド では、 パ ラ メ ー タ は値を渡 し ます。 つま り 、 呼び出 さ れたルーチンには、 実パ ラ メ ー タ の
現在の値が渡 さ れ ます。 $HP$ ALIAS 指令を指定 し なければ、 Fortran プ ロ グ ラ ム か ら C ルーチ
ン を呼び出すのは困難です。
例 と し て、 シ ス テ ムルーチン calloc(malloc(3C) のマ ンページ を参照 ) を呼び出 し て動的 メ モ
リ を取得す る 場合を考え ます。 こ のマ ンページでは、 呼び出 し 側の列が次の よ う に記述 さ れてい
ます。
char *calloc(unsigned nelem, unsigned elsize);
Fortran では、 常にア ド レ ス が渡 さ れ る ので、 Fortran の規格に定め ら れてい る 構文では、
nelem と elsize に対応す る 実パ ラ メ ー タ を指定す る のは困難です。 $HP$ ALIAS 指令を使用す
る と 、 値渡 し で呼び出す実パ ラ メ ー タ を生成す る よ う に コ ンパ イ ラ に指示 し て、 こ の問題を解決
で き ます。
!$HP$ ALIAS calloc(%VAL, %VAL)
文字列
C で記述 さ れたプ ロ グ ラ ム では、 文字列は ヌ ル文字 ('\0') で終 る も の と 期待 し てい ます。 し か
し 、 HP Fortran プ ロ グ ラ ム では、 文字列引 き 数の終わ り を示すために隠れた長 さ パ ラ メ ー タ が
渡 さ れます。 し たが っ て、 HP Fortran か ら C 言語関数に文字列を渡す場合は、 その文字列に ヌ
ルを明示的に追加 し 、 隠れた長 さ パ ラ メ ー タ を抑止 し なければな り ません。 $HP$ ALIAS 指令を
使用す る と 、 Fortran か ら C に文字列を渡す こ と がで き ます。 た と えば、 次の よ う なルーチン が
あ り ます。
例 9-1
pr_str.c
void c_rout(char *s)
{
printf(“%s\n”, s);
}
次のプ ロ グ ラ ム の ALIAS 指令では、 c_rout に文字列を渡す こ と がで き ます。
例 9-2
pass_str.f90
PROGRAM main
!$HP$ ALIAS c_rout(%REF)
CHARACTER(LEN=10) name
name = 'Charlie'
230
第9章
Fortran 指令の使用方法
HP Fortran 指令の使用方法
! Append a null to the string so that C can handle it properly
CALL c_rout(name//char(0))
END PROGRAM main
次に、 両フ ァ イ ルを コ ンパ イ ル、 リ ン ク し てプ ロ グ ラ ム を実行す る ための コ マ ン ド 行 と 、 実行結
果を示 し ます。
$ cc -Aa -c pr_str.c
$ f90 pass_str.f90 pr_str.o
$ a.out
Charlie
詳細情報
%REF お よ び %VAL 組み込み関数の詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ
さ い。
$HP$ CHECK_OVERFLOW 指令
$HP$ CHECK_OVERFLOW 指令は、 整数演算でオーバーフ ロ ーが発生 し た場合に ト ラ ッ プす る コ ー
ド を生成 し ます。 デフ ォ ル ト は、 整数オーバーフ ロ ーを無視 し ます。
構文
!$HP$ CHECK_OVERFLOW INTEGER [ON | OFF]
ON
コ ンパ イ ラ に、 整数オーバーフ ロ ー例外を ト ラ ッ プす る コ ー ド を生成 さ せま
す。
OFF
コ ンパ イ ラ には、 整数オーバーフ ロ ー例外を ト ラ ッ プす る コ ー ド を生成 さ せま
せん。
説明および制限事項
ON 文 と と も に $HP$ CHECK_OVERFLOW を使用す る と 、 プ ロ グ ラ ム にオーバーフ ロ ーを無視す る
か、 オーバーフ ロ ーで中断す る か、 ま たは ト ラ ッ プサブルーチン を呼ぶ よ う に指定で き ます。 こ
の指令を使用 し ない と 、 ON 文は整数オーバーフ ロ ーエ ラ ーには不正です。
こ の指令は、 プ ロ グ ラ ムの ど こ でで も 使用す る こ と がで き 、 後続の $HP$ CHECK_OVERFLOW 指令
に よ っ て ス テー タ ス が変化す る ま で有効です。
詳細情報
ON 文の詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第9章
231
Fortran 指令の使用方法
HP Fortran 指令の使用方法
$HP$ LIST 指令
$HP$ LIST 指令に よ っ て、 リ ス ト 出力 さ れ る フ ァ イ ルに後続の ソ ース行を取 り 込むか ど う か を
指定 し ます。
構文
!$HP$ LIST [ON | OFF]
ON
ソ ース行を リ ス ト 出力 さ れ る フ ァ イ ルに取 り 込みます。
OFF
ソ ース行を リ ス ト 出力 さ れ る フ ァ イ ルに取 り 込みません。
説明および制限事項
$HP$ LIST 指令は、 ソ ース行を リ ス ト 出力 さ れ る フ ァ イ ルに出力す る か を制御 し ます。 こ の指
令が有効なのは、 +list オプシ ョ ン を指定 し て ソ ース フ ァ イ ルを コ ンパ イ ルす る 場合だけです。
こ の指令は、 ソ ース フ ァ イ ル内の ど こ でで も 使用す る こ と がで き ます。
+list オプシ ョ ン を指定 し て コ ンパ イ ルす る フ ァ イ ルに $HP$ LIST OFF 指令が発生す る と 、 リ
ス ト 出力 さ れ る フ ァ イ ルには ソ ース フ ァ イ ル内のその指令ま での内容すべてが出力 さ れ ます。
$HP$ LIST OFF 指令は、 フ ァ イ ルの残 り の部分に適用 さ れ る か、 $HP$ LIST ON 指令に達す る
ま で適用 さ れ ます。
例
$HP$ LIST 指令は、 次の例の よ う に、 イ ン ク ルー ド フ ァ イ ルの リ ス ト 出力を使用禁止にす る 場
合に特に便利です。
!$HP$ LIST OFF
INCLUDE ”/my_stuff/some_generic_declarations.h”
!$HP$ LIST ON
詳細情報
+list オプシ ョ ンの詳細には、 238 ページの 「HP FORTRAN 77 と の非互換性」 の項を参照 し
て く だ さ い。
$HP$ OPTIMIZE 指令
$HP$ OPTIMIZE 指令は、 コ マ ン ド 行で指定 し た最適化レベルを使用可能ま たは使用不可にで き
ます。
232
第9章
Fortran 指令の使用方法
HP Fortran 指令の使用方法
構文
!$HP$ OPTIMIZE [ON | OFF]
ON
コ マ ン ド 行で指定 し た最適化レベルを使用可能に し ます。
OFF
コ マ ン ド 行で指定 し た最適化レベルを使用不可に し ます。
こ の指令は、 こ の指令の後のプ ロ グ ラ ム単位に有効です。 し たがっ て、 対象 と な る プ ロ グ ラ ム単
位の外側に配置 し なければな り ません。 こ の指令を プ ロ グ ラ ム単位の内側に挿入す る と 、 そのプ
ロ グ ラ ム単位には影響せず、 後続のプ ロ グ ラ ム単位にのみ影響 し ます。
説明および制限事項
$HP$ OPTIMIZE 指令を使用す る と 、 プ ロ グ ラ ム の ど の領域がオプテ ィ マ イ ザに よ っ て処理 さ れ
る か を判別で き ます。 $HP$ OPTIMIZE OFF を指定す る と 、 後続の ソ ース行は最適化 さ れ ません。
$HP$ OPTIMIZE ON を使用す る と 、 後続の ソ ース行が再び最適化可能にな り ます。
こ の指令が有効なのは、 プ ロ グ ラ ム の コ ンパ イ ル時に -On ま たは +On オプシ ョ ン を使用 し た場
合だけです。 ど ち ら のオプシ ョ ン も 指定 し ていなければ、 $HP$ OPTIMIZE ON と $HP$
OPTIMIZE OFF を指定す る と 最適化レベルは 0 にな り ます。
サポー ト さ れてい る 指定方法は以下の と お り です。
!HP$ OPTIMIZE ON
!HP$ OPTIMIZE OFF
!HP$ OPTIMIZE level 1
!HP$ OPTIMIZE level 0
!HP$ OPTIMIZE level 2
!HP$ OPTIMIZE level 1 on
!HP$ OPTIMIZE level 0 on
!HP$ OPTIMIZE level 2 on
!HP$ OPTIMIZE level 1 off
!HP$ OPTIMIZE level 0 off
!HP$ OPTIMIZE level 2 off
!HP$ optimize assume_no_parameters_overlaps on
!HP$ optimize assume_no_parameters_overlaps off
第9章
233
Fortran 指令の使用方法
互換性指令
互換性指令
HP Fortran は表 9-2 に示す コ ンパ イ ラ 指令をサポー ト し ます。 こ れ ら の指令は、 同時に示 さ れ
てい る プ ラ ッ ト フ ォ ーム で開発 さ れたプ ロ グ ラ ム と 互換性があ り ます。
表 9-2 HP Fortran で認識 さ れる指令の互換性
ベンダ
クレイ
指令
DIR$ NO SIDE EFFECTS
DIR$ [NO]CONCUR
DIR$ IVDEP
FPP$ NODEPCHK
KAP
*$* [NO]CONCURRENTIZE
*$* [NO]VECTORIZE
VAST
VD$ NODEPCHK
固定形式では、 各指令は注釈文字の C, !, ま たは * の後に書かれ、 ソ ース フ ァ イ ルの 1 桁目か ら
始ま ら なければな り ません。 自由形式では、 指令は Fortran 注釈文字 (!) の後に書かなければな
り ません。
指令名の他にオプシ ョ ンや引 き 数 も あ る 場合、 コ ンパ イ ラ は指令を無視 し ます。
次の項では、 指令についての詳細を説明 し ます。
ベ ク ト ル化の制御
HP Fortran はベ ク ト ルで演算を行 う プ ロ グ ラ ムループ をベ ク ト ル化で き ます。 こ の最適化に
よ っ て コ ンパ イ ラ はループ を Basic Linear Algebra Subroutine (BLAS) ラ イ ブ ラ リ でのルーチ
ン の呼び出 し に置 き 換え ます。 *$* [NO]VECTORIZE 指令を使用す る と 、 ベ ク ト ル化を使用可能
に し た り 、 使用不能に し た り で き ます。 コ ンパ イ ラ は *$* VECTORIZE 指令をループ をベ ク ト ル
化す る 要求 と みな し ます。 ループのベ ク ト ル化を有益お よ び安全に行 う こ と がで き ない と コ ンパ
イ ラ が判定す る 場合、 指令を無視 し ます。
234
第9章
Fortran 指令の使用方法
互換性指令
ベ ク ト ル化の指令を使用す る には、 +Ovectorize オプシ ョ ン で コ ンパ イ ルお よ び リ ン ク を行わ
なければな り ません。 指令は次のループの最初に適用 さ れ、 残 り のプ ロ グ ラ ム単位か、 後の指令
に取っ て代え ら れ る ま で、 効力があ り ます。 こ のオプシ ョ ンについての詳細は、 『HP Fortran リ
フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。 BLAS ラ イ ブ ラ リ についての詳細は、 『HP-UX パ ラ
レル プ ロ グ ラ ミ ン グ ガ イ ド 』 を参照 し て く だ さ い。
パラ レル化の制御
HP Fortran は、 マルチプ ロ セ ッ サマシ ン でのパ ラ レ ル実行の場合に、 各プ ロ セ ッ サに異な る 繰
り 返 し のループ を配置す る こ と に よ っ て、 対象 と な る プ ロ グ ラ ム をパ ラ レ ル化で き ます。 次の指
令は、 パ ラ レル化を局所的に制御 し ます。
•
*$* [NO]CONCURRENTIZE
•
DIR$ [NO]CONCUR
こ れ ら の指令は、 機能を使用す る も の と 抑止す る も のがあ り ます。
*$* CONCURRENTIZE お よ び DIR$ CONCUR はパ ラ レル化を使用可能に し ます。
*$* NOCONCURRENTIZE お よ び DIR$ NOCONCUR はパ ラ レ ル化を使用不能に し ます。
パ ラ レル化の指令は、 +Oparallel オプシ ョ ンお よ び +O3 オプシ ョ ン でプ ロ グ ラ ム を コ ンパ イ ル
お よ び リ ン ク し た場合のみ有効です。 各指令は次のループの最初に適用 さ れ、 残 り のプ ロ グ ラ ム
単位か、 後の指令に取っ て代え ら れ る ま で、 効力があ り ます。
コ ンパ イ ラ は *$* CONCURRENTIZE 指令お よ び DIR$ CONCUR 指令をループ をパ ラ レ ル化す る 要
求 と みな し ます。 コ ンパ イ ラ が有益ま たは安全にループのパ ラ レル化を行 う こ と がで き ない場
合、 指令を無視 し ます。 パ ラ レ ル化を抑止可能な条件については、 『HP-UX パ ラ レル プ ロ グ ラ
ミ ン グ ガ イ ド 』 を参照 し て く だ さ い。
依存検出の制御
パ ラ レル化を要求す る 特別なオプシ ョ ン ま たは指令を使用 し て も 、 コ ンパ イ ラ はデー タ の依存の
可能性を検出 し たループについてはパ ラ レル化 し ません。 し か し 、 問題のループに実際にデー タ
の依存がない こ と が分か っ ていれば、 ループの直前に次の指令のいずれか を挿入で き ます。
•
DIR$ IVDEP
•
FPP$ NODEPCHK
•
VD$ NODEPCHK
第9章
235
Fortran 指令の使用方法
互換性指令
こ れ ら の指令に よ っ て、 コ ンパ イ ラ はパ ラ レル化す る か ど う かの判定時に、 次のループ中での
デー タ の依存を無視 し ます。 DIR$ IVDEP 指令は、 他の 2 つの指令 と 異な り 、 配列に基づいた依
存だけ を コ ンパ イ ラ に無視 さ せ、 ス カ ラ に基づいた依存については無視 さ せません。 こ れ ら の指
令の 3 つ と も 、 次のループにだけ適用 さ れます。
注記
こ れ ら の指令を使用 し てループにデー タ の依存がない と 間違っ て判断 さ せ る と 、
ループは誤っ た結果を だす可能性があ り ます。
VD$ NOCONCUR 指令の存在の よ う に、 コ ンパ イ ラ に よ る パ ラ レ ル化を制限す る 条件が他に も あ り
ます。 こ の よ う な条件は、 依存の検出を使用不能にす る 指令を使用 し て も 、 パ ラ レル化を妨げ ま
す。
副作用検出の制御
コ ンパ イ ラ は、 ルーチンが副作用を含む こ と を検出す る と 、 ルーチン の呼び出 し が埋め込ま れた
ループ をパ ラ レル化 し ません。 し か し 、 ループ内で呼び出 さ れ る ルーチンに副作用がない と 分
か っ てい る 場合、 ループのパ ラ レ ル化の判定時に、 参照す る ルーチン にあ る 副作用を コ ンパ イ ラ
に無視 さ せ る よ う に、 ループの前に DIR$ NO SIDE EFFECTS 指令を挿入で き ます。
こ の指令は直後のループにだけ作用 し ます。
注記
こ れ ら の指令を使用 し てルーチンに副作用がない と 間違っ て判断 さ せ る と 、 ルー
チンの呼び出 し がループに埋め込まれ る と き に誤っ た結果 と な る 可能性があ り ま
す。
こ の指令の ク レ イ の実装は、 指令が実行文ま たは文関数に先行す る 必要があ り ます。 HP
Fortran はその必要があ り ません。
236
第9章
10 HP Fortran への移行
HP Fortran の主な特長は、 規格に合致 し た HP FORTRAN 77 と の間で互換性を確保 し てい る
点です。 既存の HP FORTRAN 77 アプ リ ケーシ ョ ン の フ ァ イ ル と オブジ ェ ク ト フ ァ イ ルは、 比
較的簡単に HP Fortran へ移行で き ます。 ただ し 、 HP Fortran で コ ンパ イ ル し て正常に動作 さ
せ る には、 HP FORTRAN 77 の コ マ ン ド 行オプシ ョ ン の一部、 お よ び、 規格に定め ら れていな
い拡張機能を修正す る 必要があ り ます。
移行を円滑に実行す る ために、 HP Fortran には、 HP FORTRAN 77 と の互換性を確保 し た多数
の拡張機能が用意 さ れてい ます。 HP Fortran は、 他社の Fortran 製品か ら アプ リ ケーシ ョ ン を
簡単に移植す る ための拡張機能を提供 し てい ます。 HP Fortran の拡張機能の要約 リ ス ト につい
ては、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。 他社の Fortran プ ロ グ ラ ム を
HP Fortran に移植す る 方法についての詳細は、 255 ページの第 11 章 「HP Fortran への移植」
を参照 し て く だ さ い。
本章では次の項目について説明 し ます。
•
HP FORTRAN 77 と の非互換性
•
移行に伴 う 問題
•
移行方法
第 10 章
237
HP Fortran への移行
HP FORTRAN 77 と の非互換性
HP FORTRAN 77 と の非互換性
次の項では、 HP Fortran と HP FORTRAN 77 の間の既知の非互換性について説明 し ます。 非
互換性には、 ソ ース レベルお よ びオブジ ェ ク ト コ ー ド の非互換性があ り ます。 非互換性は、 HP
fid ツールで検出 し てい ます。 詳細は、 252 ページの 「Fortran 非互換性デテ ク タ ー」 の項を参
照 し て く だ さ い。
コ ンパイ ラの制限
HP Fortran は、 最大 32767 ま での フ ィ ール ド 幅をサポー ト し ます。 HP FORTRAN 77 は、 最
大 2147483639 ( ほぼ 2*31 と 等 し い ) ま での フ ィ ール ド 幅を サポー ト し ます。
サポー ト さ れていない コ ンパイル行オプ シ ョ ン
HP Fortran コ ンパ イ ラ は、 表 10-1 に示 し た f77 コ マ ン ド 行オプシ ョ ン を受け付け ません。 ま
た、 表 10-2 に示 し た f77 コ ンパ イ ル行オプシ ョ ンは、 f90 では名前が変更 さ れてい ます。 さ ら
に、 HP Fortran の コ ー ド は、 次のオプシ ョ ン を指定 し て コ ンパ イ ル し た HP FORTRAN 77 の
オブジ ェ ク ト フ ァ イ ル と リ ン ク で き ません (249 ページの 「オブジ ェ ク ト コ ー ド に関す る 問題」
の項を参照 )。
表 10-1 f90 でサポー ト さ れていない f77 オプ シ ョ ン
+800
+e
+N
+A
+I[2|4]
+R
+A3
+L8
+U
+A8
+LA
-w66
+apollo
-lisam
+E
+mr
表 10-2 f90 オプ シ ョ ンに置き換え ら え る f77 オプ シ ョ ン
f77 オプ シ ョ ン
-A
238
f90 での名称
+langlvla
第 10 章
HP Fortran への移行
HP FORTRAN 77 と の非互換性
表 10-2 f90 オプ シ ョ ンに置き換え ら え る f77 オプ シ ョ ン ( 続き )
f77 オプ シ ョ ン
f90 での名称
-a
+langlvla
+autodblpad
+autodbla
+B
+escape
-D
+dlines
+es
+extend_source
-F
+cpp_keep
-L
+list
-onetrip
+onetrip
+Q
+pre_include
+s
+langlvla
+T
+fp_exception
+ttyunbuf
+nottybuf
-U
+uppercase
-u
+implicit_none
-V
+lista
a. 完全には置 き 換え ら れ ません。
フ ォ ーマ ッ ト フ ィ ール ド 幅
HP Fortran は、 最大 32767 ま での フ ォ ーマ ッ ト フ ィ ール ド 幅をサポー ト し ます。 一方、 HP
FORTRAN 77 は、 最大 2147483639 ( ほぼ 2**31 と 等 し い ) ま での フ ォーマ ッ ト フ ィ ール ド 幅
をサポー ト し ます。
第 10 章
239
HP Fortran への移行
HP FORTRAN 77 と の非互換性
浮動小数点定数
HP Fortran コ ンパ イ ラ は、 浮動小数点定数の処理が HP FORTRAN 77 と 異な り ます。 HP
Fortran コ ンパ イ ラ は規格に準拠 し てお り 、 単精度定数はすべて単精度デー タ 項目 と し て扱い、
指定時の桁数を無視 し ます。 HP FORTRAN 77 は、 定数を走査 し て、 倍精度型で内部的に保存
し ます。 こ の動作に よ っ て、 結果が異な る こ と があ り ます。
HP Fortran で次の よ う に書いた場合、
DOUBLE PRECISION x = 3.1415926535
x は単精度定数 と 解釈 さ れ、 32 ビ ッ ト 長だけで初期化 さ れ ます。 HP Fortran で、 倍精度定数 と
解釈 さ せ る には、 定数に指数 D ま たは種別型パ ラ メ ー タ を付け る 必要があ り ます。
倍精度を全体的に使用す る プ ロ グ ラ ム では、 +real_constant=double オプシ ョ ン を使用 し て、
実定数をデフ ォ ル ト で倍精度に し てお き ます。 詳細は、 127 ページの第 3 章 「デー タ 記憶領域
の制御」 を参照 し て く だ さ い。
組み込み関数
Fortran 90 規格で新規に導入 さ れた組み込み関数には、 FORTRAN 77 の利用者の関数名やサブ
ルーチン名 と 競合す る も のがあ り ます。 競合を解決す る には、 すべての手続 き ( 特に、 規格に定
め ら れていない HP Fortran) を EXTERNAL 文で宣言 し ます。 規格に定め ら れていない HP
Fortran 組み込み関数の リ ス ト は、 表 11-4 を参照 し て く だ さ い。
ま た、 HP FORTRAN 77 は、 HP Fortran に比べて、 多 く の型の引 き 数を受け付け ます。 た と え
ば、 HP FORTRAN 77 では、 MAX 組み込み関数お よ び MIN 組み込み関数は、 異な る 型の引 き 数
を指定で き ますが、 HP Fortran は規格に準拠 し てい る ため、 引 き 数はすべて同 じ 型に統一す る
必要があ り ます。 HP Fortran の TIME 組み込み関数は、 CHARACTER* 引 き 数を受け入れますが、
整数は受け入れ ません。 他の組み込み関数 も 同様です。
HP Fortran のすべての組み込み関数についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を
参照 し て く だ さ い。
手続き呼び出 し と 定義
手続 き を定義す る か、 手続 き を呼び出す場合、 HP Fortran では、 HP FORTRAN 77 が許 し た次
の条件を満たす必要があ り ます。
•
240
関数引用は、 引 き 数がない場合で も 、 引 き 数並びを か っ こ で囲む必要があ り ます。 た と え
ば、 foo が CHARACTER*10 を返す利用者定義関数であ る 場合、 HP FORTRAN 77 は
LEN(foo) を許 し て 10 を返 し ますが、 HP Fortran では、 LEN(foo()) と 書 く 必要があ り ま
す。
第 10 章
HP Fortran への移行
HP FORTRAN 77 と の非互換性
•
引 き 数並びには省略を示す コ ン マ を書け ません。 コ ン マは、 HP FORTRAN 77 では不明な引
き 数の 「プ レース ホルダー」 と し て使用で き ま し た。 た と えば、 次の文は、 f77 では許 さ れ
ま し たが、 f90 では認め ら れ ません。
call foo (a,)
省略可能な引 き 数を HP Fortran で指定す る には、 OPTIONAL 文を使用 し ます。
•
HP FORTRAN 77 が イ ン タ フ ェ ース を決め る ために使用 し ていた SYSTEM INTRINSIC 指令
は、 HP Fortran ではサポー ト さ れてい ません。
•
HP Fortran では、 再帰的手続 き は、 RECURSIVE キー ワ ー ド を付けて宣言す る 必要があ り ま
す。 再帰的手続 き は、 HP FORTRAN 77 でデフ ォ ル ト で使用で き ま し た。
デー タ 型 と 定数
次に示 し てい る よ う に、 デー タ 型 と 定数に関す る HP FORTRAN 77 の拡張機能は、 HP Fortran
では サポー ト さ れてい ません 。
•
浮動小数点定数のデフ ォ ル ト の記憶領域 と し ての倍精度 (240 ページの 「浮動小数点定数」 の
項を参照 )。
•
I お よ び J の整数接尾辞。HP FORTRAN 77 の定数 10I ( ま たは I*2) を HP Fortran で表す と 、
10_2 にな り ます。 10J ( ま たは J*4) の場合は、 10_4 を使用 し ます。
•
8 進数 と 16 進数には、 それぞれ 8#n と 16#n を使用 し ます。 HP Fortran では、 8 進数定数に
O"n"、 16 進数定数に Z"n" を使用 し ます。
•
COMPLEX 式中の BOZ 定数。 つま り 、 2 進数、 8 進数、 16 進数の定数。
•
非整数の配列添え字お よ び部分列。
•
PARAMETER (RV=1**1.2) の よ う な、 ** ( べ き 算 ) 演算子を含む定数式。
•
次の よ う に、 か っ こ を付けない PARAMETER 文。
PARAMETER i = 1
自由形式の場合、 f90 は、 こ の文を エ ラ ー と し て処理 し ます。 固定形式では、 f90 は、 代入
と し て、 次の文 と 同 じ よ う に処理 し ます。
PARAMETERi = 1
HP Fortran では、 代わ り に PARAMETER (i=1) を使用 し ます。
•
次の よ う に、 文字列で整数を初期化す る ために、 DATA 文を使用す る こ と 。
DATA i /"abcd"/
第 10 章
241
HP Fortran への移行
HP FORTRAN 77 と の非互換性
•
COMPLEX(16) のテ ン ポ ラ リ 使用。 た と えば、 次の宣言の場合、
COMPLEX(KIND=8) :: foo
REAL(KIND=16) :: bar
foo**bar は、 HP FORTRAN 77 では正当ですが、 HP Fortran では不正にな り ます。 HP
FORTRAN 77 では、 計算を継続す る ために、 COMPLEX(16) 言語要素を COMPLEX(8) に強制
的に変換 し ます。
前述の宣言の場合、 HP Fortran は次の式を受け入れ ます。
foo**REAL(bar, 8)
! foo**bar
REAL 組み込み関数についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ
さ い。
入出力
次の入出力指定子は、 HP FORTRAN 77 の OPEN 文お よ び他の入出力文では許 さ れ ますが、 HP
Fortran では認め ら れ ません。
ACCESS=expr1。 こ こ で expr1 は、 DIRECT ま たは SEQUENTIAL 以外の文字定数式です。
•
IOSTAT=
•
KEY=
•
NAME=
•
READONLY
•
STATUS=expr2。こ こ で expr2 は、OLD, NEW, UNKNOWN, REPLACE ま たは SCRATCH 以外の文字
定数式です。
•
TYPE=
HP FORTRAN 77 は、 HP Fortran に比べて、 よ り 多 く の指定子 ( お よ び、 指定子のオプシ ョ
ン ) を認めてい ます。 OPEN 文の場合、 HP FORTRAN 77 バージ ョ ン と HP Fortran バージ ョ ン
では異な り ます。 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 の OPEN の説明 と 、 『HP
FORTRAN/9000 Programmer's Reference』 の説明を読み比べて く だ さ い。
HP FORTRAN 77 では、 変数群出力の文字列は常に引用符で区切 り ます。 HP Fortran で文字列
を区切 る 方法 と 区切 る か ど う かは、 DELIM= 指定子に よ っ て決ま り ます。 ま た、 HP FORTRAN
77 では、 NAMELIST 文を実行可能文の後に書け ますが、 HP Fortran では認め ら れ ません。
NAMELIST 文についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
242
第 10 章
HP Fortran への移行
HP FORTRAN 77 と の非互換性
指令
HP Fortran では、 HP FORTRAN 77 の コ ンパ イ ラ 指令の う ち、 次に示す よ う に、 ご く 少数だけ
をサポー ト し てい ます。
•
ALIAS
•
CHECK_OVERFLOW
•
LIST
•
OPTIMIZE
•
SHARED_COMMON
各指令は構文 と 機能が変更 さ れてい ます。 HP Fortran 指令についての詳細は、 『HP Fortran リ
フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
サポー ト さ れていない指令は、 すべて削除す る か、 HP Fortran で同 じ 機能 と な る コ ー ド で置 き
換え て く だ さ い ( 表 10-3 を参照 )。
その他
次に、 HP Fortran と HP FORTRAN 77 と におけ る その他の非互換性を紹介 し ます。
•
HP Fortran バージ ョ ン の ON 文は、 構文 と 機能に関 し て、 HP FORTRAN 77 バージ ョ ン と は
異な り ます。 た と えば、 ON EXTERNAL お よ び ON INTERNAL は、 HP Fortran ではサポー ト さ
れてい ません。 ON 文の使用方法についての詳細は、 155 ページの第 5 章 「ON 文の使用方
法」 を参照 し て く だ さ い。
•
HP FORTRAN 77 は引 き 数を型変換す る 文関数を受け入れ ますが、 HP Fortran は受け入れ
ません。
•
HP FORTRAN 77 は、 注釈構文 と し て、 { 文字を受け入れ ますが、 HP Fortran は受け入れ ま
せん。
•
HP FORTRAN 77 は、 名前の指定がない PROGRAM 文を受け入れ ますが、 HP Fortran は名前
を要求 し ます。
•
HP FORTRAN 77 では、 PROGRAM 文を拡張 し て コ マ ン ド 行の引 き 数にア ク セ ス で き ますが、
HP Fortran ではで き ません。 組み込み関数を使用 し て コ マ ン ド 行の引 き 数にア ク セ スす る
方法についての詳細は、 194 ページの 「 コ マ ン ド 行引 き 数の参照」 の項を参照 し て く だ さ
い。
•
HP FORTRAN 77 は 20 次元ま での配列を サポー ト し てい ますが、HP Fortran は 7 次元ま で を
サポー ト し てい ます。
第 10 章
243
HP Fortran への移行
HP FORTRAN 77 と の非互換性
•
HP FORTRAN 77 は、 + -A と 書いた式を受け入れ ますが、 HP Fortran では構文エ ラ ーにな
り ます。 その代わ り に、 +(-A) を使用 し ます。
•
HP FORTRAN 77 では、 浮動小数点におけ る 先行す る ゼ ロ を出力 し ませんが、 HP Fortran
では出力 し ます。 こ の動作は、 +E4 オプシ ョ ン を付けて HP FORTRAN 77 プ ロ グ ラ ム を コ
ンパ イ ル し た場合 と 等価です ( ただ し 、 こ のオプシ ョ ンは、 f90 ではサポー ト さ れていない
ので注意 し て く だ さ い )。
•
HP FORTRAN 77 では、 初期化ま たは定数の畳み込みに よ っ てオーバーフ ロ ー し た整数は、
その型の最大値に置 き 換え ら れ ます。 HP Fortran では整数オーバーフ ロ ーを検出す る と 、
エ ラ ー と し て処理 し ます。 検出 さ れなか っ たオーバーフ ロ ー値は、 実行時に切 り 捨て ら れ ま
す。
244
第 10 章
HP Fortran への移行
移行に伴 う 問題
移行に伴 う 問題
移行に伴 う 問題は、 基本的に次の 4 つに分類 さ れ ます。
•
ソ ース コ ー ド に関す る 問題
•
コ マ ン ド 行オプシ ョ ン に関す る 問題
•
オブジ ェ ク ト コ ー ド に関す る 問題
•
デー タ フ ァ イ ルに関す る 問題
ソ ース コ ー ド に関する問題
HP FORTRAN 77 規格に合致 し た コ ー ド は、 f90 コ マ ン ド で再 コ ンパ イ ルす る 場合 と 同 じ よ う
に、 簡単に HP Fortran へ移行で き ます。 f90 コ マ ン ド は、 拡張子が .f お よ び .F の ソ ース フ ァ
イ ルを受け入れ ます。
ただ し 、 HP Fortran へ移行す る 場合、 主 と し て ソ ース コ ー ド が障害にな り ます。 HP
FORTRAN 77 では、 多数の コ ンパ イ ラ 指令や組み込み関数がサポー ト さ れてお り 、 一部は HP
Fortran で も サポー ト さ れてい ますが、 サポー ト 対象か ら 外れた り 、 変更 さ れた も のがあ り ま
す。 次の項では、 HP FORTRAN 77 の ソ ース コ ー ド を HP Fortran へ移行す る と き に、 指令や
組み込み関数を変更す る 方法について説明 し ます。
注記
HP FORTRAN 77 が受け入れてい る プ ロ グ ラ ミ ン グ慣例には、 一般的に使用 さ れ
る が規格に定め ら れていない も のがあ る ため、 HP Fortran でサポー ト さ れていな
い も のがあ り ます。 規格に定め ら れていない慣例、 お よ び、 HP FORTRAN 77 と
HP Fortran と の間の既知の非互換性は、 238 ページの 「HP FORTRAN 77 と の
非互換性」 の項に リ ス ト し てい ます。
指令
HP FORTRAN 77 は、 70 以上の指令を サポー ト し てい ます。 そのなかで、 HP Fortran がサ
ポー ト し てい る のはご く 一部です。 HP Fortran がサポー ト し てい る 指令お よ び指令の新 し い構
文についての詳細は、 243 ページの 「指令」 の項を参照 し て く だ さ い。 HP Fortran の指令は、
LIST 指令を除 き 、 HP FORTRAN 77 に比べて機能が制限 さ れてい る ので注意 し て く だ さ い。 詳
細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第 10 章
245
HP Fortran への移行
移行に伴 う 問題
ほ と ん ど の HP FORTRAN 77 指令は、 HP Fortran でサポー ト さ れてい ませんが、 一部の機能
は コ マ ン ド 行オプシ ョ ン か ら 使用で き ます ( 表 10-3 を参照 )。
表 10-3 f90 オプ シ ョ ンがサポー ト し ている HP FORTRAN 77 指令
HP FORTRAN 77
の 指令
HP Fortran の
オプ シ ョ ン
ANSI
+langlvl=f90
ASSEMBLY
+asm
AUTODBL DBL
+autodbl[4]
AUTODBL OFF
+noautodbl
CONTINUATIONS
使用不能
DEBUG
-g
IF/ELSE/ENDIF
使用不能
GPROF (ON)
+gprof
GPROF OFF
+nogprof
HP_DESTINATION
+DA ま たは +DS
注
FORTRAN 77 の代わ り に、 Fortran 90 に適
用 さ れ ます。
廃止予定。 指令が有効に し た機能は現在、 デ
フ ォ ル ト に設定 さ れてい ます。
C プ リ プ ロ セ ッ サ (cpp) 指令を使用 し ます。
Fortran 90 の INCLUDE 行を使用 し ます。
INCLUDE
オプシ ョ ンはすべてのシ ン ボル も 保存 し ます。
INIT
+Oinitcheck
LIST_CODE
+asm
LONG
+autodbl[4]
オプシ ョ ンは実数に も 影響を与え ます。
LOWERCASE
+[no]uppercase
小文字がデフ ォ ル ト にな り ます。
NLS
+nls
ONETRIP
+[no]onetrip
POSTPEND
+[no]ppu
246
第 10 章
HP Fortran への移行
移行に伴 う 問題
表 10-3 f90 オプ シ ョ ンがサポー ト し ている HP FORTRAN 77 指令 ( 続き )
HP FORTRAN 77
の 指令
HP Fortran の
オプ シ ョ ン
注
RANGE (ON)
+check=all ま たは
-C
RANGE OFF
+check=none
SAVE_LOCALS (ON)
+save
SAVE_LOCALS OFF
+nosave
SET
-D ま たは -U
C プ リ プ ロ セ ッ サの #define 指令を使用 し ま
す。
STANDARD_LEVEL
ANSI
+langlvl=f90
FORTRAN 77 の代わ り に、 Fortran 90 に適
用 さ れ ます。
SYMDEBUG
-g
UPPERCASE
+[no]uppercase
WARNINGS
-w
小文字がデフ ォ ル ト にな り ます。
組み込み関数
HP Fortran は、 HP FORTRAN 77 が提供す る ほ と ん ど の組み込み関数をサポー ト し てい ます。
さ ら に、 ほ と ん ど の組み込み関数は、 HP FORTRAN 77 の よ う に コ ンパ イ ラ 指令や コ マ ン ド 行
オプシ ョ ン を起動 し な く て も 使用で き ます。
HP Fortran で使用で き る 多数の組み込み関数は、 既存の HP FORTRAN 77 ソ ース コ ー ド 内の
利用者定義関数 と 名前が競合す る 可能性があ り ます。 名前の競合は、 EXTERNAL 文を使用す る と
回避で き ます。 ま た、 多 く の HP FORTRAN 77 組み込み関数は、 規格に定め ら れていない型の
引 き 数を受け入れ ます。 HP Fortran は、 こ の点で規格に さ ら に合致 し てい ます。
HP FORTRAN 77 か ら HP Fortran へ移行中のプ ロ グ ラ ム が BSD 3F ラ イ ブ ラ リ の libU77
ルーチン を呼び出す と 、 一部のルーチン名が HP Fortran の組み込み関数 と 競合す る 恐れがあ り
ます。 表 10-4 には、 同 じ 名前の libU77 ルーチン と 組み込み手続 き を リ ス ト し てい ます。 HP
FORTRAN 77 プ ロ グ ラ ム が、 こ れ ら の libU77 ルーチン を呼び出す場合、 ルーチン を
第 10 章
247
HP Fortran への移行
移行に伴 う 問題
EXTERNAL 文で宣言 し て、 libU77 ルーチン を取得 し ます。 そ う し ない と 、 コ ンパ イ ラ は対応す
る 組み込み手続 き を選択 し ます (libU77 ルーチンの ラ イ ブ ラ リ を リ ン ク す る f90 オプシ ョ ンは、
+U77 です )。
表 10-4 名前が競合する組み込み関数 と libU77 ルーチ ン
FLUSH
IARGC
SYSTEM
FREE
IDATE
TIME
GETARG
LOC
GETENV
MALLOC
HP Fortran のすべての組み込み関数お よ び libU77 ルーチン についての詳細は、 『HP Fortran
リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
コ マ ン ド 行オプ シ ョ ンに関する問題
コ マ ン ド 行オプシ ョ ンは、 次の場合に移行に伴 う 問題 と な り ます。
HP Fortran コ ンパ イ ラ で コ ンパ イ ルす る と き に、 f77 コ マ ン ド 行を使用す る 場合。 コ マ ン ド
行にサポー ト 対象外の f77 オプシ ョ ン が含まれてい る と 、 f90 はオプシ ョ ンにエ ラ ー メ ッ
セージ を出力 し ます。
•
表 10-5 には、 機能は同 じ で も 名前が異な る f77 と f90 のオプシ ョ ン を リ ス ト し てい ます。
f90 でサポー ト さ れていない f77 オプシ ョ ン の リ ス ト については、 表 10-1 を参照 し て く だ
さ い。 ま た、 f90 オプシ ョ ン で置 き 換え ら れ る f77 オプシ ョ ン の リ ス ト については、 表 10-2
を参照 し て く だ さ い。
f77 と f90 で作成 し たオブジ ェ ク ト フ ァ イ ルが混在 し てい る プ ロ グ ラ ム を実行す る 場合。オブ
ジ ェ ク ト フ ァ イ ルを リ ン ク で き て も 、 互換性がないために問題が生 じ ます。 互換性が確保 さ
れていない と 、 作成 し た実行可能プ ロ グ ラ ムは予期せぬ動作や誤っ た結果を示 し ます。 オブ
ジ ェ ク ト フ ァ イ ルに互換性がないために移行時に問題が出 る こ と は まれですが、 問題が発生
し た場合、 その検出は困難です。 こ の問題については、 次の項で説明 し ます。
•
表 10-5 f90 でサポー ト さ れている f77 オプ シ ョ ン
f77 の
オプ シ ョ ン
-C
248
f90 のオプ シ ョ ン
+check=all
機能
実行時に添え字をチ ェ ッ ク し ます。
第 10 章
HP Fortran への移行
移行に伴 う 問題
表 10-5 f90 でサポー ト さ れている f77 オプ シ ョ ン ( 続き )
f77 の
オプ シ ョ ン
f90 のオプ シ ョ ン
機能
-G
+gprof
gprof に よ る プ ロ フ ァ イ ルを準備 し ます。
-K
+save
ス タ ッ ク の代わ り に、 局所的な静的記憶領域を使用 し
ます。
-N
+noshared
リ ン カーの出力を共有不能 と し てマー ク し ます。
-n
+shared
リ ン カーの出力を共有可能 と し てマー ク し ます。
-p
+prof
prof に よ る プ ロ フ ァ イ ルを準備 し ます。
-Q
+nodemand_load
リ ン カーの出力を demand load と し てマー ク し ませ
ん。
-q
+demand_load
リ ン カーの出力を demand load と し てマー ク し ま
す。
-R4
+real_constant=si
ngle
すべての単精度定数に対 し て単精度をデフ ォ ル ト 値に
し ます。
-R8
+real_constant=do
uble
すべての単精度定数に対 し て倍精度をデフ ォ ル ト 値に
し ます。
-S
+asm
アセ ンブ リ リ ス ト を生成 し ます。
-s
+strip
リ ン カーの出力か ら シ ン ボルテーブル情報を削除 し ま
す。
-Y
+nls
母国語サポー ト を使用可能に し ます。
+Z
+pic=long
位置独立 コ ー ド ( ラ ージモデル ) を生成 し ます。
+z
+pic=short
位置独立 コ ー ド ( ス モールモデル ) を生成 し ます。
オブ ジ ェ ク ト コ ー ド に関する問題
移行に伴 う 問題は、 実行時にな っ て予期せぬ動作や不正確な結果を示す こ と があ り ます。 こ う し
た問題は、 HP FORTRAN 77 と HP Fortran で互換性のないオブジ ェ ク ト フ ァ イ ルを リ ン ク し
た場合に発生 し ます。
第 10 章
249
HP Fortran への移行
移行に伴 う 問題
f77 で生成 し たオブジ ェ ク ト フ ァ イ ルの形式は、 f90 で生成 し たオブジ ェ ク ト フ ァ イ ルの形式 と
互換性があ り ますが、 f77 で生成 し た フ ァ イ ルの個々のデー タ 項目には互換性はあ り ません。
HP FORTRAN 77 のオブジ ェ ク ト フ ァ イ ルを規格に定め ら れていない形式でデー タ を表現す る
と 、 移行時に問題が発生 し ます。 た と えば、 HP Fortran は境界の正 し く ないデー タ や規格に定
め ら れていない論理表現を認め ませんが、 HP FORTRAN 77 は許 し ます。
一方、 手続 き 引用仕様は、 HP FORTRAN 77 の ソ ース コ ー ド で適切に定義 し て呼び出す限 り 、
特に問題にな り ません。 つま り 、 定義 と 呼び出 し が、 引 き 数の型、 戻 り 値の型、 選択戻 り 機能で
一致すれば、 HP Fortran コ ンパ イ ラ は、 呼び出 し を機能 さ せ る ために、 適切な変換や コ ピーな
ど を行い ます。
オブジ ェ ク ト コ ー ド の非互換性に関す る 問題を解決す る には、 ソ ース フ ァ イ ル、 お よ び、 HP
FORTRAN 77 オブジ ェ ク ト フ ァ イ ルの生成に使用 し た f77 コ マ ン ド 行を使用 し ます。
$LOGICAL 指令な ど、 HP Fortran がサポー ト し ていない指令が ソ ース フ ァ イ ルに書かれていな
いか を調べます。 サポー ト 対象の指令についての詳細は、 243 ページの 「指令」 の項を参照 し て
く だ さ い。 次に、 サポー ト さ れていないオプシ ョ ン ( 表 10-1 を参照 ) が書かれていないか、 f77
コ マ ン ド 行を調べます。
オブジ ェ ク ト コ ー ド に非互換性を見つけた場合、 ソ ース コ ー ド を修正 し て、 f90 コ マ ン ド で再 コ
ンパ イ ル し ます。
デー タ フ ァ イルに関する問題
デー タ フ ァ イ ルは、 ど の よ う な Fortran 対応製品で作成 し て も 互換性が取れ る ため、 簡単に移行
で き ます。 ただ し 、 境界が正 し く ないデー タ 、 お よ び、 HP Fortran でサポー ト さ れていない
デー タ 型があ る と 問題にな り ます。 た と えば、 HP FORTRAN 77 は、 主 と し て構造体拡張を扱
う と き 、 境界が正 し く ないデー タ を許 し ます。 ま た、 HP FORTRAN 77 は、 規格に定め ら れて
いない論理表現 も 許 し ます。 そのため、 HP Fortran と 互換性のないデー タ フ ァ イ ルが作成 さ れ
ます。
デー タ フ ァ イ ルの非互換性を解決す る には、 デー タ フ ァ イ ルを生成 し たプ ロ グ ラ ム の ソ ース フ ァ
イ ル、 お よ び、 ソ ース フ ァ イ ルの コ ンパ イ ルに使用 し た コ マ ン ド 行を調べます。 具体的な方法に
ついての詳細は、 249 ページの 「オブジ ェ ク ト コ ー ド に関す る 問題」 の項を参照 し て く だ さ い。
250
第 10 章
HP Fortran への移行
移行方法
移行方法
HP Fortran でプ ロ グ ラ ム を コ ンパ イ ル し て正常に動作 さ せ る ための、 最 も 直接的で労力の必要
な HP FORTRAN 77 の移行方法は、 オ リ ジナルの ソ ース コ ー ド 全体を洗い出 し 、 すべての拡張
機能を削除 し て、 すべての規格に定め ら れていないプ ロ グ ラ ミ ン グ慣例を書 き 直す こ と に よ っ て
Fortran 90 規格に合致 さ せ る こ と です。 そ う す る と 、 移植性の高いプ ロ グ ラ ム にな り ます。
し か し 、 こ の方法では、 必要以上に時間 と 労力がかか り ます。 多数の HP FORTRAN 77 拡張
は、 HP Fortran で も サポー ト さ れてい ます。 ソ ース を変更す る 必要がある のは、 未サポー ト ま
たは互換性のない言語拡張を使用 し てい る 部分を削除ま たは書 き 変え る こ と だけです。
HP FORTRAN 77 プ ロ グ ラ ム を HP Fortran に移行す る こ と は、 手作業で も で き ますが、 非互
換性の検出を補助す る ユーテ ィ リ テ ィ が使用で き ます。 次の項では、 Fortran の移行に関す る 情
報 も 含めて、 こ う し たユーテ ィ リ テ ィ について説明 し ます。
HP 社提供の移行ツール
HP 社の移行ツールには、 HP FORTRAN 77 お よ び HP Fortran コ ンパ イ ラ (f77 お よ び f90),
lintfor お よ び fid があ り ます。
HP FORTRAN 77 コ ンパイ ラ
f77 コ マ ン ド を使用す る と 、 ソ ース コ ー ド が FORTRAN 77 規格に合致 し てい る か を テ ス ト で き
ます。 -A オプシ ョ ン を指定す る と 、 コ ンパ イ ラ は、 ANSI 以外の コ ー ド を検出す る と 警告 メ ッ
セージ を表示 し ます。
f77 を テ ス ト のために使用す る 場合、 ソ ース コ ー ド は FORTRAN 77 の文法に合致 し てい る 必要
があ り ます。 言い換え る と 、 f77 は、 HP 社固有の拡張機能お よ び Fortran 90 固有の言語機能に
メ ッ セージ を出力 し ます。 Fortran 90 機能 (HP FORTRAN 77 では認め ら れていて も 、
FORTRAN 77 規格では認め ら れていない機能を含む ) が ソ ース コ ー ド に含まれてい る か、 移行
時に Fortran 90 の機能を ソ ース コ ー ド を追加す る と 、 f77 コ マ ン ド は使用で き ません。
HP Fortran コ ンパイ ラ
f90 コ マ ン ド は、 f77 コ マ ン ド と 同様、 HP FORTRAN 77 ソ ース フ ァ イ ルの非互換性を検出す
る ために使用で き ます。 f90 が f77 よ り も 優れてい る 点は、 Fortran 90 の機能をすでに備え て
い る コ ー ド で使用 し た り 、 移行プ ロ セ ス の一段階 と し て機能を徐々に追加 し なが ら 使用で き る こ
と です。
第 10 章
251
HP Fortran への移行
移行方法
移行ツール と し ての f90 の欠点は、 f90 で完全に コ ンパ イ ル し て も 、 非互換性がすべて検出で き
る わけではない こ と です。 実行時ま で現れない非互換性 も あ り ます。 さ ら に、 f90 を使用 し て、
f77 で生成 し たオブジ ェ ク ト フ ァ イ ルを リ ン ク す る と 、 予期せぬ動作や不正確な結果が現れ ま
す。 詳細は、 249 ページの 「オブジ ェ ク ト コ ー ド に関す る 問題」 お よ び 250 ページの 「デー タ
フ ァ イ ルに関す る 問題」 の項を参照 し て く だ さ い。
ま た、 f90 コ マ ン ド は、 1 回で 1 つの非互換性 ( 特に構文上の非互換性 ) し か報告 し ません。 言
う ま で も な く 、 1 回で 1 つの非互換性を修正 し 、 修正が完了す る ご と に再 コ ンパ イ ル し ていて
は、 大規模な FORTRAN 77 プ ロ グ ラ ム を HP Fortran に移行す る 場合、 費用効果が低 く な り ま
す。
Lintfor
lintfor ツールは、 HP Fortran の コ ー ド と し て正 し く ない意味の仮定を検出す る ために、 HP
FORTRAN 77 の コ ー ド に使用 し ます。 ただ し 、 lintfor は Fortran の文法を受け入れないた
め、 f77 コ マ ン ド と 同 じ 欠点があ り ます。
Fortran 非互換性デテ ク タ ー
Fortran 非互換性デテ ク タ ー (fid) は、 HP FORTRAN 77 の コ ー ド を HP Fortran に移行す る 作
業を補助す る ために、 HP 社が特別に開発 し た ツールです。 こ の ツールは、 次のデ ィ レ ク ト リ に
入っ てい ます。
/opt/fortran90/contrib/bin/fid
fid は、 タ ーゲ ッ ト ソ ース コ ー ド フ ァ イ ルを対象 と し て、 HP Fortran と の非互換性が報告 さ れ
てい る HP FORTRAN 77 の各種拡張を検索 し ます。 さ ら に、 f77 コ マ ン ド 行で コ マ ン ド 行オプ
シ ョ ンの非互換性 も 検出 し ます。 fid は HP FORTRAN 77 お よ び HP Fortran 間の ソ ース コ ー
ド と オブジ ェ ク ト コ ー ド の非互換性を報告 し ます。 さ ら に、 fid が互換性のない拡張機能を検出
し 、 その機能が HP Fortran で他の方法を使用すれば実現で き る 場合は、 修正を示唆 し ます。
fid は、 プ ロ グ ラ ム全体を検索 し 、 検索結果を報告 し ます。 f77 コ マ ン ド と 同様、 タ ーゲ ッ ト プ
ロ グ ラ ム が HP FORTRAN 77 構文に準拠 し てい る こ と を前提に、 検出 し た非互換性 と と も に構
文エ ラ ー も 報告 し ます。 ただ し 、 f77 と は異な り 、 構文エ ラ ーを検出 し た場合、 fid は、 残 り の
プ ロ グ ラ ム を回復 さ せて、 解析を継続 し ます。 こ の回復機構は、 HP Fortran 言語機能を含むプ
ロ グ ラ ム に も 対応 し てい ます。
fid を使用 し て も 、 すべての非互換性が検出で き る わけではあ り ません。 自動的には検出で き な
い非互換性 も あ り ます。 ま た、 中規模サ イ ズのプ ロ グ ラ ム で も 、 検出に時間のかか る 非互換性 も
あ り ます。
252
第 10 章
HP Fortran への移行
移行方法
fid を起動す る には、 1 つ以上の FORTRAN 77 ソ ース フ ァ イ ルお よ び必要な f77 オプシ ョ ン を
fid コ マ ン ド に付けて実行 し ます。 フ ァ イ ルの一部がすでに HP Fortran へ移行中であ る 場合、
拡張子を .f に変え て fid を実行 し ます。 次に、 コ マ ン ド 行の例を示 し ます。
$ fid +800 file.f
$ fid +es program.f
次に、 非互換性を検出 し て fid が発行す る メ ッ セージ を示 し ます。
fid Warning: The command-line option, +800,
is both source incompatible
and .o incompatible with F90
fid Warning on line 8 of file.f: ON EXTERNAL
not supported by F90
fid Warning on line 9 of file.f: Detected IOSTAT
specifier in OPEN statement: Minor
differences exist between F90 and F77
IOSTAT error numbers
fid が現在検出す る 非互換性は次の と お り です。
•
OPEN 文の入出力指定子 (242 ページの 「入出力」 の項を参照 )。
•
ON EXTERNAL と ON INTERNAL の HP FORTRAN 77 形式。
•
.EQ. お よ び .NE. 演算子の演算対象 と し て使用す る 論理型。
•
すべての HP FORTRAN 77 の コ ンパ イ ラ 指令。 ただ し 、 243 ページの 「指令」 の項に記載 し
た指令は除 き ます。
•
f90オプシ ョ ン でサポー ト さ れていない コ マ ン ド 行オプシ ョ ン (238 ページの表 10-1 を参照)。
ま たは、 f90 オプシ ョ ン で置 き 換え ら れた コ ンパ イ ル行オプシ ョ ン (238 ページの表 10-2 を
参照 )。
注記
第 10 章
fid が検出す る 非互換性 リ ス ト は、 定期的に更新 さ れ ます。 fid コ マ ン ド につい
ての詳細は、 fid(1) のマ ンページ を参照 し て く だ さ い。
253
HP Fortran への移行
移行方法
254
第 10 章
11 HP Fortran への移植
プ ロ グ ラ ム を移植す る 目的は、 プ ロ グ ラ ム を作成 し たプ ラ ッ ト フ ォ ーム に関係な く 、 異な る ベン
ダのプ ロ グ ラ ム を コ ンパ イ ルお よ び実行で き る よ う にす る こ と です。 移植可能な Fortran 90 プ
ロ グ ラ ム には、 規格に指定 さ れていない言語要素を含めずに、 一般に受け入れ ら れてい る コ ー
デ ィ ン グ慣例に従 う 必要があ り ます。
し か し 、 プ ロ グ ラ ミ ン グはそれほ ど単純ではあ り ません。 多数の Fortran プ ロ グ ラ ム には長い歴
史があ り ます。 最初はプ ロ グ ラ ムの作成に同 じ プ ラ ッ ト フ ォ ーム が使用 さ れていため、 プ ロ グ ラ
ム の移植性は問題にな り ませんで し た。 古い Fortran プ ロ グ ラ ムは、 Fortran の多数の方言を
経なが ら 、 時代遅れにな っ てか ら で も 、 相互に影響 し 合っ て き ま し た。 こ う し たプ ロ グ ラ ム を移
植す る こ と は、 移植で き ない機能を見つけて削除す る の と 同 じ く ら い簡単です。 し か し 、 ほ と ん
ど の場合、 移植作業には、 移植不可能な機能を実装す る 方法を探す作業 も 含ま れ ます。
移植作業を簡素化す る ために、 HP Fortran は次の機能を提供 し てい ます。
•
言語拡張機能。 他の Fortran 対応製品 と 互換性のあ る 文、 デー タ 型、 指令、 組み込み関数な
ど。
•
移植プ ロ セ ス を支援す る コ ンパ イ ル行オプシ ョ ン。
本章では次の項目について説明 し ます。
•
拡張機能の互換性
•
移植オプシ ョ ン の使用
注記
第 11 章
HP FORTRAN 77 プ ロ グ ラ ム を HP Fortran に移行す る 方法についての詳細は、
237 ページの第 10 章 「HP Fortran への移行」 を参照 し て く だ さ い。
255
HP Fortran への移植
拡張機能の互換性
拡張機能の互換性
HP Fortran には、 Fortran 90 言語に対す る さ ま ざ ま な拡張機能が含まれてい ます。 その大部分
は、 文、 組み込みルーチン、 お よ び Fortran 90 規格に定め ら れていない実装に固有な コ ンパ イ
ラ 指令な ど、 互換性のあ る 拡張機能です。 た と えば、 ACCEPT 文を含むプ ロ グ ラ ム を移植す る 場
合、 HP Fortran におけ る 互換性のあ る 拡張機能であ る ため、 プ ロ グ ラ ム で規格に定め ら れてい
ない文を含む部分を編集す る 必要はあ り ません。
次の項では、 互換性のあ る 拡張機能について説明 し ます。 HP Fortran の言語拡張機能の リ ス ト
については、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
文
ON 文を除 き (155 ページの第 5 章 「ON 文の使用方法」 を参照 )、 HP Fortran がサポー ト す る 規
格に定め ら れていないすべての文は互換性が確保 さ れてい ます。 表 11-1 は、 ベン ダ別の リ ス ト
です。 互換性を確認す る には、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 に記載 さ れてい る 各文の説
明を参照 し て く だ さ い。
表 11-1 文の互換性
文
実装
説明
ACCEPT
DEC
標準入力か ら 読み込みます。
AUTOMATIC
Sun
記憶領域を ス タ ッ ク に割 り 当て ます。
BYTE
DEC
整数型の言語要素を宣言 し ます。
DECODE
旧バージ ョ ンの
Fortran
書式付 き デー タ を内部記憶領域か ら 入力 し ます。
DOUBLE COMPLEX
旧バージ ョ ンの
Fortran
倍精度複素数型の言語要素を宣言 し ます。
ENCODE
旧バージ ョ ンの
Fortran
書式付 き デー タ を内部記憶領域に出力 し ます。
END ( 構造体の定義 )
DEC
構造体ま たは共用体の定義を終了 し ます。
MAP
DEC
構造体内の共用体を定義 し ます。
256
第 11 章
HP Fortran への移植
拡張機能の互換性
表 11-1 文の互換性 ( 続き )
文
実装
説明
POINTER
( ク レ イ 形式 )
クレイ
ク レ イ 形式のポ イ ン タ と オブジ ェ ク ト を宣言 し
ます。
RECORD
DEC
前に定義 し た構造型の記録を宣言 し ます。
STATIC
Sun
記憶領域を静的 メ モ リ に割 り 当て ます。
STRUCTURE
DEC
名前付 き 構造型を定義 し ます。
TYPE ( 入出力 )
DEC
標準出力に書 き 込みます。
UNION
DEC
構造体内の共用体を定義 し ます。
VIRTUAL
DEC
配列を宣言 し ます。
VOLATILE
DEC
非同期プ ロ セ ス間のデー タ 共有を許可 し ます。
コ ンパイ ラ指令
コ ンパ イ ラ 指令 と は、 コ ンパ イ ラ の状態を制御す る ために、 ソ ース フ ァ イ ルに コ ーデ ィ ン グ し た
行を意味 し ます。 多数のベン ダは、 指令構文を使用 し て、 コ ンパ イ ラ がその指令を特に検索 し な
い限 り 、 指令を注釈 と し て扱 う よ う に コ ンパ イ ラ を設定 し てい ます。 た と えば、 HP Fortran が
認識す る すべての指令は、 自由形式では文字 !、 固定形式では C, * ま たは ! で開始 し ます。 固定
形式の場合、 指令は 1 桁目か ら 始め る 必要があ り ます。
注釈に似た構文を使用す る 指令は、 コ ンパ イ ルを失敗す る 原因にな り ません。 ただ し 、 コ ンパ イ
ラ が指令を認識 し ない場合、 指令で指定 し た機能は失われます。
表 11-2 に リ ス ト し た指令は、 HP Fortran が認識 し 、 他の Fortran 対応製品で も 使用で き る も の
です。 こ れ ら の指令は機能的に互換性があ り ます。 つま り 、 HP Fortran に対す る 影響は、 オ リ
ジナルの実装 と 互換性を持っ てい ます。 互換性の水準を検査す る 指令についての詳細は、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。 指令の使用方法についての詳細は、 188
ページの 「ベ ク ト ル化を局所的に制御す る 」 の項を参照 し て く だ さ い。
第 11 章
257
HP Fortran への移植
拡張機能の互換性
表に示 さ れてい る よ う に、 指令の互換性には、 ソ ース フ ァ イ ルを +Oparallel オプシ ョ ン ま たは
+Ovectorize オプシ ョ ン で コ ンパ イ ル し た場合だけ有効な も のがあ り ます。 それ以外のオプ
シ ョ ン を使用 し た場合は、 注釈 と し て無視 さ れ ます。 こ れ ら のオプシ ョ ンの使用方法についての
詳細は、 187 ページの 「+Ovectorize オプシ ョ ン を使用す る 」 の項を参照 し て く だ さ い。
表 11-2 指令の互換性
ベン ダ
クレイ
KAI
VAST
258
指令
機能
オプ シ ョ ンへの依存
DIR$ IVDEP
依存検査を使用不能に し ます。
+Oparallel
ま たは +Ovectorize
DIR$ NO SIDE EFFECTS
副作用検査を使用不能に し ます。
+Oparallel
ま たは +Ovectorize
DIR$ [NO]CONCUR
パ ラ レル実行の コ ー ド 生成を使
用可能 ( 使用不能 ) に し ます。
+Oparallel
DIR$ [NO]VECTOR
ベ ク ト ル化を使用可能 ( 使用不
能 ) に し ます。
+Ovectorize
FPP$ NODEPCHK
依存検査を使用不能に し ます。
+Oparallel
ま たは +Ovectorize
*$* [NO]CONCURRENTIZE
パ ラ レル実行の コ ー ド 生成を使
用可能 ( 使用不能 ) に し ます。
+Oparallel
*$* [NO]VECTORIZE
ベ ク ト ル化を使用可能 ( 使用不
能 ) に し ます。
+Ovectorize
VD$ [NO]VECTOR
ベ ク ト ル化を使用可能 ( 使用不
能 ) に し ます。
+Ovectorize
VD$ NODEPCHK
依存検査を使用不能に し ます。
+Oparallel
ま たは +Ovectorize
第 11 章
HP Fortran への移植
拡張機能の互換性
HP Fortran は、 指令の接頭辞 も い く つか認識 し ます。 指令の接頭辞は、 注釈文字の後、 指令名
の前に書 く ベン ダ固有の文字列です。 認識 さ れ る 接頭辞は、 表 11-3 に リ ス ト し てい ます。 HP
Fortran は、 こ れ ら の接頭辞で始ま る 指令を読み込み、 指令名が認識で き ない と 、 警告 メ ッ セー
ジ を表示 し て、 指令を無視 し ます。 指令は、 コ ンパ イ ラ が接頭辞 と 指令名を認識 し た と き だけ有
効にな り ます。 つま り 、 HP 社独自の指令か、 表 11-2 に リ ス ト し た指令に限定 さ れ ます。
表 11-3 HP Fortran が認識する指令の接頭辞
接頭辞
ベン ダ
$
SGI
$HP$
HP
$PAR
X3H5
*$*
KAI
DIR$
クレイ
FPP
クレイ
HPF$
高性能 Fortran
VD$
VAST
組み込み手続き
Fortran 90 規格の組み込み関数の他に、 HP Fortran では規格に定め ら れていない組み込み関数
を多数サポー ト し てい ます。 多 く の組み込みは、 他の実装で使用可能な規格に定め ら れていない
組み込み関数 と の互換性が確保 さ れてい ます。 表 11-4 には、 HP Fortran の規格に定め ら れてい
ない組み込み関数の総称名をすべて リ ス ト し てい ます。 個別組み込み関数が存在す る 場合、 総称
名で参照で き ます。 個別組み込み関数お よ び総称組み込み関数名についての詳細は、 『HP
Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
第 11 章
259
HP Fortran への移植
拡張機能の互換性
表 11-4 規格に定め られていない HP Fortran の組み込み手続き
ABORT
DREAL
IDIM
IXOR
RSHFT
ACOSD
EXIT
IGETARG
JNUM
RSHIFT
ACOSH
FLUSH
IJINT
LOC
SECNDS
AND
FNUM
IMAG
LSHFT
SIND
ASIND
FREE
INT1
LSHIFT
SIZEOF
ASINH
FSET
INT2
MALLOC
SRAND
ATAN2D
FSTREAM
INT4
MCLOCK
SYSTEM
ATAND
GETARG
INT8
OR
TAND
ATANH
GETENV
INUM
QEXT
TIME
BADDRESS
GRAN
IOMSG
QFLOAT
XOR
COSD
HFIX
IQINT
QNUM
ZEXT
DATE
IACHAR
IRAND
QPROD
DCMPLX
IADDR
IRANP
RAN
DFLOAT
IARGC
ISIGN
RAND
DNUM
IDATE
ISNAN
RNUM
HP Fortran では、 規格の総称組み込み関数か ら 派生 し た規格に定め ら れていない個別組み込み
関数 も サポー ト さ れてい ます。 規格に定め ら れていない個別組み込み関数は、 表 11-4 には記載
さ れてい ません。 規格に定め ら れていない個別組み込み関数に よ っ て、 総称組み込み関数は、 規
格に定め ら れていない大 き さ のデー タ 型で演算す る 機能を提供 さ れ ます。 た と えば、 総称組み込
み関数 ABS は、 標準デー タ 型の絶対値を返す よ う Fortran 90 規格で定義 さ れてい ます。 HP
Fortran は、 拡張機能 と し て BABS と ZABS を提供す る こ と で、 ABS が規格に定め ら れていない
INTEGER(KIND=1) や DOUBLE COMPLEX の値を使用で き る よ う にな り ます。 多 く の規格に定め ら
れていない個別組み込み関数 (BABS お よ び ZABS な ど ) は、 他の実装で使用可能な同名の組み込
み関数 と の互換性が確保 さ れてい ます。
260
第 11 章
HP Fortran への移植
移植オプ シ ョ ンの使用
移植オプ シ ョ ンの使用
HP Fortran には、 プ ロ グ ラ ム の移植時に使用す る 多数の コ ンパ イ ル行オプシ ョ ンがあ り ます。
+langlvl=90 オプシ ョ ンは特に重要です。 こ のオプシ ョ ン を付けてプ ロ グ ラ ム を コ ンパ イ ルす
る と 、 コ ンパ イ ラ は規格に定め ら れていない機能のすべてに対 し て警告 メ ッ セージ を発行 し ま
す。
さ ら に、 HP Fortran には、 プ ロ グ ラ ムに関す る コ ンパ イ ラ の仮定を変更す る か、 オ リ ジナルの
実装 と の互換性を確保す る コ ー ド を コ ンパ イ ラ が生成す る こ と で、 互換性を提供す る オプシ ョ ン
も あ り ます。 移植に関連す る オプシ ョ ン を使用す る と 、 ソ ース コ ー ド を編集 し て修正す る 手間が
省け ます。
次の項では、 次の各要素を移植す る と き に使用す る オプシ ョ ン について説明 し ます。
•
初期化 さ れていない変数
•
HP Fortran デー タ 型の基本の大 き さ を上回 る デー タ 型
•
HP 個別組み込み関数 と 競合す る 関数名
•
下線 (_) で終わ る 名前
•
ワ ン ト リ ッ プ DO ループ
•
ソ ース コ ー ド の形式が異な っ てい る 場合
•
エ ス ケープシーケ ン ス
初期化 さ れていない変数
129 ページの 「自動割 り 付け変数 と 静的変数」 の項で説明 し た よ う に、 HP Fortran は、 デフ ォ
ル ト で、 ス タ ッ ク か ら プ ロ グ ラ ムの変数に記憶領域を割 り 当て ます。 ただ し 、 Fortran の古い実
装では、 変数に静的記憶領域を割 り 当て ます。 ス タ ッ ク 記憶領域 と 静的記憶領域の違いは、 静的
変数が コ ンパ イ ラ に よ っ て 0 に初期化 さ れ る のに対 し て、 自動割 り 付け変数 ( ス タ ッ ク か ら 割 り
当て ら れた変数 ) は、 プ ロ グ ラ マーが明示的に初期化す る 必要があ る こ と です。
デフ ォ ル ト で静的記憶領域を割 り 当て る 実装を対象 と し て作成 し たプ ロ グ ラ ムは、 コ ンパ イ ラ に
よ る 初期化に依存 し ます。 こ のプ ロ グ ラ ム を、 ス タ ッ ク 記憶領域を割 り 当て る 実装で コ ンパ イ ル
し て実行す る と 、 悲惨な結果にな り ます。 静的記憶領域を割 り 当て る 実装 と の互換性を確保す る
には、 +save オプシ ョ ン を指定 し て コ ンパ イ ル し ます。 こ のオプシ ョ ン を指定す る と 、 コ ンパ イ
ラ は、 すべての局所変数が SAVE 属性を持つ も の と 仮定 し て動作 し ます。
第 11 章
261
HP Fortran への移植
移植オプ シ ョ ンの使用
129 ページの 「自動割 り 付け変数 と 静的変数」 の項で指摘 し た よ う に、 すべての変数を静的記憶
領域に保存す る と パフ ォ ーマ ン ス が低下 し ます。 パフ ォ ーマ ン ス を重視す る 場合は、
+Oinitcheck オプシ ョ ン を使用 し て く だ さ い。 +Oinitcheck オプシ ョ ンは、 +save オプシ ョ ン
と は異な り 、 変数を 「保存」 し ません。 つま り 、 変数を静的記憶領域に移動 し ません。 その代わ
り に、 コ ンパ イ ラ に対 し て、 使用前に定義 さ れていない、 局所的で、 非配列で、 静的なすべて変
数を検索す る よ う 指示 し ます。 コ ンパ イ ラ が検出 し た変数は、 宣言 し た手続 き が呼び出 さ れ る た
びに、 ス タ ッ ク 内でゼ ロ に初期化 さ れ ます。
+save お よ び +Oinitcheck オプシ ョ ンについての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』
の第 3 章を参照 し て く だ さ い。
大き な語サイ ズ
HP Fortran では、 整数型、 実数型、 論理型の基本の語サ イ ズは 4 バ イ ト です。 ただ し 、 ク レ イ
な ど の実装では、 Fortran 90 の語サ イ ズ を 8 バ イ ト に し てい ます。 こ う し た実装を対象に作成
し たプ ロ グ ラ ムは、 高い精度が計算処理で要求 さ れ ます。
整数型、 実数型、 論理型の基本の精度を 2 倍にす る には、 +autodbl オプシ ョ ン で コ ンパ イ ル し
て、 よ り 大 き な語サ イ ズ を使用 し てい る 実装 と の互換性を確保 し ます。 こ のオプシ ョ ンは、
COMPLEX 文お よ び DOUBLE PRECISION 文で宣言 し た型の大 き さ を 2 倍に し ますが、 BYTE と
DOUBLE COMPLEX 文で宣言 し た型は 2 倍に し ません。
倍精度型の精度を大 き く す る と 、 プ ロ グ ラ ムのパフ ォ ーマ ン ス が低下 し ます。 DOUBLE
PRECISION 文で宣言 し た型の精度を拡張す る 必要がなければ、 +autodbl4 オプシ ョ ン を使用 し
て、 単精度型だけ を拡張 し ます。 こ のオプシ ョ ン を指定 し て コ ンパ イ ルす る と 、 基本実数お よ び
倍精度実数 と し て宣言 さ れてい る 型が、 同 じ 精度を持ち、 規格違反にな り ます。
+autodbl オプシ ョ ン と +autodbl4 オプシ ョ ン の使用方法についての詳細は、 134 ページの 「基
本精度の拡張」 の項を参照 し て く だ さ い。 こ れ ら のオプシ ョ ン についての詳細は、 『HP Fortran
リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
ワン ト リ ッ プ DO ループ
最初のループカ ウ ン ト が最終ループカ ウ ン ト を上回 る よ う に DO ループ を コ ーデ ィ ン グす る と 、
Fortran 90 規格はループ を実行 し ない よ う 要求 し ます。 し か し 、 FORTRAN 66 の実装の中に
は、 DO 変数が最終値以上に大 き な値に初期化 さ れていて も 、 DO ループ を少な く と も 1 回繰 り 返
す も のがあ り ます。 こ れを ワ ン ト リ ッ プ DO ループ と 呼びます。
ワ ン ト リ ッ プ DO ループの動作を HP Fortran プ ロ グ ラ ム で複製す る には、 +onetrip オプシ ョ ン
を指定 し て コ ンパ イ ル し ます。 こ のオプシ ョ ンの効果を確認す る ため、 次の見本プ ロ グ ラ ム を作
成 し ます。
262
第 11 章
HP Fortran への移植
移植オプ シ ョ ンの使用
PROGRAM main
DO 10 i = 2, 1
PRINT *, 'Should never happen in standard Fortran 90.'
10 CONTINUE
END PROGRAM main
次の コ マ ン ド 行で コ ンパ イ ルす る 場合、
$ f90 test_loop.f90
初期ループカ ウ ン ト が最終ループカ ウ ン ト を越え てい る ため、 PRINT 文は実行 さ れてい ません。
ループ を少な く と も 1 回だけ実行 さ せ る には、 次の コ マ ン ド 行で コ ンパ イ ル し ます。
$ f90 +onetrip test_loop.f90
こ のプ ロ グ ラ ム を実行す る と 、 結果は次の と お り にな り ます。
$ a.out
Should never happen in standard Fortran 90.
名前の競合
Fortran プ ロ グ ラ ム を移植す る 場合、 名前の競合が よ く 問題にな り ます。 利用者記述手続 き が、
移植先の実装の組み込み手続 き と 同 じ 名前にな る ためです。 コ ンパ イ ラ は、 利用者記述手続 き を
呼び出す と き に、 組み込み関数名を間違っ て選択 し て し ま い ます。 た と えば、 HP Fortran は規
格に定め ら れていない組み込み関数 FLUSH をサポー ト し てい ます。 プ ロ グ ラ ム に同名の外部手
続 き が書かれてお り 、 その手続 き が EXTERNAL 文で宣言 さ れて いない場合、 HP Fortran コ ンパ
イ ラ は、 引用を組み込み関数への引用 と 解釈 し ます。
HP 社固有の組み込み関数 と 同 じ 名前の利用者記述手続 き を識別す る には、 +langlvl=90 オプ
シ ョ ン を指定 し て、 プ ロ グ ラ ム を コ ンパ イ ル し ます。 こ のオプシ ョ ン を使用す る と 、 規格に定め
ら れていない組み込み関数を初め と す る 、 ソ ース コ ー ド 内のすべての HP 社の拡張機能に警告
メ ッ セージ を発行 し ます。 次に、 ソ ース フ ァ イ ルを編集 し て、 コ ンパ イ ラ が組み込み関数 と 仮定
す る 手続 き を EXTERNAL 文で宣言 し ます。
次に見本プ ロ グ ラ ム を示 し ます。
例 11-1
clash.f90
PROGRAM clash
i = 4
j = int1(i)
PRINT *, 'j =', j
END PROGRAM clash
第 11 章
263
HP Fortran への移植
移植オプ シ ョ ンの使用
FUNCTION int1(i)
int1 = i+1
END FUNCTION int1
こ のプ ロ グ ラ ム を +langlvl=90 オプシ ョ ン を付けずに コ ンパ イ ルす る と 、 コ ンパ イ ラ は外部関
数ではな く 、 HP 社の組み込み関数 INT1 を引用 し ます。 その結果、 こ のプ ロ グ ラ ム を実行す る
と 、 次に示す よ う に、 予期せぬ結果が生 じ ます。
$ f90 clash.f90
clash.f90
program CLASH
external function INT1
11 Lines Compiled
$ a.out
j = 4
+langlvl=90 オプシ ョ ン を指定 し てプ ロ グ ラ ム を再 コ ンパ イ ルす る と 、 コ ンパ イ ラ は規格に定
め ら れていない組み込み関数名 と ソ ース形式に フ ラ グ を立て ます。
$ f90 +langlvl=90 clash.f90
program CLASH
i = 4
^
Warning 4 at (3:clash.f90) : Tab characters are an extension to
standard Fortran-90
j = int1(i)
^
Warning 39 at (5:clash.f90) : This intrinsic function is an
extension to standard Fortran-90
external function INT1
int1 = i+1
^
Warning 4 at (10:clash.f90) : Tab characters are an extension to
standard Fortran-90
11 Lines Compiled
組み込み関数 と 名前が競合 し てい る 利用者記述手続 き を識別 し た後、 ソ ース コ ー ド を編集 し て、
次の よ う に、 手続 き を EXTERNAL 文で宣言 し ます。
EXTERNAL int1
264
第 11 章
HP Fortran への移植
移植オプ シ ョ ンの使用
プ ロ グ ラ ム を コ ンパ イ ル し て実行す る と 、 期待どお り の結果にな り ます。
$ f90 clash.f90
clash.f90
program CLASH
external function INT1
11 Lines Compiled
$ a.out
j = 5
注記
名前の競合は、 libU77.a ラ イ ブ ラ リ のルーチン を呼び出す Fortran プ ロ グ ラ ム
で も 発生 し ます。 実装に よ っ ては、 デフ ォ ル ト で libU77.a に リ ン ク し ますが、
HP Fortran は リ ン ク し ません。 こ の ラ イ ブ ラ リ に リ ン ク す る には、 +U77 オプ
シ ョ ン を指定 し てプ ロ グ ラ ム を コ ンパ イ ルす る 必要があ り ます。 +U77 オプシ ョ ン
を指定 し て コ ンパ イ ルせず、 プ ロ グ ラ ムに HP Fortran 組み込み関数 と 同 じ 名前
の libU77 ルーチン の引用があ る と 、 コ ンパ イ ラ が引用先を組み込み関数 と 誤認
し て、 致命的な結果にな る こ と があ り ます。
プ ロ グ ラ ムが libU77 ルーチン を引用 し てい る か ど う かが確実でない場合は、
+langlvl=90 オプシ ョ ン を指定 し て コ ンパ イ ルす る と 、 コ ンパ イ ラ は規格に定め
ら れていないルーチン を引用す る 場合に警告を発 し ます。 libU77 ルーチン を引用
す る HP FORTRAN 77 プ ロ グ ラ ムの移行時に発生す る 問題については、 240
ページの 「組み込み関数」 の項を参照 し て く だ さ い。
下線を追加 し た名前
HP Fortran を除 く Fortran の実装に よ っ ては、 コ ンパ イ ラ が外部名に下線を自動的に追加 し ま
す。 C と Fortran な ど、 複数の言語で作成 し た ソ ース フ ァ イ ルで作成 し たプ ロ グ ラ ム を移植す る
場合、 Fortran コ ー ド の名前に下線が付いていないため、 リ ン カーが C コ ー ド の名前を検出で き
ない こ と があ り ます。 オブジ ェ ク ト コ ー ド 内の Fortran 手続 き の名前 と 一致 さ せ る ために、 C
コ ー ド には明示的に下線が追加 さ れてい る ためです。
+ppu オプシ ョ ン を指定す る と 、 HP Fortran コ ンパ イ ラ は、 手続 き お よ び共通ブ ロ ッ ク を初め と
す る 外部名に下線を追加 し て、 Fortran 以外の ソ ース フ ァ イ ルで書かれた名前 と 一致 さ せます。
た と えば、 Fortran の ソ ース フ ァ イ ルに手続 き proc_array があ り 、 C の ソ ース フ ァ イ ルが こ の
手続 き を proc_array_ と し て引用す る 場合、 Fortran の ソ ース フ ァ イ ルを +ppu オプシ ョ ン を指
定 し て コ ンパ イ ルす る と 、 コ ンパ イ ラ は Fortran オブジ ェ ク ト フ ァ イ ルの手続 き 名 と し て、
proc_array_ を使用 し ます。
第 11 章
265
HP Fortran への移植
移植オプ シ ョ ンの使用
複数言語のプ ロ グ ラ ム で発生す る 名前の競合を解決す る 方法についての詳細は、 208 ページの
「大文字 と 小文字の区別」 の項を参照 し て く だ さ い。
プ ログ ラ ム形式
Fortran 90 規格は、 固定形式ま たは自由形式の ソ ース コ ー ド を認めてい ますが、 同 じ フ ァ イ ルに
異な る 形式が混在す る こ と は認めてい ません。 さ ら に、 ソ ース フ ァ イ ルが固定形式で作成 さ れて
い る 場合、 規格では文が 72 桁を越え ない こ と を要求 し ます。 ま た、 Fortran 90 規格は、 タ ブの
使用 も 認めてい ません。
HP Fortran では、 異な る 形式を次の よ う に処理 し ます。
•
ソ ース フ ァ イ ル名に拡張子 .f90 が付いてい る 場合、 フ ァ イ ルは自由形式で コ ンパ イ ル さ れ
ます。 コ ンパ イ ラ は ソ ース フ ァ イ ル中の タ ブ文字を受け入れ ます。
•
ソ ース フ ァ イ ル名の拡張子が .f ま たは .F であ る 場合、 フ ァ イ ルは固定形式で コ ンパ イ ル さ
れます。
•
フ ァ イ ルが +langlvl=90 オプシ ョ ン で コ ンパ イ ル さ れ る 場合、 前述の よ う に、 フ ァ イ ル名の
拡張子に よ っ て、 固定形式ま たは自由形式 と 解釈 さ れ ます。 し か し 、 タ ブ文字を検出す る
と 、 コ ンパ イ ラ は警告を発行 し ます。
•
フ ァ イ ルが +source=fixed オプシ ョ ン で コ ンパ イ ル さ れてい る 場合、コ ンパ イ ラ は拡張子に
関係な く 、 固定形式 と 解釈 し ます。 タ ブ文字は許 さ れ ます。
•
フ ァ イ ルが +source=free オプシ ョ ン で コ ンパ イ ル さ れてい る 場合、 コ ンパ イ ラ は拡張子に
関係な く 、 自由形式 と 解釈 し ます。
•
フ ァ イ ルが +extend_source オプシ ョ ン で コ ンパ イ ル さ れてい る 場合、 コ ンパ イ ラ は固定形
式お よ び自由形式で、 1 行 254 文字ま で許 し ます。 行のデフ ォ ル ト の長 さ は、 固定形式が 72
文字、 自由形式が 132 文字です。
異な る ソ ース と +langlvl=90 オプシ ョ ン、 +source オプシ ョ ンお よ び +extend_source オプ
シ ョ ンについての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
エ スケープ シーケ ン ス
Fortran の実装には、 バ ッ ク ス ラ ッ シ ュ (\) が先行す る 文字を C のエ ス ケープシーケ ン ス の よ う
に処理す る も のがあ り ます。 た と えば、 プ ロ グ ラ ムに次の文を書 く 場合
PRINT *, 'a\nb\nc'
エ ス ケープシーケ ン ス と 認識 さ れて、 文は次に よ う に出力 さ れます。
266
第 11 章
HP Fortran への移植
移植オプ シ ョ ンの使用
a
b
c
規格に厳格に準拠 し て コ ンパ イ ルす る と 、 同 じ 文は次の よ う に出力 さ れます。
a\nb\nc
HP Fortran は、 エ ス ケープシーケ ン ス をデフ ォ ル ト では認識 し ませんが、 +escape オプシ ョ ン
を指定す る と 、 コ ンパ イ ラ はエ ス ケープシーケ ン ス を認識す る よ う にな り ます。 エ ス ケープシー
ケ ン ス についての詳細は、 『HP Fortran リ フ ァ レ ン ス ガ イ ド 』 を参照 し て く だ さ い。
Tru64 から HP Fortran への移植
アプ リ ケーシ ョ ン を Tru64 か ら HP Fortran へ移植す る ユーザーを支援す る オプシ ョ ン が新たに
サポー ト さ れま し た。 こ れ ら のオプシ ョ ンは、 Tru64 Fortran コ ンパ イ ラ において対応す る オプ
シ ョ ン と 可能な限 り 同 じ 効果が得 ら れ る よ う にな っ てい ます。
+cfc
+cfc フ ラ グが Fortran コ ンパ イ ラ に追加 さ れ ま し た。 +cfc フ ラ グ を指定す る こ と に よ り 、 新た
に実装 さ れた Tru64 Fortran オプシ ョ ン を使用す る こ と がで き る よ う にな り ます。 オプシ ョ ン の
使用方法には、 以下の 2 通 り があ り ます。
/opt/fortran90/tru64/f90
/opt/fortran90/bin/f90 で コ マ ン ド 行に +cfc を指定
+cfc を使用 し て期待どお り の結果を得 る ためには、 下記の ラ ン タ イ ム ラ イ ブ ラ リ パ ッ チが必要
と な り ます。
•
PHSS_31970—liblO77 11.22/11.23 0409
•
PHSS_31971—libcl 11.11
•
PHSS_31972—libcl 11.23 0409 (Aries で使用 さ れ る PA-RISC 用の共有 ラ イ ブ ラ リ も 含む )
•
PHSS_31973—libF90 11.22/11.23 0409
•
PHSS_31974—libF90 11.11
注記
第 11 章
+cfc オプショ ン は、 上記のパッ チを イ ン ス ト ールし ない限り 正常に動作し ま せん。
267
HP Fortran への移植
移植オプ シ ョ ンの使用
改良点
Tru64 Fortran 用に追加 さ れたオプシ ョ ン を サポー ト す る ため、 以下の点が改良 さ れ ま し た。
•
コ マ ン ド 行フ ラ グに CLF_TRU64 ビ ッ ト が追加 さ れ ま し た。 こ の ビ ッ ト を使用す る こ と で、 移
行オプシ ョ ン を通常のオプシ ョ ン と 区別す る こ と がで き ます。
•
コ マ ン ド 行フ ラ グで CLF_DETACHED_SUB_OPT ビ ッ ト が新たにサポー ト さ れ ま し た。 こ の
ビ ッ ト を使用す る こ と で、 空白で区切 ら れたサブオプシ ョ ン (-foo bar) を持つフ ラ グが、 空
白で区切 ら れた引 き 数を持つフ ラ グ と 混同 さ れない よ う にな り ます。
•
f90 ド ラ イ バの新規 ( 疑似 ) フ ェーズ と し て TRU64DRIVER が追加 さ れ ま し た。
•
ド ラ イ バにおけ る Compaq モー ド 判別 コ ー ド が、 追加お よ びア ッ プデー ト さ れま し た。 その
結果、 Compaq モー ド 判別 コ ー ド は以前 よ り も 早 く main() で処理 さ れ る よ う にな り ま し た。
こ れは、 他の ド ラ イ バ コ ン ポーネ ン ト が、 標準オプシ ョ ン を処理す る 前に compaq_flag の
ス テー タ ス を確認す る 必要があ る 場合に対応 し た も のです。
•
Compaq モー ド のデフ ォ ル ト 値が HP モー ド と 異な っ てい る 場合に、それ ら の値が出力 さ れ る
よ う にな り ま し た。
•
メ イ ン テーブルに ‘-align’ オプシ ョ ン が追加 さ れ ま し た。 こ れに よ り 、 サブオプシ ョ ン用に
tru64_align_flags テーブルが生成 さ れ ます。
•
新規の -align オプシ ョ ンは、 すべて既存の +A オプシ ョ ンお よ び +allow_unaligned オプ
シ ョ ン と 同時には指定で き ません。
•
EPC が変更 さ れ、 COMMONs、 レ コ ー ド フ ィ ール ド 、 お よ び SEQUENCE か ら 派生 し た型に対す
る 割 り 付け属性が よ り 柔軟に制御で き る よ う にな り ま し た ( 従来は、 個別に指定す る こ と が
で き ませんで し た )。
•
BRIDGE が変更 さ れ、 整列 さ れていない レ コ ー ド フ ィ ール ド のサブ タ イ プ U2 が、 2、 4、 お よ
び 8 の各レ コ ー ド モー ド で出力 さ れ る よ う にな り ま し た ( 従来は、 パ ッ ク 化フ ィ ール ド と し
てのみ出力 さ れてい ま し た )。 パ ッ ク 化フ ィ ール ド については、 こ の変更は Itanium ベース
プ ロ セ ッ サ を搭載 し たシ ス テ ム でのみ有効です。 こ れは、 PA-RISC で実行 さ れ る バ ッ ク エ ン
ド は、 こ の条件ではアサー ト さ れないためです。
新規オプ シ ョ ン
以下の Tru64 Fortran 用オプシ ョ ンが追加 さ れま し た。
•
-fpconstant フ ラ グ (-R8 の代用 )
•
-check_bounds (-C の代用 )
•
-[no]cpp フ ラ グ
268
第 11 章
HP Fortran への移植
移植オプ シ ョ ンの使用
•
-fixed/-free フ ラ グ
•
-d_lines (+dlines と 同義 )
•
-integer_size (16|32|64) フ ラ グ
•
-i2、 -i4、 -i8 フ ラ グ
•
-1、 -66、 -f66、 -nof77、 -onetrip (+onetrip の代用 )
•
-nof66 (+noonetrip の代用 )
•
-static、 -noautomatic、 -norecursive フ ラ グ ( すべて +save の代用 )
•
-automatic お よ び -recursive (+nosave の代用 )
•
-show [no]code (+[no]asm の代用 )
•
-[no]machine_code (+[no]extend_source の代用 )
•
-col72 (+noextend_source の代用 )
•
-u (+implicit_none の代用 )
•
-names {uppercase|lowercase} (+[no]uppercase の代用 )
•
-[no]altparam (-Wc、 -dps)
•
-what (+what の代用 )
•
+[no]padsrc フ ラ グ (Tru64 モー ド 以外に も 使用可 )。 HP モー ド のデフ ォ ル ト は、 +padsrc。
•
-check [no]bounds オプシ ョ ン ( 例 : -[no]check_bounds)
•
-assume [no]backslash オプシ ョ ン (+[no]escape の逆。 Tru64 モー ド のデフ ォ ル ト は、
HP モー ド と は異な っ てい ます。 )
•
-assume [no]{buffered_io, recl, minus0} オプシ ョ ン ( 新機能 )
•
-assume [no]underscope オプシ ョ ン ( 例 : +[no]ppu)
•
-check [no]{format, output_conversion} オプシ ョ ン ( 新機能 )
•
-convert {big_endian, cray, fdx, fgx, ibm, little_endian, native, vaxd,
vaxg} オプシ ョ ン ( 新機能 )
•
‘-assume [no]accuracy_sensitive’ のサポー ト (+O[no]fltacc にマ ッ ピ ン グ )。 Tru64
モー ド のデフ ォ ル ト は、 accuracy_sensitive。
•
‘-assume [no]dummy_aliases’ のサポー ト (+O[no]parmsoverlap にマ ッ ピ ン グ )
第 11 章
269
HP Fortran への移植
移植オプ シ ョ ンの使用
•
‘-inline {all|none|speed}’オプシ ョ ンのサポー ト (‘all’ と ‘speed’は+Oinlineにマ ッ ピ ン
グ。 ‘none’ は +Onoinline にマ ッ ピ ン グ )
•
‘-speculate {all|none}’ オプシ ョ ン のサポー ト (‘all’ は +Ostatic_prediction にマ ッ ピ
ン グ。 ‘none’ は +Onostatic_prediction にマ ッ ピ ン グ )
•
-[no_]fp_reorder (‘-assume [no]accuracy_sensitive’ の逆 )
•
-[no]omp (+O[no]openmp にマ ッ ピ ン グ )
•
-[no]pipeline (+O[no]pipeline にマ ッ ピ ン グ )
•
-nospeculate (‘-speculate none’ の代用 )
•
-[no]transform_loops (+O[no]loop_transform にマ ッ ピ ン グ )
•
-[no]member_alignment オプシ ョ ン (‘-align [no]records’ の代用 )
•
-math-library {accurate|fast} オプシ ョ ン (‘accurate’ は +nofastintrinsics にマ ッ
ピ ン グ。 ‘fast’ は動作な し )
•
-reentrancy {none|threaded} お よ び -noreentrancy オプシ ョ ン。コ ンパ イ ラ に よ り 認識
さ れ ますが無視 さ れ ます。
•
-noD お よ び -nov オプシ ョ ン。 コ ンパ イ ラ に よ り 認識 さ れ ますが無視 さ れ ます。
•
-threads/-pthread オプシ ョ ン。 コ ンパ イ ラ に よ り 認識 さ れ ますが無視 さ れ ます。
•
-norun オプシ ョ ン (+_ の代用 )
•
-[no]pad_source オプシ ョ ン (+[no]padsrc の代用 )
•
-r8 オプシ ョ ン (+r8 と 同等 )
•
-fpe0 お よ び -fpe オプシ ョ ン (‘+fp_exception -W1,+FPD’ にマ ッ ピ ン グ )
•
-fpel オプシ ョ ン (+fp_exception にマ ッ ピ ン グ )
さ ら に、 Tru64 モー ド に対す る 以下のデフ ォ ル ト が変更 さ れ ま し た。
•
+U77 は常にオ ン
•
局所変数に静的領域を使用 (+save)
•
+nopadsrc
•
-altparam
Tru64 オプシ ョ ンのすべて を含む一覧は、 f90(1) のマ ンページ を参照 し て く だ さ い。
270
第 11 章
用語集
B
Basic Linear Algebra Subroutine ラ イ ブ ラ リ
低水準のベ ク ト ルお よ び行列演算を実行す る 事実上の標準ルーチンの ラ イ ブ ラ リ 。 ラ イ ブ ラ リ の
ルーチン にア ク セ スす る には、 -lblas オプシ ョ ン を指定 し て、 コ ンパ イ ルす る 必要があ り ます。
BLAS
「Basic Linear Algebra Subroutine ラ イ ブ ラ リ 」 を参照
BOZ 定数
DATA 文で初期値 と し て使用す る 整定数。 2 進数 (B)、 8 進数 (O)、 ま たは 16 進数 (Z) で指定 し ま
す。
C
cpp
「C プ リ プ ロ セ ッ サ」 を参照
C プ リ プロセ ッサ
C 言語のユーテ ィ リ テ ィ 。 ソ ース フ ァ イ ルに挿入 さ れてい る 指令に従っ て、 プ ロ グ ラ ム の ソ ース
テ キ ス ト に文を追加ま たは削除 し ます。 HP Fortran 90 では、 ソ ース フ ァ イ ルを C プ リ プ ロ セ ッ
サ (cpp) に渡 し て前処理 し た後、 出力を コ ンパ イ ラ に渡 し ます。
D
dde
HP Fortran 90 に付属 し てい る 低水準のデバ ッ ガ HP 分散デバ ッ グ環境を呼び出す コ マ ン ド 。
H
HLO
「高水準オプ テ ィ マ イザ」 を参照
HP DDE
「HP 分散デバ ッ グ環境」 を参照
HP 分散デバ ッ グ環境
HP Fortran 90 プ ロ グ ラ ムの ソ ース レベルのデバ ッ ガ。 「dde」 を参照。
用語集
271
用語集
libU77 ルーチ ン
L
libU77 ルーチ ン
BSD 3F ラ イ ブ ラ リ (libU77.a) 内のルーチン。 libc.a のシ ス テ ム コ ールに Fortran 90 イ ン タ
フ ェース を提供 し ます。 libU77.a ラ イ ブ ラ リ は、 HP Fortran 90 に組み込まれてお り 、 +U77 オ
プシ ョ ン で使用 し ます。
M
.mod フ ァ イル
モ ジ ュ ールを定義ま たは使用す る ために、 Fortran 90 ソ ース フ ァ イ ルを処理す る と き に、 コ ンパ
イ ラ が作成 し て読み込むフ ァ イ ル。
N
NaN
Not-a-Number の略。 無限大を無限大で除算す る な ど、 数学的に意味のない浮動小数点演算を実
行 し た と き の状態。 ON 文を使用す る と 、 NaN を生 じ る 演算を ト ラ ッ プで き ます。
P
PIC
「位置独立 コ ー ド 」 を参照
T
ttv
パ ラ レル実行プ ロ グ ラ ムの解析に使用す る ツール。
tty バ ッ フ ァ リ ン グ
標準出力に出力 さ れたデー タ を画面に送信す る 前に、 バ ッ フ ァ に取 り 込んで効率的に処理す る 方
法。
あ
アー カ イ ブ ラ イ ブ ラ リ
リ ン ク 時に実行可能プ ロ グ ラ ムに リ ン ク 可能なルーチン の ラ イ ブ ラ リ 。 アーカ イ ブ ラ イ ブ ラ リ の
拡張子は .a にな り ます。 「共有ラ イ ブ ラ リ 」 を参照。
ア ン ダー フ ロー
浮動小数点演算の結果が最小の正規化数を下回 る 場合に発生す る 例外。 ア ン ダーフ ロ ーがサポー
ト さ れてい る シ ス テ ム では、 高速ア ン ダー フ ロー を使用す る と 、 こ の例外が効率的に処理で き ま
す。
272
用語集
用語集
共有 ラ イ ブ ラ リ
移行
本マニ ュ アルでは、 HP FORTRAN 77 で作成 し たプ ロ グ ラ ム を HP Fortran 90 に移す こ と を
「移行」 と 呼びます。 「移植」 を参照。
移植
本マニ ュ アルでは、 他社の Fortran 対応製品で作成 し た コ ー ド を、 HP Fortran 90 に移行す る プ
ロ セ ス を 「移植」 と 呼びます。 「移行」 を参照。
位置独立 コ ー ド
絶対ア ド レ ス を持たないオブジ ェ ク ト コ ー ド 。 PIC ( 位置独立 コ ー ド ) は、 コ ー ド と デー タ への
ポ イ ン タ が記述 さ れた リ ン ケージ テーブルです。 リ ン ケージ テーブルは、 実行時に ロ ーダーに
よ っ て書 き 込ま れ ます。 PIC で構成 さ れ る オブジ ェ ク ト コ ー ド を使用す る と 、 共有ラ イ ブ ラ リ が
作成で き ます。
エ イ リ アシング
変数を複数の名前で引用す る こ と 。 次に例を示 し ます。
•
同 じ 変数を複数の実引 き 数 と し て渡 し ます。
•
EQUIVALENCE 文を使用 し ます。
•
上下限を越え た添え字に よ っ て共通ブ ロ ッ ク で宣言 し た配列の要素を引用 し ます。
•
共通ブ ロ ッ ク の変数を実引 き 数 と し て渡 し ます。
エ イ リ ア シ ン グは基本的に最適化を禁止 し ます。
オーバー フ ロー
浮動小数点演算に よ る 結果が最大の正規化数を越え る 場合の例外。 「整数オーバー フ ロー」 を参
照。
か
拡張子
「フ ァ イル名拡張子」 「言語拡張子」 を参照
共有実行可能プ ロ グ ラ ム
テ キ ス ト セ グ メ ン ト ( つま り 、 コ ー ド ) が複数プ ロ セ ス で共有で き る 実行可能プ ロ グ ラ ム。
共有 ラ イ ブ ラ リ
実行時に実行可能プ ロ グ ラ ム に リ ン ク さ れて、 複数のプ ロ グ ラ ム が同時に共有で き る ルーチン ラ
イ ブ ラ リ 。 共有 ラ イ ブ ラ リ の名前は、 拡張子が .sl にな り ます。 「アー カ イ ブ ラ イ ブ ラ リ 」 を参
照。
用語集
273
用語集
行順
行順
メ モ リ 内で C 言語の配列を格納す る 方法。 (Fortran の配列は、 列順で格納 さ れます。) 行順で
は、 2 次元配列の行を メ モ リ 内で連続す る 位置に配置 し ます。 た と えば、 配列 [3][4] の要素
[0][0] は、 第 1 番目に格納 さ れ ます。 [0][1] は第 2 番目、 [0][2] は第 3 番目にそれぞれ格納
さ れ ます。
切 り 捨て エ ラ ー
浮動小数点演算に よ っ て発生す る 精度の損失。 浮動小数点式を評価す る 順番が異な る と 、 切 り 捨
てエ ラ ーが累積 さ れて、 結果に大 き な差が出 る こ と があ り ます。
組み込み関数
HP Fortran 90 の拡張機能であ る %VAL お よ び %REF。 %VAL は、 引 き 数を強制的に値に よ っ て渡
し ます。 ま た、 %REF は、 引 き 数を強制的に参照に よ っ て渡 し ます。
言語拡張機能
ベン ダが追加す る プ ロ グ ラ ミ ン グ言語の機能。 言語の規格で定義 さ れて ません ( ま たは、 規格違
反にな り ます )。 た と えば、 ON 文は、 HP 社の Fortran 90 規格に対す る 言語拡張機能です。
「フ ァ イル名拡張子」 を参照。
コ アダ ン プ
プ ロ グ ラ ムの実行中断後に、 フ ァ イ ルに保存 さ れた実行プ ロ グ ラ ム の コ ア イ メ ージ。 コ ア ダ ン プ
( ま たは、 「 コ ア フ ァ イ ル」 ) には、 中断 し たプ ロ グ ラ ム をデバ ッ グす る と き に使用す る 情報が格
納 さ れてい ます。
高水準オプ テ ィ マ イザ
HP Fortran 90 の最適化成分の 1 つ。 手続 き と フ ァ イ ルに ま たが っ た最適化を行い ます。
高速ア ン ダー フ ロー
ア ン ダーフ ロ ーを起 こ し た演算で、 ゼ ロ で置 き 換え る こ と でア ン ダー フ ロー を処理す る ハー ド
ウ ェ アの機能。
さ
最適化
プ ロ グ ラ ムのパフ ォ ーマ ン ス を改善す る ために、 コ ンパ イ ラ が コ ー ド を変形す る こ と 。
シグナル
「 ト ラ ッ プ」 を参照
実経過時間
実行中のプ ロ グ ラ ムが、 シ ス テ ム時間 と プ ロ セ ス時間を合わせて費や し た時間。 一方、 「仮想時
間」 はプ ロ セ ス時間だけ を対象に し ます。 (CXperf な ど の) プ ロ フ ァ イ ラ は、 仮想時間 と 実経
過時間を ト ラ ッ キ ン グ し て、 プ ロ グ ラ ムのブ ロ ッ ク 時 と 稼働時間に関す る 情報を提供 し ます。
274
用語集
用語集
整数オーバー フ ロー
自動割 り 付け変数
ス タ ッ ク に割 り 付け る 変数。 HP Fortran 90 プ ロ グ ラ ム の変数は、 デフ ォ ル ト で自動割 り 付け変
数にな り ます。 自動割 り 付け変数には、 特徴が 2 つあ り ます。
•
自動割 り 付け変数は、 宣言 さ れた手続 き が起動す る と 割 り 付け ら れ、 手続 き が返 さ れ る と 割
り 付けが解除 さ れ ます。 し たがっ て、 自動割 り 付け変数は、 呼び出 し 時に元の値を保持 し ま
せん。
•
自動割 り 付け変数は、 明示的に初期化す る 必要があ り ます。
「静的変数」 を参照。
シ リ アル実行
1 台のプ ロ セ ッ サだけが実行す る プ ロ グ ラ ム。 「パラ レル実行」 を参照。
シ ンボルテーブル
オ フ セ ッ ト ア ド レ ス を含む、 手続 き と デー タ の名前を格納 し たテーブル。 コ ンパ イ ラ は、 デバ ッ
ガ と プ ロ フ ァ イ ラ が使用で き る よ う に、 オブジ ェ ク ト フ ァ イ ルにシ ン ボルテーブルを挿入 し ま
す。
ス タ ッ ク オーバー フ ロー
実行時にシ ス テ ムが使用可能な範囲を越え た メ モ リ を ス タ ッ ク に割 り 付け る と き に発生す る エ
ラ ー。 大 き さ が非常に大 き な配列を割 り 付け る か、 再帰的プ ロ グ ラ ム が暴走す る と 、 こ う し た状
態にな り ます。
ス ト リ ーム入出力
ス ト リ ームの概念 ( フ ァ イ ル ま たは入出力装置間のデー タ フ ロ ー ) に基づ く 入出力の 1 種。 ス ト
リ ームは、 HP-UX オペレーテ ィ ン グ シ ス テ ム が管理 し ます。 ス ト リ ームへのア ク セ ス は、 ス ト
リ ーム ポ イ ン タ に よ っ て指示 さ れ ます。 ス ト リ ーム ポ イ ン タ は、 ス ト リ ーム に関す る 情報を格納
す る C 言語の構造体に類似 し た構造体のア ド レ ス です。 Fortran 90 の組み込み関数 FSTREAM に
論理装置番号を指定す る と 、 ス ト リ ーム ポ イ ン タ を返 し ます。 その結果、 Fortran プ ロ グ ラ ムは
ス ト リ ームベース のシ ス テ ムルーチンにア ク セ ス で き ます。
スレ ッ ド
単一のプ ロ セ ス内部の独立 し た制御の流れ。 独自の レ ジ ス タ セ ッ ト と プ ロ グ ラ ム カ ウ ン タ があ り
ます。 HP-UX オペレーテ ィ ン グ シ ス テ ム では、 同 じ プ ロ セ ス内で も 複数ス レ ッ ド の実行がサ
ポー ト さ れてい ます。
ス レ ッ ド ト レース ビ ジ ュ ア ラ イザ
「ttv」 を参照
整数オーバー フ ロー
整数を使用 し て、 範囲外の値を表す と き に発生す る 例外。 整数オーバーフ ロ ーは、 ON 文で ト
ラ ッ プで き ます。
用語集
275
用語集
静的変数
静的変数
静的な記憶領域 ( 「 ヒ ープ」 ) に割 り 付け ら れた変数。 静的変数には、 次の 2 つの特徴があ り ま
す。
•
プ ロ グ ラ ムが稼働 し てい る 間、 値を保持 し ます。
•
割 り 付け時に初期化 さ れ ます。
HP Fortran 90 プ ロ グ ラ ムの変数はデフ ォ ル ト で自動割 り 付け変数にな り ます。
精度
浮動小数点数値を表す桁数。 倍精度数値は単精度数値 よ り 精度が高 く な り ます。
セグ メ ン テーシ ョ ン違反
例外の一種。 実行中のプ ロ グ ラ ムが割 り 付け ら れた メ モ リ セ グ メ ン ト 外の メ モ リ にア ク セ スす る
と 発生 し ます。 「 メ モ リ フ ォ ル ト 」 と も 呼ばれます。
ゼロ除算
シ ス テ ム が非ゼ ロ の値をゼ ロ で除算す る と 発生す る 浮動小数点の例外。
た
デー タ の依存
デー タ 定義 と その使用間で確立可能な関係。 ループ中にデー タ の依存が発生す る と 、 オプテ ィ マ
イ ザはパラ レル化を阻止 し ます。
デー タ の割 り 付け境界
メ モ リ 中で占め る デー タ の位置。 8 バ イ ト よ り 大 き なオブジ ェ ク ト を除 き 、 HP Fortran 90 は、
デー タ を語境界 ( デー タ の大 き さ の倍数 ) に整列 さ せます。 8 バ イ ト 以上のオブジ ェ ク ト は、 8
バ イ ト 境界に整列 さ れます。
デバ ッ ガ
「HP 分散デバ ッ グ環境」 を参照
ド ラ イバ
コ ンパ イ ラ の成分。 コ ンパ イ ルプ ロ セ ス全体を制御 し ます。
ト ラップ
例外に よ っ て発生す る シ ス テ ム状態の変化お よ び例外を検出 し た実行プ ロ グ ラ ムに よ っ て発生す
る シ ス テ ム状態の変化。 ト ラ ッ プは使用可能ま たは使用不能に設定で き る ハー ド ウ ェ アの機能で
す。 ト ラ ッ プ を使用可能に設定す る と 、 例外を検出 し たプ ロ グ ラ ムの制御の流れを変更 し ます。
ト ラ ッ プに呼応 し て、 シ ス テ ムはシ グナル ( た と えば、 SIGFPE) を生成 し 、 プ ロ グ ラ ムに通知 し
ます。 こ の よ う なプ ロ グ ラ ムは、 ト ラ ッ プ を処理で き る よ う 設計 さ れてい ます。 HP Fortran 90
には、 ト ラ ッ プ を処理す る ON 文があ り ます。
276
用語集
用語集
プロ フ ァ イ ラ
な
ヌル
ヌ ル文字 ('\0')。 C プ ロ グ ラ ム で文字列の終了 さ せ る ために使用 し ます。
は
バッ クエン ド
コ ンパ イ ラ の成分。 オブジ ェ ク ト コ ー ド を最適化 し て生成 し ます。 「フ ロ ン ト エ ン ド 」 を参照。
バ ッ フ ァ リ ン グ、 tty
「tty バ ッ フ ァ リ ング」 を参照
パラ レル化
プ ロ グ ラ ムの対象ループ を複数のプ ロ セ ッ サでパ ラ レル実行で き る よ う 変形す る 最適化。
パラ レル実行
複数のプ ロ セ ッ サでプ ロ グ ラ ム を同時に実行す る こ と 。 コ ンパ イ ラ に よ る 最適化には、 プ ロ グ ラ
ム の対象ループ をパ ラ レ ル実行用に変形す る 作業が含まれ ます。
フ ァ イル記述子
HP-UX オペレーテ ィ ン グ シ ス テ ムの特定の入出力ルーチン が返す整数。 他のルーチン に渡 し て
フ ァ イ ルを探査 し ます。 フ ァ イ ル記述子は、 Fortran の論理装置番号 と 似てい ます。 Fortran 90
の組み込み関数 FNUM は、 論理装置番号を与え ら れ る と 、 フ ァ イ ル記述子を返 し ます。
フ ァ イル名拡張子
ピ リ オ ド (.) で始ま り 、 フ ァ イ ルの機能や内容を示すために フ ァ イ ル名に追加 さ れ る 文字列。
「言語拡張子」 を参照。
副作用
オプテ ィ マ イ ザのループのパラ レル化を阻害す る 条件。 ループ内部で呼び出 さ れ る 手続 き が、 外
部 と や り と り をす る と き に戻 り 値以外を介す る 場合、 副作用が出ます。
浮動小数点例外
「例外」 を参照
古いプ ロ グ ラ ム
FORTRAN 77 以前の古いプ ロ グ ラ ム。 穿孔カー ド で符号化 し て保存 さ れたため、 古いプ ロ グ ラ
ム と 呼ばれてい ます。 こ のプ ロ グ ラ ム では、 移植 と 最適化が困難です。
プロフ ァ イ ラ
プ ロ グ ラ ムが実行時間を費やす場所を判別す る ためのプ ロ グ ラ ミ ン グ ツール。 HP Fortran 90 で
は、 prof, gprof, CXperf が提供 さ れてい ます。
用語集
277
用語集
フ ロン ト エン ド
フ ロン ト エン ド
コ ンパ イ ラ の成分。 ソ ース コ ー ド を解析 し 、 警告 と エ ラ ー メ ッ セージ を発行 し ます。 「バ ッ ク エ
ン ド 」 を参照。
ベ ク ト ル化
配列上で操作す る プ ロ グ ラ ム の対象ループ を、 同 じ 処理を実行す る ために特別にチ ュ ーニ ン グ し
たルーチン で置 き 換え る 最適化技術。
ま
ミ リ コ ー ド ルーチ ン
頻繁に呼び出 さ れ る 組み込み関数の ミ リ コ ー ド バージ ョ ン。 呼び出 し のオーバーヘ ッ ド がほ と ん
ど な く 、 エ ラ ー処理 も ほ と ん ど行われ ません。 HP Fortran 90 の最適化では、 適切な組み込み関
数に対す る 呼び出 し を、 ミ リ コ ー ド バージ ョ ン で置 き 換え ます。
無効演算
浮動小数点の例外。 シ ス テ ム が NaN の よ う に、 意味のない数字を解釈す る と 発生 し ます。
メ モ リ フ ォル ト
「セグ メ ン テーシ ョ ン違反」 を参照
モ ジ ュ ール
デー タ の共有に使用す る Fortran 90 のプ ロ グ ラ ム単位の種類。 モジ ュ ールは副プ ロ グ ラ ム を格
納す る ために も 使用で き ます。
ら
例外
プ ロ グ ラ ムの実行中に発生す る 条件。 特別な処理を施せば、 実行が意味のあ る も の と な り ます。
一部の例外は、 シ ス テ ムが ト ラ ッ プす る ため、 プ ロ グ ラ ム内部で処理で き ます。
列順
Fortran 90 の配列を メ モ リ に格納す る 方法。 列順では、 2 次元配列の列を メ モ リ 内で連続す る 位
置に配置 し ます。 た と えば、 配列 (3,4) の要素 (1,1) は、 第 1 番目に格納 さ れ ます。 (2,1) は
第 2 番目、 (3,1) は第 3 番目にそれぞれ格納 さ れ ます。 「行順」 を参照。
わ
ワ ン ト リ ッ プ DO ループ
ループ を少な く と も 1 回繰 り 返す DO ループ。 FORTRAN 66 のプ ロ グ ラ ムは、 ワ ン ト リ ッ プ DO
ループに依存 し てい ます。
278
用語集
索引
記号
%REF 組み込み関数
定義 , 274
%VAL 組み込み関数
定義 , 274
+DOosname option, 56
+DOosname オプシ ョ ン , 55
+implicit_none オプシ ョ ン , 64
+nls オプシ ョ ン , 67
+Oinfo option, 91
+Oregreassoc オプシ ョ ン , 97, 98
+z オプシ ョ ン , 80
.mod 拡張子 , 272
// ( 連結演算子 ), 215
数字
'0' 文字 , 215
32 ビ ッ ト モー ド
64 ビ ッ ト モー ド , 121
デー タ の大 き さ , 201
4 倍精度変数 , 134
64 ビ ッ ト モー ド
C お よ び Fortran のデー タ 型 , 200
コ ンパ イ ルす る , 121
デー タ の大 き さ , 201
8 進数
定数の BOZ 形式 , 271
定数表現法 , 241
A
a.out フ ァ イ ル , 71
a.out、 デフ ォ ル ト 名 , 44
ABORT 句 , 158
ABORT 手続 き , 259
ACCEPT 文 , 256
ACCESS 指定子 , 242
ACOSD 組み込み関数 , 259
ACOSH 組み込み関数 , 259
ALIAS 指令 , 197, 206, 208, 219, 227, 243
%REF 関数 , 209
%VAL 関数 , 209
例 , 209
AND 組み込み関数 , 259
ANSI 指令 (f77), 246
ASIND 組み込み関数 , 259
ASINH 組み込み関数 , 259
+asm オプシ ョ ン , 34, 48, 50, 246, 248
ASSEMBLY 指令 (f77), 246
索引
ATAN2D 組み込み関数 , 259
ATAND 組み込み関数 , 259
ATANH 組み込み関数 , 259
+autodbl4 オプシ ョ ン , 28, 51, 134, 135, 137,
246, 262
+autodblpad オプシ ョ ン (f77), 238
+autodbl オプシ ョ ン , 28, 50, 134, 135, 137,
200, 201, 246, 262
AUTODBL 指令 (f77), 246
AUTOMATIC 文 , 131, 256
AUTOMATIC 文お よ び属性
+save オプシ ョ ン , 75
-A オプシ ョ ン (f77), 238, 251
-a オプシ ョ ン (f77), 238
-a オプシ ョ ン (ld), 107
-a リ ン カーオプシ ョ ン , 80
B
BADDRESS 組み込み関数 , 259
BLAS ラ イ ブ ラ リ , 106, 187
参照す る , 196
定義 , 271
呼び出す , 189
bold monospace ( 太字のモ ノ スペース フ ォ ン
ト ), 19
BOZ 定数 , 241, 271
BSD 3F ラ イ ブ ラ リ , 78
BYTE 文 , 134, 256
+B オプシ ョ ン (f77), 238
-b オプシ ョ ン (ld), 116
C
calloc シ ス テ ムルーチン
ALIAS 指令 , 230
CALL 句 , 158
CHARACTER 文 , 134
CHECK_OVERFLOW 指令 , 162, 231, 243
+check オプシ ョ ン , 28, 53, 152, 162, 246, 248
close シ ス テ ム コ ール , 198
COMMON 文 , 129, 221
CONCURRENTIZE, 235
CONCURRENTIZE 指令 , 235, 258
CONCUR 指令 , 235, 258
CONTINUATIONS 指令 (f77), 246
COSD 組み込み関数 , 259
cpp, 117
#define 指令 , 119
-D オプシ ョ ン , 119
279
索引
#endif 指令 , 119
f90 で起動す る , 118
#ifdef 指令 , 119
オプシ ョ ン , 27
コ マ ン ド , 24, 27, 117, 153
コ ンパ イ ラ 環境 , 24
出力を保存す る , 120
指令 , 118, 153
制御す る , 27
定義 , 271
デバ ッ グ行 , 153
デバ ッ グ ツール と し て使用す る , 153
マ ンページ , 78, 153
+cpp_keep オプシ ョ ン , 27, 54, 120, 238
+cpp オプシ ョ ン , 27, 53, 118
C プ リ プ ロ セ ッ サ指令 , 225
cpp 出力を保存す る , 120
cpp でプ リ プ ロ セ ス を行 う , 53
cpp に対 し てマ ク ロ を定義す る , 119
Ctrl-C 割 り 込み , 156
CONTROLC キー ワー ド , 163
ト ラ ッ プす る , 163
CXperf プ ロ フ ァ イ ラ
シ ン ボルテーブル , 147
-C オプシ ョ ン , 53
-c オプシ ョ ン , 25, 37, 52, 102, 117
-C オプシ ョ ン (f77), 248
C 言語
extern 指定子 , 221
Fortran か ら 呼び出す , 199
エ ス ケープシーケ ン ス , 58
大文字 と 小文字の区別 , 208, 229
隠 し 長 さ 引 き 数 , 216
共通ブ ロ ッ ク , 221
共有デー タ , 221
構造型 , 205
構造体 , 205
ス ト リ ーム入出力 , 197
添え字 , 211
デー タ 型 , 200
ヌ ル終了 , 215
配列 , 211
引 き 数渡 し 規約 , 206, 230
フ ァ イ ル処理 , 219
フ ァ イ ルを開 く , 198
複素数 , 203
符号な し 整数 , 202
ポ イ ン タ , 205
文字列 , 215
280
論理型 , 202
C プ リ プロセッサ
+cpp_keep オプシ ョ ン , 54
+cpp オプシ ョ ン , 53
-D オプシ ョ ン , 54
-I オプシ ョ ン , 65
-U オプシ ョ ン , 78
指令 , 225
D
DATA 文 , 129
非互換性 , 241
DATE 組み込み関数 , 259
daxpy ルーチン , 187
+DA オプシ ョ ン , 34, 54, 114, 192, 200, 246
64 ビ ッ ト モー ド , 121
+DS と の相互作用 , 57
+DC7200 オプシ ョ ン , 33, 55
DCMPLX 組み込み関数 , 259
dde コ マ ン ド , 146, 271
ddot ルーチン , 187
DEBUG 指令 (f77), 246
DECODE 文 , 256
#define 指令 (cpp), 119
define 指令 (cpp), 119
DELIM 指定子
非互換性 , 242
+demand_load オプシ ョ ン , 37, 56, 121, 248
DFLOAT 組み込み関数 , 259
+dlines オプシ ョ ン , 29, 56, 153, 238
DNUM 組み込み関数 , 259
DOUBLE COMPLEX 文 , 134, 256
DO ループ
FORTRAN66 ス タ イ ル , 72
+Oloop_unroll オプシ ョ ン , 94
+onetrip オプシ ョ ン , 71
DO ループ、 ワ ン ト リ ッ プ , 30, 262
DREAL 組み込み関数 , 259
+DS オプシ ョ ン , 35, 57, 115, 246
-D オプシ ョ ン , 27, 54, 119, 246
-D オプシ ョ ン (f77), 238
D 指数 , 240
E
+E4 オプシ ョ ン , 244
ELSE 指令 (f77), 246
ENCODE 文 , 256
ENDIF 指令 (f77), 246
索引
索引
#endif 指令 (cpp), 119
endif 指令 (cpp), 119
EQUIVALENCE 結合す る , 143
EQUIVALENCE 文 , 129
ERR 指定子 , 149
+escape オプシ ョ ン , 29, 58, 238, 267
+es オプシ ョ ン (f77), 238
EXIT 組み込み関数 , 259
export コ マ ン ド 、 例 , 103, 124, 125
+extend_source オプシ ョ ン , 29, 59, 238, 266
EXTERNAL 文 , 191, 247, 263
名前の競合を解決す る , 247
組み込み関数で使用す る , 240
extern 記憶領域 ク ラ ス指定子 (C), 221
F
f77、 f90 へ移行す る , 237
移行ツール , 251
オブジ ェ ク ト コ ー ド に関す る 問題 , 249
オプシ ョ ン , 248
組み込み関数 , 240, 247
指令 , 243, 245
ソ ース コ ー ド に関す る 問題 , 245
その他 , 243
定数 , 240, 241
デー タ 型 , 241
デー タ フ ァ イ ルに関す る 問題 , 250
手続 き 呼び出 し , 240
入出力 , 242
f90
バージ ョ ン情報 , 79
.f90 拡張子 , 100, 120, 266
f90 コ マ ン ド , 23, 25
cpp を起動す る , 118
PIC を作成す る , 115
移行支援 , 251
構文 , 45
コ ンパ イ ルす る , 44
リ ン ク , 37, 102
f90 ド ラ イ バ
オプシ ョ ン , 25
コ ンパ イ ラ 環境 , 24
制御す る , 25
定義 , 276
fid コ マ ン ド , 252
FILE 構造体 , 197
FLUSH
libU77 ルーチン , 247
索引
組み込み関数 , 247, 259
FMPY 命令 と 最適化 , 90
FNUM 組み込み関数 , 198, 219, 259
フ ァ イ ル記述子 , 198
FORTRAN 66 DO ループ , 71
Fortran 90 規格
最適化 , 85
Fortran 90 へ移行す る , 237
定義 , 273
Fortran 非互換性デテ ク タ ー , 252
+fp_exception オプシ ョ ン , 38, 61, 148, 150,
151, 164, 238
+FP と の比較 , 150
fpsetdefaults ルーチン , 60
fpsetmask ルーチン , 60
+FP オプシ ョ ン , 37, 59, 148, 150
+fp_exception と の比較 , 150
FREE
libU77 ルーチン , 247
組み込み関数 , 247, 259
FSET 組み込み関数 , 259
FSTREAM 組み込み関数 , 197, 219, 259
-F オプシ ョ ン (f77), 238
.F 拡張子 , 100, 120, 245, 266
cpp で処理 さ れ る , 118
.f 拡張子 , 100, 120, 245, 266
G
GETARG
libU77 ルーチン , 247
組み込み関数 , 194, 247, 259
GETARG ルーチン , 195
GETENV
libU77 ルーチン , 247
組み込み関数 , 247, 259
gmon.out プ ロ フ ァ イ ルフ ァ イ ル , 171
gprof, 62
+gprof オプシ ョ ン , 36, 40, 62, 171, 246, 248
GPROF 指令 (f77), 246
gprof プ ロ フ ァ イ ラ , 40
+gprof オプシ ョ ン , 36
使用方法 , 171
GRAN 組み込み関数 , 259
grep コ マ ン ド , 115
-G オプシ ョ ン , 62
-g オプシ ョ ン , 35, 62
f77 と 互換 , 246
コ ー ド の大 き さ , 146
281
索引
最適化 , 173
最適化 コ ー ド , 69
シ ン ボルテーブル , 147
デバ ッ ガ , 146
-G オプシ ョ ン (f77), 248
H
HFIX 組み込み関数 , 259
HP Fortran 90
互換性指令 , 234
HP_DESTINATION 指令 (f77), 246
HP_F90OPTS, 123
HP-UX
シ ス テ ム コ ール , 196
フ ァ イ ル記述子 , 198
フ ァ イ ル処理 , 197
リ ソ ースへア ク セ スす る , 193
HP/DDE デバ ッ ガ
-g オプシ ョ ン , 62
$HP$ ALIAS 指令 , 227
$HP$ CHECK_OVERFLOW 指令 , 231
$HP$ LIST 指令 , 232
$HP$ OPTIMIZE 指令 , 232
+hugesize オプシ ョ ン , 63
I
.i90 拡張子 , 100
cpp 出力 , 120
IACHAR 組み込み関数 , 259
IADDR 組み込み関数 , 259
IARGC
libU77 ルーチン , 247
組み込み関数 , 194, 247, 259
IDATE
libU77 ルーチン , 247
組み込み関数 , 247, 259
IDIM 組み込み関数 , 259
IEEE 浮動小数点規格 , 149
例外 , 156
ifdef 指令 (cpp), 119
#ifdef 指令 (cpp), 119
IF 指令 (f77), 246
IGETARG 組み込み関数 , 194, 259
IGNORE 句 , 158, 159
IJINT 組み込み関数 , 259
IMAG 組み込み関数 , 259
IMPLICIT NONE 文 , 128
282
+implicit_none オプシ ョ ン , 29, 64, 65, 128,
238
IMPLICIT 文
+implicit_none オプシ ョ ン , 64, 65
INCLUDE 行
-I オプシ ョ ン , 65
#include 指令 , 65
INIT 指令 (f77), 246
INT1 組み込み関数 , 259
INT2 組み込み関数 , 259
INT4 組み込み関数 , 259
INT8 組み込み関数 , 259
INUM 組み込み関数 , 259
IOMSG 組み込み関数 , 259
IOSTAT 指定子 , 149, 242
ipcs コ マ ン ド , 138, 139
IQINT 組み込み関数 , 259
IRAND 組み込み関数 , 259
IRANP 組み込み関数 , 259
ISAM ス タ ブ ラ イ ブ ラ リ , 104
ISIGN 組み込み関数 , 259
ISNAN 組み込み関数 , 259
italic ( イ タ リ ッ ク ), 19
IVDEP 指令 , 186, 235, 258
IXOR 組み込み関数 , 259
-I オプシ ョ ン , 27, 29, 65, 113
I お よ び J 接尾辞 , 241
.i 拡張子 , 100
cpp 出力 , 120
I/O
指定子 , 242
非互換性 , 253
J
JNUM 組み込み関数 , 259
J お よ び I 接尾辞 , 241
K
KAP 指令 , 234
KEY 指定子 , 242
KIND 接尾辞 , 240
+k オプシ ョ ン , 36, 66
-K オプシ ョ ン , 75
-K オプシ ョ ン (f77), 248
L
+langlvl オプシ ョ ン , 30, 67, 238, 246, 261,
263, 266
索引
索引
-lblas オプシ ョ ン , 106, 189, 190
ld コ マ ン ド , 24
共有 ラ イ ブ ラ リ を作成す る , 116
リ ン ク , 102, 103
ld マ ンページ , 104
libcl ラ イ ブ ラ リ , 104
libc ラ イ ブ ラ リ , 104
libF90 ラ イ ブ ラ リ , 104
libisamstub ラ イ ブ ラ リ , 104
libpthread ラ イ ブ ラ リ , 152
libU77 ラ イ ブ ラ リ , 39, 106
FLUSH ルーチン , 247
FREE ルーチン , 247
GETARG ルーチン , 195, 247
GETENV ルーチン , 247
IARGC ルーチン , 247
IDATE ルーチン , 247
LOC ルーチン , 247
MALLOC ルーチン , 247
SYSTEM ルーチン , 247
TIME ルーチン , 247
移植に関す る 問題 , 265
参照す る , 196
シ ス テ ム コ ール , 196
定義 , 272
名前の競合 , 247
libU77 ルーチン
+U77 オプシ ョ ン , 78
lintfor, 252
LIST_CODE 指令 (f77), 246
+list オプシ ョ ン , 30, 67, 238
LIST 指令 , 232
LIST 指令 , 232, 243
-lm オプシ ョ ン , 223
LOC
libU77 ルーチン , 247
組み込み関数 , 247, 259
LOGICAL 指令 (f77), 250
log 関数 , 223
LONG 指令 (f77), 246
+loop_unroll_jam, 94
LOWERCASE 指令 (f77), 246
LPATH, 123, 124
LPATH 環境変数 , 103
検索規則 , 108
LSHFT 組み込み関数 , 259
LSHIFT 組み込み関数 , 259
-L オプシ ョ ン , 38, 66, 106, 108
-l オプシ ョ ン , 66, 105, 106
索引
+L オプシ ョ ン (f77), 238
M
make ユーテ ィ リ テ ィ ー
モジ ュ ールを コ ンパ イ ルす る , 112
MALLOC
libU77 ルーチン , 247
組み込み関数 , 247, 259
MAP 文 , 256
maxssiz パ ラ メ ー タ , 151
MAX 組み込み関数 , 240
MCLOCK 組み込み関数 , 259
memcpy ルーチン
ベ ク ト ル化 , 187
memmove ルーチン
ベ ク ト ル化 , 187
memset ルーチン
ベ ク ト ル化 , 187
MIN 組み込み関数 , 240
+moddir オプシ ョ ン , 30, 67, 113
.mod 拡張子 , 101, 109
.mod フ ァ イ ル , 30
+moddir オプシ ョ ン , 67
.mod フ ァ イ ルを管理す る , 113
mon.out プ ロ フ ァ イ ルフ ァ イ ル , 172
monospace ( モ ノ スペース フ ォ ン ト ), 19
MP_NUMBER_OF_THREADS, 123, 125
N
NAMELIST 文
非互換性 , 242
NAME 指定子 , 242
NaN, 159
定義 , 272
NaN を返す , 159
+nls オプシ ョ ン , 30, 246, 248
NLS 指令 (f77), 246
NLS ( 母国語サポー ト ) を有効にす る , 30
NO CONCUR 指令 , 258
NO SIDE EFFECTS 指令 , 184, 236, 258
NO VECTOR 指令 , 258
NOCONCURRENTIZE 指令 , 258
NOCONCUR 指令 , 236
NODEPCHK コ ンパ イ ラ 指令 , 186, 235
NODEPCHK 指令 , 235, 258
NO_SIDE_EFFECTS 指令 , 236
Not-a-Number, 272
-N オプシ ョ ン (f77), 248
283
索引
-n オプシ ョ ン (f77), 248
O
+Oaggressive オプシ ョ ン , 84, 176, 180
+Oconservative オプシ ョ ン , 85
+Oall オプシ ョ ン , 84, 175, 176
+Ocache_pad_common オプシ ョ ン , 87, 177
+Oconservative オプシ ョ ン , 85, 177, 180
+Oaggressive オプシ ョ ン , 84
+Odataprefetch オプシ ョ ン , 88, 177, 188
+Oentrysched オプシ ョ ン , 88, 177
+Oaggressive オプシ ョ ン , 84
+Ofastaccess オプシ ョ ン , 89, 177
+Ofltacc オプシ ョ ン , 90, 178
+Oaggressive オプシ ョ ン , 84
+Oconservative オプシ ョ ン , 85
+Oinfo, 98
+Oinfo オプシ ョ ン , 33, 178
ベ ク ト ル化 , 188
+Oinitcheck オプシ ョ ン , 92, 129, 178, 246,
262
+Oaggressive オプシ ョ ン , 84
+save オプシ ョ ン , 75
+Oinline_budget オプシ ョ ン , 92, 178
+Oinline オプシ ョ ン , 92, 178
+Olibcalls オプシ ョ ン , 93, 178
+Olimit オプシ ョ ン , 86, 177
イ ン ラ イ ン展開 , 93
+Oloop_block オプシ ョ ン , 94
+Oloop_transform, 94
+Oloop_unroll オプシ ョ ン , 94, 178
+Omoveflops オプシ ョ ン , 95, 178
+Oconservative オプシ ョ ン , 85
+Omultiprocessor, 95
+onetrip オプシ ョ ン , 30, 71, 238, 246, 262
-onetrip オプシ ョ ン (f77), 238
ONETRIP 指令 (f77), 246
ONLY 句 , 143
ON 文 , 155
ABORT, 158
+autodbl オプシ ョ ン , 51
CALL, 158
CHECK_OVERFLOW 指令 , 231
CONTROLC キー ワー ド , 163
IGNORE, 158, 159
キー ワー ド , 156
最適化 , 155
整数オーバーフ ロ ー , 161
284
非互換性 , 243
例外を ト ラ ッ プす る , 150
ON 文に よ る 動作 , 158
+Ooptimization オプシ ョ ン , 33, 175
+Oopt_level オプシ ョ ン , 33
+Oparallel, 95
+Oparallel オプシ ョ ン , 95, 138, 179
指令 , 258
+Oparmsoverlap オプシ ョ ン , 96, 179
+Oconservative オプシ ョ ン , 85
open シ ス テ ム コ ール , 198
OPEN 文 , 253
非互換性 , 242
+Opipeline オプシ ョ ン , 96, 179
+Oprocelim オプシ ョ ン , 97, 179
OPTIMIZE 指令 , 232, 243
OPTIONAL 文 , 241
+Oregreassoc オプシ ョ ン , 98, 179
+Oreport, 98
OR 組み込み関数 , 259
+Osize オプシ ョ ン , 86, 177
イ ン ラ イ ン展開 , 93
+Ovectorize オプシ ョ ン , 100, 179, 187
+Oaggressive オプシ ョ ン , 84
指令 , 258
+O オプシ ョ ン , 69, 167, 173
OPTIMIZE 指令 , 233
-O オプシ ョ ン , 33, 68, 167
OPTIMIZE 指令 , 233
-o オプシ ョ ン , 25, 38, 71, 112
.o 拡張子 , 101
P
PA2.0
高速ア ン ダーフ ロ ー , 150
ベ ク ト ル化 , 188
PA7200 プ ロ セ ッ サ , 33
PARAMETER 文
非互換性 , 241
PA-RISC
コ ー ド 生成オプシ ョ ン , 54
バージ ョ ン番号 , 114, 192
浮動小数点 ト ラ ッ プ を使用可能にす る , 60
命令ス ケ ジ ュ ー リ ン グ オプシ ョ ン , 57
モデル情報を リ ス ト す る , 114
~用に コ ンパ イ ルす る , 114
+pa オプシ ョ ン , 72
PBO
索引
索引
コ ンパ イ ラ 環境 , 24
PIC, 36
+pic オプシ ョ ン , 115
オブジ ェ ク ト コ ー ド , 115
共有 ラ イ ブ ラ リ , 115
定義 , 273
+pic オプシ ョ ン , 36, 73, 115, 248
PIC コ ー ド , 73
POSTPEND 指令 (f77), 246
+ppu オプシ ョ ン , 30, 73, 246, 265
ALIAS 指令 , 229
+pre_include オプシ ョ ン , 25, 74, 210, 238
PRIVATE 文 , 143
+prof オプシ ョ ン , 36, 40, 74, 172, 248
prof プ ロ フ ァ イ ラ , 40
gprof と の比較 , 172
+prof オプシ ョ ン , 36
prof コ マ ン ド , 172
prof マ ンページ , 172
使用方法 , 172
PROGRAM 文
非互換性 , 243
未サポー ト の拡張機能 , 243
PUBLIC 文 , 143
-p オプシ ョ ン , 74
-p オプシ ョ ン (f77), 248
Q
QEXT 組み込み関数 , 259
QFLOAT 組み込み関数 , 259
QNUM 組み込み関数 , 259
QPROD 組み込み関数 , 259
-Q オプシ ョ ン , 56
-q オプシ ョ ン , 56
+Q オプシ ョ ン (f77), 238
-q オプシ ョ ン (f77), 248
R
-R4 オプシ ョ ン , 75
-R4 オプシ ョ ン (f77), 248
-R8 オプシ ョ ン , 75
-R8 オプシ ョ ン (f77), 248
RAND 組み込み関数 , 259
RANGE 指令 (f77), 246
RAN 組み込み関数 , 259
READONLY 指定子 , 242
read シ ス テ ム コ ール , 198
索引
+real_constant オプシ ョ ン , 31, 75, 132, 134,
240, 248
REAL 組み込み関数 , 242
RECORD 文 , 257
RECURSIVE キー ワ ー ド , 241
%REF 組み込み関数 , 151, 209
ALIAS 指令 , 228
REF 組み込み関数 , 207
ALIAS 指令 , 228
report_type, 98
RNUM 組み込み関数 , 259
RSHFT 組み込み関数 , 259
RSHIFT 組み込み関数 , 259
S
SAVE
属性 , 129, 261
文 , 129, 131
SAVE_LOCALS 指令 (f77), 246
+save オプシ ョ ン , 36, 75, 129, 246, 248, 261
+Oinitcheck オプシ ョ ン , 92
saxpy ルーチン , 188
sched.models フ ァ イ ル , 115
sdot ルーチン , 188
SECNDS 組み込み関数 , 259
setenv コ マ ン ド
HP_F90OPTS, 124
LPATH, 103, 124
MP_NUMBER_OF_THREADS, 125
SET 指令 (f77), 246
SHARED_COMMON 指令 , 138, 243
+shared オプシ ョ ン , 38, 75, 121, 248
SIGSEGV シ グナル , 151
SIND 組み込み関数 , 259
SIZEOF 組み込み関数 , 259
.sl 拡張子 , 107
+source オプシ ョ ン , 31, 76, 266
SRAND 組み込み関数 , 259
STANDARD_LEVEL 指令 (f77), 246
STATIC 文 , 129, 131, 257
STATUS 指定子 , 242
stdio マ ンページ , 197
+strip オプシ ョ ン , 39, 77, 147, 248
strip コ マ ン ド , 147
STRUCTURE 文 , 257
stty コ マ ン ド , 163
SYMDEBUG 指令 (f77), 246
SYSTEM
285
索引
libU77 ルーチン , 247
組み込み関数 , 247, 259
SYSTEM INTRINSIC 指令 (f77), 241
-S オプシ ョ ン , 50
-s オプシ ョ ン , 77
+s オプシ ョ ン (f77), 238
-S オプシ ョ ン (f77), 248
-s オプシ ョ ン (f77), 248
.s 拡張子 , 34, 101
T
TAND 組み込み関数 , 259
TIME
libU77 ルーチン , 247
組み込み関数 , 240, 247, 259
TMPDIR, 123
ttv
定義 , 272
+ttybuf オプシ ョ ン , 39, 78, 238
TTYUNBUF, 123
+ttyunbuf オプシ ョ ン (f77), 238
TTYUNBUF 環境変数 , 78
tty バ ッ フ ァ リ ン グ , 78
+ttybuf オプシ ョ ン , 39, 78, 238
環境変数 , 123
定義 , 272
TYPE (I/O) 文 , 257
typedef (C), 203
TYPE 指定子 , 242
-t オプシ ョ ン , 26, 77
+T オプシ ョ ン (f77), 238
U
+U77 オプシ ョ ン , 39, 78, 106, 165, 247
uname コ マ ン ド , 114
UNION 文 , 257
+uppercase オプシ ョ ン , 31, 79, 208, 238, 246
ALIAS 指令 , 229
UPPERCASE 指令 (f77), 246
+usage オプシ ョ ン , 23, 26, 79
USE 文 , 111, 143
ONLY 句 , 143
名称変更機能 , 143
/usr/include, 65
-U オプシ ョ ン , 27, 78, 246
+U オプシ ョ ン (f77), 238
-u オプシ ョ ン (f77), 238
286
V
%VAL 組み込み関数 , 151, 209
ALIAS 指令 , 228
VAL 組み込み関数 , 207
ALIAS 指令 , 228
VAST 指令 , 234
vec_damax ルーチン , 188
vec_dmult_add ルーチン , 188
vec_dsum ルーチン , 188
VECTORIZE 指令 , 188, 234, 258
VECTOR 指令 , 258
+version オプシ ョ ン , 26, 79
VIRTUAL 文 , 257
VOLATILE 文 , 257
-v オプシ ョ ン , 79
コ ンパ イ ラ オプシ ョ ン , 26, 102
リ ン カーオプシ ョ ン , 105
-V オプシ ョ ン (f77), 238
W
WARNINGS 指令 (f77), 246
-Wl オプシ ョ ン , 39, 105, 107
オプシ ョ ン を ld に渡す , 104
write シ ス テ ムルーチン , 198, 219
マ ンページ , 220
呼び出す , 219
WRITE 文 , 219
デバ ッ グ ツール , 153
-W オプシ ョ ン , 26, 79
-w オプシ ョ ン , 31, 79, 246
X
XOR 組み込み関数 , 259
Y
-Y オプシ ョ ン , 68
-Y オプシ ョ ン (f77), 248
Z
ZEXT 組み込み関数 , 259
+Z オプシ ョ ン , 73, 80
+z オプシ ョ ン , 73
+Z オプシ ョ ン (f77), 248
+z オプシ ョ ン (f77), 248
あ
アーカ イ ブバージ ョ ン , 107
索引
索引
アーカ イ ブ ラ イ ブ ラ リ
-l オプシ ョ ン , 66
定義 , 272
アーキ テ ク チ ャ
パフ ォーマ ン ス , 192
~用の コ ー ド を生成す る , 34
アセ ンブ ラ 出力 , 34
+asm オプシ ョ ン , 48, 50
安全な最適化 , 180
ア ン ダーフ ロ ー
+FP オプシ ョ ン , 60
ア ン ダーフ ロ ー例外 , 150
定義 , 272
暗黙の型宣言 , 128
+implicit_none オプシ ョ ン , 64, 65, 128
関数 , 191
規則 , 128
無効にす る , 29
暗黙の型宣言規則 , 128
ア ン ロ ールお よ びジ ャ ム
自動 , 95
指令指定 , 95
い
移行ツール
-A オプシ ョ ン (f77), 251
f77, 251
f90, 251
fid, 252
ISAM ス タ ブ ラ イ ブ ラ リ , 104
lintfor, 252
移行に伴 う 問題 , 245
libU77 ルーチン , 247
オブジ ェ ク ト コ ー ド , 249
オプシ ョ ン , 248
組み込み関数 , 247
組み込み手続 き , 247
指令 , 245
ソ ース コ ー ド , 245
デー タ フ ァ イ ル , 250
名前の競合 , 247
移植オプシ ョ ン
+autodbl, 50, 137
+autodbl4, 51, 137
+Oinitcheck オプシ ョ ン , 92
+onetrip, 72
+save, 75
移植可能な引 き 数 , 114, 192
索引
移植す る
KAP, 234
VAST, 234
ク レ イ , 234
移植に関す る 問題 , 255, 261
DO ループ , 262
libU77 ルーチン , 265
移植性をチ ェ ッ ク す る , 255
エ ス ケープシーケ ン ス , 266
語サ イ ズ , 262
静的記憶領域 , 261
定義 , 273
名前 , 263
名前に追加 し た下線 , 265
非初期化変数 , 261
プ ロ グ ラ ム形式 , 266
依存
モジ ュ ール , 112
依存チ ェ ッ ク 、 制御す る , 235
一時フ ァ イ ル , 123
位置独立 コ ー ド , 73
引用す る
共有デー タ , 66
イ ン ラ イ ン展開
+O3 オプシ ョ ン , 70
+Oinline_budget オプシ ョ ン , 92
+Oinline オプシ ョ ン , 92
イ ン ラ イ ン展開オプシ ョ ン
+Oinline, 178
+Oinline_budget, 178
+Oprocelim, 179
え
エ イ リ ア シ ン グ , 273
エ ス ケープシーケ ン ス , 266
エ ス ケープ文字 , 29
エ ラ ー処理
ON 文 , 155
エ ラ ーを無視す る , 158, 159
お
大き さ
デー タ を拡張す る , 134
配列 , 214
大文字 と 小文字の区別
ALIAS 指令 , 229
C お よ び Fortran, 206, 208
+uppercase オプシ ョ ン , 31, 79, 208
287
索引
制御す る , 31
大文字にす る , 79
置 き 換え る 、 サブプ ロ セ ス , 26
オーバーフ ロ ー
ス タ ッ ク , 151
整数型 , 244
浮動小数点 , 273
例外 , 150
オーバーフ ロ ー、 整数
CHECK_OVERFLOW 指令 , 231
+FP オプシ ョ ン , 60
オブジ ェ ク ト コ ー ド を移行す る , 249
オプテ ィ マ イ ザ
コ ンパ イ ラ 環境 , 24
か
外部変数 (C), 221
外部名
ALIAS 指令 , 228
+uppercase オプシ ョ ン , 79
概要
整数 , 275
角か っ こ , 19
隠 し 長 さ 引 き 数 , 215
拡張機能
~についての警告 , 67
拡張機能、 言語
+langlvl オプシ ョ ン , 255
ON 文 , 150, 155
移行支援 , 237
移植支援 , 256
組み込み関数 , 259
ク レ イ ポ イ ン タ , 149
互換性 , 237, 256
定義 , 274
文 , 256
~についての警告 , 30, 255
拡張子、 フ ァ イ ル名 , 27, 100
.mod, 272
cpp 出力フ ァ イ ル , 120
cpp 入力フ ァ イ ル , 120
C プ リ プ ロ セ ッ サ , 27
.F, 27, 100, 118, 120
.f, 100, 120
f77 と の互換性 , 245
.f90, 100, 120
.i, 100, 120
.i90, 100, 120
288
.mod, 30, 101, 109
.o, 101
.s, 34, 101
.sl, 107
アセ ン ブ ラ コ ー ド , 101
オブジ ェ ク ト コ ー ド , 101
固定形式 , 100
自由形式 , 100
定義 , 277
拡張す る
精度 , 31, 132, 134
デー タ の大 き さ , 134
拡張す る 、 精度 , 75
拡張す る 、 ソ ース行
+extend_source オプシ ョ ン , 59
下線文字 (_)
ALIAS 指令 , 229
+ppu オプシ ョ ン , 73
オプシ ョ ン名の~ , 83
外部名 , 229
下線を最後に追加す る , 30
下線を追加す る
+ppu オプシ ョ ン , 73
下線を名前に追加す る , 30, 265
型規則
+implicit_none オプシ ョ ン , 64, 65
無効にす る , 64, 65
型宣言文 , 129
カーネル ス レ ッ ド ラ イ ブ ラ リ
+Oparallel オプシ ョ ン , 95
カーネルルーチン , 196
環境変数 , 123
HP_F90OPTS, 123
LPATH, 103, 123, 124
MP_NUMBER_OF_THREADS, 123, 125
TTYUNBUF, 123
関数
組み込み , 228
関数の戻 り 値を宣言す る , 191
関数、 組み込み
%REF, 151, 207, 209
%VAL, 151, 207, 209
定義 , 274
き
記憶領域の割 り 付け境界 , 276
規格 と 最適化 , 85
規格、 Fortran 90, 237
索引
索引
キ ャ ッ シ ュ の最適化 , 87
境界が正 し く ないデー タ 引用 , 149
競合、 名前 , 247
行順 , 211, 274
共通ブ ロ ッ ク
C, 221
C の extern 指定子 , 221
共有デー タ , 138
共有 メ モ リ に配置す る , 138
利点 と 問題 , 143
行の長 さ , 266
行の長 さ を拡張す る , 266
共有実行可能プ ロ グ ラ ム , 38
作成す る , 121
定義 , 273
共有デー タ
+k オプシ ョ ン , 66
共有デー タ 項目 , 36
共有デー タ 、 C お よ び Fortran, 221
共有 メ モ リ , 138
共有 ラ イ ブ ラ リ
-l オプシ ョ ン , 66
+pic オプシ ョ ン , 73
PIC コ ー ド , 73
作成す る , 115
定義 , 273
デフ ォ ル ト , 104
リ ン ク , 107
行列操作お よ び BLAS, 196
切 り 捨て , 132, 274
切 り 捨て と 最適化 , 90
キー ワ ー ド
ON 文用の~ , 156
く
句
ABORT, 158
CALL, 158
IGNORE, 158, 159
ONLY, 143
組み込み関数
ALIAS 指令で使用す る , 228
%REF, 151, 207, 209
%VAL, 151, 207, 209
定義 , 274
組み込み手続 き
ABORT, 259
ACOSD, 259
索引
ACOSH, 259
AND, 259
ASIND, 259
ASINH, 259
ATAN2D, 259
ATAND, 259
ATANH, 259
BADDRESS, 259
COSD, 259
DATE, 259
DCMPLX, 259
DFLOAT, 259
DNUM, 259
DREAL, 259
EXIT, 259
FLUSH, 247, 259
FNUM, 198, 219, 259
FREE, 247, 259
FSET, 259
FSTREAM, 197, 219, 259
GETARG, 194, 247, 259
GETENV, 247, 259
GRAN, 259
HFIX, 259
IACHAR, 259
IADDR, 259
IARGC, 194, 247, 259
IDATE, 247, 259
IDIM, 259
IGETARG, 194, 259
IJINT, 259
IMAG, 259
INT1, 259
INT2, 259
INT4, 259
INT8, 259
INUM, 259
IOMSG, 259
IQINT, 259
IRAND, 259
IRANP, 259
ISIGN, 259
ISNAN, 259
IXOR, 259
JNUM, 259
LOC, 247, 259
LSHFT, 259
LSHIFT, 259
MALLOC, 247, 259
289
索引
MAX, 240
MCLOCK, 259
MIN, 240
OR, 259
QEXT, 259
QFLOAT, 259
QNUM, 259
QPROD, 259
RAN, 259
RAND, 259
REAL, 242
RNUM, 259
RSHFT, 259
RSHIFT, 259
SECNDS, 259
SIND, 259
SIZEOF, 259
SRAND, 259
SYSTEM, 247, 259
TAND, 259
TIME, 240, 247, 259
XOR, 259
ZEXT, 259
最適化バージ ョ ン , 93
名前の競合 , 247
引 き 数 , 240
非互換性 , 240, 247, 259
ミ リ コ ー ド バージ ョ ン , 93
ミ リ コ ー ド ルーチン , 178, 278
ラ イ ブ ラ リ , 104
クレイ
ポ イ ン タ , 149, 151
ク レ イ 指令 , 234
ク ロ ーン生成
+O3 オプシ ョ ン , 70
け
警告
-w オプシ ョ ン , 79
拡張機能についての~ , 30, 67
抑止す る , 31
言語間通信
ALIAS 指令 , 229
検索パ ス , 74
-I オプシ ョ ン , 65
-L オプシ ョ ン , 66
-l オプシ ョ ン , 66
数学 ラ イ ブ ラ リ , 55
290
検索パ ス オプシ ョ ン , 29, 38, 108
こ
コ アダンプ
+FP オプシ ョ ン , 150
ON 文 , 164
許可す る , 164
セ グ メ ン テーシ ョ ン違反 , 151
定義 , 274
ト ラ ッ プ手続 き , 164
コ ア ダ ン プ を許可す る , 164
コ ア フ ァ イ ル , 274
高水準オプテ ィ マ イ ザ , 32
コ ンパ イ ラ 環境 , 24
定義 , 274
構造型 , 200
構造型お よ び C, 205
構造体
共通ブ ロ ッ ク , 222
構造型 , 205
デー タ 共有 , 221
複素数 , 203
高速ア ン ダーフ ロ ー , 150, 274
構文
コ ンパ イ ラ 指令 , 225
最適化オプシ ョ ン , 83
指令 , 226
構文の非互換性を検出す る , 252
構文、 コ マ ン ド , 20
互換性 , 237
KAP, 234
VAST, 234
ク レ イ , 234
互換性機能 , 256
+autodbl4 オプシ ョ ン , 262
+autodbl オプシ ョ ン , 262
+escape オプシ ョ ン , 267
+extend_source オプシ ョ ン , 266
EXTERNAL 文 , 263
+langlvl=90, 266
+langlvl=90 オプシ ョ ン , 263
+onetrip オプシ ョ ン , 262
+ppu オプシ ョ ン , 265
prefixesto 指令 , 259
+source オプシ ョ ン , 266
組み込み関数 , 259
指令 , 257
文 , 256
索引
索引
互換性指令 , 234
語サ イ ズの違い , 262
固定形式 , 31, 153, 266
+source オプシ ョ ン , 76
行の長 さ , 266
デバ ッ グ行 , 153
フ ァ イ ル名拡張子 , 100
コ ー ド サ イ ズ と 最適化 , 84, 86
コ ー ド 生成
+DA オプシ ョ ン , 192
制御す る , 33
パフ ォーマ ン ス , 192
コ ー ド 生成、 制御す る , 54
コマン ド
cpp, 24, 27, 117, 153, 271
dde, 146
export, 103
f90, 23, 25, 37, 44
gprof, 40, 171
grep, 115
ipcs, 138, 139
ld, 24, 103, 116
prof, 40, 172
setenv, 103
strip, 147
stty, 163
uname, 114
コマン ド 行
cpp 出力を保存す る , 120
cpp を起動す る , 119
Fortran 90 プ ロ グ ラ ム を コ ンパ イ ルす る , 44
gprof, 171
LPATH を設定す る , 103
prof, 172
オプシ ョ ンの非互換性 , 248
共有実行可能プ ロ グ ラ ム を作成す る , 121
共有 ラ イ ブ ラ リ を作成す る , 117
最適化 コ ー ド をデバ ッ グす る , 173
最適化す る , 167, 173
実装最適化オプシ ョ ン , 176
デマ ン ド ロ ー ド 可能な実行可能プ ロ グ ラ ム を
作成す る , 121
引 き 数を参照す る , 194, 243
ベ ク ト ル化 , 187
モジ ュ ール , 112
モデル情報を入手す る , 114
ラ イ ブ ラ リ を指定す る , 105
リ ン ク , 103, 107
コ マ ン ド 行引 き 数を参照す る , 194, 243
索引
コ マ ン ド 構文 , 20
小文字名 , 79
混合言語 , 199
混合言語プ ロ グ ラ ム , 265
コ ンパ イ ラ
冗長出力 , 79
バージ ョ ン情報 , 79
リ ン ク , 52
コ ンパ イ ラ 指令 , 225, 234, 245, 253
ALIAS, 197, 206, 208, 219, 227, 243
CHECK_OVERFLOW, 162, 231, 243
CONCUR, 235, 258
CONCURRENTIZE, 235, 258
C プ リ プ ロ セ ッ サ , 225
IVDEP, 186, 235
LIST, 232, 243
NO SIDE EFFECTS, 184, 236, 258
NOCONCUR, 236
NODEPCHK, 186, 235, 258
NO_SIDE_EFFECTS, 236
OPTIMIZE, 232, 243
SHARED_COMMON, 138, 243
VECTOR, 258
VECTORIZE, 188, 234, 258
オプシ ョ ンに よ る 置 き 換え , 246
構文 , 226
互換性 , 234, 257
注釈 , 227
認識 さ れ る 接頭辞 , 259
非互換性 , 243
非互換性指令 , 241
リ ス ト , 227
コ ンパ イ ラ 成分 , 24
f90
コ ンパ イ ル行オプシ ョ ン , 48
コ ンパ イ ル行オプシ ョ ン
+implicit_none, 64
+nls, 67
+z, 80
-Y, 68
+Oregreassoc, 97, 98
-A (f77), 251
+asm, 34, 48, 50, 246, 248
+autodbl, 28, 50, 134, 135, 137, 200, 201,
238, 246, 262
+autodbl4, 28, 51, 134, 135, 137, 246, 262
-C, 53
-c, 25, 37, 52, 102, 117
-C (f77), 248
291
索引
+check, 28, 53, 246, 248
+check オプシ ョ ン , 152, 162
+cpp, 27, 53
+cpp_keep, 27, 54, 238
-D, 27, 54, 119, 246
+DA, 34, 54, 114, 121, 192, 246
+DA2.0W, 121, 200
+DC7200, 33, 55
+demand_load, 37, 56, 121, 248
+dlines, 29, 56, 153, 238
+DOosname, 55, 56
+DS, 35, 57, 115, 246
+E4, 244
+escape, 29, 58, 238, 267
+extend_source, 29, 59, 238, 266
f77 オプシ ョ ン , 238, 248
f77 オプシ ョ ン を置 き 換え る , 248
f77 指令用のサポー ト , 246
+FP, 37, 59, 148, 150
+fp_exception, 38, 61, 148, 150, 151
+fp_exceptions, 238
-G, 62
-g, 35, 62, 146, 147, 246
-G (f77), 248
+gprof, 36, 40, 62, 171, 246, 248
HP_F90OPTS で設定す る , 123
+hugecommon, 62
+hugesize, 63
-I, 27, 29, 65, 113
+implicit_none, 29, 64, 65, 128, 238
+k, 36, 66
-K, 75
-K (f77), 248
-L, 38, 66, 106, 108
-l, 38, 66, 105, 106
+langlvl, 30, 67, 238, 246, 261, 263, 266
-lblas, 106, 189, 190
+list, 30, 67, 238
+moddir, 30, 67, 113
-N, 76
-n, 76
-N (f77), 248
-n (f77), 248
+nls, 30, 246, 248
+O, 69, 167
-O, 33, 68, 167
-o, 25, 38, 71, 112
+Oaggressive, 84, 176, 180
+Oall, 84, 175, 176
292
+Ocache_pad_common, 87, 177
+Oconservative, 85, 177, 180
+Odataprefetch, 88, 177
+Oentrysched, 88, 177
+Ofastaccess, 89, 177
+Ofltacc, 90, 178
+Oinfo, 33, 91, 178
+Oinitcheck, 92, 129, 178, 246, 262
+Oinline, 92, 178
+Oinline_budget, 92, 178
+Olibcalls, 93, 178
+Olimit, 86, 177
+Oloop_block, 94
+Oloop_transform, 94
+Oloop_unroll, 94, 178
+Oloop_unroll_jam, 94
+Omoveflops, 95, 178
+Omultiprocessor, 95
+one_trip, 71
+onetrip, 30, 238, 246, 262
+Ooptimization, 33, 175
+Oopt_level, 33
+Oparallel, 95, 138, 179, 258
+Oparmsoverlap, 96, 179
+Opipeline, 96, 179
+Oprocelim, 97, 179
+Oregreassoc, 98, 179
+Oreport, 95, 98
+Osize, 86, 177
+Ovectorize, 100, 179, 187
-p, 74
-p (f77), 248
+pa, 72
+pal, 72
+pic, 36, 73, 115, 248
+ppu, 30, 73, 246, 265
+pre_include, 25, 74, 210, 238
+prof, 36, 40, 74, 172, 248
-Q, 56
-q, 56
-q (f77), 248
-R4, 75
-R4 (f77), 248
-R8, 75
-R8 (f77), 248
+real_constant, 31, 75, 132, 134, 248
-S, 50
-s, 77
-S (f77), 248
索引
索引
-s (f77), 248
+save, 36, 75, 129, 246, 248, 261
+shared, 38, 75, 121, 248
+source, 31, 76, 266
+strip, 39, 77, 147, 248
-t, 26, 77
+traceback, 164
+ttybuf, 39, 78, 238
-U, 27, 78, 246
+U77, 39, 78, 106, 165, 247
+uppercase, 31, 79, 208, 238, 246
+usage, 23, 26, 46, 79
-v, 26, 79, 102
+version, 26, 79
-W, 26, 79
-w, 31, 79, 246
-Wl, 39, 104, 107
-Wl,-v, 105
-Y (f77), 248
+Z, 73, 80
+z, 73
+Z (f77), 248
+z (f77), 248
移植時に使用す る , 261
オプシ ョ ン を表示す る , 79
基本の大 き さ を拡張す る , 50
形式 , 45
最適化 , 83
並び , 45
引 き 数 , 46
頻繁に使用す る , 46
分類別 , 47
未サポー ト , 238
コ ンパ イ ル時間 と 最適化 , 86
コ ンパ イ ルす る
Fortran 90 モジ ュ ール , 109
HP Fortran 90 プ ロ グ ラ ム , 43
PA-RISC モデル , 114
+strip オプシ ョ ン , 147
最適化用に~ , 167
冗長モー ド , 102
デバ ッ グ と 最適化用に~ , 173
デフ ォ ル ト , 23
コ ンパ イ ルプ ロ セ ス , 24
さ
再帰的手続 き , 129, 241
最適化 , 167
索引
+Oregreassoc オプシ ョ ン , 97, 98
+DA オプシ ョ ン , 54
+DC7200, 55
+DS オプシ ョ ン , 57
feedback, 91
feedback オプシ ョ ン , 33
Fortran 90 規格 , 180
-g オプシ ョ ン , 62
+Oaggressive オプシ ョ ン , 84
+Oall オプシ ョ ン , 84
+Ocache_pad_common オプシ ョ ン , 87
+Oconservative オプシ ョ ン , 85
+Odataprefetch オプシ ョ ン , 88
+Oentrysched オプシ ョ ン , 88
+Ofastaccess オプシ ョ ン , 89
+Ofltacc オプシ ョ ン , 90
+Oinfo オプシ ョ ン , 91
+Oinitcheck オプシ ョ ン , 92
+Oinline_budget オプシ ョ ン , 92
+Oinline オプシ ョ ン , 92
+Olibcalls オプシ ョ ン , 93
+Olimit オプシ ョ ン , 86
+Oloop_unroll オプシ ョ ン , 94
+Omoveflops オプシ ョ ン , 95
ON 文 , 155
+Oparallel オプシ ョ ン , 95
+Oparmsoverlap オプシ ョ ン , 96
+Opipeline, 96
+Oprocelim オプシ ョ ン , 97
OPTIMIZE 指令 , 232
+Oregreassoc オプシ ョ ン , 98
+Osize オプシ ョ ン , 86
+Ovectorize オプシ ョ ン , 100
+O オプシ ョ ン , 69
-O オプシ ョ ン , 68
安全お よ び危険な , 180
イ ン ラ イ ン展開 , 92, 178
イ ン ラ イ ン展開 さ れた手続 き を削除す る , 97
オプシ ョ ン , 32, 83, 173, 175
概要 , 32
規格に準拠 し ないプ ロ グ ラ ム , 85
キ ャ ッ シ ュ , 87
切 り 捨てエ ラ ー , 90
組み込み関数 , 93
コ ー ド サ イ ズ , 86
コ ー ド 生成 , 192
コ ンパ イ ル行オプシ ョ ン , 47
コ ンパ イ ル時間 , 86
最大限の最適化 , 84
293
索引
実装オプシ ョ ン , 175
種類 , 175
初期化 , 92
指令 , 188
制限す る , 86
積極的な , 84, 180
大域ア ク セ ス , 89
重複す る 引 き 数 , 96
定義 , 274
デー タ プ リ フ ェ ッ チ命令 , 88
デバ ッ , 173
デバ ッ グ , 62, 146
デフ ォ ル ト レベル , 173, 174
パ イ プ ラ イ ニ ン グ , 96
配列 , 188
パ ラ レル化 , 125, 182, 235
パ ラ レル実行 , 95
微調整 , 175
微調整オプシ ョ ン , 86
浮動小数点 ト ラ ッ プ , 95
プ ロ フ ァ イ リ ン グ , 168
プ ロ フ ァ イ リ ン グ オプシ ョ ン , 62, 74
ベ ク ト ル化 , 100, 187, 188, 234
保守的な , 85, 180
マニ ュ アル , 173
ミ リ コ ー ド ルーチン , 93
命令ス ケ ジ ュ ー リ ン グ , 88
メ モ リ 階層 , 55
メ モ リ の消費 , 86
呼び出す , 173
ラ イ ブ ラ リ 呼び出 し を最適化す る , 178
ループのア ン ロ ー リ ン グ , 94
レ ジ ス タ の再関連付け , 97, 98
レベル , 33, 69, 173
最適化 リ ポー ト , 98
内容 , 98
最適化レベル , 33, 69, 173
最適 コ ー ド を生成す る , 192
削除す る 、 シ ン ボルテーブル
+strip オプシ ョ ン , 77
サブプ ロ セ ス
-t オプシ ョ ン , 77
-W オプシ ョ ン , 79
サブプ ロ セ ス を置 き 換え る , 26
し
式の順序変更
+Ofltacc オプシ ョ ン , 90
294
シ グナル
SIGBUS, 148
SIGFPE, 148
SIGILL, 148
SIGSEGV, 148, 151
SIGSYS, 148
処理す る , 164
シ グナル処理
+fp_exception オプシ ョ ン , 61
シ グナルを キ ャ ッ チす る , 148
指数形式 , 132
シ ス テ ム コ ール
入出力 , 198
シ ス テ ム リ ソ ース , 193
シ ス テ ム リ ソ ース を操作す る , 193
シ ス テ ムルーチン , 196
ALIAS 指令 , 230
write ルーチン , 219
大文字 と 小文字の区別 , 230
呼び出す , 196
事前に初期化 さ れた変数 , 129
実経過時間プ ロ フ ァ イ リ ン グ
定義 , 274
実行可能プ ロ グ ラ ム
共有 , 38
作成す る , 44
デマ ン ド ロ ー ド 可能 , 37
名前付 き , 71
実行時
エ ラ ーを処理す る , 155
ラ イ ブ ラ リ , 104
実行時例外
+FP オプシ ョ ン , 59
実行を終了す る , 158
実数型 , 200
基本の大 き さ を変更す る , 50, 51
精度を拡張す る , 75
実数型、 大 き さ を拡張す る , 134
実装最適化オプシ ョ ン , 175
指定子 (I/O)
ERR=, 149
IOSTAT=, 149
非互換性 , 242
指定 し た順序に意味のあ る オプシ ョ ン , 45
-L, 106
-l, 105
自動割 り 付け
静的変数 , 261
変数 , 129, 275
索引
索引
自由形式 , 31, 266
+source オプシ ョ ン , 76
行の長 さ , 266
フ ァ イ ル名拡張子 , 100
終了す る 、 実行 , 158
出力フ ァ イ ル、 名前を付け る , 25, 38
種別型パ ラ メ ー タ , 134
精度 , 132
上下限
+check オプシ ョ ン , 53
冗長モー ド
-v オプシ ョ ン , 26, 105
コ ンパ イ ルす る , 102
リ ン ク , 105
冗長モー ド 、 使用可能にす る , 79
使用不能にす る
暗黙の型宣言 , 128
例外 , 148
省略可能な引 き 数 , 241
省略記号、 垂直 , 19
初期化
+Oinitcheck オプシ ョ ン , 92, 178
+save オプシ ョ ン , 75
移植に関す る 問題 , 261
非互換性 , 240
変数 , 36, 129
シ リ アル実行
定義 , 275
シ ン ボルテーブル , 39, 147, 168
定義 , 275
シ ン ボルテーブルを削除す る , 77
シ ン ボル、 プ リ プ ロ セ ッ サに対 し て定義す る ,
27
す
垂直省略記号 , 19
水平省略記号 , 19
数学 ラ イ ブ ラ リ
+DA オプシ ョ ン , 192
ベ ク ト ル化 , 187
数値型
基本の大 き さ を変更す る , 50, 51
精度を拡張す る , 75
数値の精度 , 132
拡張す る , 134
定義 , 276
ス ケ ジ ュ ー ラ 、 命令 , 35, 115
ス タ ッ ク オーバーフ ロ ー , 151
索引
定義 , 275
ス タ ッ ク 関連の例外 , 150
ス タ ッ ク の上書 き , 150
ス ト リ ーム
定義 , 275
入出力 , 197
ポ イ ン タ , 197
ス ト リ ーム入出力 , 197
スレッ ド
定義 , 275
複数 , 138
ラ イ ブ ラ リ , 138
スレ ッ ド ラ イブラ リ
+Oparallel オプシ ョ ン , 95
せ
制御す る 、 デー タ へのア ク セ ス , 143
制御す る 、 パ ラ レル化 , 235
制御を移行す る
ト ラ ッ プ手続 き へ~ , 158
整数
オーバーフ ロ ー , 275
整数型
オーバーフ ロ ー , 53, 161, 231, 244
基本の大 き さ を変更す る , 50, 51
デー タ 型 , 200
非互換性 , 244
符号な し , 202
大 き さ を拡張す る , 134
整数型の範囲を拡張す る , 134
生成 コ ー ド を制御す る , 54
静的記憶領域
+save オプシ ョ ン , 75
静的変数 , 129
再帰 , 129
最適化 , 129
自動割 り 付け変数 , 261
定義 , 276
パフ ォ ーマ ン ス , 129
静的 メ モ リ , 129
精度
拡張す る , 31, 134
定義 , 276
定数 , 132
デフ ォ ル ト を変更す る , 240
パフ ォ ーマ ン ス , 134
浮動小数点定数 , 240
精度 と 最適化 , 90
295
索引
精度を拡張す る
+real_constant オプシ ョ ン , 75
セグ メ ン テーシ ョ ン違反 , 148, 151
定義 , 276
積極的な最適化 , 84, 180
接頭辞、 指令 , 259
ゼ ロ 除算 , 150
定義 , 276
ゼ ロ 除算を ト ラ ッ プす る , 60
ゼ ロ 、 先行す る , 244
宣言す る
C お よ び Fortran の配列 , 211
関数の戻 り 値 , 191
先行す る ゼ ロ , 244
そ
装置番号 , 197
C の フ ァ イ ルポ イ ン タ , 219
添え字
+check オプシ ョ ン , 53
添え字をチ ェ ッ ク す る , 28
即時ア ン ダーフ ロ ー
+FP オプシ ョ ン , 60
属性、 SAVE, 129, 261
ソ ース行
+extend_source オプシ ョ ン , 59
ソ ース行を拡張す る , 29
ソ ース コ ー ド の形式 , 31, 266
ソ ース コ ー ド 、 移行す る , 245
ソ ース テ キ ス ト を取 り 込む
INCLUDE 行 , 143, 246
INCLUDE 指令 (f77), 246
+pre_include オプシ ョ ン , 210
ソ ース にテ キ ス ト を挿入す る
+pre_include オプシ ョ ン , 74
ソ ース フ ァ イ ルを リ ス ト す る
+list オプシ ョ ン , 67
LIST 指令 , 232
ソ フ ト ウ ェ ア パ イ プ ラ イ ニ ン グ , 96
た
大域デー タ
+k オプシ ョ ン , 66
多次元配列 , 211, 212
タ ブ編集 , 266
単項演算子
非互換性 , 244
単精度
296
定数 , 132
ち
中か っ こ , 19
注釈
拡張機能 と し ての #, 118
非互換性 , 243
~ と し ての コ ンパ イ ラ 指令 , 225
~ と し ての指令 , 118, 257
# 注釈文字 , 118
重複す る パ ラ メ ー タ と 最適化 , 96
つ
ツール
移行 , 251
デバ ッ ガ , 40
パフ ォ ーマ ン ス解析 , 40
て
低水準オプテ ィ マ イ ザ , 24, 32
低水準 リ ソ ース を参照す る , 196
定数 , 241
16 進形式 , 271
2 進形式 , 271
8 進形式 , 271
+real_constant オプシ ョ ン , 75
精度 , 132
精度を拡張す る , 75
表現法の非互換性 , 241
浮動小数点 , 240
定数の 16 進形式 , 241, 271
定数の 2 進形式 , 271
デ ィ レ ク ト リ 検索
-I オプシ ョ ン , 65
-L オプシ ョ ン , 66
デー タ
ア ク セ ス を制御す る , 143
暗黙の型宣言 , 128
記憶領域 , 127
共有 , 138
初期化 , 36
プ ロ モー ト , 28
割 り 付け境界 , 127, 276
デー タ ア ク セ ス を高速化す る , 89
デー タ 型 , 241
C お よ び Fortran, 200
構造型 , 205
複素数 , 241
索引
索引
複素数型 , 203, 242
ポ イ ン タ , 205
論理型 , 202, 253
デー タ の依存
定義 , 276
デー タ の大 き さ を拡張す る
+autodbl4 オプシ ョ ン , 51
+autodbl オプシ ョ ン , 50
デー タ の大 き さ を プ ロ モー ト す る
+autodbl4 オプシ ョ ン , 51
+autodbl オプシ ョ ン , 50
デー タ の割 り 付け境界
定義 , 276
パデ ィ ン グ , 222
デー タ フ ァ イ ル
移行す る , 250
デー タ プ リ フ ェ ッ チ命令 , 88
デー タ へのア ク セ ス を制御す る , 143
デー タ を格納す る , 127
手続 き
引用仕様 , 250
再帰的 , 241
削除す る , 97
非互換性 , 240
モジ ュ ール , 144
呼び出 し と 定義 , 240
手続 き ト レース バ ッ ク , 148, 151
シ ン ボルテーブル , 147
手続 き を削除す る , 97
デバ ッ ガ , 24, 40
-g オプシ ョ ン , 146
概要 , 146
使用方法 , 146
定義 , 271
デバ ッ グ , 145
cpp, 118, 153
+dlines オプシ ョ ン , 56, 153
+FP オプシ ョ ン , 59
-g オプシ ョ ン , 35, 62
WRITE 文 , 153
コ ンパ イ ル行オプシ ョ ン , 47
最適化 コ ー ド , 62, 146, 173
シ ン ボルテーブル , 147
デバ ッ グ行 , 118, 153
デバ ッ グ情報を削除す る , 147
デバ ッ グ行 , 29
デバ ッ グ情報を削除す る , 39, 147
デフ ォ ル ト
大文字 と 小文字の区別 , 208
索引
型宣言 , 128
行の長 さ , 266
コ ンパ イ ルす る , 23
最適化 , 174
デー タ の大 き さ , 134
ラ イ ブ ラ リ , 104
デフ ォ ル ト 以外の ラ イ ブ ラ リ , 105
デマ ン ド ロ ー ド 可能
+demand_load オプシ ョ ン , 56
デマ ン ド ロ ー ド 可能な実行可能プ ロ グ ラ ム ,
37, 120
と
ト ラ ッ プ , 158
Ctrl-C 割 り 込み , 163
ON 文 , 155
コ ア ダ ン プ , 164
算術エ ラ ー , 160
処理用手続 き , 160
整数オーバーフ ロ ー , 161
定義 , 276
ト ラ ッ プ手続 き , 160
浮動小数点例外 , 37, 38
例 , 163
ト ラ ッ プ処理
+fp_exception オプシ ョ ン , 61
+FP オプシ ョ ン , 59
ト ラ ッ プ手続 き を抜け る , 161
ト ラ ッ プ を使用可能にす る
+FP オプシ ョ ン , 59
ト ラ ッ プ を設定す る , 155
ト レース バ ッ ク , 147, 148, 151
ト レース バ ッ ク を要求す る , 61
な
名前
-o オプシ ョ ン , 71
外部 , 228
競合 , 247, 265
競合を解決す る , 263
組み込み関数 , 247
出力フ ァ イ ル , 25, 38
違い , 265
名前の競合
解決す る , 79
に
入出力
297
索引
シ ス テ ム コ ール , 197, 198
ス ト リ ーム , 197
非互換性 , 242
変数群 , 242
ぬ
ヌ ル終了文字列 , 215
ヌ ル文字、 定義 , 277
は
倍精度型
DOUBLE PRECISION 文 , 134
基本の大 き さ を変更す る , 50, 51
定数 , 132
デー タ 型 , 200
パ イ プ ラ イ ニ ン グ , 96
配列
C 言語 , 211
最適化す る , 188
非互換性 , 243
配列外引用 , 151, 152
配列外引用のチ ェ ッ ク , 152
配列外チ ェ ッ ク , 53
バージ ョ ン情報 , 26, 79
バ ス エ ラ ー , 148, 149
コ ア ダ ン プ , 164
バ ッ ク エ ン ド , 24
オプシ ョ ン , 32
制御す る , 32
定義 , 277
バ ッ ク ス ラ ッ シ ュ 文字
+escape オプシ ョ ン , 58
バ ッ フ ァ 出力 , 39, 272
バ ッ フ ァ な し 出力 , 39
バ ッ フ ァ リ ン グ、 tty
+ttybuf オプシ ョ ン , 78
パデ ィ ン グお よ びデー タ の割 り 付け境界 , 222
パフ ォ ーマ ン ス , 167
解析ツール , 40
向上 さ せ る オプシ ョ ン , 32
コ ー ド 生成 , 192
最適化オプシ ョ ン , 83
プ ロ フ ァ イ ラ , 168
プ ロ フ ァ イ リ ン グ オプシ ョ ン , 62, 74
パフ ォ ーマ ン ス に関す る 問題
大 き な語サ イ ズ , 262
静的記憶領域 , 262
名前 , 265
298
パフ ォ ーマ ン ス を解析す る , 40
パ ラ メ ー タ の重複 と 最適化 , 96
パ ラ レ ル化 , 125, 182, 235
+Oparallel オプシ ョ ン , 179
コ ンパ イ ルす る , 182
阻害条件 , 183
定義 , 277
デー タ 共有 , 138
デー タ の依存 , 184
不確定な繰 り 返 し 数 , 184
副作用 , 183
プ ロ フ ァ イ リ ン グ , 183
パ ラ レ ル化を制御す る , 235
パ ラ レ ル実行 , 95
定義 , 277
パ ラ レ ル実行プ ロ グ ラ ム を プ ロ フ ァ イ ルす る ,
183
範囲チ ェ ッ ク , 28
+check オプシ ョ ン , 53
ひ
引き数
ALIAS 指令に よ っ て渡す , 230
C お よ び Fortran, 230
引 き 数並び , 241
引 き 数渡 し
C お よ び Fortran, 205, 206
規約 , 206
配列 , 211
複素数 , 203
文字列 , 216
引 き 数を省略す る , 241
引 き 数、 コ マ ン ド 行 , 194
非互換性 , 238
16 進定数表現法 , 241
8 進定数表現法 , 241
ACCESS 指定子 , 242
DATA 文 , 241
fid に よ る 発行 , 253
IOSTAT 指定子 , 242
I お よ び J 接尾辞 , 241
I/O, 253
KEY 指定子 , 242
LOGICAL 指令 (f77), 250
NAME 指定子 , 242
ON, 253
ON 文 , 243, 253
OPEN 文 , 242, 253
索引
索引
PARAMETER 文 , 241
PROGRAM 文 , 243
READONLY 指定子 , 242
STATUS 指定子 , 242
TYPE 指定子 , 242
オブジ ェ ク ト フ ァ イ ル , 249
オプシ ョ ン , 248
関数引用 , 240
規格外の論理型 , 250
境界が正 し く ないデー タ , 250
組み込み関数 , 240, 247
検出す る , 252
コ マ ン ド 行 , 248
再帰的手続 き , 241
式構文 , 243
指数演算子 , 241
実行時の動作 , 250
指定子、 I/O, 242, 253
省略可能な引 き 数 , 241
初期化 , 240
指令 , 241, 243, 245, 253
先行す る ゼ ロ , 244
注釈文字 , 243
定数 , 241
定数表現 , 241
デー タ 型 , 241
デー タ フ ァ イ ル , 250
手続 き , 240
手続 き 引用仕様 , 250
デフ ォ ル ト の精度 , 241
入出力 , 242
配列 , 241, 243
引 き 数並び , 241
複素数型テ ン ポ ラ リ , 242
複素数型の BOZ 定数 , 241
浮動小数点定数 , 240
文関数 , 243
変数群入出力 , 242
文字長指定子 , 241
リ ン ク , 250
論理型演算子 , 253
組み込み関数に対す る 引 き 数 , 240
非初期化変数 , 261
非正規化値
+FP オプシ ョ ン , 60
微調整の最適化 , 86
表記規約 , 19
索引
ふ
フ ァ イ ル記述子 , 198, 219, 277
フ ァ イ ル処理
C, 219
f77, 242
HP-UX, 197
フ ァ イ ルポ イ ン タ , 219
不確定な繰 り 返 し 数お よ びパ ラ レ ル化 , 184
副作用
定義 , 277
副作用お よ びパ ラ レ ル化 , 183
副作用 と デー タ の依存 , 184
副作用、 ルーチン , 236
複数の ス レ ッ ド , 138
複素数型 , 200
BOZ 定数 , 241
C お よ び Fortran, 203
C でシ ミ ュ レー ト す る , 203
基本の大 き さ を変更す る , 50, 51
符号付 き お よ び符号な し デー タ 型 , 202
符号な し 整数、 C お よ び Fortran, 202
不正確な演算例外 , 150
不正な引 き 数
シ グナル , 148
例外 , 152
不正な浮動小数点演算を ト ラ ッ プす る , 60
不正命令例外 , 148, 150
浮動小数点
IEEE 規格 , 149, 156
+Ofltacc オプシ ョ ン , 178
+Omoveflops オプシ ョ ン , 178
オーバーフ ロ ー , 273
最適化 , 90, 95
精度 , 132, 276
先行す る ゼ ロ , 244
定数 , 240, 241
例外 , 148, 150
例外処理 , 37, 38, 148, 156
例外を ト ラ ッ プす る , 59
部分列
+check オプシ ョ ン , 53
プ ラ イ ベー ト 化の表 , 98
フ ラ ッ ト 呼び出 し グ ラ フ プ ロ フ ァ イ ル , 172
古いプ ロ グ ラ ム , 255
定義 , 277
プログラ ム
ソ ース を リ ス ト す る , 67, 232
プ ロ グ ラ ム形式 , 266
299
索引
+extend_source オプシ ョ ン , 266
+source オプシ ョ ン , 76, 266
フ ァ イ ル名拡張子 , 266
プ ロ グ ラ ム リ ス ト , 30
プロ フ ァ イ ラ
概要 , 168
シ ン ボルテーブル , 168
定義 , 277
プロ フ ァ イ リ ング
コ ンパ イ ル行オプシ ョ ン , 47
プ ロ フ ァ イ リ ン グ オプシ ョ ン
+gprof オプシ ョ ン , 62
+prof オプシ ョ ン , 74
プ ロ フ ァ イ ルフ ァ イ ル
gmon.out, 171
mon.out, 172
プ ロ フ ァ イ ルベース の最適化
コ ンパ イ ラ 環境 , 24
プ ロ モー ト す る , 28
定数 , 132
フ ロ ン ト エン ド
オプシ ョ ン , 28
コ ンパ イ ラ 環境 , 24
制御す る , 28
定義 , 278
文
ACCEPT, 256
AUTOMATIC, 131, 256
BYTE, 134, 256
CHARACTER, 134
COMMON, 129, 221
DATA, 129, 241
DECODE, 256
DOUBLE COMPLEX, 134, 256
DOUBLE PRECISION, 134
ENCODE, 256
EQUIVALENCE, 129
EXTERNAL, 191, 240, 247, 263
IMPLICIT NONE, 128
INCLUDE, 143
MAP, 256
NAMELIST, 242
ON, 150, 155, 161, 243
OPEN, 242, 253
OPTIONAL, 241
PARAMETER, 241
POINTER ( ク レ イ 形式 ), 257
PRIVATE, 143
PROGRAM, 243
300
PUBLIC, 143
RECORD, 257
SAVE, 129, 131
STATIC, 129, 131, 257
STRUCTURE, 257
TYPE (I/O), 257
UNION, 257
USE, 111, 143
VIRTUAL, 257
VOLATILE, 257
WRITE, 219
文関数、 非互換性 , 243
分類
コ ンパ イ ル行オプシ ョ ン , 47
へ
ベ ク ト ル化 , 187, 188, 234
BLAS ルーチン を呼び出す , 189
+Ovectorize オプシ ョ ン , 100, 179
局所的制御 , 188
指令 , 188
定義 , 278
ベ ク ト ル化、 制御す る , 234
ベ ク ト ル操作お よ び BLAS, 196
ページ ン グお よ びデマ ン ド ロ ー ド , 120
変数
自動割 り 付け , 129
静的 , 129
保存す る , 75
変数群入出力 , 242
変数を保存す る , 36, 75
ほ
ポインタ
C へ渡す , 205
ク レ イ , 257
ス ト リ ーム , 197
母国語サポー ト , 67
保守的な最適化 , 180
ホ レ リ ス型 , 200
ま
マ ク ロ を cpp に対 し て定義す る , 119
マニ ュ アルの範囲 , 18
マルチプ ロ セ ッ サ マシ ン , 95, 125
マ ンページ , 20
cpp, 24, 27, 153
CXperf, 40
索引
索引
C プ リ プ ロ セ ッ サ , 78
f90, 23
gprof, 40
ld, 24, 104
malloc シ ス テ ムルーチン , 230
prof, 40, 172
stdio, 197
stty, 163
ttv, 40
write, 220
シ グナル , 149
動的 メ モ リ , 230
み
未解決引用 , 105
短いデ ィ ス プ レース メ ン ト の コ ー ド , 66
見本プ ロ グ ラ ム
abort.f90, 158
allow_core.f90, 164
bye.f90, 117
call_fptrap.f90, 161
call_itrap.f90, 162
clash.f90, 263
code.f90, 111
cpp_direct.f90, 118
data.f90, 111
fnum_test.f90, 219
get_args.f90, 194
get_array.c, 213
get_string.c, 217
go_to_sleep.f90, 139
greet.f90, 117
hello.f90, 44
hi.f90, 117
ignore.f90, 159
main.f90, 110
pass_array.f90, 212
pass_chars.f90, 216
pass_complex.f90, 203
pass_str.f90, 230
precision.f90, 135, 136
pr_str.c, 230
recursive.f90, 130
saxpy.f90, 190
shared_common.f90, 222
shared_struct.c, 223
sort_em.c, 208
sqr_complex.c, 204
索引
test_sort.f90, 209
wake_up.f90, 140
モジ ュ ールを使用す る プ ロ グ ラ ム の メ イ ク
フ ァ イ ル , 113
ミ リ コ ー ド ルーチン , 93, 178
定義 , 278
む
無効演算 , 150
定義 , 278
め
名称変更機能 , 143
命令ス ケ ジ ュ ー ラ , 35, 115
命令ス ケ ジ ュ ー リ ン グ , 88
+DS オプシ ョ ン , 57
メ ッ セージ
fid に よ る 発行 , 253
-w オプシ ョ ン , 79
メモリ
階層の最適化 , 55
共有 , 138
最適化時の消費 , 86
配列 , 211
フ ォ ル ト , 148
メ モ リ におけ る 配列の配置 , 211
も
文字
下線 (_), 229
下線文字 (_), 73
バ ッ ク ス ラ ッ シ ュ , 58
文字型 , 200
モジ ュ ール
+moddir オプシ ョ ン , 67
モジ ュ ールプ ロ グ ラ ム単位 , 143
コ ンパ イ ルす る , 109
定義 , 278
モジ ュ ールを管理す る , 113
例 , 110
モジ ュ ールを コ ンパ イ ルす る ための メ イ ク
フ ァ イ ル , 113
文字列
ALIAS 指令 , 230
文字列、 C お よ び Fortran, 215
モデル ( ハー ド ウ ェ ア ) お よ びパフ ォーマ ン ス
, 192
301
索引
ゆ
融合 と 最適化 , 90
よ
抑止す る
警告 , 79
リ ン ク , 52
呼び出す
BLAS ルーチン , 189
C 関数 , 151
C プ リ プ ロ セ ッ サ , 27, 118
C ルーチン , 199
libU77 ルーチン , 196
コ ンパ イ ラ , 23, 44
シ ス テ ムルーチンお よ び ラ イ ブ ラ リ ルーチン
, 196, 198
ト ラ ッ プ手続 き , 160
リ ン カー , 102
ら
ラ イブラ リ
ISAM ス タ ブ , 104
libpthread, 152
-L オプシ ョ ン , 66
-l オプシ ョ ン , 38, 66
PA1.1 お よ び浮動小数点 ト ラ ッ プ , 60
アーカ イ ブ , 272
カーネル ス レ ッ ド ラ イ ブ ラ リ , 95
共有 , 107, 115, 273
組み込み関数 , 104
検索パ ス , 37, 108, 124
コ ンパ イ ラ 環境 , 24
参照す る , 196
シ ス テ ムルーチン , 196
実行時 , 104
数学 , 192
ス レ ッ ド , 138
デフ ォ ル ト , 104
ベ ク ト ル化 , 100, 187
リ ン ク の問題 , 105
~への呼び出 し を最適化す る , 178
り
リ ス ト す る 、 ソ ース フ ァ イ ル
LIST 指令 , 232
リ ン カー
-a オプシ ョ ン , 107
302
-b オプシ ョ ン , 116
ld コ マ ン ド , 102, 103
-lm オプシ ョ ン , 223
+strip オプシ ョ ン , 147
オプシ ョ ン , 26, 37
コ ンパ イ ラ 環境 , 24
制御す る , 37
引 き 数を~へ渡す , 39
リ ンク
-a オプシ ョ ン , 107
-a リ ン カーオプシ ョ ン , 80
-c オプシ ョ ン , 52
f90 コ マ ン ド , 102
-g オプシ ョ ン , 146
ld コ マ ン ド , 103
-L オプシ ョ ン , 66
-l オプシ ョ ン , 66
+shared オプシ ョ ン , 75
-v でデバ ッ グす る , 105
-W オプシ ョ ン , 79
コ マ ン ド 行で ラ イ ブ ラ リ を指定す る , 105
デフ ォ ル ト , 43
抑止す る , 37, 52
ラ イ ブ ラ リ , 104
リ ン ク を抑止す る , 25, 37, 117
る
ループ
ア ン ロ ー リ ン グ , 95
ジ ャ ム , 95
ループのア ン ロ ー リ ン グ , 94
ループのア ン ロ ールお よ びジ ャ ム , 94
ループのブ ロ ッ ク 化 , 94
ループ変形 , 94
ループ リ ポー ト , 98
ループ を ア ン ロ ールす る , 94
ループ をベ ク ト ル化す る , 234
れ
例外
+fp_exception オプシ ョ ン , 61
+FP オプシ ョ ン , 59
ON 文 , 155
概要 , 148
シ グナル , 148
使用不能にす る , 148
処理 , 148
処理す る , 155
索引
索引
セ グ メ ン テーシ ョ ン違反 , 151
定義 , 278
バ ス エ ラ ー , 149
不正な引 き 数 , 152
不正命令 , 150
浮動小数点 , 148, 149, 150, 156
例外を処理す る , 148, 156
レジス タ
活用 , 95
レ ジ ス タ の再関連付け と 最適化 , 97, 98
列順 , 211, 278
連結演算子 (//), 215
ろ
論理型
C と Fortran, 202
演算子 , 253
基本の大 き さ を変更す る , 50, 51
装置番号 , 197
デー タ 型 , 200, 202, 253
わ
渡す
C お よ び Fortran で引 き 数を~ , 151
C お よ び Fortran の引 き 数 , 205, 206
C へポ イ ン タ を~ , 205
C へ文字列を~ , 215
C へ割 り 付け配列を~ , 205
引 き 数をサブプ ロ セ ス に~ , 26
割 り 込み処理
+fp_exception オプシ ョ ン , 150
+FP オプシ ョ ン , 150
ON 文 , 155
割 り 付け境界
デー タ , 127
割 り 付け配列
C へ渡す , 205
ワ ン ト リ ッ プ DO ループ , 262, 278
索引
303
索引
304
索引