Comments
Description
Transcript
Fortran 使用手引書
Fortran 使用手引書 はじめに 本書の目的 本書は、Solaris™ オペレーティングシステム上で動作する Fortran 処理系(以降、本システムと呼 びます)の使用方法を記述しています。また、本システムにおける以下の事項についても記述し ています。 - Fortran プログラミングに関する解説 - 制限事項 本書の読者 本書は、本システムを使用して、Fortran 原始プログラムを処理する方および Fortran 原始プログラ ムを作成する方を対象に記述しています。 本書を読むにあたっては、Solaris のコマンド、ファイル操作およびシェルプログラミングの基本 的な操作知識が必要です。 本書では、読者は Fortran 言語仕様を理解していることを前提に記述しております。Fortran 言語仕 様については、オンラインマニュアルで提供されている“Fortran 文法書” 、JIS Fortran 規格書また は市販本を参照してください。 本書の構成 本書は以下の構成になっています。 第 1 章 Fortran システムの概要 本システムを使用して Fortran 原始プログラムを処理する場合の概要について記述しています。 第 2 章 Fortran プログラムの翻訳・結合 本システムを使用して Fortran プログラムを翻訳・結合する方法について記述しています。 第 3 章 Fortran プログラムの実行 本システムを使用して Fortran プログラムを実行する方法について記述しています。 第 4 章 Fortran システムの出力情報 Fortran 原始プログラムの翻訳時および実行時に、本システムが出力する各種の情報について記述 しています。 第 5 章 データの型、種別および内部表現 本システムで使用できるデータの型について記述しています。 Fortran 使用手引書ー Page 3 第 6 章 プログラミング上の注意 本システムを用いてプログラミングを行う場合の注意事項について記述しています。入出力文に ついては、“第 7 章 入出力処理”に記述しています。 第 7 章 入出力処理 Fortran の入出力文が扱うファイルおよび入出力文を使用する際に必要となる情報について記述し ています。 第 8 章 プログラムのデバッグ Fortran プログラムを実行した際に、エラーが発生した場合、異常終了した場合または利用者の目 的とする結果が得られなかった場合、その原因を追求し Fortran 原始プログラムを修正しなければ なりません。ここでは、その原因を追求するために本システムが提供しているデバッグ機能およ びその操作方法について記述しています。 第 9 章 最適化機能 最適化機能の使用上の注意および最適化機能の活用方法について記述しています。 第 10 章 モジュールおよびモジュール引用の注意事項 Fortran 95 仕様のモジュールを含むプログラムの翻訳時の注意事項について記述しています。 第 11 章 言語間結合 Fortran プログラムと C 言語の結合について記述しています。 第 12 章 並列機能 本システムを使用して、Fortran プログラムを並列処理する方法について記述しています。 本書の読み方 本システムの概要を知りたい場合は、“第 1 章 Fortran システムの概要”をお読みください。 本システムを使用して Fortran プログラムの翻訳、結合編集を行う場合は、“第 2 章 Fortran プロ グラムの翻訳・結合”をお読みください。Fortran プログラムの実行を行う場合は、 “第 3 章 Fortran プログラムの実行”をお読みください。また、翻訳時および実行時の各種の出力情報については、 “第 4 章 Fortran システムの出力情報”をお読みください。 Fortran プログラムを作成する場合は、 “第 5 章 データの型、種別および内部表現”および “第 6 章 プログラミング上の注意”をお読みください。Fortran の入出力文を使用してプログラミ ングする場合は、 “第 7 章 入出力処理”をお読みください。モジュールを含むプログラムを作成 する場合には、 “第 10 章 モジュールおよびモジュール引用の注意事項”をお読みください。 Fortran プログラムのデバッグを行う場合は、 “第 8 章 プログラムのデバッグ”をお読みください。 本システムで提供している最適化機能を活用したい場合には、 “第 9 章 最適化機能”をお読みく ださい。 Fortran プログラムを C プログラムと結合して使用する場合は、 “第 11 章 言語間結合”をお読み ください。 本システムを使用して Fortran プログラムを並列処理する場合は、 “第 12 章 並列機能”をお読み ください。 Fortran 使用手引書ー Page 4 本システムの言語仕様を知りたい場合は、オンラインマニュアルで提供されている“Fortran 文法 書”を参照してください。 本書の位置付け 本システムには、本書以外に以下に示すマニュアルがあります。 - “Fortran 文法書” - “Fortran 翻訳時メッセージ” - “Fortran 実行時メッセージ” 本書の注意事項 本書の情報は、プログラミングサービス情報です。Fortran を利用した応用プログラムを作成する ために利用できます。 記述上の約束 本書は、以下の形式に従って説明しています。 構文表記記号 構文表記記号とは、構文を記述する上で、特別な意味で定められた記号であり、以下のものがあ ります。 記号名 記号 説明 { } この記号で囲まれた項目の中から、どれか一つを選択することを 表します。 | この記号を区切りとして、複数の項目を列挙することを表しま す。 省略可能記号 [ ] この記号で囲まれた項目を省略してもよいことを表します。ま た、この記号は選択記号“ { }”の意味を含みます。 省略値記号 - 省略可能記号“[ ]”内の項目をすべて省略したときの省略値を 表します。 反復記号 … この記号の直前の項目を繰り返して指定できることを表します。 選択記号 商標 UNIX は、米国およびその他の国におけるオープン・グループの登録商標です。 Sun、Sun Microsystems、Sun ロゴ、Solaris およびすべての Solaris に関連する商標およびロゴは、 米国およびその他の国における米国 Sun Microsystems, Inc. の商標または登録商標であり、同社の ライセンスを受けて使用しています。 すべての SPARC 商標は、米国 SPARC International,Inc. のライセンスを受けて使用している同社の 米国およびその他の国における商標または登録商標です。 SPARC 商標が付いた製品は、米国 Sun Microsystems 社が開発したアーキテクチャに基づくもので す。 Adobe および Acrobat はアドビシステムズ社の商標です。 OpenMP は、OpenMP Architecture Review Board の商標です。 Fortran 使用手引書ー Page 5 他の各製品名は、各社の商標または登録商標です。 著作権 All Rights Reserved, Copyright © 富士通株式会社 1999-2006 平成 18 年 12 月 お願い 本書の中で分かりにくい箇所、誤っている箇所を発見された場合は、SE または販売員にご連絡く ださい。 本書を無断で他に転載しないようお願いします。 本書は予告なしに変更されることがあります。 目次 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 第 1 章 Fortran システムの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Fortran システムの構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Fortran システムの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 翻訳と結合編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.3 ファイル名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.4 代表的な翻訳時オプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.5 実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.6 デバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.7 チューニング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 19 19 20 20 21 21 22 22 第 2 章 Fortran プログラムの翻訳・結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1 翻訳コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.1 翻訳コマンドの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.2 翻訳コマンドの入力ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.2 翻訳時オプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.3 翻訳コマンドの環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 2.4 翻訳時プロフィルファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 2.5 翻訳指示行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 2.6 翻訳コマンドの復帰値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 第 3 章 Fortran プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.1 実行コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.2 実行コマンドの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.3 実行時オプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.4 実行コマンドの環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.5 実行時プロフィルファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.6 実行コマンドの復帰値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.7 実行コマンドの標準入出力および標準エラー出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.8 実行時の環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 第 4 章 Fortran システムの出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 翻訳時の出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 翻訳時の診断メッセージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 翻訳情報出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2.1 翻訳情報出力のオプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2.2 翻訳情報の出力形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 実行時の出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 実行時の診断メッセージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 トレースバックマップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 80 80 81 81 85 103 103 104 Fortran 使用手引書ー Page 7 4.2.3 エラー集計情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 第 5 章 データの型、種別および内部表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 データの表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 整数型データ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 論理型データ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3 実数型および複素数型データ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.4 文字型データ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5 構造型データ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 データの正しい境界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 精度の変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 精度の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1.1 精度拡張のオプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 精度縮小と誤差の影響分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2.1 精度縮小機能の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2.2 精度縮小機能の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 106 106 106 106 109 110 110 111 111 111 112 113 113 第 6 章 プログラミング上の注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 言語仕様レベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1 COMMON 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1.1 共通ブロックに属する変数の境界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1.2 初期値をもつ共通ブロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.2 EQUIVALENCE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.3 初期値の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.3.1 文字定数による初期値設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.3.2 非 10 進定数表現による初期値設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.3.3 重複する初期値設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.4 CRAY 仕様のポインタ変数の引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.5 初期値をもつ変数に対する SAVE 属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 整数型データの演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2 実数型データの演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.3 論理型データの演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.4 演算結果の型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.5 要素の評価順序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.6 式の一部の評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.7 関数引用による値の更新 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.8 括弧で囲まれた変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 重なりのある文字代入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5 実行文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.1 GO TO 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.2 算術 IF 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.3 IF 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.4 DO 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.4.1 DO ループの繰返し回数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.5 CASE 構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.6 PAUSE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.7 STOP 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.8 ALLOCATE / DEALLOCATE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6 手続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 116 117 117 117 118 118 118 119 119 120 120 121 121 121 122 122 122 122 123 123 123 124 124 124 124 124 125 125 125 125 126 126 Fortran 使用手引書ー Page 8 6.6.1 文関数の引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.2 組込み関数名が指定された EXTERNAL 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.3 総称名としての REAL および CMPLX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.4 組込み手続名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.5 型宣言された組込み関数名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.6 サービスルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 127 127 127 128 128 第 7 章 入出力処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1 ファイルの基本事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 ファイルの存在 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.2 ファイルの接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.2.1 接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.2.2 接続の解除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 装置番号とファイルの接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 装置番号とファイルの接続の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.2 環境変数による装置番号とファイルの接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1 書式付き Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1.1 書式付き順番探査入出力文で扱う Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1.2 書式付き直接探査入出力文で扱う Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1.3 内部ファイル入出力文で扱う Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2 書式なし Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2.1 書式なし順番探査入出力文で扱う Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2.2 書式なし直接探査入出力文で扱う Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.3 並びによる Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.4 変数群 Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.5 ファイル終了記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.6 BINARY Fortran 記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4 OPEN 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1 OPEN 文の指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1.1 FILE 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1.2 STATUS 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1.3 RECL 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1.4 ACTION 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.1.5 BLOCKSIZE 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.2 再結合時の OPEN 文の指定子の値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.3 書式付き入出力と書式なし入出力の混在 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4.4 RECL 指定子があり、ACCESS 指定子がない OPEN 文 . . . . . . . . . . . . . . . . . . . . . . . . . . 7.5 CLOSE 文の指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.5.1 STATUS 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6 INQUIRE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.1 INQUIRE 文の問合せ指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2 言語仕様レベルによる INQUIRE 文の動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2.1 ACTION 指定子の返却値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2.2 INQUIRE 文の問合せ指定子に返却される文字定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2.3 PAD 指定子の返却値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2.4 ファイル INQUIRE 文の問合せ指定子の返却値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.6.2.5 装置 INQUIRE 文の問合せ指定子の返却値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7 入出力文の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 129 129 129 130 130 131 131 132 133 134 134 135 136 137 137 138 138 138 139 139 139 139 140 141 142 142 144 144 144 145 145 145 146 146 149 149 149 149 150 150 150 Fortran 使用手引書ー Page 9 7.7.1 入出力文の制御情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.1.1 UNIT 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.1.2 FMT 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.1.3 IOSTAT 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.1.4 ERR 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.1.5 END 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.1.6 EOR 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.2 順番探査入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.2.1 書式付き順番探査入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.2.2 書式なし順番探査入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.3 直接探査入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.3.1 直接探査 READ 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.3.2 直接探査 WRITE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.3.3 旧仕様の直接探査入出力文の記述の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.3.4 直接探査入出力におけるデータ転送エラー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.4 変数群入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.4.1 変数群 READ 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.4.1.1 変数群入力における変数群記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.4.2 変数群 WRITE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.4.3 変数群入出力の言語仕様レベルによる違い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.5 並びによる入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.5.1 並びによる READ 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.5.2 並びによる WRITE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.5.2.1 並び出力における囲みなし文字定数の出力形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.6 内部ファイル入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.7 停留入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8 入出力文の組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8.1 入出力文の許されない組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8.1.1 書式付き順番探査入出力文との組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8.1.2 書式なし順番探査入出力文との組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8.1.3 直接探査入出力文との組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8.1.4 ファイル位置付け文との組合せ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.9 ファイル位置付け文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.9.1 BACKSPACE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.9.2 ENDFILE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.9.3 REWIND 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.10 IBM370 形式 -IEEE 形式浮動小数点データ入出力変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.10.1 浮動小数点データと入出力文との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.10.2 エラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.11 エンディアン入出力変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.11.1 リトルエンディアンデータと入出力文との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.12 標準ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.12.1 標準ファイルとオープンモード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.12.2 標準ファイルに対する入出力文の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.12.3 入出力文とシーク可能/不可能ファイルの関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.13 ACTION 指定子による入出力文の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.14 実数値の有効けた数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.15 入出力バッファ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16 編集記述子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 150 151 152 152 153 153 153 153 154 155 155 155 156 156 156 157 159 159 161 164 164 166 168 168 168 169 172 172 172 172 173 173 173 175 180 180 180 183 183 183 185 185 185 185 186 186 187 187 Fortran 使用手引書ー Page 10 7.16.1 整数型の G 形編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16.2 書式付き出力文の文字出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16.3 G 形編集記述子の編集結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16.4 文字列編集記述子の診断メッセージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16.5 X 形編集記述子の効果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16.6 L 形編集記述子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.16.7 D、E、F、G、I、L、B、O および Z 編集記述子の w、d の省略値 . . . . . . . . . . . . . . . 7.16.8 実数型特殊データの編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.17 磁気テープファイル入出力機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.17.1 磁気テープファイルと装置番号の接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.17.1.1 環境変数による磁気テープファイルと装置番号の接続 . . . . . . . . . . . . . . . . . . . . . . . 7.17.1.2 OPEN 文の FILE 指定子による磁気テープファイルと装置番号の接続 . . . . . . . . . . 7.17.2 磁気テープファイル入出力機能の留意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.18 入出力統計情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.18.1 入出力統計情報が出力するファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.18.2 入出力統計情報が出力する情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.18.3 入出力統計情報における注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.19 EBCDIC-ASCII 文字コード入出力変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.19.1 EBCDIC 文字コードデータと入出力文との関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 187 188 188 188 188 189 190 190 190 190 191 191 191 191 192 192 193 193 第 8 章 プログラムのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1 エラー制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 エラーモニタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2 エラー処理サービスサブルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2.1 ERRSAV サービスサブルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2.2 ERRSTR サービスサブルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2.3 ERRSET サービスサブルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2.4 ERRTRA サービスサブルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3 エラーモニタの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3.1 利用者が用意するエラー修正サブルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3.2 組込み関数で発生するエラーの注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3.3 利用者によるエラー処理の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.4 入出力エラーの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.5 組込み関数エラーの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.6 組込みサブルーチンエラーの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.7 例外ハンドリングエラーの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.8 その他のエラーの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 デバッグのための機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 デバッグを行うための検査機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1 引数の妥当性の検査(ARGCHK 機能) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.1 引数の個数の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.2 引数の型の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.3 引数の属性の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.4 関数の型の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.5 引数の大きさの検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.6 明示的引用仕様の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.1.7 形状引継ぎ配列の次元数の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.2 添字式および部分列範囲の検査(SUBCHK 機能). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.2.1 配列の引用に対する検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 194 194 200 200 200 201 202 202 202 203 203 204 208 221 222 223 225 225 225 225 225 226 226 226 227 227 227 227 Fortran 使用手引書ー Page 11 8.2.1.2.2 部分配列の引用に対する検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.3 未定義データの引用の検査(UNDEF 機能) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.3.1 未定義データの検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.3.2 割付け配列の検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.3.3 仮引数の実在検査 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.4 形状適合の検査(SHAPECHK 機能) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1.5 拡張検査(EXTCHK 機能). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2 異常終了プログラムのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2.1 異常終了の原因 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2.2 異常終了時の出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2.2.1 一般的な異常終了時の出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2.2.2 SIGXCPU の出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2.2.3 実行時オプション -a を指定した場合の出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2.2.4 異常終了処理中に再び異常終了が発生した場合の出力情報 . . . . . . . . . . . . . . . . . . . 8.3 fdb コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1 起動と終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1.1 ./a.out のデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1.2 プログラムのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1.3 デバッガの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1.4 INTERRUPT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2.1 run コマンドによるプログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2.2 入出力をリダイレクトしたプログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2.3 デバッグ中のプログラムの強制終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3 ブレークポイント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3.1 ブレークポイントの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3.2 定義されているブレークポイントの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3.3 ブレークポイントの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3.4 全ブレークポイントの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.3.5 ブレークポイントの無視 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4 プログラムのスタック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4.1 すべてのトレースの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4.2 現在のトレースの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4.3 現在のレジスタ値の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4.4 現在の浮動小数点レジスタ値の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.4.5 現在の全レジスタ値の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5 実行制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5.1 実行の継続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5.2 ステップ実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5.3 マシン命令でステップ実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5.4 次まで実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.5.5 関数の終りまで実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.6 変数の内容の表示と設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.6.1 変数などの値をフォーマットにしたがって表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.6.2 値の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.7 プログラムをマシン命令で表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.8 アドレス・マップの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.9 ソースファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.9.1 ソースの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 227 228 228 228 228 229 230 230 231 231 232 232 232 232 232 232 233 233 233 234 234 234 234 234 234 236 236 236 237 237 237 237 237 238 238 238 238 238 238 239 239 239 239 240 241 241 241 241 Fortran 使用手引書ー Page 12 8.3.9.2 ソースファイル名の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10 式の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.1 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.2 変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.2.1 Fortran プログラムでの変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.2.2 C 言語プログラムでの変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.3 定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.3.1 Fortran プログラムでの定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.3.2 C 言語プログラムでの定数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.4 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.4.1 Fortran プログラムでの演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.10.4.2 C 言語プログラムでの演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.11 Fortran プログラムをデバッグする上での注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 241 241 242 242 242 243 243 243 244 244 244 245 第 9 章 最適化機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1 オブジェクトモジュールの大きさ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.1 ループアンローリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.2 ソフトウェアパイプライニング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.3 インライン展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.1.4 ストライピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 実行結果の精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3 実行場所の移動による影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4 演算評価方法変更の最適化による影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.5 実行順序の変更による影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.6 割当て形 GO TO 文の分岐先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.7 仮引数での影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.8 インライン展開の制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.8.1 呼び出される利用者定義の手続に関する制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.8.2 呼び出す側と呼び出される側の関係に関する制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . 9.8.3 利用者定義の外部手続の名前に関する制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.9 CRAY 仕様のポインタ変数での影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.10 翻訳時オプション -Kcommonpad の影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.11 最適化制御行(OCL)の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.11.1 最適化制御行の記法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.11.2 最適化制御行の記述位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.11.3 最適化指示子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.12 プロファイル情報の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.13 実行マシン属性の選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.13.1 マシン属性の種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.13.2 マシン属性の自動選択機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.13.3 実行マシン属性の注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.14 スタック割付けの影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.15 配列の形状を変更する機能の影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.16 strong prefetch 命令の影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.17 プリフェッチを実施したことによる実行性能への影響について . . . . . . . . . . . . . . . . . . 9.18 配列宣言の次元移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.18.1 配列宣言の次元移動の影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.18.2 配列宣言の次元移動の対象変数の制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.19 配列変数マージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 246 246 246 247 247 248 248 250 251 251 251 254 254 255 255 256 256 257 257 257 257 271 272 272 272 272 272 274 274 275 275 275 276 276 Fortran 使用手引書ー Page 13 9.19.1 配列変数マージの影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.19.2 局所的な配列変数マージの対象変数の制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.19.3 共通ブロック実体の配列変数マージの対象変数の制約事項 . . . . . . . . . . . . . . . . . . . . . 9.20 memcpy(3C) および memset(3C) 関数への変換を実施したことによる影響 . . . . . . . . . . 9.21 マルチ演算関数の呼出しについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 277 278 278 278 第 10 章 モジュールおよびモジュール引用の注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1 モジュールおよびモジュール引用の翻訳方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 モジュールの更新とモジュール引用プログラムの再翻訳 . . . . . . . . . . . . . . . . . . . . . . . . 10.3 モジュールと制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 281 284 284 第 11 章 言語間結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1 言語間結合のための仕様 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.1 引数の値渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2 引数の値受取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.3 CHANGEENTRY 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.4 $pragma 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 外部名の加工 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 関数値の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.4 引数の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.4.1 文字型の引数の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.4.2 翻訳時オプション -Az の注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.5 外部変数によるデータの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.6 データ属性の対応 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.7 Fortran プログラムの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8 C プログラムとの結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.1 結合方法の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.2 手続の呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.2.1 C のプログラムに最初に制御を渡す方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.2.2 C の標準ライブラリを呼び出す方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3 データの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.1 関数値によるデータの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.1.1 C での Fortran の関数値の受取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.1.2 Fortran での C の関数値の受取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.2 引数によるデータの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.2.1 Fortran から C への引数の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.2.2 C から Fortran への引数の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.2.3 C への文字定数の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.3 外部変数によるデータの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.4 ファイルによるデータの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.5 C とのデータ属性の対応 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.3.6 配列の記憶順序の相違 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8.4 C プログラムとの結合の制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 285 285 285 286 286 286 287 288 288 288 288 288 289 289 289 290 290 291 291 291 292 293 294 294 295 296 297 297 298 298 299 第 12 章 並列機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1 並列処理の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.1 並列処理とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.2 並列処理の効果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.3 並列処理で効果を得るための条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.4 本システムの並列機能の特徴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 300 300 300 301 301 Fortran 使用手引書ー Page 14 12.2 自動並列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1 翻訳・実行の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.1 翻訳の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.1.1 自動並列化のための翻訳時オプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2 実行の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.1 環境変数 PARALLEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.2 スレッド数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.3 環境変数 THREAD_STACK_SIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.4 実行時の領域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.5 待機スレッドの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.6 打切り時間設定時の注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.2.7 サービスルーチン使用時の注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1.3 翻訳・実行の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.2 並列化プログラムのチューニング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3 自動並列化処理の詳細 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1 自動並列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.1 自動並列化の対象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.2 ループスライスとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.3 配列操作と自動並列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.4 コンパイラによる自動ループスライス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.5 ループ交換と自動ループスライス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.6 ループ分割と自動ループスライス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.7 ループ融合と自動ループスライス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.8 リダクションによるループスライス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.9 ループスライスされない DO ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.10 自動並列化状況の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.1.11 マルチスレッド範囲の拡大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.2 最適化制御行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.2.1 最適化制御行の記法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.2.2 最適化制御行の記述位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.2.3 自動並列化と最適化指示子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.2.4 自動並列化用の最適化指示子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.2.5 ワイルドカード指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.3 自動並列化機能を使うときの留意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.3.1 翻訳時オプション -Kparallel,instance=N 指定時の注意 . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.3.2 並列処理の入れ子での注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.3.3 翻訳時オプション -Kparallel,reduction 指定時の注意 . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.3.4 最適化制御行の使い方の注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.3.3.5 並列処理中の入出力文および組込み手続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 OpenMP 仕様による並列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1 翻訳・実行の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.1 翻訳の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.1.1 OpenMP Fortran プログラムを翻訳するための翻訳時オプション . . . . . . . . . . . . . . 12.3.1.1.2 OpenMP Fortran プログラムの最適化情報の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.2 実行の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.2.1 実行時の環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.2.2 OpenMP Fortran 仕様の環境変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.2.3 実行時の注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1.2.4 複数のスレッドからの出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 302 302 302 303 303 303 304 304 305 305 305 305 306 306 307 307 307 307 307 308 309 309 310 311 313 313 314 314 315 315 315 329 330 330 330 331 331 332 333 333 333 333 335 336 336 337 337 339 Fortran 使用手引書ー Page 15 12.3.2 実現依存の仕様 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3 OpenMP 仕様の明確化および制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.1 ASSIGN 文による文番号指定および割当て形 GO TO 文 . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.2 ATOMIC ディレクティブおよび REDUCTION 並び項目における追加の関数 および演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.3 FORALL 構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.4 THREADPRIVATE 使用時の注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.5 インライン展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.6 パラレルリージョンからの内部手続呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.7 文関数定義文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.3.8 変数群要素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.4 プログラミングの注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.4.1 パラレルリージョンの実現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.4.2 OpenMP Fortran プログラムの自動並列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.5 他のマルチスレッドプログラムとの結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.6 OpenMP Fortran プログラムのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.6.1 デバッグのための検査機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.6.2 fdb コマンドによるデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 I/O バッファ並列転送 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1 翻訳・実行の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1.1 翻訳の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1.2 実行の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1.3 I/O バッファ並列転送の条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1.4 翻訳・実行の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.2 I/O バッファ並列転送機能の注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5 並列実行情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.1 並列実行情報が出力する情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 スタック情報表示機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 341 341 342 342 342 342 342 343 343 343 343 343 344 344 344 344 347 347 347 347 347 348 348 348 348 350 付録 A プログラムの制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.1 関数引用、部分配列、配列要素引用および部分列引用の入れ子の深さ . . . . . . . . . . . . . A.2 DO 構文、CASE 構文、IF 構文の入れ子の深さ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.3 DO 形並びの入れ子の深さ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.4 INCLUDE 行の入れ子の深さ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.5 配列宣言子の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.5.1 すべての配列宣言子の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.5.2 大きさゼロの配列宣言子の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.6 部分配列の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.7 分岐命令から分岐先命令への距離による影響 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 352 352 352 352 353 353 353 354 354 付録 B 印刷制御用コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.1 fot コマンドの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.2 fot コマンドの実行例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.3 fot コマンドの復帰値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.4 fot コマンドの出力情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 355 356 356 356 付録 C 富士通ホスト系 FORTRAN コンパイラとの互換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.1 B 形編集記述子および Z 形編集記述子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.2 実引数に 2 バイトの整数型をもつ組込み関数の結果の型 . . . . . . . . . . . . . . . . . . . . . . . . . C.3 追加の FORTRAN77 言語仕様組込み関数の解釈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 358 358 358 Fortran 使用手引書ー Page 16 C.4 DO パラメタの増分値変数を更新している DO ループの DO 変数の値 . . . . . . . . . . . . . . 359 C.5 先行の入出力文が ENDFILE 文である場合の入出力文の動作 . . . . . . . . . . . . . . . . . . . . . . 359 C.6 先行の入出力文が EOF 検出である場合の入出力文の動作 . . . . . . . . . . . . . . . . . . . . . . . . 359 C.7 先行の入出力文が順番探査 READ 文である場合の入出力文の動作 . . . . . . . . . . . . . . . . . 360 C.8 OPEN 文の STATUS 指定子とファイル名の関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 C.9 名前なしファイルの扱い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 C.10 内部ファイルに対する並びによる出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 C.11 8 バイトの整数型との演算結果の型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 C.12 OPEN 文の BLANK 指定子、DELIM 指定子および PAD 指定子 . . . . . . . . . . . . . . . . . . . 363 C.13 OPEN 文の STATUS 指定子と ACTION 指定子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 C.14 Q 形編集記述子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 C.15 ファイル INQUIRE 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 C.16 組込み関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 付録 D 32 ビットモードと 64 ビットモードの違い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 D.1 LOC 組込み関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 D.2 CRAY 仕様 POINTER 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 D.3 サービスルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 D.4 組込み関数の結果値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 D.5 組込み関数 VAL および %VAL の引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 D.6 VALUE 文および VALUE 属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 D.7 複素数型、倍精度複素数型および 4 倍精度複素数型の関数 . . . . . . . . . . . . . . . . . . . . . . . 366 付録 E Parallelnavi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 E.1 ラージページ機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 E.1.1 翻訳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 E.1.2 実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 E.1.3 ラージページ機能を利用するプログラムの判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 E.1.4 制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 E.2 CPU 数の管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 E.2.1 自動並列化におけるスレッド数の決定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 E.2.2 OpenMP におけるスレッド数の決定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 E.3 スレッド間ハードウェアバリア機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 E.3.1 翻訳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 E.3.2 実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 E.3.3 スレッド間ハードウェアバリア機能を利用するプログラムの判定 . . . . . . . . . . . . . . . . 372 E.3.4 制約事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 表目次 表 5.1 データの型に対する正しい境界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 7.1 ファイル名による INQUIRE 文で設定される値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 7.2 装置番号による INQUIRE 文で設定される値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 7.3 誤り条件、ファイル終了条件および記録終了条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.1 エラー制御表の標準値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.2 入出力に関するエラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.3 組込み関数に関するエラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.4 組込みサブルーチンに関するエラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.5 割込み発生時の修正処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.6 その他のエラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 8.7 捕捉シグナルと対応するシグナルコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 9.1 最適化制御行に記述できる最適化指示子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 9.2 ユーザプログラムから直接呼び出すことができるマルチ演算関数一覧 . . . . . . . . . . . 表 11.1 Fortran の手続名の加工方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 11.2 翻訳時オプション -mldefault の指定と外部名の加工方法 . . . . . . . . . . . . . . . . . . . . . . 表 11.3 CHANGEENTRY 文に指定された手続の外部名の加工方法 . . . . . . . . . . . . . . . . . . . . 表 11.4 $pragma 指定子に指定された手続の外部名の加工方法 . . . . . . . . . . . . . . . . . . . . . . . . 表 11.5 Fortran と C の対応するデータ属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 表 12.1 自動並列化用の最適化指示子一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 146 148 152 197 205 208 222 223 224 231 258 278 286 287 287 287 298 316 図目次 図 12.1 並列処理のイメージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.2 並列処理による経過時間の短縮 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.3 ループスライスのイメージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.4 配列操作の文の自動並列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.5 ループスライスができない DO ループの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.6 多重 DO ループでのループ交換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.7 DO ループの分割 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.8 DO ループの融合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.9 リダクションによる自動ループスライス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.10 回転数が小さく、演算数が少ない DO ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.11 サブルーチンの引用を含む DO ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.12 飛出しのある DO ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.13 複雑な構造の DO ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.14 マルチスレッド範囲の拡大の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.15 マルチスレッド範囲の拡大の例(多重ループ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.16 ARRAY_PRIVATE 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.17 NOARRAY_PRIVATE 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.18 INDEPENDENT 指定のない DO ループの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.19 INDEPENDENT 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.20 NOALIAS 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.21 NORECURRENCE 指定のない DO ループの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.22 NORECURRENCE 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.23 SERIAL 指定のないプログラムの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.24 SERIAL 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.25 PARALLEL 指定のないプログラムの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.26 PARALLEL 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.27 PSTRONG 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.28 PWEAK 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.29 REDUCTION 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.30 NOREDUCTION 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.31 TEMP 指定のないプログラムの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.32 TEMP 指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.33 変数名 op 整定数指示子の使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.34 並列処理が入れ子になった場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.35 リダクションによる精度差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.36 最適化制御行の誤った使い方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 12.37 並列処理中の入出力文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 301 307 307 308 308 309 310 311 311 312 312 313 314 314 317 317 318 319 319 320 320 321 322 323 324 325 325 326 327 327 328 329 330 331 332 333 第 1 章 Fortran システムの概要 この章では、本システムを利用して Fortran 原始プログラムを処理する場合の概要について説明し ます。 1.1 Fortran システムの構成 本システムは、Solaris のもとで動作する言語処理プログラムの一つです。 本システムは、以下の四つのプログラムから構成されます。 - Fortran ドライバ ドライバは、frt、f90 および f95(以降、翻訳コマンド frt は f90 および f95 を含みます)とい うコマンド名で提供されます。ドライバは、Fortran コンパイラ、プリプロセッサ、アセンブ ラおよびリンカを呼び出すプログラムです。 - Fortran コンパイラ Fortran コンパイラは、Fortran ドライバから呼び出されます。Fortran コンパイラは、Fortran 言 語で記述された原始プログラムを翻訳して、オブジェクトプログラムを生成するプログラム です。 - Fortran ライブラリ Fortran ライブラリは、Fortran オブジェクトプログラムから呼び出されます。Fortran ライブラ リは、Fortran プログラムを実行するためのプログラムです。ライブラリの種類として、スター トアップルーチン、Fortran の入出力文、組込み手続およびサービスルーチンを提供していま す。また、Fortran プログラムの実行結果をプリンタに印刷するために、印刷制御用コマンド として fot を提供しています。fot については、 “付録 B 印刷制御用コマンド”を参照してく ださい。 - オンラインマニュアル man コマンドを使用することで本システムの使用方法を検索することができます。 オンラインマニュアルは、本システム向けに frt(1)、fot(1)、intrinsic(3F) および service(3F) を 提供しています。 1.2 Fortran システムの使用方法 ここでは、本システムとして提供されるプログラムの簡単な使用方法について説明します。 1.2.1 準備 本システムを使用するには、以下の環境変数を正しく設定する必要があります。ここで、<dir> は FSUNf90cp パッケージのインストール先のディレクトリです。 Fortran 使用手引書ー Page 20 環境変数名 PATH 設定値 /<dir>/FSUNf90/bin LD_LIBRARY_PATH /<dir>/FSUNf90/lib LD_LIBRARY_PATH_64 /<dir>/FSUNf90/lib/sparcv9 MANPATH /<dir>/FSUNf90/man 設定例: % % % % setenv setenv setenv setenv PATH /opt/FSUNf90/bin:$PATH LD_LIBRARY_PATH /opt/FSUNf90/lib:$LD_LIBRARY_PATH LD_LIBRARY_PATH_64 /opt/FSUNf90/lib/sparcv9:$LD_LIBRARY_PATH_64 MANPATH /opt/FSUNf90/man:$MANPATH 1.2.2 翻訳と結合編集 利用者は、frt コマンドにより翻訳および結合編集を行い、実行可能ファイルを作成することがで きます。 以下は、prog.f95 ファイルに格納された Fortran プログラムから実行可能ファイルを作成する例で す。 % frt prog.f95 これにより、実行可能ファイル a.out が作成されます。 翻訳時オプション -c を指定することにより、結合編集を行わず、オブジェクトファイルの作成ま でを行うこともできます。 % frt -c prog.f95 1.2.3 ファイル名 frt コマンドには、Fortran ソースファイル、アセンブラファイルおよびオブジェクトファイルを指 定することができます。ファイル名についての詳細は、 “2.1.2 翻訳コマンドの入力ファイル”を 参照してください。 Fortran ソースファイルは、サフィックスが .f95、.f90、.f、.for、.F95、.F90、.F または .FOR であ るファイルです。サフィックスが .f95 または .f90 であるファイルは、自由形式の Fortran 原始プロ グラムと解釈されます。サフィックスが .F95 または .F90 であるファイルは、自由形式の前処理指 令 Fortran 原始プログラムと解釈されます。サフィックスが .f または .for であるファイルは、固定 形式の Fortran 原始プログラムと解釈されます。サフィックスが .F または .FOR であるファイルは、 固定形式の前処理指令 Fortran 原始プログラムと解釈されます。ソース形式の解釈は、翻訳時オプ ション -Free または -Fixed で変更することができます。 アセンブラファイルは、サフィックスが .s のファイルです。 オブジェクトファイルは、サフィックスが .o のファイルです。 Fortran ソースファイルにモジュールが含まれ、モジュール引用が他のファイルにある場合は、翻 訳時オプション -Am を指定して翻訳する必要があります。 % frt -c -Am module_file.f95 モジュールについての詳細は、“第 10 章 モジュールおよびモジュール引用の注意事項”を参照 してください。 Fortran 使用手引書ー Page 21 1.2.4 代表的な翻訳時オプション 本システムには、多くの翻訳時オプションが存在します。翻訳時オプションの詳細については、 “2.2 翻訳時オプション”を参照してください。ここでは、重要な翻訳時オプションの概要を説 明します。 -c オブジェクトファイルの作成までを行います。結合編集を行わず、実行可能ファイ ルは作成されません。 -fw w レベル(軽度のエラー)および s レベル(重度のエラー)の診断メッセージだけ を出力します。 -fs s レベル(重度のエラー)の診断メッセージだけを出力します。 -fmsg_num msg_num にメッセージ番号を指定することにより、特定の診断メッセージの出力を 抑止します。 -Nmaxserious=maxnum 翻訳時に検出された重度のエラーメッセージの数が maxnum に達した場合に翻訳を 中止することを指定します。 -o exe_file 生成される実行可能ファイル名またはオブジェクトファイル名を変更します。 -Am モジュールを翻訳し、サフィックス .mod のモジュール情報ファイルを生成します。 または USE 文でサフィックス .mod のモジュール情報ファイルを引用します。 -Fixed ソースプログラムが固定形式で記述されていることを指示します。 -Free ソースプログラムが自由形式で記述されていることを指示します。 -Haesux 翻訳時および実行時に引数の整合性、添字式、部分列式の値、未定義な変数の参照 または配列式の形状適合の検査を行うことを指示します。 -M directory モジュール情報を格納するディレクトリを指定します。 -I directory INCLUDE ファイルおよびモジュール情報ファイルを検索するディレクトリを指定 します。 -O[0,1,2,3,4,5] 最適化のレベルを指定します。デフォルトは、-O2 です。 -Kfast 高速化のための最適化オプションを誘導します。 -Kfast_GP SPARC64 GP を搭載したシステム向けの最適化を指示します。 -KV9 64 ビットアドレスモードの実行可能プログラムを作成します。 -X6 言語仕様で解釈の異なる部分を FORTRAN66 仕様と解釈します。 -X7 言語仕様で解釈の異なる部分を FORTRAN77 仕様と解釈します。 -X9 言語仕様で解釈の異なる部分を Fortran 95 仕様と解釈します。 1.2.5 実行 利用者は、frt コマンドを使用して作成した実行可能プログラムを実行コマンドとして起動します。 以下は、実行可能ファイル a.out を実行する例です。 % a.out 利用者は、この実行コマンドの起動時に Fortran ライブラリへ実行処理に関する指示を行うことが できます。この使用方法については、“第 3 章 Fortran プログラムの実行”を参照してください。 Fortran 使用手引書ー Page 22 また、frt コマンドのオンラインマニュアルの中でもこの使用方法が説明されていますので、man コマンドを利用してください。 Fortran プログラムの実行結果をプリンタに印刷する場合は、印刷制御用コマンドの fot コマンド を使用します。fot コマンドの使用方法については、“付録 B 印刷制御用コマンド”を参照して ください。また、fot コマンドのオンラインマニュアルの中にもこの使用方法が説明されています ので、man コマンドを利用してください。 1.2.6 デバッグ Fortran 原始プログラムのデバッグの方法として、本システムで提供されるバッチデバッグ機能と プログラミング支援ツールおよびデバッガで提供されるソースレベルのデバッグの二つがありま す。 バッチデバッグ機能については、“8.2 デバッグのための機能”を参照してください。 Parallelnavi 環境でソースレベルのデバッグを行う場合は、プログラミング支援ツールを使用して ください。また、fdb コマンドでソースレベルのデバッグを行うこともできます。fdb コマンドは、 Parallelnavi 環境でも Parallelnavi でない環境でも使用することができます。 プログラミング支援ツールについては、 “プログラミング支援ツール使用手引書”を参照してくだ さい。 fdb コマンドについては、“8.3 fdb コマンド”にラインモードでのデバッグ方法が説明されてい ますので参照してください。 1.2.7 チューニング Fortran プログラムのチューニングの方法として、プログラミング支援ツールおよび プロファイラで提供される実行時間のサンプリング機能があります。Parallelnavi 環境では、プロ グ ラ ミ ン グ 支 援 ツ ー ル で 提 供 さ れ る 実 行 時 間 の サ ン プ リ ン グ 機 能 を 使 用 し て く だ さ い。 Parallelnavi でない環境では、プロファイラで提供される実行時間のサンプリング機能を使用して ください。 プログラミング支援ツールについては、 “プログラミング支援ツール使用手引書”を参照してくだ さい。プロファイラについては、“プロファイラ使用手引書”を参照してください。 第 2 章 Fortran プログラムの翻訳・結合 この章では、Fortran 言語で記述されたプログラムを翻訳および結合するための手続きについて説 明します。 2.1 翻訳コマンド 利用者は、翻訳コマンド frt を使用することにより、原始プログラムの翻訳から実行可能プログラ ムの作成までを行うことができます。 frt コマンドは、frt のコマンド行に指定された各種のオペランドを解析し、必要に応じて Fortran コンパイラ、cpp コマンド(プリプロセッサ)、as コマンド(アセンブラ)および ld コマンド(リ ンカ)を呼び出します。 2.1.1 翻訳コマンドの形式 利用者は、frt コマンドのオペランドとして、Fortran コンパイラ、as コマンドおよび ld コマンド に対するオプションの並びとファイル名の並びを指定することができます。 ここで、Fortran コンパイラに対するオプションを翻訳時オプションといいます。翻訳時オプショ ンの指定については、“2.2 翻訳時オプション”を参照してください。 as コマンドおよび ld コマンドに対するオプションについては、man コマンドを使用して参照する ことができます。 以下に、frt コマンドの形式を示します。 コマンド名 frt f90 f95 オペランド [ □オプションの並び ] □ファイル名の並び □:一個以上の空白が必要なことを意味します。 備考 1.frt、f90 および f95 のコマンド名は等価です。 備考 2. “オプションの並び”と“ファイル名の並び”の指定順序に制約はありません。たとえば、 “ファイル名の並び”の後に“オプションの並び”を指定してもかまいませんし、混在し ていてもかまいません。 備考 3. “ファイル名の並び”には、一つ以上のファイル名を指定しなければなりません。 備考 4. “ファイル名の並び”については、 “2.1.2 翻訳コマンドの入力ファイル”を参照してくだ さい。 Fortran 使用手引書ー Page 24 2.1.2 翻訳コマンドの入力ファイル 以下に、frt コマンドに入力ファイルとして指定できるファイルを示します。 ファイル種別 ファイルのサフィックス 渡し先 Fortran 原始プログラム .f、.for、.f90 および .f95 Fortran コンパイラ 前処理指令 Fortran 原始プログラム(注) .F、.FOR、.F90 および .F95 プリプロセッサ アセンブラ原始プログラム .s アセンブラ オブジェクトプログラム .o リンカ その他 上記以外 リンカ 注) 前処理指令 Fortran 原始プログラムとは、C 言語の # 行を含んだ Fortran 原始プログラムの ことです。 2.2 翻訳時オプション 翻訳時オプションは、frt コマンドのオペランド、翻訳時プロフィルファイル、環境変数 FORT90C および翻訳指示行に指定することができます。環境変数 FORT90C については、 “2.3 翻訳コマン ドの環境変数”を、翻訳時プロフィルファイルについては、“2.4 翻訳時プロフィルファイル” を、翻訳指示行については、 “2.5 翻訳指示行”をそれぞれ参照してください。 Fortran 原始プログラムおよび前処理指令 Fortran 原始プログラムのファイルサフィックスは、翻訳 時オプションに影響します。以下に、ファイルサフィックスと翻訳時オプションの関係を示しま す。 ファイルサフィックス .f、.for、.F および .FOR オプション -X7 -Fixed .f90、.f95、.F90 および .F95 -X9 -Free 以下に翻訳時オプションの形式と意味を説明します。 オプションの並び [ -c ] [-dc] [ -f msg_lvl ] [ -g ] [ -lname ] [ -ml=target ] [ -mldefault=target ] [ -o exe_file ] [ -static-flib ] [ -nostatic-flib ] [ -v msg_arg ] [ -w ] [ -x inl_arg ] [ -A obj_arg ] [ -C typ_arg ] [ -D name[=tokens] ] [ -E msg_arg ] [ -Fixed ] [ -Free ] [ -G ] [ -H dbg_arg ] [ -I directory ] [ -K opt_arg ] [ -L directory ] [ -M directory ] [ -N src_arg ] [ -O opt_lvl ] [ -P ] [ -Q lst_arg ] [ -S ] [ -SSL2 ] [ -SSL2BLAMP ] [ -U name ] [ -V ] [ -Wtool,arg1[,arg2] ... ] [ -X lan_lvl ] [ -# ] [ -### ] -c リンカの呼出しを抑止する機能です。-c オプションが有効な場合、オブジェクトプログラム(サ フィックス ".o" のファイル)を作成します。実行可能プログラムは作成しません。 本オプションは、-P および -S オプションと同時には指定できません。 -d c c:{n|y} -d オプションは、リンクの方法を指定します。本オプションの省略値は、-dy です。このオプショ ンと引数はリンカに渡されます。 本オプションは、-G オプションと同時には指定できません。 Fortran 使用手引書ー Page 25 n -dn オプションが有効な場合、リンカにスタティックリンクを指定します。本オプションは、 -KV9、-Kparallel、-KOMP、-Khardbarrier および -Klargepage オプションと同時に指定することは できません。スタティックなシステムライブラリが提供されていないため、リンク時にエラーが 発生します。なお、-static-flib オプションを指定することにより、Fortran ライブラリだけをスタ ティックにリンクすることができます。 y -dy オプションが有効な場合、リンカにダイナミックリンクを指定します。 -f msg_lvl msg_lvl : { i | w | s | msg_num } -f オプションは、翻訳時に Fortran コンパイラが出力する診断メッセージに対して、エラーレベル により制御する機能です。本オプションの省略値は、-fi です。 診断メッセージにプレフィックスとして jwdxxxxi-y を付加します。ここで、xxxx はメッセージ番 号であり、y はエラーレベルです。エラーレベルとして、i(インフォメーション)、w(軽度のエ ラー)と s(重度のエラー)があります。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 -fmsg_num オプションを有効にすることにより、特定のエラーメッセージの出力を抑止すること ができます。msg_num は、コンマを区切り子として、複数個指定することもできますし、他のサ ブオプションと組み合わせて指定することもできます。 例:翻訳時オプション -f % frt -fw,1040,2005 a.f90 翻訳時に検出される w レベル(軽度のエラー)以上の診断メッセージの出力を指示し、加え て jwd1040i-w および jwd2005i-w のメッセージを抑止します。 i -fi オプションが有効な場合、翻訳時に検出されるすべての診断メッセージを出力します。 w -fw オプションが有効な場合、翻訳時に検出される w レベル(軽度のエラー)以上の診断メッセー ジを出力します。 s -fs オプションが有効な場合、翻訳時に検出される s レベル(重度のエラー)以上の診断メッセー ジを出力します。 msg_num -fmsg_num オプションが有効な場合、msg_num に対応する翻訳時の診断メッセージの出力を抑止 します。msg_num には、エラーレベルが i または w の診断メッセージのメッセージ番号が指定で きます。 -g fdb デバッガ等で使用されるデバッグ情報を出力する機能です。 -g オプションが有効な場合、オブジェクトプログラム中にデバッグ用の情報を出力します。この 機能を使用することで、利用者はソースレベルによるデバッグを行うことができます。 -g オプションと -O オプションを指定した場合、-O オプションは無効となります。 fdb デバッガの仕様については、 “8.3 fdb コマンド”または man マニュアルを参照してください。 Fortran 使用手引書ー Page 26 -lname -l オプションは、ライブラリ libname.so または libname.a を検索します。コマンド行内でのこのオ プションの位置は重要です。それは、ライブラリが、コマンド行に他のライブラリやオブジェク トファイルが現れる順に検索されるためです。このオプションと引数はリンカに渡されます。 -ml=target target : { cdecl | frt } -ml オプションは、外部手続名の加工方法の変更を行います。target には、cdecl または frt が指定 できます。本機能については、“11.2 外部名の加工”を参照してください。 -mldefault=target target : { cdecl | frt } -mldefault オプションは、デフォルトの外部手続名の加工方法の変更を行います。target には、cdecl または frt が指定できます。本機能については、“11.2 外部名の加工”を参照してください。 -o exe_file -oオプションの引数として指定されたファイル名exe_fileで実行可能プログラムを作成する機能で す。 -o オプションと -c オプションの両方が有効な場合、-o オプションの引数として指定されたファイ ル名でオブジェクトプログラムを作成します。 -o オプションと -S オプションの両方が有効な場合、-o オプションの引数として指定されたファイ ル名でアセンブラ原始プログラムを作成します。 { -static-flib | -nostatic-flib } Fortran ライブラリを静的に結合した実行可能プログラムを作成するかどうかを指示します。デ フォルトは、-nostatic-flib です。 -static-flib Fortran ライブラリを静的に結合した実行可能プログラムを作成することを指示します。本オプ ションは、リンク時に指定する必要があります。なお、Fortran ライブラリを静的に結合するので、 ロードモジュールサイズが大きくなります。 本オプションは、-dn および -G オプションと同時には指定できません。 -nostatic-flib Fortran ライブラリを動的に結合した実行可能プログラムを作成することを指示します。本オプ ションは、リンク時に指定する必要があります。 -v msg_arg msg_arg : { 90o | 95d | 95e | 95o | 95s } -v オプションの引数は、コンマ(,)を区切り子として組み合わせて指定することができます。 90o -v90o オプションが有効な場合、原始プログラム中の Fortran 90 規格の廃止予定事項の検査を行い ます。 95d -v95d オプションが有効な場合、 原始プログラム中の Fortran 95 規格の廃止事項の検査を行います。 95e -v95e オプションが有効な場合、原始プログラム中の Fortran 90 規格から Fortran 95 規格に対して 追加された事項の検査を行います。 95o -v95o オプションが有効な場合、原始プログラム中の Fortran 95 規格の廃止予定事項の検査を行い ます。 Fortran 使用手引書ー Page 27 95s -v95s オプションが有効な場合、原始プログラムが Fortran 95 規格に準拠しているか検査を行いま す。 -w -w オプションが有効な場合、固定形式ソースの長さを 255 に拡張して翻訳を行います。 -x inl_arg inl_arg : { - | pgm_nm [ , pgm_nm ] ... | stm_no | dat_szK | dir=dir_nm[ , dir=dir_nm ] ... | 0 } -x オプションは、 -K オプションと同じくオブジェクトプログラムの実行性能向上を追求するため、 利用者定義の外部手続、内部手続、およびモジュール手続のインライン展開の最適化を指示する 機能です。最適化機能は、-x オプションの引数として指定します。-x オプションは、-O0 オプショ ンが有効な場合は、無効となります。-x オプションの引数はコンマ(,)を区切り子とし、組み合 わせて指定することができます。デフォルトは、-x0 です。 この最適化機能は、多くの翻訳時間と翻訳作業領域を必要とします。また、最適化が有効になれ ばなるほどオブジェクトプログラムの大きさが増大します。しかし、実行時間の大幅な短縮が期待 できますので、オブジェクトプログラムの実行性能向上を追求したいときに利用してください。 また、利用者は -Ei オプションを有効にすることにより、この最適化が行われたかどうかを翻訳 時の診断メッセージで知ることができます。 -x- オプションが有効な場合、コンパイラが処理対象の利用者定義の手続を自動的に決定し、その 引用箇所にインライン展開する最適化を行います。 pgm_nm [ , pgm_nm ] ... -xpgm_nm[ , pgm_nm ]... オプションが有効な場合、引数 pgm_nm として指定された利用者定義の手 続だけに閉じてインライン展開の最適化を行います。引数 pgm_nm は利用者定義の手続名であり、 引数はコンマ(,)を区切り子とし、複数指定することができます。 一般的に -x- オプションが有効な場合、すべての利用者定義の手続がインライン展開の対象となる ため、多くの翻訳処理時間や翻訳作業領域を必要とします。これを最小限に抑えるには、呼出し 頻度の高い手続名を選び、それを -x オプションの引数として指定することが必要です。 モジュール手続名を指定する場合は、モジュール手続名の前にモジュール名と区切り文字 "." を付 けなければなりません。 内部手続名を指定する場合は、内部手続名の前に親の手続名と区切り文字 "." を付けなければなり ません。 モジュール手続内の内部手続名については、モジュール名の指定も必要です。 例:翻訳時オプション -xpgm_nm(内部手続名の指定) % frt -xsub.insub a.f90 stm_no -xstm_no オプションが有効な場合、引数 stm_no として指定された実行文数以下の利用者定義の手 続だけに閉じてインライン展開の最適化を行います。引数 stm_no は実行文の数です。 引数として指定できる値は 1 から 2147483647 の範囲で指定できます。 dat_szK -x オプションの引数として指定する dat_sz は、ローカルな配列の大きさです。引数として指定で きる値は 1 から 2147483 までの範囲であり、この引数の値に続けて英字 K(単位:K バイト)を 必ず指定してください。 Fortran 使用手引書ー Page 28 -xdat_szK オプションが有効な場合、ローカルな配列の合計の大きさが、引数 dat_sz 以下の大きさ の利用者定義の手続だけに閉じてインライン展開の最適化を行います。 利用者定義の手続のインライン展開の最適化を行うと、利用者定義の手続がその引用箇所にイン ライン展開されるとともに関係するデータも一緒に組み込みます。組み込むデータの中に巨大な ローカル配列があるときにオブジェクトプログラムの大きさが膨大になる場合があります。これ を回避するときにこの機能を利用してください。 dir=dir_nm [ , dir=dir_nm ] ... -xdir=dir_nm が指定された場合、利用者定義の手続を呼び出しているプログラム単位と同じ入力原 始プログラムのファイルに加え、引数 dir_nm として指定されたディレクトリの直下のファイル内 の利用者定義の手続を対象にインライン展開の最適化を行います。ただし、ディレクトリ dir_nm 下のファイルでインライン展開の対象となるのは、サフィックスが .f、.for、.f90 および .f95 のファ イルだけです。 引数 dir_nm はディレクトリ名であり、サブオプション(dir=dir_nm)はコンマ(,)を区切り子と し、複数指定することができます。複数指定した場合、すべてのディレクトリ下のファイルをイ ンライン展開の対象とします。 -xdir=dir_nm オプションは、他のサブオプション(-、pgm_nm、stm_no、dat_szK)と組み合わせて 指定することも可能です。その場合、指定されたディレクトリ下のすべてのファイルに対して、 他のサブオプションを有効にします。 -xdir=dir_nm オプションを指定した場合、より多くの翻訳処理時間や翻訳作業領域を必要としま す。これを最小限に抑えるために、指定するディレクトリ配下には、呼出し頻度の高い手続が存 在するファイル群だけを置くような使用方法を推奨します。 dir_nm には、ワイルドカードを使うことはできません。 0 インライン展開する最適化を行いません。 -A obj_arg obj_arg : { A | E | { R | r } | T | U | d | i | m | p | q | w | y | z | { 0 | 1 | 2 | n } } -A オプションの引数として A、E、R、r、T、U、d、i、m、p、q、w、y、z、0、1、2 または n が 指定できます。また、R、r、0、1、2、n の引数を除き、引数を組み合わせて指定することができます。 A 共通ブロックに属する変数および構造型の要素に対する記憶域への割付けで、型に応じた境界調 整を抑止する機能です。 -AA オプションが有効な場合、共通ブロックに属する変数および構造型の要素に対する記憶域へ の割付け処理において、型に応じた正しい境界調整を行いません。 データの境界調整については、“5.2 データの正しい境界”を参照してください。 E 文字列の中の特殊文字列を、特殊文字列として扱わないことを指示します。 R 定数を書換えできないオブジェクト領域に割り付けることを指示します。定数域を破壊して誤動 作することを防止し、その領域を破壊した時点で実行を中止します。 r 定数を書換えできないオブジェクト領域に割り付けることを指示しません。デフォルトは -Ar で す。 Fortran 使用手引書ー Page 29 T 有効域内におけるそれぞれの英字と型および型パラメタとの対応付けを空とします。IMPLICIT 文 がある場合には、IMPLICIT 文の対応付けを有効とします。 U 原始プログラム内の英小文字と英大文字を別の文字として扱うことを指示します。 以下の注意が必要です。 - 規格合致プログラムとはみなされません。JIS Fortran では、英小文字は英大文字と等価な文字 です。 - サービスサブルーチンおよびサービス関数を引用する場合、英小文字でなければなりません。 - 組込み手続の名前は、すべての宣言および参照において文字のつづり(英小文字と英大文字) を同じにしてください。同じでない場合は、動作を保証しません。 - IMPLICIT 文において、英字範囲並びに指定された英小文字は、英大文字と等価です。 - シンボリックデバッガを用いてデバッグを行う場合、利用者が定義した手続名は、英小文字 と英大文字は非等価になり、変数名は、英小文字と英大文字は等価になります。 d 実数型、複素数型の定数、変数および関数(組込み関数、文関数、外部関数、モジュール関数、 内部関数)を一段高い精度に拡張する機能です。 -Ad オプションが有効な場合、実数型の定数、変数および関数(組込み関数、文関数、外部関数、 モジュール関数、内部関数)を倍精度実数型に、複素数型の定数、変数および関数(組込み関数、 文関数、外部関数、モジュール関数、内部関数)を倍精度複素数型にそれぞれ精度拡張します。 本機能については、“5.3.1 精度の拡張”を参照してください。 本オプションは、-CcR4R8、-CcdRR8、-Ccd4d8、-Cca4a8、-CcdDR16 および -CcR8R16 オプション と同時には指定できません。 i 4 バイトの整数型のデータを 2 バイトの整数型に変更する機能です。 -Ai オプションが有効な場合、 以下に示す 4 バイトの整数型のデータを 2 バイトの整数型に変更します。 - - - - 絶対値が 0 から 32767 までの整定数 I、J、K、L、M、N で始まる名前の暗黙の型 INTEGER の型指定における種別指定の省略時の型 組込み関数(実引数が 4 バイトの整数型を除く INT、NINT、IDNINT、ICHAR、MAX1、MIN1、 LEN および INDEX)の結果の型 本オプションは、-CcI4I8、-CcdII8、-Ccd4d8 および -Cca4a8 オプションと同時には指定できません。 m モジュールを翻訳するための機能です。本機能については、 “第 10 章 モジュールおよびモジュー ル引用の注意事項”を参照してください。 p モジュールの暗黙の参照許可属性を PRIVATE 属性にします。これは、モジュールに参照対象並 びのない PRIVATE 文を記述するのと同じ効果をもちます。 q 倍精度実数型、倍精度複素数型の定数、変数および関数(組込み関数、文関数、外部関数、モ ジュール関数、内部関数)を一段高い精度に拡張する機能です。 Fortran 使用手引書ー Page 30 -Aq オプションが有効な場合、倍精度実数型の定数、変数および関数(組込み関数、文関数、外 部関数、モジュール関数、内部関数)を 4 倍精度実数型に、倍精度複素数型の定数、変数および 関数(組込み関数、文関数、外部関数、モジュール関数、内部関数)を 4 倍精度複素数型にそれ ぞれ精度拡張します。 本機能については、“5.3.1 精度の拡張”を参照してください。 本オプションは、-CcR4R8、-CcdRR8、-Ccd4d8、-Cca4a8、-CcdDR16 および -CcR8R16 オプション と同時には指定できません。 w 関数名 IACHAR、ACHAR、IBITS および ISHFTC を組込み手続とする機能です。 -Aw オプションが有効な場合、これらの関数名は、-X6、-Xf6、-X7 または -Xf7 オプションが有効 でも組込み手続となります。 y 代入文の右辺の符号付き実定数を左辺の変数の型に拡張して取り出す機能です。 -Ay オプションが有効な場合 real(8) a a=1.23456789012345 は、以下のプログラムとして解釈されます。 real(8) a a=1.23456789012345d0 z 外部手続呼出しの実引数に現れた文字定数の末尾に \0(ヌル文字)を追加する機能です。 -Az オプションを有効にすることにより、対応する引数を C 言語の strlen 関数の引数にすることが できます。 この際、引数として渡される文字型の長さには \0(ヌル文字)を含みません。 以下のプログラムを -Az オプションを有効にして翻訳しても、実行結果は 1234 4 となります。 call sub('1234') end subroutine sub(arg) character(len=*) arg print *,arg , len(arg) end {0|1|2|n} トレースバックマップに対する情報量を選択する機能です。 Fortran プログラムの実行時にエラーが発生した場合にトレースバックマップ(逆追跡情報)を標 準エラー出力ファイルに出力します。 このトレースバックマップに対する情報を、その情報の種類の指定に応じてオブジェクトプログ ラム中に出力します。利用者は、トレースバックマップの情報の種類を -A オプションの引数とし て指定することができます。引数として指定できるのは、0、1、2 または n のうちどれか一つで す。本オプションの省略値は、-A2 です。 トレースバックマップについては、 “4.2.2 トレースバックマップ”を参照してください。 Fortran 使用手引書ー Page 31 0 -A0 オプションが有効な場合、トレースバックマップ上にエラーが発生した行位置を表示しない オブジェクトプログラムを出力します。 1 -A1 オプションが有効な場合、トレースバックマップ上にエラーが発生したユーザ手続の呼出し 箇所(行位置)を表示するオブジェクトプログラムを出力します。 2 -A2 オプションが有効な場合、-A1 オプション指定に加えてエラーが発生した行位置を表示するオ ブジェクトプログラムを出力します。 n -An オプション指定は、-A0 オプション指定と同じ意味です。 -C typ_arg typ_arg : { l | pp | cdII8 | cI4I8 | cdLL8 | cL4L8 | cdRR8 | cR4R8 | cd4d8 | ca4a8 | cdDR16 | cR8R16 } -C オプションの引数として l、pp、cdII8、cI4I8、cdLL8、cL4L8、cdRR8、cR4R8、cd4d8、ca4a8、 cdDR16 または cR8R16 が指定できます。 0 ≦ l ≦ 15 l 浮動小数点数の計算で生じる計算誤差(丸め誤差)が、利用者プログラムの計算結果にどの程度 の影響を及ぼしているかを検証する機能です。 -Cl オプション(l は 0 から 15 までの範囲です)が有効な場合、実数型、倍精度実数型、4 倍精度 実数型、複素数型、倍精度複素数型および 4 倍精度複素数型のデータが代入文で設定されるたび に、そのデータの仮数部の下位 l ビットをゼロにします。複素数型、倍精度複素数型および 4 倍 精度複素数型のデータの場合は、それぞれ実部と虚部の下位 l ビットをゼロにします。 本機能については、“5.3.2 精度縮小と誤差の影響分析”を参照してください。 pp C のプリプロセッサを呼び出す機能です。前処理指令 Fortran 原始プログラム(C 言語の # 行を含 んだ原始プログラム)を翻訳する場合に指定します。 cdII8 基本整数型を 8 バイトの整数型とする機能です。変数、定数および関数に適用します。 本オプションが有効な場合、組込み手続の個別名 INT、IFIX、IDINT、IQINT、NINT、IDNINT お よび IQNINT は、実引数に現れることはできません。 本オプションは、-Ai オプションと同時には、指定できません。 integer integer(4) a=2 b=2_4 :: a :: b 上記は、以下のプログラムとして解釈します。 integer(8) integer(4) a=2_8 b=2_4 :: a :: b Fortran 使用手引書ー Page 32 cI4I8 すべての 4 バイトの整数型を 8 バイトの整数型とする機能です。変数、定数および関数に適用し ます。 本オプションが有効な場合、組込み手続の個別名 INT、IFIX、IDINT、IQINT、NINT、IDNINT お よび IQNINT は、実引数に現れることはできません。 本オプションは、-Ai オプションと同時には、指定できません。 integer integer(4) a=2 b=2_4 :: a :: b 上記は、以下のプログラムとして解釈します。 integer(8) integer(8) a=2_8 b=2_8 :: a :: b cdLL8 基本論理型を 8 バイトの論理型とする機能です。変数、定数および関数に適用します。 本オプションが有効な場合、組込み手続の個別名 BTEST は、実引数に現れることはできません。 logical logical(4) a=.true. b=.true._4 :: a :: b 上記は、以下のプログラムとして解釈します。 logical(8) logical(4) a=.true._8 b=.true._4 :: a :: b cL4L8 すべての 4 バイトの論理型を 8 バイトの論理型とする機能です。変数、定数および関数に適用し ます。 本オプションが有効な場合、組込み手続の個別名 BTEST は、実引数に現れることはできません。 logical logical(4) a=.true. b=.true._4 :: a :: b 上記は、以下のプログラムとして解釈します。 logical(8) logical(8) a=.true._8 b=.true._8 :: a :: b Fortran 使用手引書ー Page 33 cdRR8 基本実数型および基本複素数型を倍精度実数型および倍精度複素数型とする機能です。変数、定 数および関数に適用します。 本オプションが有効な場合、組込み手続の個別名 REAL、FLOAT、SNGL および SNGLQ は、実 引数に現れることはできません。 本オプションは、-Ad および -Aq オプションと同時には、指定できません。 real :: real(4) :: complex :: complex(4) :: a=2.0 b=2.0_4 c=(2.0,2.0) d=(2.0_4,2.0_4) a b c d 上記は、以下のプログラムとして解釈します。 real(8) :: real(4) :: complex(8) :: complex(4) :: a=2.0_8 b=2.0_4 c=(2.0_8,2.0_8) d=(2.0_4,2.0_4) a b c d cR4R8 すべての実数型および複素数型を倍精度実数型および倍精度複素数型とする機能です。変数、定 数および関数に適用します。 本オプションが有効な場合、組込み手続の個別名 REAL、FLOAT、SNGL および SNGLQ は、実 引数に現れることはできません。 本オプションは、-Ad オプションが有効な場合と等価です。 本オプションは、-Ad および -Aq オプションと同時には、指定できません。 real :: real(4) :: complex :: complex(4) :: a=2.0 b=2.0_4 c=(2.0,2.0) d=(2.0_4,2.0_4) a b c d Fortran 使用手引書ー Page 34 上記は、以下のプログラムとして解釈します。 real(8) :: real(8) :: complex(8) :: complex(8) :: a=2.0_8 b=2.0_8 c=(2.0_8,2.0_8) d=(2.0_8,2.0_8) a b c d cd4d8 本オプションは、-CcdII8、-CcdLL8 および -CcdRR8 オプションすべてが有効な場合と等価です。 本オプションは、-Ai、-Ad および -Aq オプションと同時には、指定できません。 integer :: integer(4) :: logical :: logical(4) :: real :: real(4) :: complex :: complex(4) :: a=2 b=2_4 c=.true. d=.true._4 e=2.0 f=2.0_4 g=(2.0,2.0) h=(2.0_4,2.0_4) a b c d e f g h 上記は、以下のプログラムとして解釈します。 integer(8) :: integer(4) :: logical(8) :: logical(4) :: real(8) :: real(4) :: complex(8) :: complex(4) :: a=2_8 b=2_4 c=.true._8 d=.true._4 e=2.0_8 f=2.0_4 g=(2.0_8,2.0_8) h=(2.0_4,2.0_4) a b c d e f g h Fortran 使用手引書ー Page 35 ca4a8 本オプションは -CcI4I8、-CcL4L8 および -CcR4R8 オプションすべてが有効な場合と等価です。 本オプションは、-Ai、-Ad および -Aq オプションと同時には、指定できません。 integer :: integer(4) :: logical :: logical(4) :: real :: real(4) :: complex :: complex(4) :: a=2 b=2_4 c=.true. d=.true._4 e=2.0 f=2.0_4 g=(2.0,2.0) h=(2.0_4,2.0_4) a b c d e f g h 上記は、以下のプログラムとして解釈します。 integer(8) :: integer(8) :: logical(8) :: logical(8) :: real(8) :: real(8) :: complex(8) :: complex(8) :: a=2_8 b=2_8 c=.true._8 d=.true._8 e=2.0_8 f=2.0_8 g=(2.0_8,2.0_8) h=(2.0_8,2.0_8) a b c d e f g h cdDR16 基本倍精度実数型を 4 倍精度実数型とする機能です。変数、定数および関数に適用します。 本オプションが有効な場合、組込み手続の個別名 DFLOAT、DBLE、DBLEQ、DREAL および DPROD は、実引数に現れることはできません。 本オプションは、-Ad および -Aq オプションと同時には、指定できません。 double precision :: a real(8) :: b a=2.0d0 b=2.0_8 Fortran 使用手引書ー Page 36 上記は、以下のプログラムとして解釈します。 real(16) real(8) a=2.0_16 b=2.0_8 :: a :: b cR8R16 すべての倍精度実数型および倍精度複素数型を 4 倍精度実数型および 4 倍精度複素数型とする機 能です。変数、定数および関数に適用します。 本オプションが有効な場合、組込み手続の個別名 DFLOAT、DBLE、DBLEQ、DREAL および DPROD は、実引数に現れることはできません。 本オプションは、-Aq オプションが有効な場合と等価です。 本オプションは、-Ad および -Aq オプションと同時には、指定できません。 double precision :: a real(8) :: b complex(8) :: c a=2.0d0 b=2.0_8 c=(2.0_8,2.0_8) 上記は、以下のプログラムとして解釈します。 real(16) :: a real(16) :: b complex(16) :: c a=2.0_16 b=2.0_16 c=(2.0_16,2.0_16) -D name[=tokens] name を、#define 前処理指令のように、指定された tokens と関連付けます。=tokens が指定されな い場合は、トークン 1 を与えます。 -D オプションと -U オプションに同一の name を指定した場合は、その順序によらず name は定義 されません。 規定のマクロには、以下のものがあります。 - __unix - __sparc - __sparcv9 - __sun - __SVR4 - __`uname -s`_`uname -r` - unix - sparc - sun __sparcv9 は -KV9 オプションが有効な場合に有効です。 Fortran 使用手引書ー Page 37 -E msg_arg msg_arg : { a |c | f | g | i | s | u } 許容値を認めない演算の検出メッセージ、短文メッセージの出力、最適化に関するメッセージの 出力およびプログラム単位間での手続特性のエラー検査を Fortran コンパイラに指示する機能で す。-E オプションの引数として、a、c、f、g、i、s または u が指定できます。また、これらの引 数は組み合わせて指定することができます。 a -Ea オプションが有効な場合、翻訳時に配列の形状を検査して、キャッシュの競合など実行性能に 悪影響を与える可能性がある場合に i レベルの診断メッセージを出力します。 本機能は、配列の大きさがキャッシュの倍数であるとみなされた場合にメッセージを出力します。 メッセージが出力された配列については、キャッシュの大きさの倍数とならないように配列の形 状を書き換えることを推奨します。なお、キャッシュの大きさが不明、割付け配列、ポインタの 配列である場合診断メッセージは出力されません。 本機能を使用する場合の注意事項として、-Karraypad_const[N] または、-Karraypad_expr=N オプショ ンが指定された場合、配列の大きさはパディングされた大きさを加算した値が対象になります。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 c -Ec オプションが有効な場合、許容値を認めていない関係式(実数型、倍精度実数型、4 倍精度実 数型、複素数型、倍精度複素数型または 4 倍精度複素数型の関係演算で、演算子が ==、/=、.EQ. または .NE.)または算術 IF 文における算術式が実数型、倍精度実数型または 4 倍精度実数型のと きに、翻訳時に i レベルの診断メッセージを出力します。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 許容量を認めていない関係式については、 “6.3.2 実数型データの演算”を参照してください。 f -Ef オプションが有効な場合、ループ融合の最適化が行われた箇所の通知として、i レベルの診断 メッセージを翻訳時に出力します。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 g -Eg オプションが有効な場合、翻訳時に外部手続の定義と引用との間の手続特性の検査、外部手続 の定義と引用仕様本体との間の手続特性の検査および共通ブロックの大きさの検査をプログラム 単位にまたがって行います。この場合、より多くの翻訳時間がかかります。 -Eg オプションが有効な場合、-Haesux および -O0 オプションも有効にします。 i -Ei オプションが有効な場合、利用者定義の手続のインライン展開の最適化を行った結果として、 i レベルの診断メッセージを翻訳時に出力します。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 利用者定義の手続のインライン展開の最適化については、翻訳時オプション -x を参照してくださ い。 s -Es オプションが有効、かつ、英文の場合、通常は長文として出力される翻訳時の診断メッセージ を短文に変更します。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 Fortran 使用手引書ー Page 38 u -Eu オプションが有効な場合、ループアンローリングの最適化またはソフトウェアパイプライニン グが行われた箇所の通知として、翻訳時に i レベルの診断メッセージを出力します。 翻訳時の診断メッセージについては、“4.1.1 翻訳時の診断メッセージ”を参照してください。 ループアンローリングの最適化については、翻訳時オプション -O および -K を参照してください。 ソフトウェアパイプライニングについては、 “9.1.2 ソフトウェアパイプライニング”を参照して ください。 -Fixed -Fixed オプションが有効な場合、固定形式の Fortran 原始プログラムとして翻訳します。 -Free -Free オプションが有効な場合、自由形式の Fortran 原始プログラムとして翻訳します。 -G リンカが、ダイナミックリンク実行形式ファイルではなく、共用オブジェクトを作成するために 使用します。このオプションはリンカに渡されます。このオプションは -dn オプションと同時に は、指定できません。 -H dbg_arg dbg_arg : { a | e | s | u | x } Fortran 原始プログラムをデバッグするための機能です。-H オプションが有効な場合、Fortran 原始 プログラムの誤りを翻訳時に検査し、かつ、オブジェクトプログラム内にデバッグするために必 要な情報を組み込み、実行時に自動検査します。-H オプションの引数として、a、e、s、u または x が指定できます。また、これらの引数は組み合わせて指定することができます。 同様な機能として、翻訳時オプション -Eg を提供します。翻訳時オプション -Eg は、手続の特性 などのプログラム単位間の誤りを Fortran 原始プログラムの翻訳時に検査します。 -H オプションが有効な場合、-O0 オプションも有効にします。-O オプションを有効にする場合に は、-H オプションよりあとに -O オプションを指定する必要があります。 本機能については、“8.2 デバッグのための機能”を参照してください。 a Fortran 原始プログラムの翻訳時に、手続を引用したとき、引用元と引用先の妥当性を検査するオ ブジェクトプログラムを出力し、そのプログラムの実行時に誤りを検査する機能です。 -Ha オプションが有効な場合、引数や関数結果に関する手続引用の妥当性の検査を利用者プログ ラムの実行時に行います。実行時に誤りを検出した場合は、診断メッセージを出力します。 本機能については、“8.2.1.1 引数の妥当性の検査(ARGCHK 機能)”を参照してください。 e Fortran 原始プログラムの翻訳時に、配列式または配列式をもつ代入文において、形状適合を検査 するオブジェクトプログラムを出力し、そのプログラムの実行時に誤りを検査する機能です。 -He オプションが有効な場合、形状適合の検査を利用者プログラムの実行時に行います。実行時 に誤りを検出した場合は、診断メッセージを出力します。 本機能については、“8.2.1.4 形状適合の検査(SHAPECHK 機能) ”を参照してください。 Fortran 使用手引書ー Page 39 s Fortran 原始プログラムの翻訳時に、部分配列、配列要素または部分列の宣言と引用をしたときに、 宣言した大きさと引用した範囲の正当性を検査するオブジェクトプログラムを出力し、翻訳時お よびそのプログラムの実行時に誤りを検査する機能です。 -Hs オプションが有効な場合、部分配列、配列要素または部分列の引用で、その添字式や部分列式 の値が宣言した範囲内かどうかの検査を行います。誤りを検出した場合は、診断メッセージを出 力します。 本機能については、“8.2.1.2 添字式および部分列範囲の検査(SUBCHK 機能)”を参照してくだ さい。 u Fortran 原始プログラムの翻訳時に、モジュールの宣言部および共通ブロックに属さない変数を引 用したとき、その変数に値が定義されているかを検査するオブジェクトプログラムを出力し、そ のプログラムの実行時に誤りを検査する機能です。 -Hu オプションが有効な場合、モジュールの宣言部および共通ブロックに属さない変数の引用に おいて、その変数に値が定義されているかの検査を利用者プログラムの実行時に行います。実行 時に誤りを検出した場合は、診断メッセージを出力します。 本機能については、“8.2.1.3 未定義データの引用の検査(UNDEF 機能)”を参照してください。 x Fortran 原始プログラムの翻訳時に、モジュールの宣言部および共通ブロックに属する変数を引用 したとき、その変数に値が定義されているか、ポインタを引用したとき、ポインタが結合されて いるか、および DO 構文の増分値、FORALL 構文の刻み幅、配列構成 DO 制御の増分値および添 字三つ組の刻み幅が 0 以外の値かを検査するオブジェクトプログラムを出力し、そのプログラム の実行時に誤りを検査する機能です。 -Hx オプションが有効な場合、-Hu オプションも有効にします。 -Hx オプションを有効にする場合、以下の注意が必要です。 - 共通ブロックに属する変数に値を設定しているプログラム単位は、初期値設定プログラム単 位を含め、すべて -Hx オプションを指定して翻訳しなければなりません。 - モジュールを -Hx オプションを指定して翻訳した場合、そのモジュールを引用しているすべ てのプログラム単位を、-Hx オプションを指定して翻訳しなければなりません。 本機能については、“8.2.1.5 拡張検査(EXTCHK 機能) ”を参照してください。 -I directory INCLUDE ファイルまたはモジュールの翻訳情報を検索するためのディレクトリ名を指示する機 能です。モジュール翻訳情報の検索の対象とするためには、-Am オプションを有効にする必要が あります。 -Idirectory オプションが有効な場合、引数 directory のディレクトリ名で検索します。-I オプション の引数として指定できるディレクトリ名は一つです。ただし、-I オプションは複数指定でき、検 索は -I オプションが指定された順に行います。 INCLUDE ファイルの検索は以下の順序で行います。 1.INCLUDE 行が属するファイルが置かれているディレクトリ 2.frt コマンドを起動しているカレントディレクトリ 3.-I オプションの引数に指定されたディレクトリ モジュールの翻訳情報の検索は以下の順序で行います。 Fortran 使用手引書ー Page 40 1.-M オプションの引数に指定されたディレクトリ 2.frt コマンドを起動しているカレントディレクトリ 3.-I オプションの引数に指定されたディレクトリ Fortran 使用手引書ー Page 41 -K opt_arg opt_arg : { adr44 | adr64 | noalias | arraypad_const[=N] | arraypad_expr=N | array_merge | array_merge_common[=name] | array_merge_local | array_merge_local_size=N | { array_private | noarray_private } | array_subscript | array_subscript_element=N | array_subscript_elementlast=N | array_subscript_rank=N | array_transform | { auto | noauto } | { bcopy | nobcopy } | commonpad[=N] | { dalign | nodalign } | { eval | noeval } | fast | fast_GP[=level] | fast_GP2[=level] | fast_VI[=level] | { FMADD | NOFMADD } | { frecipro | nofrecipro } | { fsimple | nofsimple } | { fuse | nofuse } | GREG_SYSTEM | { hardbarrier | nohardbarrier } | { ilfunc | noilfunc } | instance=N | { largepage[=level] | nolargepage } | localpad[=N] | { loop | noloop } | { mfunc[=level] | nomfunc } | { mregion_extension | nomregion_extension } | { ns | nons } | { ocl | noocl } | { OMP | NOOMP } | options | pagesize=N | pagesize_heap=N | pagesize_stack=N | { parallel[=level] | noparallel } | parallel_iteration=N | parallel_strong | parallel_weak | pg | { pic | PIC } | pmsg[=level] | { preex | nopreex } | { prefetch[=level] | noprefetch } | prefetch_cache_level=N | { prefetch_infer | prefetch_noinfer } | prefetch_iteration=N | prefetch_iteration_L2=N | prefetch_line=N | prefetch_line_L2=N | prefetch_model=kind | { prefetch_strong | prefetch_nostrong } | preschedule_length=N | pu | { pureomp | nopureomp } | { reduction | noreduction } | { striping[=N] | nostriping } | { threadprivate | nothreadprivate } | { threadsafe | nothreadsafe } | { tiling[=N] | notiling } | { unroll[=N] | nounroll } | { VIS1 | VIS2 | NOVIS } | vppocl | archi | cpu } オブジェクトプログラムの実行性能向上を追求するための最適化を指示する機能です。最適化機 能は -K オプションの引数として指定します。 -K オプションの引数はコンマ(,)を区切り子とし、組み合わせて指定することができます。 adr44 -Kadr44 オプションが有効な場合、絶対アドレスを 44 ビットで表すオブジェクトを生成します。 -Kadr44 オプションは、-KV9 オプションが有効な場合に意味があります。本オプションは、-KV9 オプションより後に指定しなければなりません。 adr64 -Kadr64 オプションが有効な場合、絶対アドレスを 64 ビットで表すオブジェクトを生成します。 -Kadr64 オプションは、-KV9 オプションが有効な場合に意味があります。本オプションは、-KV9 オプションより後に指定しなければなりません。 noalias -Knoalias オプションは、コンパイラに対して、原始プログラム中のポインタ変数が、他のポイン タ変数やターゲット変数と同じ領域を参照しないものとして、最適化を行うことを指示します。 本オプションが指定された場合、コンパイラは上記の前提を元に最適化・自動並列化を行うため、 指定しない場合に比べて、ポインタ変数に関する最適化・自動並列化を促進します。 Fortran 使用手引書ー Page 42 原始プログラム中のポインタの引用が、上記の条件を満たしていないのに本オプションを指定し た場合、実行可能プログラムは誤った結果を出力することがあるので注意が必要です。 arraypad_const[=N] 1 ≦ N ≦ 2147483647 1 次元目が明示上下限であり、かつその上下限式が定数式の配列に対して N 要素のパディングを 行います。N が省略された場合、対象の配列ごとにコンパイラがパディングの量を決めます。パ ディングとは、配列の内部に隙間を作ることです。 -Karraypad_expr=N オプションと同時には指定できません。 本オプションを指定する場合の注意事項については、“9.15 配列の形状を変更する機能の影響” を参照してください。 arraypad_expr=N 1 ≦ N ≦ 2147483647 上下限式が定数式かどうかにかかわらず、1 次元目が明示上下限の配列に対して N 要素のパディ ングを行います。 -Karraypad_const[=N] オプションと同時には指定できません。 本オプションを指定する場合の注意事項については、“9.15 配列の形状を変更する機能の影響” を参照してください。 array_merge 本オプションは、-Karray_merge_local および -Karray_merge_common オプションが指定された場合 と等価です。 本オプションを指定する場合の注意事項については、 “9.19 配列変数マージ”を参照してくださ い。 array_merge_common[=name] 共通ブロック内の複数配列をマージすることを指示します。-g または -H オプションが有効な場合 は、-Karray_merge_common[=name] オプションを無効とします。 name には、共通ブロック名を指定できます。 name を省略した場合、すべての共通ブロック内の配列が対象となります。 array_merge_local ローカル配列の複数配列をマージすることを指示します。-g または -H オプションが有効な場合 は、-Karray_merge_local オプションを無効とします。 -Karray_merge_local_size=1000000 も同時に有効になります。 array_merge_local_size=N 2 ≦ N ≦ 2147483647 マージ対象とするローカル配列の大きさが、N バイト以上であることを指示します。 -Karray_merge_local オプションが有効な場合に意味があります。 { array_private | noarray_private } ループ内のプライベート化可能な配列に対して、プライベート化するかどうかを指示します。デ フォルトは、-Knoarray_private です。 array_private ループ内のプライベート化可能な配列に対して、プライベート化を行います。 -Kparallel オプションが有効な場合に意味があります。 Fortran 使用手引書ー Page 43 noarray_private ループ内のプライベート化可能な配列に対して、プライベート化を行いません。 array_subscript 4 次元以上の割付け配列および最終次元の要素が 10 以下で、最終次元以外の要素が 100 以上の 4 次元以上の配列に対して配列の次元移動を行うことを指示します。本オプションを指定する場合 の注意事項については、 “9.18 配列宣言の次元移動”を参照してください。-g または -H オプショ ンが有効な場合は、-Karray_subscript オプションを無効とします。 -Karray_subscript_element=100,-Karray_subscript_elementlast=10 および -Karray_subscript_rank=4 も同 時に有効になります。 2 ≦ N ≦ 2147483647 array_subscript_element=N 本オプションが指定された場合、配列の次元移動の対象となる配列の最終次元以外の要素数が N 以上であることを指示します。本オプションは、-Karray_subscript オプションが有効な場合に意味 があります。 array_subscript_elementlast=N 2 ≦ N ≦ 2147483647 本オプションが指定された場合、配列の次元移動の対象となる配列の最終次元の要素数が N 以下 であることを指示します。本オプションは、-Karray_subscript オプションが有効な場合に意味があ ります。 array_subscript_rank=N 2 ≦ N ≦ 30 本オプションが指定された場合、配列の次元移動の対象となる配列の次元数が N 次元以上である ことを指示します。本オプションは、-Karray_subscript オプションが有効な場合に意味がありま す。 array_transform 本オプションは、-Karraypad_const、-Karray_merge および -Karray_subscript オプションが指定され た場合と等価です。 { auto | noauto } SAVE 属性をもつ変数および初期値をもつ変数を除く局所変数を、automatic 変数にするかどうか を指示します。automatic 変数は、手続の終了時に不定になります。デフォルトは、-Knoauto です。 auto SAVE 属性をもつ変数および初期値をもつ変数を除く局所変数を、automatic 変数として扱い、ス タックに割り付けます。本オプションを指定する場合の注意事項については、 “9.14 スタック割 付けの影響”を参照してください。 noauto SAVE 属性をもつ変数および初期値をもつ変数を除く局所変数を、automatic 変数にしません。 { bcopy | nobcopy } 配列間の転送を行うループおよび配列へ定数値 0 を設定するループを、memcpy(3C) および memset(3C) 関数に変換する最適化を行うかどうかを指示します。デフォルトは、-Knobcopy です。 bcopy 配列間の転送を行うループおよび配列へ定数値 0 を設定するループを、memcpy(3C) および memset(3C) 関数に変換する最適化を行います。本オプションは、-KSPARC64_GP2 および -O3 オ プション以上が有効な場合に意味があります。 Fortran 使用手引書ー Page 44 nobcopy 配列間の転送を行うループおよび配列へ定数値 0 を設定するループを、memcpy(3C) および memset(3C) 関数に変換する最適化を行いません。 4 ≦ N ≦ 4096 commonpad[=N] -Kcommonpad オプションが有効な場合、データキャッシュの使用効率をあげるために共通ブロッ ク内の各変数の領域の間に、隙間をつくることを指定します。N は、4 ~ 4096 の範囲で指定でき、 単位はバイトです。N を省略した場合は、コンパイラが自動的に最良な値を決定します。 { dalign | nodalign } 共通ブロック、仮引数またはポインタで参照される 8 バイトの整数型、倍精度実数型、4 倍精度 実数型、倍精度複素数型および 4 倍精度複素数型のデータに対して、生成されるオブジェクトプ ログラムが倍語の境界に割り付けられているものとして命令を生成するかどうかを指示します。 デフォルトは、-Knodalign です。 dalign 生成されるオブジェクトプログラムが倍語の境界に割り付けられているものとして命令を生成し ます。本オプションを使用する場合、実行可能プログラムを構成するすべての手続は -Kdalign を 指定して翻訳されていなければなりません。 nodalign 生成されるオブジェクトプログラムが倍語の境界に割り付けられていないものとして命令を生成 します。 { eval | noeval } オブジェクトプログラムに対して演算評価方法を変更する最適化を行うかどうかを指示します。 なお、この最適化を行うことで実行結果に副作用を生じることがあるため注意が必要です。デフォ ルトは、-Knoeval です。 eval オブジェクトプログラムに対して演算評価方法を変更する最適化を行います。 -Kparallel オプションが有効な場合、-Kreduction オプションも有効になります。 noeval オブジェクトプログラムに対して演算評価方法を変更する最適化を行いません。 本オプションが指定された場合、-Knoreduction オプションも有効になります。 fast -Kfast オプションが有効な場合、翻訳しているマシン上で高速に実行させることを指示します。こ れは、-O4 -Kfsimple,dalign,ns,fuse,mfunc,prefetch、-KVIS1 または -KVIS2、-Karchi および -Kcpu オプ ションの中から、翻訳マシンに合わせた最適なオプションを自動的に選択したものと等価になり ます。なお、-KSPARC64_GP2 オプションを選択した場合、翻訳マシンに合わせて -Kprefetch_model=kind オプションを自動的に選択します。 fast_GP[=level] level={ 0 | 1 | 2 | 3 } SPARC64 GP を搭載したシステムで、高速な実行性能を得るために適した最適化を行うことを指 示します。 level には、0、1、2 および 3 が指定できます。level の省略値は 1 です。 fast_GP=0 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP,V8PLUS,VIS1 オプションが有効な場合と 同様の最適化を実施します。 Fortran 使用手引書ー Page 45 fast_GP=1 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP,V8PLUS,VIS1,FMADD オプションが有効 な場合と同様の最適化を実施します。 fast_GP=2 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP,V8PLUS,VIS1,FMADD,eval オプションが有 効な場合と同様の最適化を実施します。 fast_GP=3 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP,V8PLUS,VIS1,FMADD,eval,preex オプショ ンが有効な場合と同様の最適化を実施します。 fast_GP2[=level] level={ 0 | 1 | 2 | 3 } SPARC64 V を搭載したシステムで、高速な実行性能を得るために適した最適化を行うことを指示 します。また、翻訳マシンによって -Kprefetch_model=kind を自動的に選択します。ただし、 SPARC64 V を搭載していないシステム上で翻訳した場合は、-Kprefetch_model=L を選択します。 level には、0、1、2 および 3 が指定できます。level の省略値は 1 です。 fast_GP2=0 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP2,V8PLUS,VIS1 オプションが有効な場合と 同様の最適化を実施します。 fast_GP2=1 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP2,V8PLUS,VIS1 オプションが有効な場合と 同様の最適化を実施します。 fast_GP2=2 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP2,V8PLUS,VIS1,eval オプションが有効な場 合と同様の最適化を実施します。 fast_GP2=3 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64_GP2,V8PLUS,VIS1,eval,preex オプションが有 効な場合と同様の最適化を実施します。 fast_VI[=level] level={ 0 | 1 | 2 | 3 } SPARC64 VI を搭載したシステムで高速な実行性能を得るための最適化を行うことを指示します。 level には、0、1、2 および 3 が指定できます。省略値は 1 です。 fast_VI=0 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64VI,V8PLUS,VIS2 オプションが有効な場合と同 様の最適化を実施します。 fast_VI=1 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64VI,V8PLUS,VIS2,FMADD オプションが有効な 場合と同様の最適化を実施します。 fast_VI=2 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64VI,V8PLUS,VIS2,FMADD,eval オプションが有 効な場合と同様の最適化を実施します。 fast_VI=3 -O5 -Kfsimple,dalign,ns,fuse,mfunc,prefetch,SPARC64VI,V8PLUS,VIS2,FMADD,eval,preex オプション が有効な場合と同様の最適化を実施します。 Fortran 使用手引書ー Page 46 { FMADD | NOFMADD } multiply add/subtract 浮動小数点演算命令を出力するかどうかを指示します。デフォルトは、 -KNOFMADD です。 FMADD multiply add/subtract 浮動小数点演算命令を出力します。-KFMADD オプションが有効な場合、作成 されたロードモジュールは、SPARC64 GP、SPARC64 V および SPARC64 VI 以外の機種では動作 を保証しません。本オプションは、-KV8PLUS または -KV9 オプションが有効であり、かつ -O1 オ プション以上が有効な場合に意味があります。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KFMADD オプションを有効にして翻訳されたオブジェクトプログラムが含まれ る場合には、本オプションを指定する必要があります。 NOFMADD multiply add/subtract 浮動小数点演算命令を出力しません。 { frecipro | nofrecipro } 浮動小数点数の除算を、逆数との乗算に変換するかどうかを指示します。デフォルトは、 -Knofrecipro です。この最適化により、逆数に関する共通式の除去や命令スケジューリングを促進 しますが、プログラムによっては効果が得られない場合もあるので注意が必要です。また、この 最適化が行われた場合、行われなかった場合に比べ、計算結果に丸め誤差程度の違いが生じます。 frecipro 浮動小数点数の除算に関し、逆数を使った最適化を行います。 nofrecipro 浮動小数点数の除算に関し、逆数を使った最適化を行いません。 { fsimple | nofsimple } オブジェクトプログラムに対して浮動小数点演算の単純化を行うかどうかを指示します。たとえ ば、x*0 のような演算は、0 に単純化されます。デフォルトは、-Knofsimple です。この最適化に より、生成されるコードは IEEE 754 に準拠しなくなります。 fsimple オブジェクトプログラムに対して浮動小数点演算の単純化を行います。-O1 オプション以上が有 効な場合に意味があります。 nofsimple オブジェクトプログラムに対して浮動小数点演算の単純化を行いません。 { fuse | nofuse } 隣接するループを融合するかどうかを指示します。本オプションは、-O3 オプション以上が有効 な場合に意味があります。デフォルトは、-Knofuse です。 fuse 隣接するループを融合します。 nofuse 隣接するループを融合しません。 Fortran 使用手引書ー Page 47 GREG_SYSTEM 翻訳段階で、g5 から g6(-KV9 指定時は g6)のグローバル・レジスタをレジスタ割付けの対象に することを指示します。これらのレジスタは、システムで予約されたレジスタです。ただし、マ ルチスレッドのプログラムには、使用できません。-O1 オプション以上が有効な場合に意味があ ります。 { hardbarrier | nohardbarrier } Parallelnavi スレッド間ハードウェアバリア機能を使用する実行可能ファイルを作成するかどうか を指示します。Parallelnavi スレッド間ハードウェアバリア機能については、 “E.3 スレッド間 ハードウェアバリア機能”を参照してください。本オプションは、-Kparallel または -KOMP オプ ションと同時に指定した場合に有効になります。デフォルトは、-Knohardbarrier です。本機能は、 Parallelnavi 固有です。 hardbarrier Parallelnavi スレッド間ハードウェアバリア機能を使用する実行可能ファイルを作成します。 nohardbarrier Parallelnavi スレッド間ハードウェアバリア機能を使用する実行可能ファイルを作成しません。 { ilfunc | noilfunc } 単精度実数型および倍精度実数型の組込み関数 SIN、COS、LOG、LOG10 および EXP をインライ ン展開するかどうかを指示します。なお、この最適化を行うことで最適化を行わない場合と比べ、 丸め誤差程度の違いが生じます。また、組込み関数の引数が“8.1.5 組込み関数エラーの処理” のエラー発生の原因に該当する場合は、実行結果を保証しません。デフォルトは、-Knoilfunc です。 ilfunc 単精度実数型および倍精度実数型の組込み関数 SIN、COS、LOG、LOG10 および EXP をインライ ン展開します。-O1 オプション以上が有効な場合に意味があります。 noilfunc 単精度実数型および倍精度実数型の組込み関数 SIN、COS、LOG、LOG10 および EXP をインライ ン展開しません。 instance=N 2 ≦ N ≦ 128 -Kinstance=N オプションは、実行時のスレッド数を指定します。N は、2 ~ 128 の範囲で指定でき ます。本オプションは -Kparallel オプションが有効な場合に意味があります。本機能については “第 12 章 並列機能”を参照してください。 { largepage[=level] | nolargepage } level={ 1 | 2 } Parallelnaviラージページ機能を使用する実行可能ファイルを作成するかどうかを指示します。level には、1 および 2 が指定できます。level の省略値は 1 です。 Parallelnavi ラージページ機能については、 “E.1 ラージページ機能”を参照してください。デフォ ルトは、-Knolargepage です。本機能は、Parallelnavi 固有です。 largepage=1 データ域およびヒープ域に対して Parallelnavi ラージページ機能を適用し、実行可能ファイルを作 成します。 largepage=2 データ域およびヒープ域に加えて、スタック域に対してもラージページ機能を適用し、実行可能 ファイルを作成します。 nolargepage Parallelnavi ラージページ機能を使用する実行可能ファイルを作成しません。 Fortran 使用手引書ー Page 48 localpad[=N] 4 ≦ N ≦ 4096 -Klocalpad オプションが有効な場合、データキャッシュの使用効率をあげるためにローカル配列領 域の間に、隙間をつくることを指定します。N は、4 ~ 4096 の範囲で指定でき、単位はバイトで す。N を省略した場合は、コンパイラが自動的に最良な値を決定します。 { loop | noloop } 多重ループの構成変更の最適化を行うかどうかを指示します。本オプションは、-O3 オプション 以上が有効な場合に意味があります。デフォルトは、-Knoloop です。 loop 多重ループの構成変更の最適化を行ないます。 noloop 多重ループの構成変更の最適化を行いません。 { mfunc[=level] | nomfunc } level={ 1 | 2 | 3 } 組込み関数および演算をマルチ演算関数に変換する最適化を行うかどうかを指示します。なお、 マルチ演算関数とは、1 回の呼出しで複数の引数に対する同種の組込み関数計算および演算を行 うことにより、実行性能を向上させた関数です。ただし、アルゴリズムが異なることにより精度 の違いを生じる場合があります。本オプションは、-KV8PLUS または -KV9 オプションが有効で あり、かつ -O3 オプション以上の最適化レベルが有効な場合に意味があります。level には、1、2 および 3 が指定できます。level の省略値は 1 です。デフォルトは、-Knomfunc です。 mfunc=1 引数の多重度を 2 または 4 としたマルチ演算関数を使用します。 mfunc=2 -Kmfunc=1 の機能に加え、多重度を 8 以上としたマルチ演算関数も使用します。本機能は、スタッ ク領域を多く必要とします。 mfunc=3 -Kmfunc=2 の機能に加え、IF 構文などを含むループに対しても多重度を 8 以上としたマルチ演算 関数を使用します。IF 構文の真率が低い場合、-Kmfunc=1 または -Kmfunc=2 より実行性能が低下 することがあるので注意が必要です。本機能は、スタック領域を多く必要とします。 nomfunc 組込み関数および演算をマルチ演算関数に変換する最適化を行いません。 以下に対象となる組込み関数および演算を示します。なお、SIN、COS および ATAN 関数は、 -KSPARC64_GP2 または -KSPARC64VI オプションが有効な場合にのみ、本最適化の対象となりま す。 関数名/演算 LOG 単精度実数型 倍精度実数型 ○ ○ EXP ○ ○ べき乗演算 SIN × ○ ○ ○ COS ○ ○ ATAN ○ ○ ○:対象 ×:対象外 Fortran 使用手引書ー Page 49 { mregion_extension | nomregion_extension } マルチスレッド範囲を拡大することにより、並列化オーバヘッドを削減することを指示します。 本オプションは、-Kparallel オプションが有効な場合に意味があります。本機能については、 “第 12 章 並列機能”および“12.2.3.1.11 マルチスレッド範囲の拡大”を参照してください。デ フォルトは、-Knomregion_extension です。 mregion_extension マルチスレッド範囲を拡大することにより、並列化オーバヘッドを削減することを指示します。 nomregion_extension マルチスレッド範囲を拡大しないことを指示します。 { ns | nons } FPU を non-standard floating-point mode で初期化するかどうかを指示します。高速な性能を得るた めに、アンダフローの数値をゼロにすることがあります。デフォルトは、-Knons です。 ns FPU を non-standard floating-point mode で初期化します。-O1 オプション以上が有効な場合に意味 があります。 nons FPU を non-standard floating-point mode で初期化しません。 { ocl | noocl } 最適化制御行を有効にするかどうかを指示します。最適化制御行については、 “9.11 最適化制御 行(OCL)の利用”を参照してください。デフォルトは -Knoocl です。 ocl 最適化制御行を有効にします。-O1 オプション以上が有効な場合に意味があります。 noocl 最適化制御行を無効にします。 { OMP | NOOMP } OpenMP Fortran 仕様のディレクティブを有効にするかどうかを指示します。 本機能については“12.3 OpenMP 仕様による並列化”を参照してください。デフォルトは、 -KNOOMP です。 OMP OpenMP Fortran 仕様のディレクティブを有効にします。-KOMP オプションが有効な場合、 -Kthreadsafe、-Kauto、-AR および -D_OPENMP=200505 オプションも有効にします。ただし、主プ ログラムの局所変数は、-Kauto オプションが有効であってもスタックには割り付けません。 -Knoauto、-Knothreadsafe および -Ar オプションは、-KOMP オプションより後に指定すれば有効に なります。-Knoauto または -Knothreadsafe オプションを -KOMP オプションと同時に指定する場合 には、注意が必要です(“12.3 OpenMP 仕様による並列化”を参照してください)。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KOMP オプションを指定して翻訳されたオブジェクトプログラムが含まれる場合 は、本オプションを指定する必要があります。 NOOMP OpenMP Fortran 仕様のディレクティブを注釈として扱います。 Fortran 使用手引書ー Page 50 options !options で始まる行を翻訳指示行として扱うことを指示します。 翻訳指示行については、“2.5 翻訳指示行”を参照してください。 pagesize=N -Kpagesize_heap=N および -Kpagesize_stack=N オプションが指定された場合と等価です。 pagesize_heap=N ヒープ域のページサイズを設定します。N には 8K、64K、512K、4M、32M、256M、2G または、 16G が指定できます。N にはシステムがサポートしている有効なページサイズを指定してくださ い。有効なページサイズは pagesize(1M) コマンドの -a オプションを使って確認することができま す。有効なページサイズを指定しなかった場合は、実行時に以下のメッセージが出力され、その 要求は無視されます。 ヒープ域のページサイズに有効でない値を指定した場合 fjmpss runtime : The heap page size(SIZE) specified by -Kpagesize_heap or -Kpagesize cannot be used in this system. SIZE : -Kpagesize_heap または -Kpagesize に指定した値 本オプションは、-Klargepage オプションと同時に指定できません。本オプションは、翻訳時、リ ンク時に指定する必要があります。本オプションは、Solaris 9 以降の場合に有効です。本オプショ ンを指定すると、オペレーティングシステムにインストールされた MPSS(Multiple Page Size Support)機能が、ヒープ域に任意のページサイズを割り当てます。MPSS 機能の詳細については Solaris マニュアルを参照してください。-Kpagesize_heap={2G|16G} は -KV9 が有効な場合に意味が あります。 pagesize_stack=N スタック域のページサイズを設定します。N には 8K、64K、512K、4M、32M、256M、2G また は、16G が指定できます。N にはシステムがサポートしている有効なページサイズを指定してく ださい。有効なページサイズは pagesize(1M) コマンドの -a オプションを使って確認することがで きます。有効なページサイズを指定しなかった場合は、実行時に以下のメッセージが出力され、 その要求は無視されます。 スタック域のページサイズに有効でない値を指定した場合 fjmpss runtime : The stack page size(SIZE) specified by -Kpagesize_stack or -Kpagesize cannot be used in this system. SIZE : -Kpagesize_stack または -Kpagesize に指定した値 本オプションは、-Klargepage オプションと同時に指定できません。本オプションは、翻訳時、リ ンク時に指定する必要があります。本オプションは、Solaris 9 以降の場合に有効です。本オプショ ンを指定すると、オペレーティングシステムにインストールされた MPSS(Multiple Page Size Support)機能が、スタック域に任意のページサイズを割り当てます。MPSS 機能の詳細について は Solaris マニュアルを参照してください。-Kpagesize_stack={2G|16G} は -KV9 が有効な場合に意 味があります。 { parallel[=level] | noparallel } level={ 1 | 2 | 3 | 4 } -Kparallel オプションは、自動並列化するかどうかをを指示します。-O オプションのいずれも指定 されていない場合は、-O3 オプションが有効になります。-O0、-O1 または -O2 オプションが同時 に指定されている場合は、-O3 オプションが有効になります。-g、-H または -Eg オプションが有 効な場合は、-Kparallel オプションを無効とします。 本機能については“12.2 自動並列化”を参照してください。 Fortran 使用手引書ー Page 51 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-Kparallel オプションを指定して翻訳されたオブジェクトプログラムが含まれる場 合には、本オプションを指定する必要があります。 level には、1、2、3 および 4 が指定できます。level の省略値は 2 です。 parallel=1 並列化効果が高いと見込まれるループだけを自動並列化させることを指示します。 -O3 -Kparallel_weak,fuse と同等です。 parallel=2 標準的な自動並列化を行うことを指示します。このとき、-O3 -Kfuse も有効とします。 parallel=3 標準的な自動並列化を行うことを指示します。このとき、-O3 -Kfuse,eval,preex,reduction も有効と します。 parallel=4 並列化効果の見積もりを行わず、自動並列化可能と解析されたループをすべて並列化させること を指示します。-O3 -Kparallel_strong,fuse,eval,mregion_extension,preex,reduction と同等です。 noparallel 自動並列化しないことを指示します。 parallel_iteration=N 1 ≦ N ≦ 2147483647 翻訳時に繰返し回数がN以上と判明しているループのみを並列化の対象とすることを指示します。 本オプションは、-Kparallel オプションが有効な場合に意味があります。 例: REAL(KIND=4),DIMENSION(10000,5) :: A,B,C DO J=1,5 DO I=2,10000 A(I,J) = B(I,J) + C(I,J) ENDDO ENDDO -Kparallel_iteration=6 オプションが有効な場合、外側ループは繰返し回数が 5 のため並列化の 対象になりません。 parallel_strong 並列化効果の見積もりを行わず、自動並列化可能と解析されたループをすべて並列化させること を指示します。-Keval および -Kpreex オプションも同時に有効になります。上記を除き、機能や 注意事項は、-Kparallel オプションと同じです。 parallel_weak 並列化効果が高いと見込まれるループだけを自動並列化させることを指示します。上記を除き、 機能や注意事項は、-Kparallel オプションと同じです。 pg -Kpg オプションが有効な場合、最適化(広域命令スケジューリング等)を行うためにコンパイラ が参照するプロファイル情報を生成するための命令を生成します。-O1 オプション以上が有効な 場合に意味があります。-Kpu オプションと同時には指定できません。プロファイル情報について は、 “9.12 プロファイル情報の利用”を参照してください。 Fortran 使用手引書ー Page 52 { pic | PIC } -Kpic オプションまたは -KPIC オプションが有効な場合、位置独立コード(PIC)を生成します。 なお、本オプションが有効な場合、ld コマンドに対するオプションとして、 “-z text”を指定する ことはできません。-Kpic と -KPIC オプションを同時に指定した場合、後に指定した方が有効に なります。 pmsg[=level] level={ 1 | 2 | 3 } -Kpmsg オプションが有効な場合、自動並列化の状況を i レベルの診断メッセージで出力します。 本オプションは、-Kparallel オプションが有効な場合に意味があります。level には、1、2 および 3 が指定できます。level の省略値は 3 です。翻訳時の診断メッセージについては、"4.1.1 翻訳時の 診断メッセージ " を参照してください。 pmsg=1 自動並列化した旨のメッセージのみを出力します。 pmsg=2 -Kpmsg=1 の出力に加えて、自動並列化されなかったことを示す簡略化されたメッセージを出力し ます。簡略化とは、同一のメッセージ番号と line 情報をもつメッセージの出力回数を 1 回にする ことを意味します。 pmsg=3 -Kpmsg=1 の出力に加えて、自動並列化されなかったことを示すメッセージを出力します。-Ef オ プションも同時に有効になります。 { preex | nopreex } オブジェクトプログラムに対して不変式の先行評価の最適化を行うかどうかを指示します。なお、 この最適化を行うことで実行結果に副作用を生じることがあるため注意が必要です。利用者は、 翻訳時の診断メッセージの出力により、この最適化が行われたかどうかを知ることができます。 デフォルトは、-Knopreex です。 preex オブジェクトプログラムに対して不変式の先行評価の最適化を行います。-O1 オプション以上が 有効な場合に意味があります。 nopreex オブジェクトプログラムに対して不変式の先行評価の最適化を行いません。 { prefetch[=level] | noprefetch } level={ 1 | 2 | 3 | 4 | 5 } prefetch 命令を使用したオブジェクトを生成するかどうかを指示します。本オプションは、 -KV8PLUS または -KV9 オプションが有効な場合に意味があります。level には、1、2、3、4 およ び 5 が指定できます。-KSPARC64_GP オプションが有効な場合、level の省略値は、2 です。 -KSPARC64_GP2 または -KSPARC64VI オプションが有効な場合、level の省略値は、3 です。 -O1 オプション以上が有効な場合に意味があります。 prefetch=1 ループ内で使用される配列データに対して、ループ内に prefetch 命令を生成します。ただし、多 重ループの場合は、最内ループ内の配列データのみ対象とします。 prefetch=2 -Kprefetch=1 の機能に加えて、キャッシュのラインサイズよりも大きなストライドでアクセスされ る配列データを対象とします。 Fortran 使用手引書ー Page 53 prefetch=3 -Kprefetch=2 の機能に加えて、プリフェッチするアドレスが翻訳時に確定しないループにおいて、 アドレス計算をするための命令を生成し、プリフェッチすることを指示します。 prefetch=4 -Kprefetch=3 の機能に加えて、添字が複雑な場合でも連続アクセスとみなし、積極的にプリフェッ チすることを指示します。 prefetch=5 -Kprefetch=4 の機能に加えて、間接的にアクセス(リストアクセス)される配列データに対して、 プリフェッチすることを指示します。 noprefetch prefetch 命令を使用したオブジェクトを生成しません。 prefetch_cache_level=N N={ 1 | 2 | 3 } どのキャッシュレベルにデータをプリフェッチするかを指示します。本オプションは、 -KSPARC64_GP2 または -KSPARC64VI が有効であり、かつ -Kprefetch オプションが有効な場合に 意味があります。N には、1、2 および 3 が指定できます。 -KSPARC64_GP2 オプションが有効な場合のデフォルトは、-Kprefetch_model を参照してください。 -KSPARC64VI オプションが有効な場合のデフォルトは、-Kprefetch_cache_level=2 です。 prefetch_cache_level=1 データを 1 次キャッシュにプリフェッチすることを指示します。 通常の prefetch 命令を使用します。 prefetch_cache_level=2 データを 2 次キャッシュにのみプリフェッチすることを指示します。2 次キャッシュにのみプリ フェッチする prefetch 命令を使用します。 prefetch_cache_level=3 prefetch_cache_level=1 および prefetch_cache_level=2 の機能を同時に有効にします。 2 種類の prefetch 命令を組み合わせることにより、より高度なプリフェッチを実現することができます。 { prefetch_infer | prefetch_noinfer } プリフェッチのためのアドレス計算を省略し、既存の情報から距離を推測してプリフェッチする ことを指示します。本オプションは、-Kprefetch が有効な場合に意味があります。デフォルトは、 -Kprefetch_noinfer です。 prefetch_infer プリフェッチのためのアドレス計算を省略し、既存の情報から距離を推測してプリフェッチする ことを指示します。 prefetch_noinfer プリフェッチのためのアドレス計算を省略し、既存の情報から距離を推測してプリフェッチしな いことを指示します。 prefetch_iteration=N 1 ≦ N ≦ 2147483647 prefetch 命令を生成する際、ループの N 回転後に参照または定義されるデータを対象とすることを 指示します。ただし、本機能では 1 次キャッシュにプリフェッチする prefetch 命令を対象としま すので、-Kprefetch および -Kprefetch_cache_level=1 または 3 が有効な場合に意味があります。 -Kprefetch_line=N オプションと同時には指定できません。 Fortran 使用手引書ー Page 54 1 ≦ N ≦ 2147483647 prefetch_iteration_L2=N prefetch 命令を生成する際、ループの N 回転後に参照または定義されるデータを対象とすることを 指示します。ただし、本機能では 2 次キャッシュにのみプリフェッチする prefetch 命令を対象と しますので、-Kprefetch および -Kprefetch_cache_level=2 または 3 が有効な場合に意味があります。 -Kprefetch_line_L2=N オプションと同時には指定できません。 prefetch_line=N 1 ≦ N ≦ 100 prefetch 命令を生成する際、N キャッシュライン先に該当するデータをプリフェッチの対象とする ことを指示します。ただし、本機能では 1 次キャッシュにプリフェッチする prefetch 命令を対象 としますので、-Kprefetch および -Kprefetch_cache_level=1 または 3 が有効な場合に意味がありま す。-Kprefetch_iteration=N オプションと同時には指定できません。 prefetch_line_L2=N 1 ≦ N ≦ 100 prefetch 命令を生成する際、N キャッシュライン先に該当するデータをプリフェッチの対象とする ことを指示します。ただし、本機能では 2 次キャッシュにのみプリフェッチする prefetch 命令を 対象としますので、-Kprefetch および -Kprefetch_cache_level=2 または 3 が有効な場合に意味があり ます。-Kprefetch_iteration_L2=N オプションと同時には指定できません。 prefetch_model=kind kind={ M | L } SPARC64 V を搭載しているシステムのモデルに応じて、適切なプリフェッチを行うことを指示し ます。本オプションは、-KSPARC64_GP2 および -Kprefetch オプションが有効な場合に意味があり ます。デフォルトは、-Kprefetch_model=L です。 以下に、kind とモデル名の対応を示します。 モデル名 PRIMEPOWER HPC2500 PRIMEPOWER 2500 kind その他 M L prefetch_model=L PRIMEPOWER HPC2500、PRIMEPOWER 2500 向けにプリフェッチを行うことを指示します。本オ プションが有効な場合、-Kprefetch_cache_level=2 オプションも有効になります。 prefetch_model=M PRIMEPOWER HPC2500、PRIMEPOWER 2500 以外の SPARC64 V を搭載しているシステム向けに プリフェッチを行うことを指示します。本オプションが有効な場合、-Kprefetch_cache_level=1 も 有効にします。 { prefetch_strong | prefetch_nostrong } strong prefetch 命令を生成するかどうかを指示します。本オプションは、-KSPARC64_GP2 または -KSPARC64VI が有効であり、かつ -Kprefetch オプションが有効な場合に意味があります。デフォ ルトは、-Kprefetch_nostrong です。 prefetch_strong strong prefetch 命令を生成します。 prefetch_nostrong strong prefetch 命令を生成しません。 preschedule_length=N 2 ≦ N ≦ 999 -O5 が指定された際、レジスタ割付け前で行う命令スケジューリングの範囲を指示します。N に は、アセンブラ命令の移動範囲の最大値を指定します。N は、2 ~ 999 の範囲で指定できます。 Fortran 使用手引書ー Page 55 pu -Kpu オプションが有効な場合、-Kpg オプションを指定し作成した実行可能ファイルを実行したと きに得られるプロファイル情報を使用して最適化(広域命令スケジューリング等)を行います。 -O1 オプション以上が有効な場合に意味があります。-Kpg オプションと同時には指定できません。 プロファイル情報については、“9.12 プロファイル情報の利用”を参照してください。 { pureomp | nopureomp } OpenMP Fortran 仕様のディレクティブによる指示に必ずしも忠実に従わないような最適化を許す かどうかを指示します。本オプションは、-KOMP オプションが有効な場合に意味があります。本 機能については“12.3 OpenMP 仕様による並列化”を参照してください。デフォルトは、 -Knopureomp です。 pureomp -Kpureomp オプションは、OpenMP Fortran 仕様のディレクティブに忠実に従います。 nopureomp -Knopureomp オプションは、OpenMP Fortran 仕様のディレクティブを緩やかに解釈してオブジェ クトプログラムの効率化を図ります。 { reduction | noreduction } リダクションの最適化を行なうかどうかを指示します。本オプションは、-Kparallel オプションが 有効な場合に意味があります。デフォルトは、-Knoreduction です。本機能については“第 12 章 並列機能”および“12.2.3.1.8 リダクションによるループスライス”を参照してください。 reduction リダクションの最適化を行います。 noreduction リダクションの最適化を行いません。 { striping[=N] | nostriping } 1 ≦ N ≦ 100 -Kstriping オプションは、ストライピングの最適化を行うことを指示します。N には、ストライピ ングのストライプ長の上限を指定します。N は、1 ~ 100 の範囲で指定できます。N の指定を省略 した場合、N=2 が指定されたものとみなします。本オプションは、-O3 オプション以上が有効な 場合に意味があります。デフォルトは、-Knostriping です。 ストライピングは、ループ内の文が多重に展開されるので、ループアンローリング同様、オブジェ クトモジュールの大きさが増加します。また、多くの翻訳時間を必要とする場合があります。実 行性能に関しても、使用するレジスタが増加するため実行性能が低下する場合があるので注意が 必要です。 striping ストライピングの最適化を行います。 nostriping ストライピングの最適化を行いません。 { threadprivate | nothreadprivate } すべての名前付き共通ブロックをスレッドプライベートとするかどうかを指示します。本オプ ションは、-KOMP オプションが有効な場合に意味があります。本機能については“12.3 OpenMP 仕様による並列化”を参照してください。デフォルトは、-Knothreadprivate です。 threadprivate すべての名前付き共通ブロックをスレッドプライベートとします。 Fortran 使用手引書ー Page 56 nothreadprivate スレッドプライベートとして指定された名前付き共通ブロック以外は、通常の共通ブロックとし ます。 { threadsafe | nothreadsafe } スレッドセーフなオブジェクトプログラムを生成するかどうかを指示します。デフォルトは、 -Knothreadsafe です。 threadsafe スレッドセーフなオブジェクトプログラムを生成します。 nothreadsafe スレッドセーフでないオブジェクトプログラムを生成します。 { tiling[=N] | notiling } 2 ≦ N ≦ 9999 ループタイリングの最適化を行うかどうかを指示します。N にはタイルの大きさを、2 ~ 9999 の 範囲で指定します。N の指定を省略した場合、コンパイラが自動的に最良な値を決定します。デ フォルトは、-Knotiling です。-O3 オプション以上が有効な場合に意味があります。 tiling[=N] ループタイリングの最適化を行います。 notiling ループタイリングの最適化を行いません。 { unroll[=N] | nounroll } 2 ≦ N ≦ 100 ループアンローリングの最適化を行うことを指示します。N にはループ展開数の上限を指定しま す。N は 2 ~ 100 の範囲で指定できます。N の指定を省略した場合、コンパイラが自動的に最良 な値を決定します。-O0 または -O1 オプションが有効な場合のデフォルトは -Knounroll、-O2 オプ ション以上が有効な場合のデフォルトは -Kunroll です。 unroll[=N] ループアンローリングの最適化を行います。 nounroll ループアンローリングの最適化を行いません。 { VIS1 | VIS2 | NOVIS } VIS(Visual Instruction Set)を出力するかどうかを指示します。デフォルトは、-KNOVIS です。 VIS1 VIS(Visual Instruction Set)バージョン 1.0 を出力します。本オプションは、-KV8PLUS または -KV9 オプションが有効な場合に意味があります。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KVIS1 オプションを有効にして翻訳されたオブジェクトプログラムが含まれる場 合には、本オプションを指定する必要があります。 VIS2 VIS(Visual Instruction Set)バージョン 2.0 を出力します。本オプションは、-KV8PLUS または -KV9 オプションが有効な場合に意味があります。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KVIS2 オプションを有効にして翻訳されたオブジェクトプログラムが含まれる場 合には、本オプションを指定する必要があります。 Fortran 使用手引書ー Page 57 NOVIS VIS(Visual Instruction Set)を出力しません。 vppocl 最適化指示子 NOVREC を最適化指示子 NORECURRENCE と同等に扱うことを指示します。本オ プションが指定されていない場合、最適化指示子 NOVREC は無効となります。本オプションは、 -Kocl オプションが有効な場合に意味があります。 archi archi には、V8、V8PFMADD、V8PLUS、V9 または V9FMADD が指定できます。詳細については、 -Kcpu オプションを参照してください。 V8 -KV8 オプションが有効な場合、SPARCV8 の命令セットを使用したオブジェクトプログラムを生 成します。 V8PFMADD 本オプションは、-KV8PLUS および -KFMADD オプションが有効な場合と等価です。 V8PLUS -KV8PLUS オプションが有効な場合、SPARCV8+ の命令セットを使用したオブジェクトプログラ ムを生成します。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KV8PLUS オプションを指定して翻訳されたオブジェクトプログラムが含まれる 場合には、本オプションを指定する必要があります。 V9 -KV9 オプションが有効な場合、SPARCV9 の命令セットを使用したオブジェクトプログラムを生 成します。-Kadr44 オプションも同時に有効になります。-KV9 オプションを指定する場合の注意 事項については、“付録 D 32 ビットモードと 64 ビットモードの違い”を参照してください。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KV9 オプションを指定して翻訳されたオブジェクトプログラムが含まれる場合 には、本オプションを指定する必要があります。 V9FMADD 本オプションは、-KV9 および -KFMADD オプションが有効な場合と等価です。 cpu cpu には、SPARC64_GP、SPARC64_GP2、SPARC64VI、ULTRA、ULTRA1 または ULTRA2 が指定 できます。 -Kcpu オプションと -Karchi オプションの指定可能な組合せは、以下のとおりです。 -Kcpu -Karchi V8 V8PLUS V8PFMADD V9 V9FMADD SPARC64_GP ○ ○ ○ ○ ○ SPARC64_GP2 ○ ○ ○ ○ ○ SPARC64VI ○ ○ ○ ○ ○ ULTRA、ULTRA1 ○ ○ × ○ × ULTRA2 ○ ○ × ○ × Fortran 使用手引書ー Page 58 ○:指定可能 ×:指定不可能 SPARC64_GP -KSPARC64_GP オプションが有効な場合、SPARC64 GP に特有な最適化を行います。 SPARC64_GP2 -KSPARC64_GP2 オプションが有効な場合、SPARC64 V に特有な最適化を行います。 また、SPARC64 V以外のCPUでは動作が保証されません。 -KV9オプションが有効な場合、-static-flib オプションが有効になります。 SPARC64VI -KSPARC64VI オプションが有効な場合、SPARC64 VI に特有な最適化を行ないます。 ULTRA -KULTRA オプションは、-KULTRA1 オプションと等価です。 ULTRA1 -KULTRA1 オプションが有効な場合、UltraSPARC-I に特有な最適化を行います。 ULTRA2 -KULTRA2 オプションが有効な場合、UltraSPARC-II に特有な最適化を行います。 -L directory リンカがライブラリを検索するディレクトリのリストに directory を加えます。このオプションと 引数はリンカに渡されます。 -M directory 原始プログラム中のモジュールの翻訳情報を directory に登録します。また、原始プログラム中に 存在しないモジュールを directory から引用したい場合に指定します。モジュールの翻訳について は、 “第 10 章 モジュールおよびモジュール引用の注意事項”を参照してください。 -N src_arg src_arg : { { allextput | noallextput } | { autoobjstack | noautoobjstack } | { calleralloc | nocalleralloc } | { compdisp | nocompdisp } | { copyarg | nocopyarg } | { f90move | nof90move } | { f95 | nof95 } | { freealloc | nofreealloc } | { mallocfree | nomallocfree } | maxserious=maxnum | { obsfun | noobsfun } | { recursive | norecursive } | { save | nosave } | { Rtrap | Rnotrap } } -N オプションの引数はコンマ(,)を区切り子とし、組み合わせて指定することができます。 { allextput | noallextput } EXTERNAL 文だけに現れる外部名を有効にするかどうかを指示します。デフォルトは、 -Nnoallextput です。 allextput EXTERNAL 文だけに現れる外部名を有効にします。 noallextput EXTERNAL 文だけに現れる外部名を無効にします。 { autoobjstack | noautoobjstack } 自動割付けデータ実体をスタックまたはヒープのどちらに割り付けるかを指示します。デフォル トは、-Nnoautoobjstack です。 Fortran 使用手引書ー Page 59 autoobjstack 自動割付けデータ実体をスタックに割り付けることを指示します。本オプションを指定する場合 の注意事項については、“9.14 スタック割付けの影響”を参照してください。 noautoobjstack 自動割付けデータ実体をヒープに割り付けることを指示します。 { calleralloc | nocalleralloc } 利用者定義の配列関数の引用において、関数結果の領域を呼出し元または呼出し先のどちらで確 保するかを指示します。デフォルトは、-Nnocalleralloc です。 calleralloc 利用者定義の配列関数の引用において、以下の条件を満たす関数結果は、関数の呼出し元で領域 を確保します。 - 組込みデータ型である。かつ、 - 形状明示配列であり、すべての明示された上下限は定数式である。かつ、 - 文字型のとき、長さ型パラメタは定数式である。 条件を満たさない関数結果は、関数の実行時に動的な領域の割付けを行い、復帰後に呼出し元で 解放を行います。 本オプションの指定により、関数結果の領域の動的な割付け・解放によって生じる実行時オーバ ヘッドを削減することができます。 本オプションを指定する場合には、該当する配列関数を定義または引用するすべてのファイルで 指定しなければなりません。該当する配列関数に対して呼出し元と呼出し先で本オプションの有 無が異なる場合、正しい動作は保証されません。 nocalleralloc 利用者定義の配列関数の引用において、関数結果の領域は常に関数の実行時に動的な割付けを行 い、復帰後に呼出し元で解放を行います。 { compdisp | nocompdisp } 翻訳しているファイル名およびプログラム単位名を表示するかどうかを指示します。デフォルト は、-Nnocompdisp です。 compdisp 翻訳しているファイル名およびプログラム単位名を表示します。 nocompdisp 翻訳しているファイル名およびプログラム単位名を表示しません。 { copyarg | nocopyarg } 手続引用の実引数に指定されたスカラ定数を、コピーして引数として渡すかどうかを指示します。 デフォルトは、-Nnocopyarg です。 copyarg 手 続 引 用 の 実 引 数 に 指 定 さ れ た ス カ ラ 定 数 を、コ ピ ー し て 引 数 と す る こ と を 指 示 し ま す。 -Ncopyarg オプションが有効な場合、副プログラムで仮引数の値を更新しても、実引数の定数値に は影響しません。ただし、本オプションの指定により動作可能になるプログラムは、Fortran 95 規 格に合致しないプログラムです。 Fortran 使用手引書ー Page 60 例:-Ncopyarg CALL SUB(1) PRINT *,1 END SUBROUTINE SUB(I) I=2 END -Ncopyarg オプションが有効な場合、1 を出力します。 nocopyarg 手続引用の実引数に指定されたスカラ定数を、そのまま引数とします。 { f90move | nof90move } 重なりのある文字代入 (“6.4 重なりのある文字代入”を参照) の FORTRAN77 または FORTRAN66 言語仕様での動作を指示します。 -X9 オプションが有効な場合、常に -Nf90move が有効であり、-Nnof90move を指定できません。 -X7、-X6、-Xf7 または -Xf6 オプションが有効な場合のデフォルトは、-Nnof90move です。-Nf90move オプションを指定すると Fortran 95 言語仕様の文字代入を行います。 例:-Nf90move CHARACTER(LEN=5) C C='12345' C(1:4)=C(2:5) PRINT *,C END -X7、-X6、-Xf7 または -Xf6 オプションが有効な場合、-Nf90move オプションを指定すること により、23455 の結果が得られます。 { f95 | nof95 } 手続呼出しの CPU_TIME および NULL を組込み手続として解釈するかどうかを指示します。 CPU_TIME および NULL は、Fortran 95 規格で追加された組込み手続名です。 f95 CPU_TIME および NULL を組込み手続と解釈することを指定します。-X9 オプションが有効な場 合のデフォルトです。-X7、-X6、-Xf7 または -Xf6 オプションが有効な場合、指定することはでき ません。 nof95 手続呼出しの CPU_TIME および NULL を利用者定義の手続と解釈することを指示します。 -X7、-X6、-Xf7 または -Xf6 オプションが有効な場合、常に -Nnof95 が有効です。 { freealloc | nofreealloc } 局所的な割付け配列を、手続の終了時に解放するかどうかを指示します。デフォルトは、-Nfreealloc です。 freealloc 副プログラムの復帰時に局所的な割付け配列を解放することを指示します。 Fortran 使用手引書ー Page 61 nofreealloc 副プログラムの復帰時に局所的な割付け配列を解放しないことを指示します。-Nnofreealloc オプ ションを指定すると Fortran 95 規格に合致しないプログラムになります。原始プログラムを修正 し、SAVE 属性を付加することを推奨します。 { mallocfree | nomallocfree } MALLOC および FREE を組込み手続とすることを指示するオプションです。デフォルトは、 -Nnomallocfree です。 mallocfree MALLOC および FREE を組込み手続とすることを指示します。-Nmallocfree オプションが有効な 場合、MALLOC および FREE の関数結果および引数の型は、以下のようになります。 32 ビット(-KV9 オプションが無効)のアドレスモード指定の場合 ルーチン名 MALLOC 関数の型 引数の型 4 バイトの整数型 すべての整数型 FREE なし 4 バイトの整数型 64 ビット(-KV9 オプションが有効)のアドレスモード指定の場合 ルーチン名 MALLOC 関数の型 引数の型 8 バイトの整数型 すべての整数型 FREE なし 8 バイトの整数型 本オプションは、32 ビットアドレスモードのプログラムを 64 ビットアドレスモードに移行する 場合に指定することを推奨します。 nomallocfree MALLOC および FREE を組込み手続とはしません。本オプションが有効な場合、MALLOC およ び FREE は、サービスルーチンとみなします。 maxserious=maxnum 翻訳時に検出される s レベル(重度のエラー)のエラーメッセージの数が maxnum に達した場合 に翻訳を中止することを指定します。maxnum は、1 以上の値でなければなりません。本オプショ ンを指定しない場合、翻訳は最後まで行います。 { obsfun | noobsfun } デフォルトは -Nnoobsfun です。-Nobsfun オプションが有効な場合、以下の関数名を組込み関数名 として解釈します。 AIMAX0、AJMAX0、I2MAX0、IMAX0、JMAX0、IMAX1、JMAX1、AIMIN0、AJMIN0、I2MIN0、 IMIN0、JMIN0、IMIN1、JMIN1、FLOATI、FLOATJ、DFLOTI、DFLOTJ、IIABS、JIABS、I2ABS、 IIDIM、JIDIM、I2DIM、IIFIX、JIFIX、JFIX、INT1、INT2、INT4、IINT、JINT、ININT、JNINT、 IIDNNT、I2NINT、JIDNNT、IIDINT、JIDINT、IMOD、JMOD、I2MOD、IISIGN、JISIGN、I2SIGN、 BITEST、BJTEST、IIBCLR、JIBCLR、IIBITS、JIBITS、IIBSET、JIBSET、IBCHNG、ISHA、ISHC、 ISHL、IIAND、JIAND、IIEOR、JIEOR、IIOR、JIOR、INOT、JNOT、IISHFT、JISHFT、IISHFTC、 JISHFTC、IZEXT、JZEXT、IZEXT2、JZEXT2、JZEXT4、VAL { recursive | norecursive } サブルーチン副プログラムまたは関数副プログラムに RECURSIVE キーワードを付加するかどう かを指示します。デフォルトは、-Nnorecursive です。 Fortran 使用手引書ー Page 62 recursive 要素別処理手続でないサブルーチン副プログラムまたは関数副プログラムに RECURSIVE キー ワードを付加します。-Nrecursive オプションが有効な場合、Fortran 95 規格に合致しないプログラ ムになります。原始プログラムを修正し、再帰的呼出しを行う手続に RECURSIVE のキーワード を付加することを推奨します。 norecursive RECURSIVE キーワードを付加しません。 { save | nosave } 主プログラムを除くプログラムに保存要素並びを省略した SAVE 文を付加するかどうかを指示し ます。デフォルトは、-Nnosave です。 save 主プログラムを除くプログラムに保存要素並びを省略した SAVE 文を付加します。本オプション は、-Nrecursive および -Kauto オプションと同時には指定できません。 nosave 主プログラムを除くプログラムに保存要素並びを省略した SAVE 文を付加しません。 { Rtrap | Rnotrap } デフォルトは、-NRnotrap です。 主プログラム単位を -NRnotrap オプションが有効で翻訳した場合、以下の動作になります。 - 組込み演算(jwe0259i-e から jwe0282i-e、jwe1397i-e、jwe1398i-e、jwe1413i-e、jwe1414i-e、 jwe1416i-e および jwe1417i-e)に対する Fortran ライブラリの診断メッセージを出力しません。 - 浮動小数点演算の割込み事象(jwe0011i-e、jwe0012i-e、jwe0013i-e および jwe0292i-e)を検出 しません。 これらの診断メッセージを出力または浮動小数点演算の割込み事象を検出したい場合は、主プロ グラム単位を -NRtrap オプションを指定して翻訳してください。Fortran ライブラリの診断メッセー ジの詳細は、“Fortran 実行時メッセージ”を参照してください。 Rtrap 主プログラム単位を -NRtrap オプションが有効で翻訳した場合、実行時に組込み演算の診断メッ セージを出力し、浮動小数点演算の割込み事象を検出します。浮動小数点アンダフローによるプ ログラム割込みを検出したい場合、実行時に -u オプションを指定してください。 Rnotrap 主プログラム単位を -NRnotrap オプションが有効で翻訳した場合、実行時の組込み演算の診断メッ セージを出力しません。また、浮動小数点演算の割込み事象も検出しません。 -O [ opt_lvl ] opt_lvl : { 0 | 1 | 2 | 3 | 4 | 5 } 5オブジェクトプログラムの最適化レベルを指示する機能です。 最適化レベルには 0、1、2、3、4 または 5 があり、-O オプションの引数として指定します。-O オ プションの引数は省略可能であり、opt_lvl を省略した場合は、引数として 3 を指定したものと解 釈します。本オプションの省略値は、-O2 です。 最適化レベル 1、2、3、4 または 5 の -O オプションと -g オプションの両方が有効な場合、-O0 オ プションを有効にします。 オブジェクトプログラムの最適化については、“第 9 章 最適化機能”を参照してください。 Fortran 使用手引書ー Page 63 さらに最適化機能として、-K オプション指定により不変式の先行評価と演算評価方法の変更、-x オプション指定により利用者定義の手続のインライン展開を指定することができます。 0 -O0 オプションが有効な場合、オブジェクトプログラムの最適化は行いません。しかし、翻訳時 間や翻訳作業領域は、最小となりますのでコンパイルエラーのチェックなどプログラミングの初 期段階で利用してください。 1 -O1 オプションが有効な場合、オブジェクトプログラムに対して基本的な最適化を行います。 -O0 オプションが有効な場合に比べてオブジェクトプログラムの大きさが縮小され、実行時間も 大幅に短縮されます。 2 -O2 オプションが有効な場合、-O1 オプションが有効な場合の基本的な最適化に加えてループアン ローリングの最適化を行います。-O1 オプションが有効であり、かつ、DO ループを多用している 場合に実行時間の短縮が期待できます。また、利用者は -Eu オプションを有効にすることにより、 ループアンローリングの最適化が行われたかどうかを翻訳時の診断メッセージで知ることができ ます。 3 -O3 オプションが有効な場合、-O2 オプションが有効な場合の基本的な最適化に加えて多重ループ の構成変更、ループタイリングおよび最適化機能の繰返しの最適化を行います。-O2 オプション が有効な場合、オブジェクトプログラムの実行性能向上を追求したいときに利用してください。 4 -O4 オプションが有効な場合、-O3 オプションが有効な場合の最適化に加えて多重ループのフルア ンローリング、ループ交換促進のためのループ分割および添字が定数の配列に関する最適化を行 います。-O3 オプションが有効な場合に比べて翻訳時間は大幅に増加しますが、オブジェクトプ ログラムの実行性能向上を追求したいときに利用してください。 5 -O5 オプションが有効な場合、-O4 オプションが有効な場合の最適化に加えてソフトウェア・パイ プライニングおよびより高度なレジスタ割当てを行います。-O4 オプションが有効な場合に比べ て翻訳時間はさらに大幅に増加しますが、オブジェクトプログラムの実行性能向上を追求したい ときに利用してください。 -P -P オプションは、C のプリプロセッサ(前処理)の結果をファイルに出力することを指示するオ プションです。原始プログラムファイルのサフィックスが .F、.FOR、.F90 および .F95 でない場 合、-Cpp オプションを指定しなければなりません。プリプロセッサの結果は、原始プログラム ファイルに対応して、以下のように生成します。 file.F file.f file.FOR file.for file.F90 file.f90 file.F95 file.f95 → → → → → → → → file.cpp.f file.cpp.f file.cpp.for file.cpp.for file.cpp.f90 file.cpp.f90 file.cpp.f95 file.cpp.f95 Fortran 使用手引書ー Page 64 -Q [ lst_arg ] lst_arg : { a | d | i | m | ofile | p | t | x } -Q オプションは、翻訳情報を得る機能です。翻訳情報を .lst ファイルに出力します。Fortran 原始 プログラムを複数ファイル指定した場合には、最初のファイル名 .lst ファイルに出力します。 -Q オプションの引数として a、d、i、m、ofile、p、t または x が指定できます。引数は、-Qa,ofile,x のようにコンマで区切って指定することができます。引数は省略してもかまいません。引数を省 略した場合、翻訳情報として、原始プログラムリストおよびエラーメッセージを出力します。 a -Qa オプションが有効な場合、-Q オプションでの出力に加えて、名前の属性情報を出力します。 d -Qd オプションが有効な場合、-Q オプションでの出力に加えて、構造型の構成情報を出力します。 i -Qi オプションが有効な場合、-Q オプションでの出力に加えて、インクルードされたファイルの プログラムリストおよびインクルードファイル名一覧を出力します。 m -Qm オプションが有効な場合、-Qp オプションでの出力に加えて、自動並列化の状況を OpenMP ディレクティブによって表現した原始プログラムを出力します。出力される原始プログラムは、 入力ファイルの拡張子の直前に .omp が挿入されたファイルに格納されます。 本オプションは、-Kparallel オプションが有効な場合に有効にします。 本オプションは、-Qi オプションが有効な場合には、無効にします。 ofile o に続けてファイル名を指定します。-Qo オプションの引数として指定されたファイル名 file に翻 訳情報を出力します。 p -Qp オプションが有効な場合、-Q オプションでの出力に加えて、プログラムリスト中に最適化情 報を出力します。最適化情報により、自動並列化やインライン展開、アンローリングの状況がわ かります。 t -Qt オプションが有効な場合、-Qp オプションでの出力に加えて、より詳細な最適化情報および統 計情報を出力します。 x -Qx オプションが有効な場合、-Q オプションでの出力に加えて、名前および文番号の相互参照情 報を出力します。 -S オブジェクトプログラムの作成およびリンカの呼出しを抑止する機能です。 -S オプションが有効な場合、アセンブラ原始プログラム(サフィックス .s のファイル)を生成し ます。 { -SSL2 | -SSL2BLAMP } 数学ライブラリ(SSL II、BLAS、LAPACK)の結合を指示します。詳細については、 “SSL II オン ラインマニュアル”、“SSL II スレッド並列機能オンラインマニュアル”または“BLAS,LAPACK, ScaLAPACK オンラインマニュアル”を参照してください。 Fortran 使用手引書ー Page 65 -SSL2 SSL II、SSL II スレッド並列機能、BLAS / LAPACK を結合します。 -SSL2BLAMP SSL II、SSL II スレッド並列機能、BLAS / LAPACK スレッド並列版を結合します(-SSL2 オプ ションとの違いは、BLAS / LAPACK においてスレッド並列版が結合されることです)。本オプ ションは、-KV8PLUS、-KV9、-KV8PFMADD または -KV9FMADD オプションが指定された場合 のみ有効となります。 -U name #undef 前処理指令と同様に、name の定義を無効にします。-D オプションと -U オプションに同一 の name を指定した場合は、その順序によらず name を定義しません。 -V -V オプションが有効な場合、各ツールのバージョン情報を標準エラー出力ファイルに出力します。 -W tool,arg1[,arg2] ... -W オプションは、指定された arg1[,arg2] ... をそれぞれ別の引数として tool に渡します。各引数 は、直前の引数とコンマのみで区切られていなければなりません(コンマを引数の一部としたい 場合は、直前にバックスラッシュ(\)を置きます。このとき、バックスラッシュ自体は、引数に は含まれません)。tool には、以下のどちらかの文字を指定します。 p :プリプロセッサ 0 :コンパイラ a :アセンブラ l :リンカ たとえば、-Wa,-oobjfile は、-o と objfile をその順序でアセンブラに渡します。また、-Wl,-Iname に より、リンク段階のダイナミックリンカの省略時名を変更することができます。他の指定したコ マンド行オプションに関して、引数がツールに渡される順序は変わることがあります。 -X lan_lvl lan_lvl : { 6 | 7 | 9 | f6 | f7 } 言語仕様のレベルを指定する機能です。-X オプションの引数として 6、7、9、f6 または f7 が指定 できます。 各言語仕様の間では、解釈が異なる部分があります。利用者は、翻訳する Fortran 原始プログラム がどの言語仕様で記述されているかを Fortran コンパイラに指示します。これにより、正しい解釈 で Fortran 原始プログラムを翻訳・実行することができます。 -X オプション指定時の動作の詳細については“6.1 言語仕様レベル”を参照してください。 6 -X6 オプションが有効な場合、解釈が異なる部分に関して FORTRAN66 言語仕様を採用します。 7 -X7 オプションが有効な場合、解釈が異なる部分に関して FORTRAN77 言語仕様を採用します。 9 -X9 オプションが有効な場合、解釈が異なる部分に関して Fortran 95 言語仕様を採用します。 -Nf90move および -Nf95 オプションも同時に有効になります。 f6 -Xf6 オプションが有効な場合、解釈が異なる部分に関して富士通ホスト系で定義している FORTRAN66 言語仕様を採用します。 Fortran 使用手引書ー Page 66 f7 -Xf7 オプションが有効な場合、解釈が異なる部分に関して富士通ホスト系で定義している FORTRAN77 言語仕様を採用します。 -# -# オプションは、frt コマンドによって実行されるパスおよびオプションを表示します。ただし、 実行は行いません。 -### -### オプションは、frt コマンドによって実行されるパスおよびオプションを表示します。 2.3 翻訳コマンドの環境変数 以下に、frt コマンドが認識する環境変数を説明します。 FORT90C 利用者は、環境変数 FORT90C の値として翻訳時オプションを設定することができます。環境変 数 FORT90C の中に設定された翻訳時オプションは、frt コマンドの起動時に有効となります。つ ねに指定する翻訳時オプションを、あらかじめ環境変数 FORT90C の中に設定しておくと便利で す。 frt コマンド行に指定された翻訳時オプションは、環境変数 FORT90C の中に設定された値の末尾 に付加され、処理されます。あとに処理されたオプションが有効になります。 環境変数 FORT90C の使用例を以下に示します。 FORT90C を使用した例: % setenv FORT90C '-fw -I/usr/prv/usri' % frt a.f90 上記の例を環境変数FORT90Cを使用しないならば、以下のfrtコマンドを使用することになります。 FORT90C を使用しない例: % frt -fw -I/usr/prv/usri a.f90 TMPDIR 環境変数 TMPDIR を設定することにより、frt コマンドが使用するテンポラリディレクトリを変更 することができます。 環境変数 TMPDIR を設定しない場合、インクルードファイル /usr/include/stdio.h に定義されている P_tmpdir の示すディレクトリが使用されます。 環境変数 TMPDIR の使用例: % setenv TMPDIR /usr/local/tmp 2.4 翻訳時プロフィルファイル 翻訳時プロフィルファイル(/etc/opt/FSUNf90cp/jwd_prof)を設定することにより、翻訳時オプショ ンのデフォルトを変更することができます。 Fortran 使用手引書ー Page 67 翻訳時プロフィルファイルは、以下の形式に従って作成してください。 - 二重引用符(”)または一重引用符(’)で囲まれていない空白文字は、意味を持ちません。 - 文字列の開始および終了を表す二重引用符および一重引用符は、すべて等価です。ただし、 一連の文字列は必ず開始を表す二重引用符および一重引用符と同一の文字または行末によっ て終了します。 - 文字列に含まれていない“#”から行末まではコメントと解釈します。 以下に翻訳時プロフィルファイルの指定例を示します。 #Default options -fw -Kocl 翻訳時オプションの指定の優先順位は、以下のように決定されます。 (1)翻訳指示行(-Koptions 指定時のみ) (2)翻訳コマンドのオペランド (3)環境変数 FORT90C (4)プロフィルファイル (5)標準値 2.5 翻訳指示行 原始プログラムの手続きの先頭に !options 行を記述し、翻訳時オプション -Koptions が指定された とき、そこに記述されたオプションを有効にすることができます。 以下に記法を示します。 !options opt [,opt] .... opt:オプション 指定できるオプション一覧 -O[1-4] -Keval/noeval/frecipro/nofrecipro/fuse/nofuse/ilfunc/noilfunc/loop/noloop/mfunc[=level]/ nomfunc/ocl/noocl/preex/nopreex/prefetch[=N]/noprefetch/prefetch_infer/prefetch_noinfer/ prefetch_iteration=N/prefetch_iteration_L2=N/prefetch_line=N/prefetch_line_L2=N/ striping[=N]/nostriping/tiling[=N]/notiling/unroll[=N]/nounroll/noalias/vppocl 注意事項を以下に示します。 - 内部副プログラムの先頭には記述できません。 - コマンドラインで -O5 が指定されている場合、翻訳指示行に -O[ 1 | 2 | 3 | 4 ] のオプショ ンは、指定できません。 2.6 翻訳コマンドの復帰値 以下に、frt コマンドが設定する復帰コードを示します。 復帰コード 0 意味 正常に終了しました。 1 翻訳エラーまたはリンカでエラーが発生しました。 上記以外 リンカでエラーが発生しました。 第 3 章 Fortran プログラムの実行 この章では、Fortran 原始プログラムを実行するための手続きについて説明します。 3.1 実行コマンド 利用者は、翻訳コマンド frt で作成した実行可能プログラムのファイルを実行コマンドとして起動 します。これにより、Fortran 原始プログラムが実行されます。 3.2 実行コマンドの形式 利用者は、実行コマンド名に続いて、Fortran ライブラリで定義される実行時オプションまたは利 用者が定義したオプションを指定することができます。 実行時オプションの説明については“3.3 実行時オプション”を参照してください。 以下に、実行コマンドの形式を示します。 コマンド名 オペランド ファイル名 [ □ -Wl, 実行時オプション [, 実行時オプション ]...] [ □利用者定義オプション [, 利用者定義オプション ]...] □:一つ以上の空白が必要なことを意味します。 備考 1.ファイル名は、実行可能プログラムが格納されているファイル名であり、翻訳コマンド frt の -o オプションの引数として指定されたものです。-o オプションが省略されたときのファ イル名は a.out です。 備考 2.オペランドに実行時オプションを指定するときは、先頭に“-Wl,” (l は英小文字)を指定 しなければなりません。また、実行時オプション間の区切り子は、コンマ(,)でなければ なりません。 備考 3.利用者定義オプションは、本システムで提供されているサービスサブルーチン GETPARM または GETARG を使用することで取り出すことができます。サービスルーチンについて は、オンラインマニュアルで提供されている“Fortran 文法書”を参照してください。 備考 4.オペランドに同じ実行時オプションが指定された場合は、あとで指定された実行時オプ ションが有効になります。 コマンド名 a.out に続き、Fortran ライブラリの実行時オプション“-Wl,-i”と利用者が定義したオ プション“-K”および“-L”を指定した例を以下に示します。 % a.out -Wl,-i -K,-L 3.3 実行時オプション 実行時オプションは、実行コマンド名に続いて指定することができます。また、環境変数に指定 することもできます。 Fortran 使用手引書ー Page 69 実行時オプションの形式 -Wl[,-a] [,-dnum] [,-enum] [,-gnum] [,-i] [,-lelvl] [,-mu_no] [,-n] [,-pu_no] [,-q] [,-ru_no] [,-tsec] [,-u] [,-x] [,-Cu_no] [,-Gu_no] [,-Lb] [,-Li] [,-Lr] [,-Lu] [,-M] [,-Oi] [,-Q] [,-Re] [,-Rp] [,-Ry] [,-Tu_no] 実行時オプションは先頭に“-Wl” (l は英小文字)を指定し、続いて、オプションを指定します。 実行時オプション間の区切り子は、コンマ(,)でなければなりません。同じオプションが指定さ れた場合、あとで指定されたオプションが有効となります。 例:実行時オプションの指定 % a.out -Wl,-a,-p10,-x 以下に各オプションの意味を説明します。 -a Fortran プログラムの終了時に、強制的に異常終了させることを指示します。 -a オプションを指定した場合、強制的な異常終了処理が行われます。この異常終了処理は、使用 中のファイルのクローズ処理の直前で行われます。同時に動作していたプログラムの仮想記憶領 域の内容が core ファイルに出力されます。 例:実行時オプション -a % a.out -Wl,-a -dnum 1 ≦ num ≦ 32767 直接探査入出力文が実行されたときに、使用される入出力作業域の大きさを指定します。直接探 査入出力で使用される入出力域の大きさは装置番号ごとに Fortran 記録を複数ブロッキングするこ とによって、管理されます。このため、num は、Fortran 記録の数を表す 1 ~ 32767 の整数値を指 定します。 -d オプションを指定した場合、num 個の Fortran 記録が 1 個のブロッキングレコードとして扱われ ます。このとき、使用される入出力作業域の大きさは、OPEN 文の RECL 指定子の値の num 倍の 大きさです。 -d オプションを指定しない場合、4K バイトの入出力作業域が使用されます。 なお、複数プロセスでファイルが共有される場合は、-d1 を指定してください。 -d オプションは、連続した記録番号で入出力する場合に有効です。ただし、-d オプションで指定 した値は、実行時に使用されるすべての装置番号に対して有効となります。このため、無駄なメ モリが消費されることがあるため、注意してください。装置番号ごとに入出力作業域の大きさを 指定する方法として、環境変数で指定する方法があります。環境変数で指定する方法については、 “3.8 実行時の環境変数”を参照してください。 -d オプションと環境変数を同時に指定した場合、-d オプションが有効となります。 例:実行時オプション -d % a.out -Wl,-d10 -enum 0 ≦ num ≦ 32767 実行時に発生したエラーの総数によって、プログラムの実行の終了を制御します。引数 num は、 エラーの総発生許容回数を指示する 0 ~ 32767 の整数値です。num ≧ 1 のとき、発生したエラー の合計が num 回に達するとプログラムの実行が終了されます。 -enum オプションを指定しない場合または引数 num に 0 を指定した場合は、エラーの発生回数に よってプログラムの実行が終了されることはありません。ただし、個々のエラーの発生に対して、 本システムで規定される標準的なエラー打切り回数に達した場合は、プログラムの実行は終了さ れます。 Fortran 使用手引書ー Page 70 たとえば、入力データのエラー(jwe0171i-e)が 10 回起こった場合、-e の値として 0 や 32767 を 指定していても、プログラムの実行は打ち切られます。 例:実行時オプション -e % a.out -Wl,-e10 -gnum 1 ≦ num 順番探査入出力文が実行されたときに、使用される入出力作業域の大きさを指定します。順番探 査入出力で使用される入出力作業域の大きさは装置番号ごとに K バイト単位で管理されます。こ のため、num は、1K バイト単位で指定します。-g オプションを指定しない場合、使用される入出 力作業域の大きさは、書式つき順番探査入出力では 8K バイト、書式なし順番探査入出力では 1M バイトとなります。 -g オプションは、書式なし順番探査入出力文で大量データを入出力する場合に有効です。ただし、 -g オプションで指定した値は、実行時に使用されるすべての装置番号に対して有効となります。 このため、無駄なメモリが消費されることがあるので、注意してください。装置番号ごとに入出 力作業域の大きさを指定する方法として、 環境変数で指定する方法または OPEN 文の BLOCKSIZE 指定子で指定する方法があります。環境変数で指定する方法については、“3.8 実行時の環境変 数”を参照してください。 -g オプションと環境変数を同時に指定した場合、-g オプションが有効となります。 例:実行時オプション -g % a.out -Wl,-g10 -i 実行時に割込み事象が発生した場合の処理を Fortran ライブラリで行うかどうかを指示します。 -i オプションを指定した場合、実行時に割込み事象が発生した場合の処理は行われません。 -i オプションを指定しない場合、実行時に割込み事象が発生した場合の処理が行われ、診断メッ セージ(jwe0011i-e、jwe0013i-e、jwe0014i-e、jwe0292i-e)が出力されます。-i オプションを指定 したときに捕捉されるシグナルについては、 “8.2.2 異常終了プログラムのデバッグ”を参照して ください。また、割込み事象が発生した場合の処理については、 “8.1.7 例外ハンドリングエラー の処理”を参照してください。 なお、-i オプションを指定する場合、-u オプションは指定できないので、注意してください。 例:実行時オプション -i % a.out -Wl,-i -lelvl elvl : { i | w | e | s } 実行時の診断メッセージの出力を制御します。引数 elvl には、出力する最低のエラーレベル i、w、 e または s を指定します。-l オプションを指定しない場合は、エラーレベルが w、e または s の診 断メッセージが出力されます。ただし、診断メッセージの最大印刷回数を超えたものは印刷され ません。 例:実行時オプション -l % a.out -Wl,-le i -li オプションを指定した場合は、すべてのエラーレベルの診断メッセージが出力されます。 w -lw オプションを指定した場合は、エラーレベルが w、e、s および u の診断メッセージが出力され ます。 Fortran 使用手引書ー Page 71 e -le オプションを指定した場合は、エラーレベルが e、s および u の診断メッセージが出力されます。 s -ls オプションを指定した場合は、エラーレベルが s および u の診断メッセージが出力されます。 -mu_no 0 ≦ u_no ≦ 2147483647 標準エラー出力ファイルと接続する装置番号を指定します。引数 u_no は、装置番号を表す 0 ~ 2147483647 の整数値です。 -mu_no オプションを指定した場合、引数 u_no で指定した装置番号が標準エラー出力ファイルと 接続されます。 -mu_no オプションを指定しない場合、システムの標準値である装置番号 0 が標準エラー出力ファ イルと接続されます。 u_no で指定した装置番号(システム標準値は 0)は、標準エラーファイルに結合されるため、環 境変数によってファイルと結合できません。環境変数に指定しても、無効となりますので、ご注 意ください。なお、端末以外に出力したいときは、リダイレクション機能を御使用ください。 装置番号とファイルの接続については、“3.8 実行時の環境変数”または“7.2 装置番号とファ イルの接続”を参照してください。 例:実行時オプション -m % a.out -Wl,-m10 -n 端末に対する促進メッセージの出力を制御します。 -n オプションを指定した場合、書式付き順番探査 READ 文、並びによる READ 文および変数群 READ 文を用いて標準入力ファイルからデータを入力するとき、端末に入力促進メッセージが出 力されます。 -n オプションを指定しない場合、書式付き順番探査 READ 文、並びによる READ 文および変数群 READ 文を用いて標準入力ファイルからデータを入力するとき、端末に入力促進メッセージは出 力されません。 例:実行時オプション -n % a.out -Wl,-n -pu_no 0 ≦ u_no ≦ 2147483647 標準出力ファイルと接続する装置番号を指定します。引数 u_no は、装置番号を表す 0 ~ 2147483647 の整数値です。 -pu_no オプションを指定した場合、引数 u_no で指定する装置番号が標準出力ファイルと接続され ます。 -pu_no オプションを指定しない場合、システム標準値である装置番号 6 が標準出力ファイルと接 続されます。 u_no で指定した装置番号(システム標準値は 6)は、標準出力ファイルに接続されるため、環境 変数によってファイルと接続できません。環境変数に指定しても、無効となりますので、ご注意 ください。なお、端末以外に出力したいときは、リダイレクション機能を御使用ください。 装置番号とファイルの接続については、“3.8 実行時の環境変数”または“7.2 装置番号とファ イルの接続”を参照してください。 Fortran 使用手引書ー Page 72 例:実行時オプション -p % a.out -Wl,-p10 -q -q オプションは、入出力文の出力文字を大文字にするか小文字にするかを指定します。書式付き 出力文の E 形編集、EN 形編集、ES 形編集、D 形編集、Q 形編集、G 形編集、L 形編集および Z 形編集で出力した文字、INQUIRE 文の問合せ指定子に返却される文字定数(NAME 指定子は除 く)の英字の出力文字が変更されます。 -q オプションを指定した場合、英大文字で出力されます。 -q オプションを指定しない場合、英小文字で出力されます。 なお、翻訳時オプション -X9 が有効な場合、書式付き出力文の E 形編集、EN 形編集、ES 形編集、 D 形編集、Q 形編集、G 形編集、L 形編集および Z 形編集で出力した文字、INQUIRE 文の問合せ 指定子に返却される文字定数(NAME 指定子は除く)は、大文字で出力されます。このため、-q オプションは意味をもちません。 例:実行時オプション -q % a.out -Wl,-q -ru_no 0 ≦ u_no ≦ 2147483647 標準入力ファイルと接続する装置番号を指定します。引数 u_no は、装置番号を表す 0 ~ 2147483647 の整数値です。 -ru_no オプションを指定した場合、引数 u_no で指定する装置番号が標準入力ファイルと接続され ます。 -ru_no オプションを指定しない場合、システム標準値である装置番号 5 が標準入力ファイルと接 続されます。 u_no で指定した装置番号(システム標準値は 5)は、標準入力ファイルに接続されるため、環境 変数によってファイルと接続できません。環境変数に指定しても、無効となりますので、ご注意 ください。なお、端末以外から入力したいときは、リダイレクション機能を御使用ください。 装置番号とファイルの接続については、“3.8 実行時の環境変数”または“7.2 装置番号とファ イルの接続”を参照してください。 例:実行時オプション -r % a.out -Wl,-r10 -tsec 1 ≦ sec ≦ 9999 プログラムを実行開始から打ち切るまでの時間を秒数で指定します。この時間は、CPU 時間です。 引数 sec は、打切り時間を秒単位で表す 1 ~ 9999 の整数値です。 たとえば、-t20 を指定した場合、20 秒(CPU 時間)が経過したら実行が打ち切られます。 例:実行時オプション -t % a.out -Wl,-t10 -u 浮動小数点アンダフローによるプログラム割込みを検出するかどうかを指示します。 翻訳時に -NRtrap オプションを指定し、実行時に -u オプションを指定した場合、浮動小数点アン ダフローによるプログラム割込みが検出され、実行時の診断メッセージ(jwe0012i-e)が出力され ます。翻訳時に -NRtrap オプションを指定しない場合、-u オプションを指定しても浮動小数点ア ンダフローによるプログラム割込みは検出されません。 Fortran 使用手引書ー Page 73 -u オプションを指定しない場合、浮動小数点アンダフローによるプログラム割込みは抑止され、 浮動小数点アンダフローがなかったものとして実行されます。 -u オプションを指定する場合は、-i オプションは指定できないので、注意してください。 例:実行時オプション -u % a.out -Wl,-u -x 書式付き入力文で数値編集を行うときに、入力欄の空白を無視するかまたは 0 として扱うかを指 定します。 -x オプションを指定した場合、事前に OPEN 文が実行されていない書式付き順番探査入力文で数 値編集を行うときに、入力欄の空白は 0 として扱われます。これは、OPEN 文の BLANK 指定子 で、ZERO を指定した場合と同じです。 -x オプションを指定しない場合、入力欄の空白は NULL として解釈され、無視されます。これは、 OPEN 文の BLANK 指定子で、NULL を指定するか、省略した場合と同じです。 例:実行時オプション -x % a.out -Wl,-x -C または -Cu_no 0 ≦ u_no ≦ 2147483647 書式なし入出力文において、IBM370 形式浮動小数点データのファイルを扱うかどうかを指定しま す。引数 u_no は、装置番号を表す 0 ~ 2147483647 の整数値です。引数 u_no を省略した場合、書 式なしファイルと接続しているすべての装置番号に対して有効となります。引数 u_no を指定した 場合、u_no と接続している装置番号に対して有効となります。u_no が書式付きのファイルと接続 している場合は効果がありません。 -C オプションを指定した場合、ファイルのデータが IBM370 形式浮動小数点データとみなされ、 書式なし入出力文において IBM370-IEEE 形式浮動小数点データの変換が行われます。 -C オプションを指定しない場合、ファイルのデータが IEEE 形式浮動小数点データとみなされ、書 式なし入出力文において IBM370-IEEE 形式浮動小数点データの変換は行われません。 なお、-C と -Cu_no を同時に指定した場合、-C が有効となります。 IBM370 形式浮動小数点データの入出力変換については、 “7.10 IBM370 形式 -IEEE 形式浮動小数 点データ入出力変換”を参照してください。 例:実行時オプション -C % a.out -Wl,-C10 -G または -Gu_no 0 ≦ u_no ≦ 2147483647 書式なし入出力文において、IBM370 EBCDIC の文字コードのデータファイルを取り扱うかどうか を指定します。引数 u_no は、装置番号を表す 0 ~ 2147483647 の整数値です。引数 u_no を省略し た場合、書式なしファイルと接続しているすべての装置番号に対して有効となります。u_no が、 書式付きのファイルと接続している場合は効果がありません。 -G オプションを指定した場合、IBM370 EBCDIC の文字コードのデータとみなされ、書式なし入 出力文において ASCII 文字コードへの変換が行われます。 -G オプションを指定しない場合、ASCII 文字コードのデータとみなされ、書式なし入出力文にお いてそのまま ASCII 文字コードへの変換は行われません。 なお、-G と -Gu_no が同時に指定された場合、-G が有効になります。 Fortran 使用手引書ー Page 74 IBM370 EBCDIC 文字データの入出力変換については、 “7.19 EBCDIC-ASCII 文字コード入出力変 換”を参照してください。 例:実行時オプション -G % a.out -Wl,-G10 -Lb -Lb オプションを指定すると、サービスルーチンの 4 バイトの論理型または論理型の引数および復 帰値が 8 バイトの論理型として扱われます。 例:実行時オプション -Lb % a.out -Wl,-Lb -Li -Li オプションを指定すると、サービスルーチンの 4 バイトの整数型または整数型の引数および復 帰値が 8 バイトの整数型として扱われます。 例:実行時オプション -Li % a.out -Wl,-Li -Lr -Lr オプションを指定すると、サービスルーチンの 4 バイトの実数型または実数型の引数および復 帰値が 8 バイトの実数型として扱われます。 例:実行時オプション -Lr % a.out -Wl,-Lr -Lu 入出力文で扱う Fortran 記録の大きさが 2G バイトを超える場合に指定します。本オプションは、 翻訳時オプション -KV9 が有効な場合、有効となります。 例:実行時オプション -Lu % a.out -Wl,-Lu -M IBM370-IEEE 形式浮動小数点データの変換時に仮数部のビットが損失した場合に、診断メッセー ジ(jwe0147i-w)を出力するかどうかを指定します。 -M オプションを指定した場合、IBM370-IEEE 形式浮動小数点データの変換によって仮数部のビッ トが損失したときに診断メッセージ(jwe0147i-w)が出力されます。 -M オプションを指定しない場合、診断メッセージ(jwe0147i-w)は出力されません。 例:実行時オプション -M % a.out -Wl,-M -Oi 入出力統計情報を出力します。入出力統計情報については、 “7.18 入出力統計情報”を参照して ください。 例:実行時オプション -Oi % a.out -Wl,-Oi -Q 書式付き入力文の一つの Fortran 記録を構成する欄の幅が、入力される Fortran 記録の長さより長 い場合、その Fortran 記録のうしろに入力欄の幅が必要とするだけの空白を論理的に詰めるかどう かを指示します。 Fortran 使用手引書ー Page 75 -Q オプションを指定した場合、事前に OPEN 文が実行されていない書式付き順番探査入力文にお いて、空白は詰められません。これは、OPEN 文の PAD 指定子で NO を指定した場合と同じです。 -Q オプションを指定しない場合は、論理的に空白が詰められます。これは、OPEN 文の PAD 指定 子で YES を指定するか、省略した場合と同じです。 例:実行時オプション -Q % a.out -Wl,-Q -Re このオプションを指定することにより、以下のエラー機能が抑止されます。 - 診断メッセージ、トレースバックマップ、エラー集計情報の出力 - ERRSET/ERRSTR サービスサブルーチンによるエラー項目の修正 - 利用者修正出口処理ルーチンの実行 エラーが発生した場合、Fortran システムの標準修正が行われ、実行が継続されます。 例:実行時オプション -Re % a.out -Wl,-Re -Rp 並列でプログラムが実行されたかどうかを通知する実行時の診断メッセージの出力を指示しま す。 -Rp オプションを指定した場合、翻訳時オプション -Kparallel を指定したプログラムが一度も並列 で実行されないとき、実行時の診断メッセージ(jwe1034i-w)が出力されます。 -Rp オプションを指定しない場合、実行時の診断メッセージ(jwe1034i-w)は出力されません。 例:実行時オプション -Rp % a.out -Wl,-Rp -Ry -Ry オプションを指定した場合、西暦年を下 2 けたで表示するサービスルーチン引用に対して、実 行時に診断メッセージが出力されます。西暦年を下 2 けたで表示するルーチンには、以下のもの があります。 - DATE サービスサブルーチン - JDATE サービス関数 ユーザプログラムで、返却値を単純に大小比較していると、誤動作する可能性がありますので、 プログラムでの考慮が必要になります。実行時オプション -Ry,-li を指定することにより、これら のルーチンを実行した場合に診断メッセージを出力することができます。なお、下 4 けたで西暦 年を通知するルーチンには、以下のものがあります。 - - - - - CTIME サービス関数 FDATE サービスサブルーチン IDATE サービスサブルーチン GETDAT サービスサブルーチン DATE_AND_TIME 組込みサブルーチン 例:実行時オプション -Ry % a.out -Wl,-Ry Fortran 使用手引書ー Page 76 -T または -Tu_no 0 ≦ u_no ≦ 2147483647 書式なし入出力文において、リトルエンディアンデータのファイルを入出力するときに指定しま す。引数 u_no は、装置番号を表す 0 ~ 2147483647 の整数値です。引数 u_no を省略した場合、書 式なしファイルと接続しているすべての装置番号に対して有効となります。引数 u_no を指定した 場合、u_no と接続している装置番号に対して有効となります。u_no が書式付きのファイルと接続 している場合は効果がありません。 -T オプションを指定した場合、書式なし入出力文において論理型データ、整数型データ、IEEE 浮 動小数点形式データがエンディアン変換されます。 -T と -Tu_no を同時に指定した場合、-T が有効となります。 リトルエンディアンデータの入出力変換については、 “7.11 エンディアン入出力変換”を参照し てください。 例:実行時オプション -T % a.out -Wl,-T10 3.4 実行コマンドの環境変数 利用者は、環境変数 FORT90L の値として実行時オプションを設定することができます。環境変数 FORT90L の中に設定された実行時オプションは、実行コマンドの起動時に有効となります。つね に指定する実行時オプションをあらかじめ環境変数 FORT90L の中に設定しておくと便利です。 ただし、環境変数 FORT90L に設定した実行時オプションは、実行コマンド行で無効にすることが できません。環境変数 FORT90L に設定した実行時オプションを無効にしたい場合は、環境変数 FORT90L の再設定が必要なので注意してください。 環境変数 FORT90L の中に設定された値は、実行コマンド行に指定されている実行時オプションの 最初に付加され処理されます。 環境変数 FORT90L の使用例を以下に示します。 例 1:FORT90L 1)FORT90L を使用したとき % setenv FORT90L '-Wl,-e99,-le' % a.out -Wl,-m99 -k 2)FORT90L を使用しないとき % a.out -Wl,-e99,-le,-m99 -k 1)と 2)は等価です。実行コマンド a.out を実行したとき、実行時オプション -e99,-le,-m99 お よび利用者定義のオプション -k が有効になります。 例 2: % setenv FORT90L '-Wl,-e10' % a.out -Wl,-e99 実行コマンド a.out を実行したとき、実行時オプション -e99 が有効になります。 3.5 実行時プロフィルファイル 実行時プロフィルファイル(/etc/opt/FSUNf90cp/jwe_prof)を設定することにより、実行時オプショ ンのデフォルトを変更することができます。 実行時プロフィルファイルは、以下の形式に従って作成してください。 Fortran 使用手引書ー Page 77 - 先頭から“#”で始まる行はコメント行とみなされるため、何を記述してもかまいません。 - 1 つの実行時オプションを複数行に渡って記述することはできません。 - 指定できる実行時オプションの形式は、“3.3 実行時オプション”で説明されている記述に 従わなければなりません。 以下に、実行時プロフィルファイルの指定例を示します。 #Default options -Wl,-x,-le 実行時オプションの指定の優先順位は、以下のように決定されます。 (1)実行コマンドのオペランド (2)環境変数 FORT90L (3)プロフィルファイル (4)標準値 3.6 実行コマンドの復帰値 以下に実行コマンドが設定する復帰コードを示します。 復帰コード 意味 0 プログラムは正常に終了しました。または、i レベル(警告) のエラーが発生しました。 4 w レベル(軽度)のエラーが発生しました。 8 e レベル(中度)のエラーが発生しました。 12 s レベル(重度)のエラーが発生しました。 16 w レベル、e レベルまたは s レベルのエラーの発生回数が打切 り回数に達しました。または、u レベル(異常)のエラーが発 生しました。 240 プログラムが異常終了しました。 上記以外 実行時オプション -a 指定により、プログラムが強制終了しま した。 3.7 実行コマンドの標準入出力および標準エラー出力 実行コマンドの標準入力、標準出力および標準エラー出力はそれぞれ Fortran 原始プログラムで扱 う装置番号と対応しています。以下に、対応を記述します。 標準入力 :装置番号 5 標準出力 :装置番号 6 標準エラー出力 :装置番号 0 3.8 実行時の環境変数 実行時に指定する環境変数について説明します。 fuxx filen 装置番号とファイルを接続するための環境変数です。 xx は装置番号です。filen には、接続するファイル名を指定します。 Fortran 使用手引書ー Page 78 装置番号とファイルを接続する方法については、 “7.2 装置番号とファイルの接続”を参照して ください。 この環境変数を使用して、標準入力、標準出力および標準エラー出力と接続される装置番号(実 行時オプション -r、-p、-m で指定した装置番号、システム標準である場合は 5、6、0)とは接続 できませんので、ご注意ください。これらの装置番号とファイルを結合したいときは、リダイレ クション機能を御使用ください。 以下に、装置番号 10 と data.file というファイルを指定する例を示します。 % setenv fu10 data.file この指定により、実行時に装置番号 10 と data.file が接続されます。 fuxxbf size 順番探査入出力文または直接探査入出力文を実行したときに使用される入出力作業域の大きさを 装置番号ごとに指定するための環境変数です。 xx は装置番号です。size は、順番探査入出力では K バイト単位、直接探査入出力では Fortran 記録 数を単位として指定します。指定可能な値は、順番探査入出力では 1 ≦ size、直接探査入出力で は 1 ≦ size ≦ 32767 です。Fortran システムの省略値は、書式つき順番探査入出力では 8K バイト、 書式なし順番探査入出力では 1M バイト、直接探査入出力では 4K バイトです。 以下に、順番探査入出力で使用する入出力作業域の大きさと直接探査入出力で使用する入出力作 業域の大きさを指定する例を記述します。 例 1:順番探査入出力の場合 装置番号 10 に対して、順番探査入出力文が実行されるとき、64K バイトの入出力作業域が使 用されます。 % setenv fu10bf 64 例 2:直接探査入出力の場合 装置番号 10 に対して、直接探査入出力文が実行されるとき、50 個の Fortran 記録が 1 個のブ ロッキングとして扱われ、OPEN 文の RECL 指定子の値の 50 倍の大きさの入出力作業域が使 用されます。 % setenv fu10bf 50 FLIB_IOBUFCPY I/O バッファ並列転送を行うための環境変数です。環境変数 FLIB_IOBUFCPY に MP を指定したと きのみ有効になります。 以下に、環境変数 FLIB_IOBUFCPY の指定例を示します。 % setenv FLIB_IOBUFCPY MP 環境変数 FLIB_IOBUFCPY に MP 以外を指定した場合、I/O バッファ並列転送は行われません。I/O バッファ並列転送についての詳細は、“12.4 I/O バッファ並列転送”を参照してください。 FLIB_IOBUFCPY_SIZE size I/Oバッファ並列転送を行うための条件を変更する環境変数です。環境変数FLIB_IOBUFCPY_SIZE に size を指定したとき、データの転送量および入出力作業域が sizeK バイト以上の場合、書式な し入出力文において並列転送が実行されます。size の指定は K バイト単位で、1 ≦ size の値が指 定できます。 以下に、環境変数 FLIB_IOBUFCPY_SIZE の指定例を示します。 % setenv FLIB_IOBUFCPY_SIZE 16 Fortran 使用手引書ー Page 79 I/O バッファ並列転送についての詳細は、“12.4 I/O バッファ並列転送”を参照してください。 FLIB_PARALLEL_INFO { 1 | 2 } 並列実行情報を出力するための環境変数です。 以下に、環境変数 FLIB_PARALLEL_INFO の指定例を示します。 % setenv FLIB_PARALLEL_INFO 1 並列実行情報についての詳細は、“12.5 並列実行情報”を参照してください。 IOINF file 入出力統計情報をファイルに出力するための環境変数です。file には、ファイル名を指定します。 以下に、info.file というファイルを指定する例を示します。 % setenv IOINF info.file この指定があり、実行時オプション -Oi を指定して実行したとき、入出力統計情報が info.file に出 力されます。入出力統計情報の詳細については、 “7.18 入出力統計情報”を参照してください。 第 4 章 Fortran システムの出力情報 この章では、Fortran 言語で記述されたプログラムの翻訳および実行において、本システムが出力 する情報について説明します。 4.1 翻訳時の出力情報 ここでは、翻訳時の出力情報について説明します。 4.1.1 翻訳時の診断メッセージ Fortranプログラムの翻訳時にfrtコマンドおよびFortranコンパイラが出力する情報として診断メッ セージがあります。診断メッセージは、frt コマンド行に指定された各種のオペランドに誤りがあ る場合、入力原始プログラム中に誤りがある場合、利用者に通知すべき有用な情報がある場合、 および誤りではないが注意すべき事項がある場合に出力されます。 frt コマンドが出力する診断メッセージの形式を以下に示します。 frt:メッセージ本文 Fortran コンパイラが出力する診断メッセージの形式を以下に示します。 jwdxxxxi-y ファイル名 行番号 けた位置 メッセージ本文 jwdxxxxi-y jwd xxxx i y :Fortran コンパイラのメッセージを表します。 :メッセージの通し番号を表します。 :固定で常に出力されます。 :i、w、s または u の英字のうちどれかであり、メッセージのエラーレベルおよび復帰コー ドを表します。 y 復帰コード エラーではないが注意を促すメッセージです。 i w 0 s 1 u エラーレベルの意味 軽度のエラーを示すメッセージであり、システムは処理を続 行します。 重度のエラーを示すメッセージであり、システムはエラーの 文を無視し、その他の文については処理を続行します。 致命的なエラーを示すメッセージであり、システムは処理を 打ち切ります。 ファイル名 エラーが発生した原始プログラムのファイル名を表示します。 行番号 エラーが発生した原始プログラムの行番号を表示します。 Fortran 使用手引書ー Page 81 けた位置 必要に応じて、エラーが発生した原始プログラムの、行内のけた位置を表示します。 メッセージ本文 利用者環境でのメッセージ種別に従い、英語または日本語のどちらかでメッセージ本文を出力し ます。英語の場合、翻訳時オプションにより長文または短文のどちらかでメッセージ本文を出力 することができます。 4.1.2 翻訳情報出力 ここでは、翻訳情報について説明します。 4.1.2.1 翻訳情報出力のオプション 翻訳時オプション -Q を指定することにより、翻訳情報を得ることができます。 翻訳情報は .lst ファ イルに出力されます。Fortran 原始プログラムを複数ファイル指定した場合には、最初のファイル 名 .lst ファイルに出力されます。また、サブオプションを指定することにより、翻訳情報を制御す ることができます。以下にオプションの指定とその意味を示します。 -Q :原始プログラムリスト、エラーメッセージを出力します。 -Qa :翻訳時オプション -Q での出力に加えて、名前の属性情報も出力します。 -Qd :翻訳時オプション -Q での出力に加えて、構造型の構成情報も出力します。 -Qi :翻訳時オプション -Q での出力に加えて、インクルードされたファイルのプログラムリ スト、インクルードファイル名一覧も出力します。 -Qm :翻訳時オプション -Qp での出力に加えて、自動並列化の状況を OpenMP ディレクティ ブおよび節によって表現した原始プログラムを出力します。 本機能によって出力される OpenMP ディレクティブおよび節には、入力ファイルにす でに記述されていたディレクティブおよび節と区別するために!FRTが最後に付加され ます。 なお、自動並列化の状況を OpenMP ディレクティブおよび節で正確に表現できない場 合、“!$OMP”ではなく“!!!!! PARALLEL INFO:”で始まる行が出力されます。その行 には、自動並列化と同時に行われた最適化の情報が付加されることがあります。 本機能によって出力されるOpenMPディレクティブおよび節の種類を以下に示します。 - PARALLEL DO - FIRSTPRIVATE(var_name,...) - LASTPRIVATE(var_name,...) - PRIVATE(var_name,...) - REDUCTION(+:var_name) - REDUCTION(-:var_name) - REDUCTION(*:var_name) - REDUCTION(MAX:var_name) - REDUCTION(MIN:var_name) - REDUCTION(.OR.:var_name) - REDUCTION(.AND.:var_name) Fortran 使用手引書ー Page 82 -Qofile “!!!!! PARALLEL INFO:”で始まる行に出力される情報の種類を以下に示します。 - LOOP INTERCHANGED ループ交換が行われたことを意味します。 - LOOP FUSED ループ融合が行われたことを意味します。 - LOOP SPLIT ループ分割が行われたことを意味します。 - COLLAPSED ループが一重化されたことを意味します。 - OTHER METHODS 上記以外の要因により、自動並列化の状況を OpenMP ディレクティブおよび節で 正確に表現できないことを意味します。 主な要因を以下に示します。 ・ DO ループ以外である。 ・ 誘導変数(ループの回転に伴って一定値ずつ増加または減少する、DO 変数 以外の変数)を含むループである。 ・ 構造型の変数を含むループである。 ・ ループ内で添字が不変な配列要素への定義を含むループである。 ・ リダクション演算の対象変数が、ループ内で添字が不変な配列要素である。 ・ ループの初期値、終値、増分値が、配列要素や関数引用などを含んでいる。 - UNKNOWN VARIABLE(var_name) OpenMPディレクティブおよび節の種別を正確に判断できなかった変数を意味し ます。 主な要因を以下に示します。 ・ 最適化の対象変数のため、OpenMP ディレクティブおよび節の種別を正確に 判断できない変数 ・ 複素数型の変数 なお、 “!!!!! PARALLEL INFO:”で出力される上記の情報を参考にして、利用者がプロ グラムを書き換えることにより、該当ループを容易に OpenMP 化することができます。 使用する際の注意事項を以下に示します。 - -P オプションによって生成されたファイルに対して、-Qm オプションを指定し て翻訳した場合、前処理を行う前のファイル名に対して .omp が付加されたファ イルが作成されます。 例: % frt -P file.F95 file.cpp.f95 が生成されます。 % frt -Qm -Kparallel file.cpp.f95 OpenMP ディレクティブが挿入されたファイルとして file.omp.F95 が生成さ れます。 - MAX や MIN という名前をもつ変数やプログラム単位が存在する原始プログラム の場合、REDUCTION([MAX | MIN ]:var_name) という OpenMP ディレクティブが 生成されると、その原始プログラムは S レベルのエラーとなり翻訳することが できません。その際には、MAX や MIN という名前を使用しないように原始プロ グラムを修正してください。 - 最適化の影響により、自動並列化された場合でも、OpenMP ディレクティブや “!!!!! PARALLEL INFO:”で始まる行が出力されない場合があります。 :file に指定されたファイル名に翻訳情報を出力します。 Fortran 使用手引書ー Page 83 -Qp -Qt :翻訳時オプション -Q での出力に加えて、最適化情報も出力します。 以下に表示記号についての意味を説明します。なお、OpenMP 仕様によって並列化な どを指示された文についての出力は、 “12.3.1.1.2 OpenMP Fortran プログラムの最適化 情報の表示”を参照してください。 DO 文または配列演算に対する表示記号 p :並列化されたことを示します。 m :並列化された部分とされなかった部分があることを示します。 s :並列化されなかったことを示します。 空白 :DO 文または配列演算が並列化の対象でないことを示します。 上記以外に対する表示記号 p :並列化されたことを示します。 ただし、DO 文に対する表示記号が s の場合、コンパイラは並列化効果が得 られないと判断し、並列化を行いませんが、並列化可能であったことを意味 します。 m :並列化された部分とされなかった部分があることを示します。 ただし、DO 文に対する表示記号が s の場合、コンパイラは並列化効果が得 られないと判断し、並列化を行いませんが、並列化可能であった部分と不可 能であった部分があったことを意味します。 s :並列化されなかったことを示します。 空白 :DO 文または配列演算が並列化の対象でないことを示します。 共通な表示記号 i :インライン展開されたことを示します。 u :アンローリングされたことを示します。 :翻訳時オプション -Qp での出力に加えて、より詳細な最適化情報および統計情報を出 力します。本機能で出力する内容は、ループ単位に出力する最適化情報や文単位で出 力する並列化次元情報および手続ごとに、その手続の 1 回の引用で消費されるスタッ クの大きさを大まかに出力する統計情報があります。 1) ループごとに出力する情報を以下に示します。 a) 自動並列化に関する情報を表示 - Standard iteration count : N :ループの繰返し数が、N 以上のときは並列実行 し、N 未満のときは逐次実行することを意味し ます。 b) ループに対して行った最適化情報を表示 - INTERCHANGED :ループ交換されたことを意味します。 - FUSED :ループ融合が行われたことを意味します。 - SPLIT :ループ分割が行われたことを意味します。 - COLLAPSED :ループが一重化されたことを意味します。 - SOFTWARE PIPELINING :ループに対しソフトウェアパイプラインされた ことを意味します。 :ループストライピングされたことを意味します。 - STRIPING - MULTI-OPERATION FUNCTION :マルチ関数化された関数を含むことを 意味します。 - PATTERN MATCHING(matmul) :ループをライブラリ呼出し(matmul) に変換したことを意味します。 - PATTERN MATCHING(memcpy) :代入文をライブラリ呼出し(memcpy) に変換したことを意味します。 c) prefetch 命令に関する情報を表示 - PREFETCH : N :ループ中に存在する prefetch 命令の個数を示します。 - 変数名 : N,... :変数ごとの prefetch 命令の個数を示します。 - OTHER PREFETCH : コンパイラが内部的に生成した変数に対しての prefetch 命令の個数を示します。 Fortran 使用手引書ー Page 84 -Qx 2) 文ごとに出力する詳細情報を以下に示します。 a) 並列化次元 p:並列化されたループの次元を示します。 3) 統計情報に出力する詳細情報を以下に示します。 a) 手続ごとに、その手続の 1 回の引用で消費されるスタックの大きさを 出力します。 注意事項を以下に示します。 - 内部手続で使用するスタックの大きさは、親手続に含めて表示されます。 - 以下のデータは、スタックに割付けられますが、その大きさは、本機能の出 力には含まれません。 ・ THREADPRIVATE 指示文に指定されたデータ ・ -Nautoobjstack オプションが有効な場合の自動割付けデータ b) 手続ごとの prefetch 命令の個数を示します。 :翻訳時オプション -Q での出力に加えて、名前および文番号の相互参照情報も出力され ます。 これらのサブオプションは、-Qa,ofile,x のようにコンマで区切って指定することができます。 Fortran 使用手引書ー Page 85 4.1.2.2 翻訳情報の出力形式 翻訳時オプション -Q を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 15:34:35 2006 Compilation information Current directory : /home/fujitsu Source file : sample.f95 Option information Command line options : -Q Effective options : -fi -A2 -Ar -Free -O2 -Q -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Knofuse -Knohardbarrier -Knoilfunc -Knolargepage -Knoloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Knotiling -Kunroll -KNOOMP -Knothreadsafe -Knoparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Main program "check" (line-no.)(nest) 1 program check 2 integer,dimension(10,10) :: a = 0 3 interface 4 subroutine sub(i,j,a) 5 integer,dimension(:,:) :: a 6 end subroutine 7 end interface 8 1 do i=1,10 9 2 do j=mod(i,2)+1,10,2 10 2 call sub(i,j,a) 11 2 end do 12 1 end do 13 write (*,"(10i3)") (a(:,i),i=1,10) 14 end program Procedure information Lines : 14 Statements : 14 External subroutine subprogram "sub" (line-no.)(nest) 15 16 subroutine sub(i,j,a) Fortran 使用手引書ー Page 86 17 18 19 integer,dimension(:,:) :: a a(i,j) = 1 end subroutine Procedure information Lines : 5 Statements : 4 Total information Procedures : 2 Total lines : 19 Total statements : 18 診断メッセージが出力された場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 15:42:03 2006 Compilation information Current directory : /home/fujitsu Source file : error.f95 Option information Command line options : -Q Effective options : -fi -A2 -Ar -Free -O2 -Q -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Knofuse -Knohardbarrier -Knoilfunc -Knolargepage -Knoloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Knotiling -Kunroll -KNOOMP -Knothreadsafe -Knoparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Main program "error" (line-no.)(nest) 1 program error 2 1 do 10 i=1,3 3 2 do 20 j=1,3 4 2 call sub(i*j) 5 2 10 enddo 6 1 end program Diagnostic messages: program name(error) jwd1027i-s "error.f95", line 3: 文番号 ' 20' は定義されていません . jwd1131i-s "error.f95", line 3, column 10: DO 構文 ,IF 構文または CASE 構文の入れ 子が正しくありません . Fortran 使用手引書ー Page 87 Procedure information Lines : 6 Statements : 6 External subroutine subprogram "sub" (line-no.)(nest) 7 8 subroutine sub(i) 9 integer,intent(in) :: i 10 print *,i() 11 end subroutine Diagnostic messages: program name(sub) jwd2008i-i "error.f95", line 8: この仮引数 'i' は , 副プログラム中で使用されてい ません . jwd1771i-s "error.f95", line 10, column 18: 'i' は , すでに INTENT 属性をもつので 指定できません . Procedure information Lines : 5 Statements : 4 Total information Procedures : 2 Total lines : 11 Total statements : 10 Fortran 使用手引書ー Page 88 翻訳時オプション -Qi を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 15:53:52 2006 Compilation information Current directory : /home/fujitsu Source file : inc.f95 Option information Command line options : -Qi Effective options : -fi -A2 -Ar -Free -O2 -Qi -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Knofuse -Knohardbarrier -Knoilfunc -Knolargepage -Knoloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Knotiling -Kunroll -KNOOMP -Knothreadsafe -Knoparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Module "mod" (inc)(line-no.)(nest) 1 module mod 2 character(len=15) cc 3 end module Procedure information Lines : 3 Statements : 3 Main program "include" (inc)(line-no.)(nest) 4 5 program include 6 include "inc1" 1 1 use mod,only:cc 7 call init() 8 print *,cc 9 end program Procedure information Lines : 7 Statements : 5 External subroutine subprogram "init" (inc)(line-no.)(nest) 10 11 subroutine init() Fortran 使用手引書ー Page 89 2 1 2 1 1 2 13 14 Procedure information Lines : 8 Statements : 4 Total information Procedures : 3 Total lines : 18 Total statements : 12 Include file name list 1 : ./inc1 2 : ./inc2 include "inc2" include "inc1" use mod,only:cc cc = "Fujitsu Fortran" end subroutine Fortran 使用手引書ー Page 90 翻訳時オプション -Qp を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 16:11:48 2006 Compilation information Current directory : /home/fujitsu Source file : psample.f95 Option information Command line options : -Qp -Kparallel -xEffective options : -fi -A2 -Ar -Free -O3 -Qp -X9 -x-KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Kfuse -Knohardbarrier -Knoilfunc -Knolargepage -Kloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Ktiling=40 -Kunroll -KNOOMP -Knothreadsafe -Kparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Main program "main" (line-no.)(nest)(optimize) 1 integer,parameter ::n=10000 2 real,dimension(n,n)::a 3 1 p u do i=1,n 4 2 p u do j=1,n 5 2 piu a(i,j) = a(i,j) * func(i) 6 2 p u enddo 7 1 p enddo 8 end Diagnostic messages: program name(main) jwd8211i-i "psample.f95", line 3: ループを入れ換えました .( 行 :4) Procedure information Lines : 8 Statements : 8 External function subprogram (line-no.)(nest)(optimize) 9 10 11 12 Procedure information Lines : 4 "func" function func(i) func=i+1 end Fortran 使用手引書ー Page 91 Statements : 3 Total information Procedures : 2 Total lines : 12 Total statements : 11 Fortran 使用手引書ー Page 92 翻訳時オプション -Qx を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 16:16:36 2006 Compilation information Current directory : /home/fujitsu Source file : xref.f95 Option information Command line options : -Qx Effective options : -fi -A2 -Ar -Free -O2 -Qx -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Knofuse -Knohardbarrier -Knoilfunc -Knolargepage -Knoloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Knotiling -Kunroll -KNOOMP -Knothreadsafe -Knoparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Module "complex" (line-no.)(nest) 1 module complex 2 type type1 3 sequence 4 real :: r_part 5 real :: i_part 6 end type type1 7 interface operator(+) 8 module procedure plus 9 end interface 10 private plus 11 contains 12 type(type1) function plus(op1,op2) 13 type(type1),intent(in) :: op1,op2 14 plus%r_part = op1%r_part + op2%r_part 15 plus%i_part = op1%i_part + op2%i_part 16 end function plus 17 end module Procedure information Lines : 17 Statements : 17 Scoping unit of module : complex Cross reference of name complex Fortran 使用手引書ー Page 93 |(Class and Type) |(Declaration) |(Definition) |(Reference) plus |(Class and Type) |(Declaration) |(Definition) |(Reference) type1 |(Class and Type) |(Declaration) |(Definition) |(Reference) [OPERATOR(+)] |(Class and Type) |(Declaration) |(Definition) |(Reference) : module name : 1 : : : module function name, TYPE(type1) : 8 10 : : : type name : : 2 : : user defined operator : 7 : : Scoping unit of module sub-program : plus Cross reference of name op1 |(Class and Type) : variable name, TYPE(type1) |(Declaration) : 12 13 |(Definition) : |(Reference) : 14 15 op2 |(Class and Type) : variable name, TYPE(type1) |(Declaration) : 12 13 |(Definition) : |(Reference) : 14 15 plus |(Class and Type) : variable name, TYPE(type1) |(Declaration) : |(Definition) : 14 15 |(Reference) : plus |(Class and Type) : module function name, TYPE(type1) |(Declaration) : |(Definition) : 12 |(Reference) : 16 type1 |(Class and Type) : type name |(Declaration) : |(Definition) : |(Reference) : 12 13 Main program "main" (line-no.)(nest) 18 19 program main 20 use complex Fortran 使用手引書ー Page 94 21 22 23 24 25 type(type1) cpx1, cpx2, result read (*,*) cpx1, cpx2 result = cpx1 + cpx2 print *,result end program main Procedure information Lines : 8 Statements : 7 Scoping unit of program : main Cross reference of name complex |(Class and Type) : module name |(Declaration) : |(Definition) : |(Reference) : 20 cpx1 |(Class and Type) : variable name, TYPE(type1) |(Declaration) : 21 |(Definition) : 22 |(Reference) : 23 cpx2 |(Class and Type) : variable name, TYPE(type1) |(Declaration) : 21 |(Definition) : 22 |(Reference) : 23 main |(Class and Type) : program name |(Declaration) : 19 |(Definition) : |(Reference) : 25 result |(Class and Type) : variable name, TYPE(type1) |(Declaration) : 21 |(Definition) : 23 |(Reference) : 24 type1 |(Class and Type) : type name |(Declaration) : |(Definition) : |(Reference) : 21 [OPERATOR(+)] |(Class and Type) : user defined operator |(Declaration) : |(Definition) : |(Reference) : 23 Total information Procedures : 2 Total lines : 25 Total statements : 24 Fortran 使用手引書ー Page 95 翻訳時オプション -Qa,x を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 16:26:56 2006 Compilation information Current directory : /home/fujitsu Source file : xref.f95 Option information Command line options : -Qa,x Effective options : -fi -A2 -Ar -Free -O2 -Qa,x -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Knofuse -Knohardbarrier -Knoilfunc -Knolargepage -Knoloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Knotiling -Kunroll -KNOOMP -Knothreadsafe -Knoparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Module "complex" (line-no.)(nest) 1 module complex 2 type type1 3 sequence 4 real :: r_part 5 real :: i_part 6 end type type1 7 interface operator(+) 8 module procedure plus 9 end interface 10 private plus 11 contains 12 type(type1) function plus(op1,op2) 13 type(type1),intent(in) :: op1,op2 14 plus%r_part = op1%r_part + op2%r_part 15 plus%i_part = op1%i_part + op2%i_part 16 end function plus 17 end module Procedure information Lines : 17 Statements : 17 Scoping unit of module : complex Attribute and Cross reference of name complex Fortran 使用手引書ー Page 96 |(Class and Type) |(Attributes) |(Declaration) |(Definition) |(Reference) plus |(Class and Type) |(Attributes) |(Declaration) |(Definition) |(Reference) type1 |(Class and Type) |(Attributes) |(Declaration) |(Definition) |(Reference) [OPERATOR(+)] |(Class and Type) |(Attributes) |(Declaration) |(Definition) |(Reference) : module name : : 1 : : : module function name, TYPE(type1) : PUBLIC : 8 10 : : : type name : PUBLIC : : 2 : : user defined operator : PUBLIC : 7 : : Scoping unit of module sub-program : plus Attribute and Cross reference of name op1 |(Class and Type) : variable name, TYPE(type1) |(Attributes) : INTENT(IN), dummy-argument |(Declaration) : 12 13 |(Definition) : |(Reference) : 14 15 op2 |(Class and Type) : variable name, TYPE(type1) |(Attributes) : INTENT(IN), dummy-argument |(Declaration) : 12 13 |(Definition) : |(Reference) : 14 15 plus |(Class and Type) : variable name, TYPE(type1) |(Attributes) : result-value |(Declaration) : |(Definition) : 14 15 |(Reference) : plus |(Class and Type) : module function name, TYPE(type1) |(Attributes) : |(Declaration) : |(Definition) : 12 |(Reference) : 16 type1 |(Class and Type) : type name |(Attributes) : host-associated Fortran 使用手引書ー Page 97 |(Declaration) |(Definition) |(Reference) : : : 12 13 Main program "main" (line-no.)(nest) 18 19 program main 20 use complex 21 type(type1) cpx1, cpx2, result 22 read (*,*) cpx1, cpx2 23 result = cpx1 + cpx2 24 print *,result 25 end program main Procedure information Lines : 8 Statements : 7 Scoping unit of program : main Attribute and Cross reference of name complex |(Class and Type) : module name |(Attributes) : |(Declaration) : |(Definition) : |(Reference) : 20 cpx1 |(Class and Type) : variable name, TYPE(type1) |(Attributes) : |(Declaration) : 21 |(Definition) : 22 |(Reference) : 23 cpx2 |(Class and Type) : variable name, TYPE(type1) |(Attributes) : |(Declaration) : 21 |(Definition) : 22 |(Reference) : 23 main |(Class and Type) : program name |(Attributes) : |(Declaration) : 19 |(Definition) : |(Reference) : 25 result |(Class and Type) : variable name, TYPE(type1) |(Attributes) : |(Declaration) : 21 |(Definition) : 23 |(Reference) : 24 type1 |(Class and Type) : type name |(Attributes) : use-associated Fortran 使用手引書ー Page 98 |(Declaration) |(Definition) |(Reference) [OPERATOR(+)] |(Class and Type) |(Attributes) |(Declaration) |(Definition) |(Reference) Total information Procedures : 2 Total lines : 25 Total statements : 24 : : : 21 : user defined operator : use-associated : : : 23 Fortran 使用手引書ー Page 99 翻訳時オプション -Qd を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 16:32:55 2006 Compilation information Current directory : /home/fujitsu Source file : xref.f95 Option information Command line options : -Qd Effective options : -fi -A2 -Ar -Free -O2 -Qd -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Knofuse -Knohardbarrier -Knoilfunc -Knolargepage -Knoloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Knotiling -Kunroll -KNOOMP -Knothreadsafe -Knoparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave Module "complex" (line-no.)(nest) 1 module complex 2 type type1 3 sequence 4 real :: r_part 5 real :: i_part 6 end type type1 7 interface operator(+) 8 module procedure plus 9 end interface 10 private plus 11 contains 12 type(type1) function plus(op1,op2) 13 type(type1),intent(in) :: op1,op2 14 plus%r_part = op1%r_part + op2%r_part 15 plus%i_part = op1%i_part + op2%i_part 16 end function plus 17 end module Procedure information Lines : 17 Statements : 17 Scoping unit of module : complex Derived type construction type1 Fortran 使用手引書ー Page 100 | (Attributes) : SEQUENCE |r_part | (Type and Attributes) : REAL(4) |i_part | (Type and Attributes) : REAL(4) Scoping unit of module sub-program : plus Main program "main" (line-no.)(nest) 18 19 program main 20 use complex 21 type(type1) cpx1, cpx2, result 22 read (*,*) cpx1, cpx2 23 result = cpx1 + cpx2 24 print *,result 25 end program main Procedure information Lines : 8 Statements : 7 Scoping unit of program : main Total information Procedures : 2 Total lines : 25 Total statements : 24 Fortran 使用手引書ー Page 101 翻訳時オプション -Kparallel=3 -Qm を指定した場合に出力される(.omp. ファイル)例 subroutine sub(n) real,dimension(10000) :: a real,dimension(10000,100) :: c,d real::rres=0.0 a = 1.0 d = 2.0 c = 3.0 !$OMP PARALLEL DO REDUCTION(MAX:rres) !FRT do i=1,n if (rres<a(i)) rres = a(i) end do !$OMP PARALLEL DO PRIVATE(i) !FRT do j=1,n do i=1,100 c(i,j) = c(i,j) + d(i,j) end do end do !!!!! PARALLEL INFO: LOOP INTERCHANGED !!!!! PARALLEL INFO: LOOP COLLAPSED do i=1,10000 do j=1,100 d(i,j) = d(i,j) + c(i,j) end do end do write(6,*) rres end Fortran 使用手引書ー Page 102 翻訳時オプション -Kparallel -Qt を指定した場合の出力例を以下に示します。 Fujitsu Fortran Version 7.0 Wed Aug 23 17:05:42 2006 Compilation information Current directory : /home/fujitsu Source file : detaillst.f95 Option information Command line options : -Kparallel -Qt Effective options : -fi -A2 -Ar -Free -O3 -Qp,t -X9 -x0 -KV8 -KNOVIS -KULTRA2 -KNOFMADD -Knoauto -Knobcopy -Knodalign -Knoeval -Knofrecipro -Knofsimple -Kfuse -Knohardbarrier -Knoilfunc -Knolargepage -Kloop -Knons -Knomfunc -Knoocl -Knopreex -Knoprefetch -Kprefetch_noinfer -Kprefetch_nostrong -Knostriping -Ktiling=40 -Kunroll -KNOOMP -Knothreadsafe -Kparallel -Knoarray_private -Knoreduction -Knomregion_extension -Nnoallextput -Nnoautoobjstack -Nnocalleralloc -Nnocompdisp -Nnocopyarg -Nfreealloc -Nf90move -Nf95 -Nnomallocfree -Nnoobsfun -NRnotrap -Nnorecursive -Nnosave External subroutine subprogram "sub" (line-no.)(nest)(optimize) 1 subroutine sub(a,b,c,n) 2 implicit none 3 integer(kind=4) :: n 4 real(kind=8),dimension(n,n) :: a,b 5 real(kind=8) :: c 6 integer(kind=4) :: i,j <<< Loop-information Start >>> <<< [PARALLELIZATION] <<< Standard iteration count: 6 <<< [OPTIMIZATION] <<< INTERCHANGED <<< Loop-information End >>> 7 1 p do i=2,n <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< INTERCHANGED <<< Loop-information End >>> 8 2 pp u do j=2,n 9 2 p u a(i,j) = a(i,j) + b(i,j) * c 10 2 p u enddo 11 1 p enddo 12 end Fortran 使用手引書ー Page 103 Diagnostic messages: program name(sub) jwd8211i-i "detaillst.f95", line 7: ループを入れ換えました .( 行 :8) Procedure information Lines : 12 Statements : 12 Stack(byte): 64 Prefetch num: 0 Total information Procedures : 1 Total lines : 12 Total statements : 12 Total stack(byte): 64 Total prefetch num: 0 4.2 実行時の出力情報 Fortran プログラムを実行すると、以下の情報が出力されます。 - - - - - - 出力文による印刷情報 PAUSE 文または STOP 文によるメッセージ 診断メッセージ トレースバックマップ エラー集計情報 デバッグ機能の出力情報 ここでは、Fortran プログラムの実行時にエラーが起こったときに出力される診断メッセージ、ト レースバックマップおよびエラー集計情報について説明します。その他の出力情報については、 それぞれの項目を参照してください。出力文については“7.7 入出力文の使用方法” 、PAUSE 文 および STOP 文については“6.5.6 PAUSE 文”および“6.5.7 STOP 文”、デバッグ機能について は“8.2 デバッグのための機能”を参照してください。 4.2.1 実行時の診断メッセージ 診断メッセージは、Fortran プログラムの実行中に、PAUSE 文および STOP 文が実行されたときま たはエラーが検出されたときに出力されます。 診断メッセージは以下の形式で出力されます。 jwexxxxt-y 付加情報 メッセージ本文 jwexxxxt-y jwe :Fortran プログラムの実行時に出力されるメッセージを示します。 xxxx :メッセージ番号を表します。 t :i または a が出力されます。i は応答不要なメッセージを表します。また、a は応答が必要 なメッセージを表し、PAUSE 文が実行された場合にだけ出力されます。PAUSE 文につい ては“6.5.6 PAUSE 文”を参照してください。 y :i、w、e、s または u のどちらかの英字であり、診断メッセージのレベルを表します。診断 メッセージのレベルは以下の意味をもっています。 Fortran 使用手引書ー Page 104 診断メッセージのレベルの意味 y i エラーではありません。注意を促しています。 w 軽度のエラーが発生したことを示します。実行は続行されます。 e 中度のエラーが発生したことを示します。エラーが発生した文は無視さ れます。標準は 10 回エラーが発生すると、実行が打ち切られます。 s 重度のエラーが発生したことを示します。エラーが発生した文は無視さ れます。標準は 1 回エラーが発生すると、実行が打ち切られます。 u 実行が続行できないような致命的なエラーが発生したことを示します。 実行は打ち切られます。 付加情報 必要に応じてエラーが発生した原始プログラムの行番号を表示します。 メッセージ本文 エラーの内容を表す英文が出力されます。 4.2.2 トレースバックマップ トレースバックマップは、エラー制御表にトレースバックマップを印刷するという指定がある場 合に、診断メッセージの直後に出力されます。トレースバックマップの情報は、主プログラムか らエラーが発生したプログラム単位までの呼出し関係を出力します。ただし、例外ハンドリング の処理が行われた場合、トレースバックマップの情報が正しく出力されない場合がありますので ご注意ください。なお、エラー制御表については、 “8.1 エラー制御”、例外ハンドリングについ ては、 “8.1.7 例外ハンドリングエラーの処理”および“8.2.2 異常終了プログラムのデバッグ”、 翻訳時オプション -A0 については、“2.2 翻訳時オプション”を参照してください。 error occurs at name1 at name2 at name3 at name1 name1 line s1 loc wwwwwwww offset xxxxxxxx loc yyyyyyyy called from loc zzzzzzzz in name2 loc yyyyyyyy called from loc zzzzzzzz in name3 loc yyyyyyyy called from o.s line s2 line s2 :エラーが発生したプログラム単位の入口名または組込み関数名です。各プログラ ム名が不定の場合、'????????' が表示されます。 name2 : name1 を呼び出したプログラム単位の入口名または組込み関数名です。各プログ ラム名が不定の場合、'????????' が表示されます。 name3 :主プログラムの名前です。o.s は、制御プログラムを表わしています。各プログ ラム名が不定の場合、'????????' が表示されます。 s1 :エラーが発生した文の行番号です。翻訳時オプション -A0 を指定した場合、出力 されません。 s2 :各プログラム単位を呼び出している文の行番号です。翻訳時オプション -A0 を指 定した場合、出力されません。 wwwwwwww :エラーが発生した文の絶対番地が 16 進数で表示されています。 xxxxxxxx :エラーが発生した文のプログラム単位の先頭からの相対番地が16進数で表示され ています。不定の場合は、表示されません。 yyyyyyyy :各プログラム単位の先頭の絶対番地が 16 進数で表示されています。不定の場合 は、'00000000' が表示されます。 zzzzzzzz :各プログラム単位を呼び出している文の絶対番地が 16 進数で表示されています。 不定の場合は、'00000000' が表示されます。 Fortran 使用手引書ー Page 105 name1、name2 および name3 は、原始プログラムで記述した手続名を以下の加工した名前で表示さ れます。 手続の種類 主プログラム 加工名 MAIN_ _ 主プログラムの内部副プログラム 主プログラム名 . 内部副プログラム名 _ 外部副プログラム 外部副プログラム名 _ 外部副プログラムの内部副プログラム 外部副プログラム名 . 内部副プログラム名 _ モジュール副プログラム モジュール名 . モジュール副プログラム名 _ モジュール副プログラムの 内部副プログラム モジュール名 . モジュール副プログラム名 . 内部副プログラム名 _ 備考. 翻訳時オプション -AU が指定されていないとき、主プログラムを除く加工名は、すべて小 文字に統一されます。 4.2.3 エラー集計情報 Fortran プログラムの実行の終了時に、以下のようなエラーの集計情報が出力されます。 ただし、エラー識別番号 900 から 1000 までのシステムエラーは、エラー集計情報として出力され ません。 error summary (Fortran) error number error level y jwennnni total error count = xxx nnnn y zzz xxx error count zzz :診断メッセージの番号です。 : y レベル(y :i、w、e、s、u)のエラーが発生したことを表しています。 :エラーの発生回数を表しています。 :それぞれの診断メッセージの合計回数を表しています。 第 5 章 データの型、種別および内部表現 この章では、データの型について説明します。 5.1 データの表現 データは、型により、値の表現範囲、内部表現および占有記憶領域が異なります。 5.1.1 整数型データ 1 バイトの整数型(one-byte integer type)は、整数値を正確に表現し、-128 から 127 までの値をと り、1 バイトの記憶領域を占めます。種別値 1 が対応します。 2 バイトの整数型(two-byte integer type)は、整数値を正確に表現し、-32768 から 32767 までの値 をとり、2 バイトの記憶領域を占めます。種別値 2 が対応します。 4 バイトの整数型(four-byte integer type)は、整数値を正確に表現し、-2147483648 から 2147483647 までの値をとり、4 バイトの記憶領域を占めます。種別値 4 が対応し、JIS Fortran 規格の基本整数 型に対応します。 8 バイトの整数型(eight-byte integer type)は、整数値を正確に表現し、-9223372036854775808 か ら 9223372036854775807 までの値をとり、8 バイトの記憶領域を占めます。 種別値 8 が対応します。 各整数型の先頭のビットは、符号を示します。 正の整数は、符号ビットがゼロで、残りのビットが真数表示の 2 進数として表現されます。 負の整数は、符号ビットに 1 をもつ 2 の補数として表現されます。 ゼロの整数は、すべてのビットがゼロとなります。 5.1.2 論理型データ 1 バイトの論理型(one-byte logical type)は、真または偽の値だけをとり、1 バイトの記憶領域を 占めます。種別値 1 が対応します。 2 バイトの論理型(two-byte logical type)は、真または偽の値だけをとり、2 バイトの記憶領域を 占めます。種別値 2 が対応します。 4 バイトの論理型(four-byte logical type)は、真または偽の値だけをとり、4 バイトの記憶領域を 占めます。種別値 4 が対応し、JIS Fortran 規格の基本論理型に対応します。 8 バイトの論理型(eight-byte logical type)は、真または偽の値だけをとり、8 バイトの記憶領域を 占めます。種別値 8 が対応します。 論理型は 2 進数で表現され、真の値は、最後のビットが 1 であり、かつ、残りのビットはすべて ゼロです。偽の値は、すべてのビットがゼロです。 5.1.3 実数型および複素数型データ 実数型データの内部表現は、IEEE に準拠しています。 Fortran 使用手引書ー Page 107 複素数型データの実部と虚部の内部表現は、同じ種別の実数型の内部表現と同じです。実部と虚 部は、連続した記憶域を占めるので、実数の倍の領域で 1 つのデータとなります。 以下に、単精度実数型、倍精度実数型および 4 倍精度実数型のデータフォーマットの内部表現を 示します。 単精度実数型 単精度実数型(single precision real type)は、実数値を近似的に表現し、精度が 2 進で 24 けた(10 進で約 6 けた)であり、絶対値がゼロまたは 2 –126(約 10 –37 )から 2 127(約 10 38 )までの値をと り、 4 バイトの記憶領域を占めます。種別値 4 が対応し、 JIS Fortran 規格の基本実数型に対応します。 以下は単精度実数型における符号(s)、指数部(e)、仮数部(f)のビット構成を示しています。 s e f 31 30 23 22 0 以下に特殊データの内部表現とそれに対応する値を示します。 名称 16 進定数値 10 進定数値 0 00000000 0.0e+00 +正規化された最大値 7f7fffff 3.40282347e+38 -正規化された最大値 ff7fffff -3.40282347e+38 +正規化された最小値 00800000 1.17549435e-38 -正規化された最小値 80800000 -1.17549435e-38 +正規化されていない最大値 007fffff 1.17549421e-38 -正規化されていない最大値 807fffff -1.17759421e-38 +正規化されていない最小値 00000001 1.40129846e-45 -正規化されていない最小値 80000001 -1.40129846e-45 +無限大 7f800000 Inf(Infinity) -無限大 +quiet NaN ff800000 -Inf 7fc00000 ~ 7fffffff NaN(Not a Number) -quiet NaN ffc00000 ~ ffffffff -NaN +signaling NaN 7f800001 ~ 7fbfffff NaN -signaling NaN ff800001 ~ ffbfffff -NaN 倍精度実数型 倍精度実数型(double precision real type)は、実数値を近似的に表現し、精度が 2 進で 53 けた(10 進で約 15 けた)であり、絶対値がゼロまたは 2 –1022(約 10 –307 )から 2 1023(約 10 308 )までの値を とり、8 バイトの記憶領域を占めます。種別値 8 が対応します。 以下は倍精度実数型における符号(s)、指数部(e)、仮数部(f)のビット構成を示しています。 s 63 62 e f 52 51 0 Fortran 使用手引書ー Page 108 以下に特殊データの内部表現とそれに対応する値を示します。 名称 16 進定数値 10 進定数値 0 00000000 00000000 0.0e+00 +正規化された最大値 7fefffff ffffffff 1.797693134862316d+308 -正規化された最大値 ffefffff ffffffff -1.797693134862316d+308 +正規化された最小値 00100000 00000000 2.225073858507201d-308 -正規化された最小値 80100000 00000000 -2.225073858507201d-308 +正規化されていない最大値 000fffff ffffffff 2.225073858507201d-308 -正規化されていない最大値 800fffff ffffffff -2.225073858507201d-308 +正規化されていない最小値 00000000 00000001 4.940656458412465d-324 -正規化されていない最小値 80000000 00000001 -4.940656458412465d-324 +無限大 7ff00000 00000000 Inf -無限大 fff00000 00000000 -Inf +quiet NaN 7ff80000 00000000 ~ 7fffffff ffffffff NaN -quiet NaN fff80000 00000000 ~ ffffffff ffffffff -NaN +signaling NaN 7ff00000 00000001 ~ 7ff7ffff ffffffff NaN -signaling NaN fff00000 00000001 ~ fff7ffff ffffffff -NaN 4 倍精度実数型 4 倍精度実数型(quadruple precision real type)は、実数値を近似的に表現し、精度が 2 進で 113 け た(10 進で約 33 けた)であり、絶対値がゼロまたは 2 –16382(約 10 –4931 )から 2 16383(約 10 4932 ) までの値をとり、16 バイトの記憶領域を占めます。種別値 16 が対応します。 以下は 4 倍精度実数型における符号(s)、指数部(e) 、仮数部(f)のビット構成を示しています。 s e 127 126 f 112 111 0 以下に特殊データの内部表現とそれに対応する値を示します。 名称 16 進定数値 10 進定数値 0 00000000 00000000 00000000 00000000 +正規化された 最大値 7ffeffff ffffffff ffffffff ffffffff 1.189731495357231765085 7593266280070q+4932 -正規化された 最大値 fffeffff ffffffff ffffffff ffffffff -1.189731495357231765085 7593266280070q+4932 +正規化された 最小値 00010000 00000000 00000000 00000000 3.362103143112093506262 6778173217526q-4932 -正規化された 最小値 80010000 00000000 00000000 00000000 -3.362103143112093506262 6778173217526q-4932 0.0e+00 Fortran 使用手引書ー Page 109 名称 16 進定数値 10 進定数値 +正規化されて いない最大値 0000ffff ffffffff ffffffff ffffffff 3.362103143112093506262 6778173217519q-4932 -正規化されて いない最大値 8000ffff ffffffff ffffffff ffffffff -3.362103143112093506262 6778173217519q-4932 +正規化されて いない最小値 00000000 00000000 00000000 00000001 6.475175119438025110924 4389582276465q-4966 -正規化されて いない最小値 80000000 00000000 00000000 00000001 -6.475175119438025110924 4389582276465q-4966 +無限大 7fff0000 00000000 00000000 00000000 Inf -無限大 ffff0000 00000000 00000000 00000000 -Inf +quiet NaN 7fff8000 00000000 00000000 00000000 ~ 7fffffff ffffffff ffffffff ffffffff NaN -quiet NaN ffff8000 00000000 00000000 00000000 ~ ffffffff ffffffff ffffffff ffffffff -NaN +signaling NaN 7fff0000 00000000 00000000 00000001 ~ 7fff7fff ffffffff ffffffff ffffffff NaN -signaling NaN ffff0000 00000000 00000000 00000001 ~ ffff7fff ffffffff ffffffff ffffffff -NaN 複素数型 単精度複素数型(single precision complex type)は、複素数値を近似的に表現し、一対の単精度実 数型のデータで表現します。単精度複素数型のデータは、8 バイトの記憶領域を占有し、最初の 4 バイトが実部、あとの 4 バイトが虚部を表します。その実部と虚部の精度および絶対値は、単精 度実数型と同じです。JIS Fortran 規格の基本複素数型に対応します。 倍精度複素数型(double precision complex type)は、複素数値を近似的に表現し、一対の倍精度実 数型のデータで表現します。倍精度複素数型のデータは、16 バイトの記憶領域を占有し、最初の 8 バイトが実部、あとの 8 バイトが虚部を表します。その実部と虚部の精度および絶対値は、倍 精度実数型と同じです。 4 倍精度複素数型(quadruple precision complex type)は、複素数値を近似的に表現し、一対の 4 倍 精度実数型のデータで表現します。4 倍精度複素数型のデータは、32 バイトの記憶領域を占有し、 最初の 16 バイトが実部、あとの 16 バイトが虚部を表します。その実部と虚部の精度および絶対 値は、4 倍精度実数型と同じです。 5.1.4 文字型データ 文字型(character type)のデータは、0 から 65000 個までの任意の文字の列であり、1 バイトの記 憶域に 1 つの文字が入ります。したがって、文字型のデータの占有する記憶領域のバイト数は、 列の中の文字数と等しくなります。 文字型のデータの中の各文字は、連続的に 1、2、3、... と番号付けられた文字位置をもちます。番 号は、文字の列の左からの文字の位置を示します。種別値 1 が対応します。 文字型データの内部表現は、ASCII コード系で表され、1 個の文字は、パリティビットなしの 8 ビットの 2 進数で表現されます。 Fortran 使用手引書ー Page 110 5.1.5 構造型データ 構造型は、組込み型から構成される型であり、末端の成分はすべて組込み型です。構造型のデー タは、組込み型のデータの集まりです。構造型のスカラデータであるこのデータの集まりを構造 体(structure)といいます。 構造型が連続型でない場合、構造型のデータの記憶領域列の順序は、不定です。 5.2 データの正しい境界 データが正しい境界に割り当てられていない場合は、実行できません。 コンパイラは、通常、原始プログラム内の各データに対して正しい境界を割り当てます。 表 5.1 に、データの型による正しい境界を示します。 表 5.1 データの型に対する正しい境界 データの型 正しい境界 1 バイトの整数型 任意の番地 2 バイトの整数型 2 の倍数の番地 4 バイトの整数型 4 の倍数の番地 8 バイトの整数型 8 の倍数の番地 1 バイトの論理型 任意の番地 2 バイトの論理型 2 の倍数の番地 4 バイトの論理型 4 の倍数の番地 8 バイトの論理型 8 の倍数の番地 実数型 4 の倍数の番地 倍精度実数型 8 の倍数の番地 4 倍精度実数型 8 の倍数の番地 複素数型 4 の倍数の番地 倍精度複素数型 8 の倍数の番地 4 倍精度複素数型 8 の倍数の番地 文字型 任意の番地 構造型 成分の正しい境界の最大値の番地 共通ブロックに属する変数、構造型の要素はコンパイラが自動的に境界を割り当てます。 ただし、翻訳時オプション -AA が有効な場合は、この機能は抑止されます。 EQUIVALENCE 文により記憶域を共有している変数の場合は、利用者が指定したとおりの境界と なるので注意が必要です。 また、構造型の定義において、構造型の最後の要素の次の境界は、その構造型の正しい境界でな ければなりません。 例:翻訳時オプション -AA が有効な場合の構造型定義 TYPE TAG REAL(8) R INTEGER(4) I END TYPE Fortran 使用手引書ー Page 111 この構造型(TAG)の正しい境界は、8 の倍数の番地です。 しかし、構成要素である変数 I の次の境界は、4 の倍数の番地となるため、この構造型の定 義は誤りです。 5.3 精度の変換 Fortran で扱う算術データの精度には、ハードウェア上の限界があります。 ここでは、データの精度を考慮する際に、本システムで用意されている精度拡張機能および精度 縮小機能を使用する場合の方法について説明します。 5.3.1 精度の拡張 作成したプログラムの演算精度を上げたい場合に精度拡張機能を使用します。 精度拡張機能は、指定された型の定数、変数および関数に対して、原始プログラム上で定義され た型から精度を一段高い型に変換するものです。 5.3.1.1 精度拡張のオプション 精度拡張は、実数型および複素数型の定数、変数または関数に対して行うことができます。 精度拡張を指示する翻訳時オプション -Ad を指定した場合、データの型は次のように変換されま す。 実数型 → 倍精度実数型 複素数型 → 倍精度複素数型 精度拡張を指示する翻訳時オプション -Aq を指定した場合、データの型は次のように変換されま す。 倍精度実数型 → 4 倍精度実数型 倍精度複素数型 → 4 倍精度複素数型 以下に、翻訳時オプション-Adを指定した場合の定数、変数または関数の精度拡張の例を示します。 例:翻訳時オプション -Ad による精度拡張 IMPLICIT REAL(8)(D) REAL KNOTE,KIN COMPLEX ARY(10),CDATA KNOTE = 1.0 KIN = 3.111-2.5D0*KNOTE DEX = 0.5D0-1.111111111111 ARY(1) = (1.1,1.0) KIN = KIN-SQRT(KIN/2.0) 上記のプログラムを翻訳時オプション -Ad を指定して翻訳した場合、下記のプログラムと同 等になります。 IMPLICIT REAL(8)(D) REAL(8) KNOTE,KIN COMPLEX(8) ARY(10),CDATA KNOTE = 1.0_8 KIN = 3.111_8-2.5D0*KNOTE DEX = 0.5D0-1.111111111111_8 ARY(1) = (1.1_8,1.0_8) KIN = KIN-DSQRT(KIN/2.0_8) Fortran 使用手引書ー Page 112 関数が精度拡張された場合、組込み関数に対しては、より高い精度の型をもつ関数名に変えられ ます。ただし、EXTERNAL 文での宣言などにより、利用者定義の関数とされた場合、関数名は変 わりません。 利用者が定義した外部関数の引用の場合、その関数値が精度拡張の対象となります。したがって、 関数引用が精度拡張された場合は、関数副プログラムも精度拡張機能を働かせて翻訳しなければ なりません。 組込み関数の引用の場合、その関数名、引数および関数値の型が、精度拡張により影響を受けます。 組込み関数が個別名の場合、適当な関数名に変えられます。 組込み関数名が総称名の場合、その引数に対して精度拡張機能が働いて、適当な関数名が選択さ れます。 組込み関数名が実引数として引用された場合、精度拡張された結果の関数名に変えられます。 5.3.2 精度縮小と誤差の影響分析 精度縮小機能は、浮動小数点数で表されるデータの精度に限界があるために生じる計算誤差(丸 め誤差)が、利用者が意図した計算の結果に、どの程度の影響を及ぼしているかを計測するため の機能です。 これを応用して、使用しているアルゴリズムが、誤差に対して信頼できるかを調べることで、数 値計算プログラムのデバッグを行うことができます。 たとえば、連立一次方程式を解くプログラムまたは行列の固有値・固有ベクトルを求めるプログ ラムでは、行列が不適当なとき、行列に対するわずかな入力誤差が、非常に大きい誤差に結びつ き、求めた結果が正しい結果とは似ても似つかぬことがあります。 このような誤差に敏感な部分を発見することにより、それに見合う解法の選択、入力誤差の影響 を安定化する工夫などの数値計算プログラムの改良・デバッグを行うために精度縮小機能があり ます。 一般に、演算けた数と解の精度について、次のような関係があることが認められています。 d = (p – α) ⁄ m d :解の精度(けた) p :演算けた数 α :損失けた m :問題と解法に固有な値 m は通常 1 であり、代数方程式の根を求めるときなどはその重根度に対応しています。 この式は、問題の条件数をより適確に表現するものですが、次のような場合には成立しません。 - 入力データや定数などに誤差がある場合 - 問題解法の計算式に誤差がある場合 - 反復計算などを適当に打ち切る場合 すなわち、計算誤差(丸め誤差)が主要な誤差である範囲でのみ成立します。 このような場合、演算けた数を 1 けた増減すれば、 解の精度が 1/m けた増減することがわかります。 したがって、演算けた数を少し動かせば、解の精度もそれについて動くはずです。 精度縮小機能は、この原理を利用して、解の精度を推測しようとするものです。 精度縮小機能は、翻訳時オプション -Cl の指定によって動作します。 Fortran 使用手引書ー Page 113 5.3.2.1 精度縮小機能の定義 精度縮小機能は、次の翻訳時オプションの指定によって動作します。 -Cl 0 ≦ l ≦ 15 精度縮小機能は、実数型、倍精度実数型、4 倍精度実数型、複素数型、倍精度複素数型および 4 倍 精度複素数型のデータに対して適用されます。 この機能が動作すると、精度縮小機能の対象のデータが代入文で定義される場合に、そのデータ の値のハードウェア上の表現による下位 l ビットを 0 にします。 この下位 l ビットが 0 になった値が実際のデータ値となります。 l は精度縮小数と呼ばれ、0 ≦ l ≦ 15 でなければなりません。 l が 0 の場合の動作は、翻訳時オプション -Cl を指定しない場合と等価です。しかし、この l は PRNSET サービスサブルーチンによって、実行時に動的に変えることができます。したがって、 動的に変更された l の値がゼロ以外であれば精度縮小機能が働きます。 精度縮小数 l の値は、実行可能プログラムに対して一つ定まるものです。 l の初期値は、主プログラムの翻訳時に指定されたものです。 副プログラムの翻訳時の -Cl の指定は、精度縮小機能を動作させるためだけであり、そのときの 精度縮小数 l の値は意味をもちません。 5.3.2.2 精度縮小機能の使用方法 浮動小数点数の計算は、精度縮小数を変え、同じ計算を 2 回以上実行し、その結果を比較してく ださい。 1 回目:-C0 で翻訳して実行 2 回目:-C1 で翻訳して実行 2 回の計算結果の一致する部分が必ずしも正しいとは限りませんが、少なくとも、一致しない部 分は正しくありません。確実さを増すためには、実行回数を増やしてください。すなわち、-Cl の l を 2 から 10 程度に変えて実行回数を増やすことにより確実に解の精度を判定できます。ただし、 一般的には、2 回実行すれば十分です。 何回も計算機で実行するのは不便なので、1 回の実行によって精度を調べる方が能率的です。 このように 1 回の実行で調べるには、精度判定の目的をもつ原始プログラムを作る必要がありま す。 このプログラムは、翻訳時オプション -Cl を付けて翻訳し、プログラムの中で PRNSET サービス サブルーチンを使用するものです。 このプログラムは、以下の手順に従って作成してください。 1) 2) 3) 4) 5) 調査プログラム部分に必要な変更を受けるデータを退避します。 CALL PRNSET(l) を実行します。 退避したデータを使って計算し、l に対応する所に結果を保存します。 l を変更し、所定の回数に達していなければ 2) に分岐します。 l に対するそれぞれの結果を比較して、一致する情報を印刷します。 Fortran 使用手引書ー Page 114 以下に精度縮小機能を利用したプログラムの例を示します。 例:精度縮小機能を利用したプログラム REAL,DIMENSION(10,11) :: A,B REAL,DIMENSION(10,10) :: X 1 READ (*,FMT='(I2,I2)',END=99) N,M ! データの入力 PRINT '(I2,I2)',N,M ! データの印刷 DO I = 1,N READ (5,'(5F12.8)') (A(I,J),J=1,N+1) WRITE (6,'(5F12.8)') (A(I,J),J=1,N+1) END DO DO L = 1,M CALL PRNSET(L-1) CALL SWEEP(A,B,N) ! 精度縮小を変えて計算 X(:N,L) = B(:N,N+1) END DO WRITE(UNIT=*,FMT='(//,A,5X,3(A,10X),A)') & & ' -Cl ','X1=1.0','X2=2.0','X3=1.0','X4=-1.0' DO L = 1,M WRITE(6,'(A,I1,A,1P8E16.7)') & & ' -C',L-1,' ',X(:N,L) ! 計算結果の印刷 END DO WRITE(6,'(/,A,7X,3(A,14X),A)') ' -Cl:-C0','X1','X2','X3','X4' DO L = 2,M X(:N,L) = X(:N,L)-X(:N,1) END DO DO L = 2,M ! -Cl の結果と -C0 の結果 WRITE(6,'(A,I1,A,1P8E16.7)') ' -C',L-1,':-C0',X(:N,L) END DO GOTO 1 99 END SUBROUTINE SWEEP(A,Z,N) REAL,DIMENSION(10,11) :: A,Z Z(:N,:N+1) = A(:N,:N+1) DO K = 1,N Z(K,K+1:N+1) = Z(K,K+1:N+1)/Z(K,K) DO I=1,N ! 連立一次方程式を掃出し法で解く IF (K.EQ.I) CYCLE Z(I,K+1:N+1) = Z(I,K+1:N+1)-Z(I,K)*Z(K,K+1:N+1) END DO END DO END SUBROUTINE SWEEP 入力データの印刷 1 行目の内容は元数とテスト個数で 2 から 5 行目の内容はそれぞれ 4 個の 係数と 1 個の定数項です。 Fortran 使用手引書ー Page 115 4 9 3.20000005 1.25979996 -2.01999998 5.13980007 -1.44019997 1.02010000 -1.35010004 3.09999990 -2.12010002 3.53999996 -2.02979994 2.54999995 -1.37020004 3.64000010 -1.94000006 3.21000004 1.11020005 2.80999994 4.53999996 3.70040011 計算結果 -Cl -C0 -C1 -C2 -C3 -C4 -C5 -C6 -C7 -C8 X1=1.0 9.9909294e-01 9.9581611e-01 9.9198890e-01 1.0101604e+00 1.0316334e+00 1.0174370e+00 8.9227295e-01 1.0482483e+00 9.1392517e-01 X2=2.0 1.9976463e+00 1.9891458e+00 1.9792151e+00 2.0263634e+00 2.0820694e+00 2.0452271e+00 1.7205429e+00 2.1251831e+00 1.7766724e+00 -C0 の結果との差 -Cl:-C0 X1 -C1:-C0 -3.2768250e-03 -C2:-C0 -7.1040392e-03 -C3:-C0 1.1067390e-02 -C4:-C0 3.2540321e-02 -C5:-C0 1.8343925e-02 -C6:-C0 -1.0681915e-01 -C7:-C0 4.9155235e-02 -C8:-C0 -8.5166931e-02 X3=1.0 1.0000743e+00 1.0003431e+00 1.0006566e+00 9.9916744e-01 9.9740791e-01 9.9856758e-01 1.0088348e+00 9.9604034e-01 1.0070496e+00 X4=-1.0 -9.9882913e-01 -9.9459982e-01 -9.8966026e-01 -1.0131168e+00 -1.0408325e+00 -1.0225105e+00 -8.6096954e-01 -1.0623016e+00 -8.8891602e-01 X2 X3 X4 -8.5005760e-03 2.6881695e-04 4.2293072e-03 -1.8431187e-02 5.8233738e-04 9.1688633e-03 2.8717041e-02 9.0682507e-04 -1.4287710e-02 8.4423065e-02 -2.6663542e-03 -4.2002678e-02 4.7580719e-02 -1.5066862e-03 -2.3681164e-02 2.7709961e-01 8.7604523e-03 1.3785934e-01 1.2753677e-01 -4.0339231e-03 -6.3470840e-02 -2.2097397e-01 6.9752932e-03 1.0991287e-01 備考 1.この例題は、性質(条件)の悪い連立一次方程式を掃出し法で解くものです。 備考 2.縮小ビット数を 0 ~ 8 に指定した場合、解および -C0 の場合の結果との差が印刷さ れます。 -C0 との差がほぼ誤差を示しており、デバッグの目的を十分果していることが分ります。 第 6 章 プログラミング上の注意 この章では、本システムを用いてプログラミングを行う場合の注意事項について説明します。 入出力処理については、 “第 7 章 入出力処理”で説明します。 6.1 言語仕様レベル Fortran 言語仕様には、三つのレベルがあります。 FORTRAN66 言語仕様 FORTRAN66 言語仕様と呼び、これに基づいて記述されたプログラムを FORTRAN66 プログラム と呼びます。翻訳時オプション -X6 または -Xf6 を指定した場合、FORTRAN66 プログラムとして 解釈されます。 FORTRAN77 言語仕様 FORTRAN77 言語仕様と呼び、これに基づいて記述されたプログラムを FORTRAN77 プログラム と呼びます。以下のどちらかの場合、FORTRAN77 プログラムとして解釈されます。 - 翻訳時オプション -X7 または -Xf7 を指定した - ファイルのサフィックスが“.f” 、 “.for”、 “.F”または“.FOR”であり、翻訳時オプション -X を指定しない 例:FORTRAN77 プログラムと解釈される場合 % frt a.f90 -X7 % frt b.f Fortran 95 言語仕様 Fortran 95 言語仕様と呼び、これに基づいて記述されたプログラムを Fortran 95 プログラムと呼び ます。以下のどちらかの場合、Fortran 95 プログラムとして解釈されます。 - 翻訳時オプション -X9 を指定した - ファイルのサフィックスが“.f90” 、“.f95”、 “.F90”または“.F95”であり、翻訳時オプショ ン -X を指定しない 例:Fortran 95 プログラムと解釈される場合 % frt b.f -X9 % frt a.f90 本システムは、FORTRAN66、FORTRAN77 および Fortran 95 プログラムを翻訳するコンパイラで すが、言語仕様の相違からプログラムに対する指定を誤ると正しい結果が得られない場合があり ます。 翻訳時オプション -X6、-Xf6、-X7、-Xf7 または -X9 の指定による原始プログラムの解釈について は、以下の項目に違いがあります。 Fortran 使用手引書ー Page 117 - 組込み関数名が指定された EXTERNAL 文(“6.6.2 組込み関数名が指定された EXTERNAL 文”参照) - DO ループの繰返し回数( “6.5.4.1 DO ループの繰返し回数”参照) - X 形編集記述子の効果( “7.16.5 X 形編集記述子の効果”参照) - 総称名としての REAL および CMPLX( “6.6.3 総称名としての REAL および CMPLX”参照) - 組込み手続名( “6.6.4 組込み手続名”参照) - 型宣言された組込み関数名( “6.6.5 型宣言された組込み関数名”参照) - 重なりのある文字代入(“6.4 重なりのある文字代入”参照) - 初期値をもつ変数に対する SAVE 属性( “6.2.5 初期値をもつ変数に対する SAVE 属性”参照) - RECL 指定子があり、ACCESS 指定子がない OPEN 文(“7.4.4 RECL 指定子があり、ACCESS 指定子がない OPEN 文”参照) - INQUIRE 文(“7.6.2 言語仕様レベルによる INQUIRE 文の動作”参照) - 整数型の G 形編集( “7.16.1 整数型の G 形編集”参照) - 書式付き出力文の文字出力( “7.16.2 書式付き出力文の文字出力”参照) - G 形編集記述子の編集結果(“7.16.3 G 形編集記述子の編集結果”参照) - 変数群入出力( “7.7.4.3 変数群入出力の言語仕様レベルによる違い”参照) - 文字列編集記述子の診断メッセージ(“7.16.4 文字列編集記述子の診断メッセージ”参照) - 並び出力における囲みなし文字定数の出力形式( “7.7.5.2.1 並び出力における囲みなし文字 定数の出力形式”参照) - 再結合時の OPEN 文の指定子の値(“7.4.2 再結合時の OPEN 文の指定子の値”参照) - 書式付き入出力と書式なし入出力の混在( “7.4.3 書式付き入出力と書式なし入出力の混在” 参照) - 直接探査入出力におけるデータ転送エラー(“7.7.3.4 直接探査入出力におけるデータ転送エ ラー”参照) - 論理型の入力編集(“7.16.6 L 形編集記述子”参照) - 括弧で囲まれた変数( “6.3.8 括弧で囲まれた変数”参照) ここでは、データの宣言および指定について説明します。 6.2.1 COMMON 文 COMMON 文を使用するには、以下の注意が必要です。 6.2.1.1 共通ブロックに属する変数の境界 共通ブロックに属する変数は、正しい境界(“5.2 データの正しい境界”参照)に並べなければ なりません。 正しい境界に合っていない場合、コンパイラは、自動的に空き領域を挿入するので、変数は正し い境界に合わせられます。 ただし、以下の例外があります。 - 翻訳時オプション -AA が有効な場合、コンパイラは空き領域を挿入しません。 - 倍精度実数型、4 倍精度実数型、倍精度複素数型または 4 倍精度複素数型の変数が 8 の倍数 の番地にない場合、4 の倍数の番地に合わせられます。ただし、翻訳時オプション -Kdalign が 有効な場合、8 の倍数の番地に合わせられます。 なお、共通ブロックの先頭は、必ず 8 の倍数の番地に合わせられています。 6.2.1.2 初期値をもつ共通ブロック 以下の条件のどちらかの場合、結合編集時にエラーになります。 1) 異なるファイルにまたがって、同じ名前の共通ブロックまたは無名共通ブロックに 2 度以上 初期値を設定している。 Fortran 使用手引書ー Page 118 例 1:結合編集時にエラーになる場合 1 ! ファイル名 : a.f ! ファイル名 : b.f PROGRAM MAIN SUBROUTINE SUB COMMON /COM/A,B COMMON /COM/A,B DATA A/1.0/ DATA B/2.0/ CALL SUB PRINT *,A,B END END 2) 異なるファイルにまたがって、大きさの異なる同じ名前の共通ブロックまたは無名共通ブ ロックを引用し、同じ共通ブロックの中で大きさが最大でない共通ブロックに初期値を設定 している。 例 2:結合編集時にエラーになる場合 2 ! ファイル名 : a.f ! ファイル名 : b.f PROGRAM MAIN BLOCK DATA BLK COMMON /COM/A,B COMMON /COM/A PRINT *,A DATA A/1.0/ END END 6.2.2 EQUIVALENCE 文 各結合実体は、それぞれ正しい境界に置かなければなりません。 6.2.3 初期値の設定 ここでは、初期値の設定に対する注意事項について説明します。 6.2.3.1 文字定数による初期値設定 文字定数は、文字型の変数に対する初期値として指定することができます。 文字型以外のデータに対して、初期値として文字定数を指定すると w レベルの診断メッセージが 出力されます。 配列名に対する初期値の指定は、その要素数と同数の文字定数が必要です。 要素の長さよりも長い文字定数を指定しても、後続の配列要素の初期値とはなりません。 例 1:配列名に対する文字定数の初期値 CHARACTER(LEN=3) A(2) DATA A/'ABCDEF'/ この場合の初期値は以下のようになります。 A(1) 'ABC' A(2) 初期値なし(不定) また、配列要素または文字部分列の初期値として、要素または部分列の長さよりも長い文字定数 を指定しても、残りの部分が無視されるだけです。 Fortran 使用手引書ー Page 119 例 2:配列要素に対する文字定数の初期値 CHARACTER(LEN=2) B(4) DATA B(2)/'ABCDE'/ この場合の初期値は以下のようになります。 B(1) B(2) 初期値なし(不定) 'AB' B(3) B(4) 初期値なし(不定) 初期値なし(不定) B(3)、B(4) に、初期値として 'CD'、'E' を与えたい場合、次のどちらかの方法があります。 CHARACTER(LEN=2) B(4) DATA B(2),B(3),B(4)/'AB','CD','E'/ または CHARACTER(LEN=2) B(4) CHARACTER(LEN=6) BB EQUIVALENCE (B(2),BB) DATA BB/'ABCDE'/ 6.2.3.2 非 10 進定数表現による初期値設定 配列名に対して初期値を設定する場合は、その配列の要素の数と同じ数だけ 16 進定数、8 進定数 または 2 進定数を記述しないと、不足分は不定となります。 すなわち、一つの配列要素に一つの 16 進定数、8 進定数または 2 進定数が対応し、16 進定数、8 進定数または 2 進定数の長さがその配列要素の大きさを超えても、あふれは生じません。 例:配列名に対する 16 進定数の初期値 INTEGER A(3) DATA A/Z'F0F0A100F2F2A202'/ A(1) の初期値 A(2) の初期値 A(3) の初期値 F2F2A202 初期値なし(不定) 初期値なし(不定) 一つのスカラ変数の占めるバイト数より長い 16 進定数、8 進定数または 2 進定数を指定した場合 は、定数の左側の超過部分が無視されます。 一つのスカラ変数の占めるバイト数より短い 16 進定数、8 進定数または 2 進定数を指定した場合 は、データの不足分の領域(左側)にゼロ(0)が補われます。 6.2.3.3 重複する初期値設定 同一の変数に対して、初期値の設定を 2 回以上指定した場合、w レベルの診断メッセージが出力 され、原始プログラム上で物理的に最後の指定が有効となります。 ただし、このようなプログラムは修正してください。 Fortran 使用手引書ー Page 120 6.2.4 CRAY 仕様のポインタ変数の引用 CRAY 仕様のポインタ変数を引用する場合には、以下の注意が必要です。 a) 手続呼出しの仮引数のアドレスを副プログラム内で保存してはいけません。 例 1:誤ったポインタ変数の引用 1 SUBROUTINE SUB(A) POINTER (IP,IPP) INTEGER A(10),IPP(10) SAVE IP : IP = LOC(A(2)) : END b) 関数は、実引数のアドレスを結果として返却してはいけません。 例 2:誤ったポインタ変数の引用 2 FUNCTION ADDR(I) INTEGER ADDR,I(5) ADDR = LOC(I(2)) END POINTER (IP,PTR) INTEGER PTR ,DATA(5),ADDR IP = ADDR(DATA) PTR = 1 END c) ポインタ変数で参照されるデータは、組込み関数 LOC でアドレスを明示的にプログラム単位 内で確定した場合を除き、他のデータと重なってはいけません。 代入文などによりアドレスを複写して引用してはいけません。 例 3:誤ったポインタ変数の引用 3 POINTER (IP1,ARRAY1) POINTER (IP2,ARRAY2) INTEGER DATA(5),ARRAY1(5),ARRAY2(5) IP1 = LOC(DATA) ARRAY1 = 1 IP2 = IP1 ARRAY2 = 2 ! 代入文により確定したアドレスでは引用できません END 6.2.5 初期値をもつ変数に対する SAVE 属性 Fortran 95 言語仕様では、初期値をもつ変数は SAVE 属性をもちます。 FORTRAN66 および FORTRAN77 言語仕様では、SAVE 文または SAVE 属性をもつ型宣言文で指 定しない限り SAVE 属性はもちません。 Fortran 使用手引書ー Page 121 例:初期値をもつ変数に対する SAVE 属性 SUBROUTINE S INTEGER :: I = 1 I = 1 END Fortran 95 言語仕様では上記プログラムは、以下のプログラムと同等です。 SUBROUTINE S INTEGER :: I = 1 SAVE I I = 1 END 6.3 式 ここでは、式について説明します。 6.3.1 整数型データの演算 整数型のデータを代入する場合、値の大きさのチェックは行われません。 整数型データの演算結果が、許される値の範囲を超えたとき、結果は不定になります。 このことは特に、整数型データの比較のときに影響します。 例: IF(I-J) 1,2,3 この例で“I-J”の結果がオーバフローする可能性があるときには、論理 IF 文の関係演算子 による比較に変えるべきです。オーバフローした場合、次にどの文番号をもつ文が実行され るか不定です。 PARAMETER 文および PARAMETER 属性をもつ型宣言文の定数式において、オーバフローした 場合、名前付き定数の値は不定になります。 6.3.2 実数型データの演算 各精度の実数型のデータは、できるだけ正確に扱われますが、機械語で完全に一致するように表 現できるとは限りません。 例:許容値を認めていない判定 IF(A-0.1) 1,2,1 3 IF(B.EQ.C) GO TO 4 この例で、A が正確に計算できれば 0.1 となるはずでも、計算機上では必ずしも文番号 2 の文 に分岐するとは限りません。 B と C とが等しくなるはずでも、文番号 4 の文に分岐するとは限りません。 実数型の関係演算では、等値比較を行うべきでありません。 翻訳時オプション -Ec( “2.2 翻訳時オプション”参照)を指定すれば、許容値を認めていない関 係式に対して i レベルの診断メッセージが出力されます。 ここで、許容値を認めていない関係式とは、関係式 e1 relop e2 において、relop(関係演算子)が “==” 、 “/=”、 “.EQ.”または“.NE.”であり、e1 または e2 が実数型、倍精度実数型、4 倍精度実数 型、複素数型、倍精度複素数型または 4 倍精度複素数型のものです。 Fortran 使用手引書ー Page 122 判定の例を以下に示します。 例:望ましい判定 IF(ABS(A-0.1)-0.00001) 2,1,1 3 IF(ABS(B-C)<D) GO TO 4 PARAMETER 文および PARAMETER 属性をもつ型宣言文の定数式において、演算結果が正規化 されていない値(“5.1.3 実数型および複素数型データ”参照)となる定数式は記述できません。 6.3.3 論理型データの演算 論理型データに真(.TRUE.)または偽(.FALSE.)以外の値を設定し、その値を論理値として扱う プログラムを作成してはいけません。 たとえば、論理型の変数に 16 進定数で初期値を設定し論理値として扱うプログラムまたは EQUIVALENCE 文で論理型の変数と整数型の変数を同じ領域に割り付け、代入された整数値を論 理値として扱うようなプログラムを作成してはいけません。 例:論理値以外での論理演算 LOGICAL :: A = Z'00000002',B INTEGER :: I = 2 EQUIVALENCE (I,B) IF(A) GO TO 10 IF(B) GO TO 20 IF(A.AND.B) GO TO 30 IF(A.OR.B) GO TO 40 この場合、論理 IF 文で GO TO 文が実行されることを期待してはいけません。 論理式の結果は、真または偽であり、ビットごとの論理演算ではありません。 例: LOGICAL(1) :: L1,L2 DATA L1/Z'FF'/ L2 = .NOT.L1 この例で、L2 の結果は偽とはなりません。 6.3.4 演算結果の型 8 バイトの整数型と単精度実数型または単精度複素数型の四則演算およびべき乗演算の結果の型 は、言語仕様レベルにより異なります。 Fortran 95 言語仕様では、結果の型は、単精度実数型または単精度複素数型です。FORTRAN66 お よび FORTRAN77 言語仕様では、倍精度実数型または倍精度複素数型です。 6.3.5 要素の評価順序 要素が演算子によって結合される場合、どちらの要素を先に評価するかは、規定されません。 たとえば、F を関数とするとき、式 F(X)+F(Y) において、F(X) と F(Y) のどちらが先に評価される かを規定したプログラムを作成してはなりません。 6.3.6 式の一部の評価 式の値を得る場合、式の一部が評価されないときがあります。 Fortran 使用手引書ー Page 123 たとえば、論理式 L1.AND.L2 において、L1 が偽であれば、L2 を評価しなくても式の値は偽であ ることがわかります。 したがって、このような評価されない部分に関数の引用を書く場合は、十分注意しなければなり ません。 6.3.7 関数引用による値の更新 文の中で、関数の引用がある場合、その文の中のほかの要素の値を変更してはなりません。 たとえば、F(I).AND.I==1 の式において、関数引用の F(I) で I の値を変更してはいけません。 ただし、論理 IF 文の論理式の中の関数の引用は、論理式が真のとき実行される実行文の中の要素 を変更してもかまいません。 また、共通ブロック中の要素の値が、文中の関数の引用の値に影響がある場合、その文中のほか の関数の引用の実行は、共通ブロック中のその要素の値を変更してはいけません。 たとえば、以下のプログラムにおける FA( )+FB( ) は、誤りです。 FUNCTION FA( ) COMMON /C/A FA = A END FUNCTION FB( ) COMMON /C/A A = 1 FB = A END 6.3.8 括弧で囲まれた変数 使用者手続の実引数に括弧で囲まれた変数が出現した場合、Fortran 言語仕様により解釈が異なり ます。 FORTRAN66 または FORTRAN77 言語仕様では、記述された変数が実引数となります。 Fortran95 言語仕様では、変数の値を一時的な領域へ複写し、その一時領域が実引数となります。 6.4 重なりのある文字代入 FORTRAN66 および FORTRAN77 言語仕様では、翻訳時オプション -Nf90move を指定しない場合、 文字代入文の右辺と左辺で同じデータ(記憶領域が同じ)を使用し、かつ、その定義の範囲と参 照の範囲が重なっているプログラムの動作は不定です。翻訳時オプション -Nf90move を指定した 場合、Fortran 95 言語仕様と同じ結果になります。 Fortran 95 言語仕様では、文字代入文の右辺と左辺の重なりの有無にはプログラムの動作は影響し ません。 例:重なりのある文字代入 CHARACTER(LEN=5) C C = '12345' C(1:4) = C(2:5) PRINT *,C ! Fortran 95 言語仕様では 23455 が出力されます。 FORTRAN66 および FORTRAN77 言語仕様では、翻訳時オプション -Nf90move を指定しない 場合、重なりのある文字列代入文の動作は不定です。 Fortran 使用手引書ー Page 124 6.5 実行文 ここでは、実行文について説明します。 6.5.1 GO TO 文 計算形 GO TO 文および割当て形 GO TO 文の文番号並びに書かれた文番号の中に、一つでも未定 義の文番号があると翻訳時に s レベルのエラーとなります。 したがって、あとで処理を追加する予定の位置へは、必ず文番号を定義するようにしなければな りません。 割当て形 GO TO 文の分岐先が、文番号並びと異なる文番号への分岐の場合、翻訳時にはエラーが 出力されないので、間違った動作をすることがあります。 割当て形 GO TO 文の記述で、文番号の並びを指定した方が実行時の効率が良くなります。 このとき、この割当て形 GO TO 文の次に実行される可能性のある文の文番号は、すべて指定しな ければなりません。 6.5.2 算術 IF 文 算術 IF 文の算術式の型が整数型で、その算術式の絶対値がその型の表現できる値を超えた場合に は、次にどの文番号をもつ文が実行されるか不定です。 たとえば、次のような算術 IF 文を実行した結果、次に 10、20 または 30 のいずれの文番号をもつ 文が実行されるか不定です。 例: I = 3 IF(2147483647+I) 10,20,30 6.5.3 IF 文 IF 文の論理式の評価が論理型の内部表現(“5.1.2 論理型データ”参照)に該当しない値をもつ場 合の動作は不定です。論理式の評価については“6.3.3 論理型データの演算”を参照してください。 例: LOGICAL TR EQUIVALENCE(TR,JR) DATA JR/16/ IF(TR) CALL S CALL 文が実行されることを期待してはいけません。 6.5.4 DO 文 DO ループの範囲の繰返し回数が、初期値、限界値および増分値の値によっては、0 になる場合が あります。 DO ループの範囲の実行中、DO 変数や増分値または限界値を変更して繰返し回数を変えることは できません。 DO ループの範囲の外側から DO ループの範囲の内側へ入る文がある場合、注意を促す診断メッ セージが出力されます。 このようなプログラムの動作は、不定です。 Fortran 使用手引書ー Page 125 備考. FORTRAN66 プログラムで定義している DO の拡張範囲については、注意を促す診断メッ セージが出力され正常に動作しますが、将来の互換性を考え修正してください。 6.5.4.1 DO ループの繰返し回数 FORTRAN77 言語仕様および Fortran 95 言語仕様では、DO ループの繰返し回数 γ 7 は、以下の式で 定義されます。 γ7 = MAX ( INT ( ( m2 – m1 + m3 ) ⁄ m 3 ), 0 ) ここで、m1、m2 および m3 は、それぞれ DO 文の初期値、限界値および増分値です。 FORTRAN66 言語仕様では、DO ループの繰返し回数 γ 6 は、以下の式で定義されます。 γ 6 = MAX ( ( m2 – m1 ) ⁄ m3 + 1, 1 ) FORTRAN77 および Fortran 95 言語仕様では、DO 文で定義される DO の範囲が必ずしも実行され るとは限りませんが、FORTRAN66 言語仕様では、DO の範囲が少なくとも 1 回は実行されること を意味しています。 6.5.5 CASE 構文 場合式がスカラ整数式の場合、場合値は、スカラ整数式の型で表現できる範囲でなければなりま せん。 例:CASE 構文の誤り INTEGER(2) :: I : SELECT CASE(I) CASE(40000) ! 場合式が 2 バイトの整数型なので、場合値は ! -32768 から 32767 までの値でなければなりません。 : END SELECT 6.5.6 PAUSE 文 PAUSE 文は、標準エラー出力ファイルに対して診断メッセージ(jwe0001a)を出力します。 メッセージが端末に出力され、かつ、標準入力が端末の場合は、応答待ちになり、プログラムの 実行を中断します。 応答待ちプログラムの実行を再開させるには、標準入力に対して任意のデータを入力してくださ い。上記以外の場合は、PAUSE 文を無視し、そのままプログラムの実行を継続します。 例:PAUSE 文の診断メッセージ PAUSE jwe0001a pause PAUSE n(n は、1 から 5 けたの 10 進数字列) jwe0001a pause n PAUSE c(c は、アポストロフィで囲まれた文字定数で、長さは 255 文字以下) jwe0001a pause c 6.5.7 STOP 文 STOP 文は、プログラムの実行を終了します。終了符号が指定されている場合は、標準エラー出力 ファイルに対して診断メッセージ(jwe0002i)を出力します。 Fortran 使用手引書ー Page 126 例:STOP 文の診断メッセージの例 STOP n(n は、1 から 5 けたの 10 進数字列) jwe0002i stop n STOP c(c は、アポストロフィで囲まれた文字定数で、長さは 255 文字以下) jwe0002i stop c 6.5.8 ALLOCATE / DEALLOCATE 文 ALLOCATE 文および DEALLOCATE 文に STAT 指定子を指定した場合、 以下の値が返却されます。 0 以外の値は、実行時の診断メッセージの番号です。1 バイトの整数型の変数を指定すると正しく 値を受け取ることができないので注意が必要です。 返却値 意味 0 正常に実行されました。 912 ALLOCATE 文を実行したときに、領域が不足しています。 1001 ALLOCATE 文で指定した割付け配列が、すでに割り付けられています。 1003 DEALLOCATE 文で指定した割付け配列が、割り付けられていません。 1004 DEALLOCATE 文で指定したポインタが、未結合状態です。 1005 DEALLOCATE で指定したポインタと結合している実体が、 ALLOCATE 文で生成されていません。 6.6 手続 ここでは、手続について説明します。 6.6.1 文関数の引用 文関数の引用において、仮引数の型と実引数の型が異なる場合、診断メッセージが出力され、そ の評価は、実引数の型によって行われます。 ただし、その実引数に算術要素または論理要素を使用する場合、その実引数の型は、式の変換規 則で許されるものでなければなりません。 次の例では、文関数 SF の引用で、実引数の型は倍精度実数型となります。 しかし、文関数 ESF の引用は、エラーです。 例:文関数の引用 REAL(8) X,Y,Z LOGICAL L,M,N,ESF SF(I,J,K) = I**2+J**3+K**4 ESF(L,M,N) = .NOT. L .AND. M .AND. N : XX = 3.0E1+SF(X,Y,Z) ! SF の実引数の型は倍精度実数型 : L = X == Y .AND. ESF(X,Y,Z) ! 式の変換規則で許されない引数です。 Fortran 使用手引書ー Page 127 6.6.2 組込み関数名が指定された EXTERNAL 文 FORTRAN77 および Fortran 95 言語仕様では、組込み関数を表す名前が EXTERNAL 文に指定され た場合、その名前は組込み関数としての性格を失い、利用者が定義する外部手続または初期値設 定プログラム単位として扱われます。 FORTRAN66 言語仕様では、基本外部関数を表す名前が EXTERNAL 文に指定された場合、その名 前は基本外部関数として扱われます。 備考. FORTRAN77 および Fortran 95 言語仕様での組込み関数とは、FORTRAN66 言語仕様での 基本外部関数および組込み関数の両者を総称したものです。 6.6.3 総称名としての REAL および CMPLX FORTRAN77 および Fortran 95 言語仕様では、REAL および CMPLX の総称関数は、それぞれ実数 型および複素数型への型変換の機能をもっています。 Fortran 95 言語仕様では、REAL 総称関数の第 1 引数が複素数型で第 2 引数を省略した場合、結果 の種別型パラメタは、第 1 引数の種別型パラメタになります。 FORTRAN66 言語仕様では、REAL および CMPLX の総称関数は、それぞれ複素数型の実数部の 取出しおよび複素数の形成の機能をもっています。 6.6.4 組込み手続名 以下の名前は、FORTRAN77 および Fortran 95 言語仕様では、組込み関数として解釈されますが、 FORTRAN66 言語仕様では組込み関数(基本外部関数)としては解釈されず、ユーザ定義の関数 として扱われます。 ICHAR、CHAR、ANINT、DNINT、QNINT、NINT、IDNINT、IQNINT、DPROD、QPROD、LEN、 INDEX、DASIN、QASIN、DACOS、QACOS、LGE、LGT、LLE、LLT、NOT、IAND、IOR、 IEOR、ISHFT、IBSET、IBCLR、BTEST 以下の名前は、Fortran 95 言語仕様では、組込み手続として解釈されますが、FORTRAN66 および FORTRAN77 言語仕様では、ユーザ定義の手続として取り扱われます。 ACHAR、ADJUSTL、ADJUSTR、ALL、ALLOCATED、ANY、ASSOCIATED、CEILING、COUNT、 CSHIFT、DATE_AND_TIME、DIGITS、DOT_PRODUCT、EOSHIFT、EPSILON、EXPONENT、 FLOOR、FRACTION、HUGE、IACHAR、IBITS、ISHFTC、KIND、LBOUND、LEN_TRIM、 LOGICAL、MATMUL、MAXEXPONENT、MAXLOC、MAXVAL、MERGE、MINEXPONENT、 MINLOC、MINVAL、MODULO、MVBITS、NEAREST、PACK、PRECISION、PRESENT、 PRODUCT、RADIX、RANDOM_NUMBER、RANDOM_SEED、RANGE、REPEAT、RESHAPE、 RRSPACING、SCALE、SCAN、SELECTED_INT_KIND、SELECTED_REAL_KIND、 SET_EXPONENT、SHAPE、SIZE、SPACING、SPREAD、SUM、TINY、SYSTEM_CLOCK、 TRANSFER、TRANSPOSE、TRIM、UBOUND、UNPACK、VERIFY、CPU_TIME、NULL 備考.翻訳時オプション -Nnof95 が指定されたとき、手続呼出しの CPU_TIME および NULL はユーザ手続呼出しと解釈されます。 Fortran 使用手引書ー Page 128 以下の名前は、翻訳時オプション -Nobsfun が指定されたとき、組込み関数として解釈されます。 AIMAX0、AJMAX0、I2MAX0、IMAX0、JMAX0、IMAX1、JMAX1、AIMIN0、AJMIN0、I2MIN0、 IMIN0、JMIN0、IMIN1、JMIN1、FLOATI、FLOATJ、DFLOTI、DFLOTJ、IIABS、JIABS、I2ABS、 IIDIM、JIDIM、I2DIM、IIFIX、JIFIX、JFIX、INT1、INT2、INT4、IINT、JINT、ININT、JNINT、 IIDNNT、I2NINT、JIDNNT、IIDINT、JIDINT、IMOD、JMOD、I2MOD、IISIGN、JISIGN、I2SIGN、 BITEST、BJTEST、IIBCLR、JIBCLR、IIBITS、JIBITS、IIBSET、JIBSET、IBCHNG、ISHA、ISHC、 ISHL、IIAND、JIAND、IIEOR、JIEOR、IIOR、JIOR、INOT、JNOT、IISHFT、JISHFT、IISHFTC、 JISHFTC、IZEXT、JZEXT、IZEXT2、JZEXT2、JZEXT4、VAL 6.6.5 型宣言された組込み関数名 FORTRAN77 および Fortran 95 言語仕様では、組込み関数名が本来もっている型と異なる型で型宣 言されても、組込み関数としての性格を失うことはありません。 FORTRAN66 言語仕様では、組込み関数名が本来もっている型と異なる型で型宣言されると、組 込み関数としての性格を失い、関数引用として使用されるときはユーザ定義の関数とみなされま す。 6.6.6 サービスルーチン 翻訳時オプション -AU を指定した場合、サービスルーチン名は英小文字でなければなりません。 各サービスルーチンの明示的引用仕様を定義したモジュール SERVICE_ROUTINES を引用するこ とにより、引数の数、引数の型などの正当性の検査が実施されます。モジュール SERVICE_ROUTINES を引用する場合には、以下の注意が必要です。 - 翻訳時オプション -Am を指定してください。 - SERVICE_ROUTINES にはすべてのサービスサブルーチンおよびサービス関数の明示的引用 仕様が含まれます。引用する場合は以下のように ONLY 句を指定し、実際に引用するサービ スルーチンだけを参照結合することをお勧めします。 USE SERVICE_ROUTINES ,ONLY:ACCESS - 翻訳時オプション -AU を指定した場合、モジュール名 SERVICE_ROUTINES および各サービ スルーチン名は小文字でなければなりません。 - 翻訳時オプション -CcdII8、-CcI4I8、-CcdRR8、-CcR4R8、-CcdLL8、-CcL4L8、-Ccd4d8、-Cca4a8、 -Ad または -Aq を指定した場合、サービスルーチンの引数および結果の対応する型が変換さ れます。実行時に対応する実行時オプション -Lb、-Li、-Lr を指定する必要があります。 モジュール SERVICE_ROUTINES を引用しない場合、サービスルーチン引用の正当性の検査は実 施されません。モジュールの引用については、“第 10 章 モジュールおよびモジュール引用の注 意事項”を参照してください。 翻訳時オプション -Nmallocfree を指定した場合、malloc 関数および free サブルーチンは組込み手 続として解釈されます。 翻訳時オプション -NRtrap および実行時オプション -Wl,-i または -Wl,-u を指定した場合、dvchk サービスサブルーチンおよび overfl サービスサブルーチンには、例外が発生していないことを示 す値が返却されます。 第 7 章 入出力処理 この章では、原始プログラムに記述した入出力文がどのように実行されるか、利用者が目的に合っ た実行を行うのにどのような手続が必要か、および入出力文で扱うファイルについて説明します。 入出力文で扱うファイルには、内部ファイルと外部ファイルがありますが、特にことわりのない 限り、“ファイル”と記述している場合は外部ファイルを意味します。 7.1 ファイルの基本事項 入出力文で扱うファイルには、内部ファイルと外部ファイルがあります。 内部ファイルは、内部記憶領域にあり、スカラ文字型変数、文字型配列要素、文字型配列または 文字部分列のうちのどれかです。内部ファイルは内部ファイル入出力文で入出力することができ ます。 外部ファイルは、Fortran プログラムの外部媒体上にあり、順編成ファイルと直接編成ファイルの 二つに分けられます。 順編成ファイルとは、Fortran における探査法の順番探査に接続されるファイルです。直接編成ファ イルとは、Fortran における探査法の直接探査に接続されるファイルです。Fortran が扱うことがで きるファイルを次に示します。 - - - - 標準入力ファイル(stdin) 標準出力ファイル(stdout) 標準エラー出力ファイル(stderr) 通常ファイル なお、標準ファイル以外を通常ファイルと呼ぶことにします。通常ファイルは、順番探査または 直接探査のどちらかで入出力できます。標準ファイルは、順番探査でだけ入出力できます。ただ し、書式なし入出力で探査することはできません。 7.1.1 ファイルの存在 ファイルは、実行可能プログラムの実行開始時に存在しているものと、実行可能プログラムの実 行中に新しく存在するものとがあります。 存在しているファイルまたは新たに存在するファイルは、入出力文に指定した装置番号と結びつ けられることにより、入出力することができます。 この結びつきについては、“7.2 装置番号とファイルの接続”を参照してください。 7.1.2 ファイルの接続 入出力文を実行するためには、ファイルと装置番号が結びつけられていなければなりません。こ れをファイルの接続といいます。また、CLOSE 文の実行で、ファイルと装置番号の結びつきが解 除されます。これを、ファイルの接続の解除といいます。 Fortran 使用手引書ー Page 130 一つの装置番号は同時に二つ以上のファイルと接続できません。また、一つのファイルは同時に 二つ以上の装置番号と接続できません。 7.1.2.1 接続 ファイルの接続には、次のものがあります。 - 動的な接続 - 事前の接続 動的な接続は、実行可能プログラムの実行中に、OPEN 文、WRITE 文、READ 文、BACKSPACE 文、ENDFILE 文または PRINT 文(翻訳時オプション -Xf6 または -Xf7 を指定した場合、OPEN 文、 WRITE 文、ENDFILE 文または PRINT 文)の実行によって行われます。ただし、直接探査入出力 文を実行するファイルに対しては、OPEN 文の実行によって行われます。 事前の接続は、実行可能プログラムの実行前に、Fortran プログラムの外部からの指定によって行 われます。 事前の接続が行われているファイルに対して、OPEN 文が実行された場合、事前に接続されてい るファイル名と OPEN 文の FILE 指定子で指定されたファイル名が同じか、または OPEN 文の FILE 指定子が省略された場合には、事前の接続が有効となります。また、事前に接続されているファ イル名と OPEN 文の FILE 指定子で指定されたファイル名が異なる場合は、事前の接続が解除さ れ、OPEN 文で指定されたファイルが動的に接続されます。 システムで定義されている標準入力ファイル(stdin) 、標準出力ファイル(stdout)および標準エ ラー出力ファイル(stderr)については、事前の接続が行われているのと同じ状態です。FILE 指定 子の指定がある OPEN 文が実行されると、システムで定義されている標準ファイルの接続が解除 されるので注意してください。 以下は、装置番号とファイルの対応を示したものです。 装置番号 ファイル 意味 0 標準エラー出力ファイル 診断メッセージを出力するファイル Fortran システムが装置番号として 0 を使用します。 5 標準入力ファイル 装置番号 5 の入力文が対応します。 6 標準出力ファイル 装置番号 6 の出力文が対応します。 1~4 利用者指定の名前付きファイル 7 ~ 2147483647 または名前なしファイル 各装置番号の入出力文が対応します。 7.1.2.2 接続の解除 ファイルの接続の解除は、次の場合に行われます。 - CLOSE 文の実行 - 実行可能プログラムの終了 - 同一装置番号に対しファイル名が異なる OPEN 文の実行 接続の解除では、以下の処理を行います。 - ファイルと装置番号の接続解除 - ファイルの保存または削除の処理 Fortran 使用手引書ー Page 131 このため、一度接続を解除された装置番号に対してファイルを接続するには、OPEN 文の実行に よって、動的な接続を行わなければなりません。接続を解除されたファイルは、同じ実行可能プ ログラム内で、同じ装置番号または別の装置番号と再接続できます。しかし、一度接続を解除さ れたファイルを再接続するには、ファイル名を指定した OPEN 文を実行しなければなりません。 すなわち、一度接続を解除された名前なしファイルは、再び接続することはできません。標準入 力ファイル、標準出力ファイル、標準エラー出力ファイルは名前なしファイルと同じ扱いです。 以下に、ファイルの接続関係の変遷例を示します。 ファイル A 接続 データ 解除 OPEN(1,FILE='A') READ(1)K CLOSE(1) OPEN(1,FILE='B') 接続 データ ファイル B READ(1)J 接続 データ OPEN(2,FILE='A') READ(2)L CLOSE(1) 解除 7.2 装置番号とファイルの接続 装置番号とファイルを接続するには以下の三つの方法があります。 - プログラムの中でファイル名指定の OPEN 文を実行することにより接続します。 - リダイレクション機能を使うことにより標準入力、標準出力、標準エラー出力をプログラム 外で接続します。 - 環境変数を使用して装置番号とファイルをプログラム外で接続します。 7.2.1 装置番号とファイルの接続の優先順位 装置番号とファイルを接続する場合、その接続方法により、優先順位があります。 Fortran 使用手引書ー Page 132 標準入力、標準出力および標準エラー出力ファイルの場合の接続方法とその優先順位を、以下の 表に示します。 指定方法 説明 ファイル名指定の OPEN 文 OPEN 文の FILE 指定子による指定 優先順位 高い 実行時オプション 標準入出力、標準エラー出力と結合 する装置番号の設定。 -pu_no(標準出力) -ru_no(標準入力) -mu_no(標準エラー出力) ↑ ↓ Fortran システムの標準値 標準入出力、標準エラー出力と結合 する装置番号の設定。 標準出力(装置番号 6) 標準入力(装置番号 5) 標準エラー出力(装置番号 0) 低い 利用者指定の名前付きファイルおよび名前なしファイルの場合の接続方法とその優先順位を、以 下の表に示します。 指定方法 説明 ファイル名指定の OPEN 文 OPEN 文の FILE 指定子による指定 環境変数 環境変数 fuxx(xx は装置番号)によ る割当て 優先順位 高い 低い 7.2.2 環境変数による装置番号とファイルの接続 環境変数によって、装置番号とファイルの対応づけをとることができます。以下に環境変数によ るファイル名の指定方法を示します。 環境変数:fuxx = ファイル名 :固定です。 :装置番号(00 ~ 2147483647)を示します。 ファイル名 :(フル)パス名であっても、単なるファイル名であってもかまいません。 fu xx 実行時オプション -m、-r、-p によって表される装置番号(標準は、それぞれ 0、5、6)は、それ ぞれ固定的に標準エラー出力、標準入力、標準出力に接続されるため、環境変数によってファイ ルと接続することはできません。これらのファイルは、リダイレクション機能を使用することに より端末以外に接続することができます。 環境変数でのファイルの接続はファイルの接続が解除されたときに無効になり、それ以降も無効 になります。ファイルの接続が解除されるときの入出力文は以下のどちらかです(標準入力ファ イル、標準出力ファイルおよび標準エラー出力ファイルに関しても同様です)。 - CLOSE 文 - ファイル名指定の OPEN 文 Fortran 使用手引書ー Page 133 例 1:装置番号 1 とファイル名 test.data の接続 環境変数の設定: % setenv fu01 test.data 設定した内容の確認: - set(set コマンドは設定されているすべての内容を表示します) - echo $fu01(echo コマンドは指定したものの内容を表示します) 例 2:無効な環境変数による接続 Fortran プログラム OPEN(1,FILE='b.file') READ(1,100) I : コマンド列 % setenv fu01 a.file % a.out a.out を実行すると環境変数による接続(a.file への接続)は無効となり、OPEN 文で指定 したファイル名(この場合は、b.file)が有効となり、そのファイルよりデータが入力され ます。 7.3 Fortran 記録 Fortran 記録は、値の列または文字の列であり、一つの Fortran 記録は必ずしも一つの物理記録に対 応するものではありません。Fortran 記録は、次の六つがあります。 - 書式付き Fortran 記録(“7.3.1 書式付き Fortran 記録”を参照) - 書式なし Fortran 記録(“7.3.2 書式なし Fortran 記録”を参照) - 並びによる Fortran 記録( “7.3.3 並びによる Fortran 記録”を参照) - 変数群 Fortran 記録(“7.3.4 変数群 Fortran 記録”を参照) - ファイル終了記録(“7.3.5 ファイル終了記録”を参照) - BINARY Fortran 記録( “7.3.6 BINARY Fortran 記録”を参照) Fortran 記録の構成を、以下に示します。 Fortran 記録の種類 書式付き Fortran 記録 入出力文の種類 順編成ファイル 書式付き順番探査入出力文 不定長記録 一つの論理記録と して存在します。 直接編成ファイル 書式付き直接探査入出力文 固定長記録 一つの論理記録と して存在します。 内部ファイル 内部ファイル入出力文 記録形式 一つの Fortran 記録 ファイルの種類 一つの文字型スカ 固定長記録 ラ変数として存在 します。 Fortran 使用手引書ー Page 134 Fortran 記録の種類 書式なし Fortran 記録 並びによる Fortran 記録 入出力文の種類 順編成ファイル 書式なし順番探査入出力文 可変長記録 一つの論理記録と して存在します。 直接編成ファイル 書式なし直接探査入出力文 固定長記録 一つの論理記録と して存在します。 順編成ファイル 並びによる入出力文 PRINT 文 不定長記録 一つの論理記録と して存在します。 内部ファイル 内部ファイル入出力文 一つの文字型スカ 固定長記録 ラ変数として存在 します。 順編成ファイル 変数群入出力文 & 変数名から / ま たは &end までの 不定長記録 一つの論理記録と して存在します。 内部ファイル 内部ファイル入出力文 一つの文字型スカ 固定長記録 ラ変数として存在 します。 順編成ファイル 直接探査入出力文以外の入 なし 出力文 長さの属性をもた ない最後の Fortran 記録とし て存在します。 順編成ファイル 書式なし順番探査入出力文 固定長記録 一つの論理記録と して存在します。 直接編成ファイル 書式なし直接探査入出力文 固定長記録 一つの論理記録と して存在します。 変数群 Fortran 記録 ファイル 終了記録 BINARY Fortran 記録 記録形式 一つの Fortran 記録 ファイルの種類 備考. Fortran 記録は外部媒体上では、不定長、固定長または可変長の論理記録という形態で存在 します。不定長記録では、Fortran 記録と改行文字(\n)を含めたもの、固定長記録では、 Fortran 記録そのもの、可変長記録では、Fortran 記録に 8 バイト(Fortran 記録の長さを格 納した前後の 4 バイト)を加えたものです。 7.3.1 書式付き Fortran 記録 書式付き Fortran 記録は、任意の文字列で構成され、書式仕様によって定義されます。 この書式付き Fortran 記録は、書式付き順番探査入出力文、書式付き直接探査入出力文および内部 ファイル入出力文で扱うことができます。 7.3.1.1 書式付き順番探査入出力文で扱う Fortran 記録 書式付き順番探査入出力文で扱うファイルの記録形式は不定長記録であり、一つの Fortran 記録が 一つの論理記録に対応します。不定長記録の記録長は、扱う Fortran 記録の長さにより可変です。 記録の最大の長さは、OPEN 文の RECL 指定子で指定することができます。論理記録の終端には 改行文字(\n)が入っています。書式付き順番探査 WRITE 文における書式仕様に $ 編集記述子ま たは \ 編集記述子を指定した場合、改行文字を含まない Fortran 記録を出力することができます。 Fortran 使用手引書ー Page 135 以下に書式付き Fortran 記録と不定長記録形式との関係を示します。 [ 原始プログラム ] INTEGER,DIMENSION(20) :: IA INTEGER,DIMENSION(10) :: IB INTEGER,DIMENSION(30) :: IC WRITE(2,10) IA,IB 10 FORMAT(20I4,/,10I4) WRITE(2,20) IC 20 FORMAT(30I4) [ Fortran 記録 ] 1 81 80 Fortran 記録(IA) \n 論理記録 1 40 Fortran 記録(IB) 41 \n 論理記録 120 1 Fortran 記録(IC) 121 \n 論理記録 7.3.1.2 書式付き直接探査入出力文で扱う Fortran 記録 書式付き直接探査入出力文で扱うファイルの記録形式は固定長記録です。一つの Fortran 記録は一 つの論理記録を形成します。論理記録の長さは OPEN 文の RECL 指定子で与えなければなりませ ん。出力では、論理記録より Fortran 記録が短いときは残りの部分に空白が詰められます。ただし、 論理記録より Fortran 記録が長くてはなりません。この固定長記録形式は Fortran 固有の形式です。 以下に書式付き Fortran 記録と固定長記録形式との関係を示します。 [ 原始プログラム ] INTEGER,DIMENSION(20) :: IA INTEGER,DIMENSION(10) :: IB OPEN(UNIT=3,ACCESS='DIRECT',RECL=80) WRITE(3,FMT=10,REC=1) IA,IB 10 FORMAT(20I4) Fortran 使用手引書ー Page 136 [ Fortran 記録 ] 1 80 Fortran 記録(IA) 論理記録 1 80 40 Fortran 記録(IB) 40 バイトの空白 論理記録 7.3.1.3 内部ファイル入出力文で扱う Fortran 記録 内部ファイル入出力文で扱うファイルの形式は固定長記録であり、内部ファイルに存在します。 内部ファイルがスカラ文字型変数、文字型配列要素または文字部分列のとき、それはただ一つの Fortran 記録を含みます。Fortran 記録の長さはスカラ文字型変数、文字型配列要素または文字部分 列の長さを超えてはなりません。内部ファイルが文字型配列のとき、一つの Fortran 記録の長さは 配列要素の長さを超えてはなりません。 出力で、Fortran 記録の長さがスカラ文字型変数、文字型配列要素または文字部分列の長さより短 いときには、それぞれの残りの部分に空白が詰められます。入力では、Fortran 記録の長さはそれ ぞれの長さに等しくなります。 以下に書式付き Fortran 記録と内部ファイルの関係を示します。 [ 原始プログラム ] CHARACTER(LEN=20),DIMENSION(3) :: C INTEGER,DIMENSION(5) :: IA INTEGER,DIMENSION(3) :: IB INTEGER,DIMENSION(2) :: IC WRITE(C,10) IA,IB,IC 10 FORMAT(5I4) [ Fortran 記録(内部ファイル :C)] 20 バイト C(1) C(2) C(3) Fortran 記録(IA) Fortran 記録(IB) 値は変わらず (IC) Fortran 使用手引書ー Page 137 7.3.2 書式なし Fortran 記録 書式なし Fortran 記録は、値(文字および文字以外のデータをともに含んでもよいし、データを含 まなくてもよい)の列で構成され、長さは原始プログラムの入出力並びに依存(長さはゼロであっ てもよい)します。この書式なし Fortran 記録は、書式なし順番探査入出力文および書式なし直接 探査入出力文で扱うことができます。 7.3.2.1 書式なし順番探査入出力文で扱う Fortran 記録 書式なし順番探査入出力文で扱うファイルの記録形式は可変長記録であり、一つの Fortran 記録が 一つの論理記録に対応します。可変長記録形式の記録の長さは、扱う Fortran 記録の長さにより可 変であり、論理記録の先頭および最後の各 4 バイト(翻訳オプション -KV9 が有効であり、実行 時オプション -Lu を指定した場合には 8 バイト)には一つの Fortran 記録の長さが格納されていま す。この最大の長さは、OPEN 文の RECL 指定子で指定することができます。 先頭の長さ域は、書式なし入力文が実行されるときに使用され、最後の長さ域は、BACKSPACE 文が実行されるときに使用されます。この可変長記録は、Fortran 固有の形式です。 以下に書式なし Fortran 記録と可変長記録形式との関係を示します。 [ 原始プログラム ] INTEGER,DIMENSION(10) :: IA,IC INTEGER,DIMENSION(20) :: IB WRITE(2,*) IA,IB WRITE(2,*) IC [ Fortran 記録 ] 実行時オプション -Lu を指定していない場合 1 4 44 Fortran 記録(IB) Fortran 記録(IA) 120 Fortran 記録 L 論理記録 1 4 40 L 48 44 Fortran 記録(IC) 40 Fortran 記録 L 論理記録 L:それぞれの Fortran 記録の長さを示す長さ情報 124 128 120 L Fortran 使用手引書ー Page 138 翻訳時オプション -KV9 が有効なとき、実行時オプション -Lu が指定されている場合 1 48 8 Fortran 記録(IA) 120 Fortran 記録(IB) Fortran 記録 L 136 128 120 L 論理記録 1 40 L 56 48 8 Fortran 記録(IC) 40 Fortran 記録 L 論理記録 L:それぞれの Fortran 記録の長さを示す長さ情報 7.3.2.2 書式なし直接探査入出力文で扱う Fortran 記録 書式なし直接探査入出力文で扱うファイルの記録の形式は固定長記録であり、一つ以上の論理記 録が対応します。固定長記録の形式については“7.3.1.2 書式付き直接探査入出力文で扱う Fortran 記録”を参照してください。 記録長は OPEN 文の RECL 指定子で与えなければなりません。一つの Fortran 記録は一つ以上の論 理記録を形成します。出力では、論理記録の途中で Fortran 記録が終了したとき、残りの部分にバ イナリゼロが詰められます。また、Fortran 記録の長さが論理記録長より長いときは、出力並びの 残りの部分が Fortran 記録として次の記録番号に出力されます。この固定長記録形式は Fortran 固 有の形式です。 7.3.3 並びによる Fortran 記録 並びによる Fortran 記録は、並びによる入出力文、PRINT 文および内部ファイル入出力文で扱うこ とができ、データ項目と値区切り子で構成されます。データ項目とは、入出力並び項目に割当て られる文字の列です。出力では、出力並び項目の個数および型によって Fortran 記録の長さが決定 されます。入力では、論理記録の先頭から入力並び項目の処理を終了するまでのデータ項目を一 つの Fortran 記録として扱います。 並びによる入出力文で扱うファイルの記録形式は不定長記録および固定長記録です。不定長記録 形式については“7.3.1.1 書式付き順番探査入出力文で扱う Fortran 記録”と同じです。固定長記 録の形式については“7.3.1.3 内部ファイル入出力文で扱う Fortran 記録”と同じです。 7.3.4 変数群 Fortran 記録 変数群 Fortran 記録は、変数群入出力文および内部ファイル入出力文で扱うことができ、& 変数群 名から / または &end までのデータ項目(変数群名によって指定された要素に割当てられた文字の 列)で構成されます。変数群 Fortran 記録と論理記録との対応は、並びによる入出力文で扱う Fortran 記録と同じです。 Fortran 使用手引書ー Page 139 変数群入出力文で扱うファイルの記録形式は不定長記録です。不定長記録の形式については “7.3.1.1 書式付き順番探査入出力文で扱う Fortran 記録”と同じです。また、内部ファイル入出力 文で扱うファイルの記録形式は固定長記録です。固定長記録の形式については“7.3.1.3 内部ファ イル入出力文で扱う Fortran 記録”と同じです。 7.3.5 ファイル終了記録 ファイル終了記録は、一つのファイルの最後の記録としてだけ存在することができ、長さに関す る属性はもちません。 ファイル終了記録は ENDFILE 文によって書かれます。ファイルは順編成ファイルに接続されてい なければなりません。ファイル終了記録は、ファイルが順編成ファイルに接続されていて、かつ、 最後の処理が ENDFILE 文以外で、WRITE 文実行後の以下のどれかの条件のときにも暗黙に出力 されます。 - REWIND 文が実行されています。 - BACKSPACE 文が実行されています。 - CLOSE 文が実行されています。 7.3.6 BINARY Fortran 記録 BINARY Fortran 記録は、値(文字および文字以外のデータをともに含んでもよいし、データを含 まなくてもよい)の列で構成され、長さは原始プログラムの入出力並びに依存(長さはゼロであっ てもよい)します。この Fortran 記録は、書式なし順番探査入出力文および書式なし直接探査入出 力文で扱うことができます。 BINARY Fortran 記録は固定長形式です。 7.4 OPEN 文 ここでは OPEN 文について説明します。 7.4.1 OPEN 文の指定子 ここでは、OPEN 文に指定できる以下の指定子について説明します。他の指定子については “7.7.1 入出力文の制御情報”を参照してください。 - - - - - FILE 指定子(“7.4.1.1 FILE 指定子”を参照) STATUS 指定子(“7.4.1.2 STATUS 指定子”を参照) RECL 指定子(“7.4.1.3 RECL 指定子”を参照) ACTION 指定子(“7.4.1.4 ACTION 指定子”を参照) BLOCKSIZE 指定子(“7.4.1.5 BLOCKSIZE 指定子”を参照) STATUS 指定子、ACCESS 指定子、FORM 指定子、BLANK 指定子、ACTION 指定子、PAD 指定 子、POSITION 指定子、DELIM 指定子、CARRIAGECONTROL 指定子および CONVERT 指定子に 指定する文字式の値は、各指定子によって異なります。各指定子に指定された文字式は、文字式 の先頭より、各指定子で指定可能な文字定数の長さだけ比較されます(ただし、先頭の空白は比 較されません) 。 比較した結果が等しくない、または文字式の長さが比較される文字定数の長さに満たない場合、 診断メッセージ(jwe0086i-w)が出力され、その指定子は指定されないものとみなされます。文 字式の長さが、比較される文字定数の長さより長い場合、残りは空白でなければなりません。 以下に、OPEN 文の ACCESS 指定子で指定する文字式の扱いを示します。他の指定子も同様に扱 われます。 Fortran 使用手引書ー Page 140 例:文字列 "SEQUENTIAL" として扱われる場合 OPEN(10,ACCESS='SEQUENTIAL') OPEN(10,ACCESS='sequential') OPEN(10,ACCESS='SeQuEnTiAl') OPEN(10,ACCESS='SEQUENTIAL ') OPEN(10,ACCESS=' SEQUENTIAL') 例:指定子が未指定として扱われる場合 OPEN(10,ACCESS='SEQUENTIALAB') OPEN(10,ACCESS='SEQUEN') OPEN(10,ACCESS='S EQUENTIAL') OPEN(10,ACCESS=' ') 7.4.1.1 FILE 指定子 この指定子には、ファイル名を指定します。 FILE 指定子に指定する文字式の値で、先頭に空白があったときは、その空白が無視されます。 以下に、現在のディレクトリを '/home/v1954' とした場合の、OPEN 文の FILE 指定子に指定する文 字式の扱いを示します。 例:/home/v1954/file.data1 と解釈される場合 OPEN(10,FILE='/home/v1954/file.data1') OPEN(10,FILE='file.data1') OPEN(10,FILE=' file.data1') 例:/home/c1121/file.data1 と解釈される場合 OPEN(10,FILE='../c1121/file.data1') FILE 指定子で指定したファイルの名前は、STATUS 指定子の値によって決定されます。 STATUS 指定子 FILE 指定子 FILE 指定子あり NEW、 OLD、SHR、 REPLACE SCRATCH UNKNOWN FILE 指定子に指定さ FILE 指定子に指定さ ファイルの状態により れた値の名前付きファ NEW または OLD と同 れた値の名前付きファ イルとして扱います。 イルとして扱います。 様に扱われます。 (注 1) 名前付きファイル FILE 指定子なし (fort.nn) として扱われ 環境変数割当てなし ます。 (注 2) 名前付きファイル 名前なしファイルとし (fort.nn) として扱われ て扱われます。 ます。 (注 3) 環境変数に指定された FILE 指定子なし ファイル名の名前付き 環境変数割当てあり ファイルとして扱われ ます。 環境変数に指定された ファイル名の名前付き ファイルとして扱われ ます。 (注 1) 環境変数に指定された ファイル名の名前付き ファイルとして扱われ ます。 注 1) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。指定していない 場合、CLOSE 文に STATUS='KEEP' を指定しないとファイルは削除されます。 注 2) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。 注 3) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、名前なしファイルとして扱われます。 Fortran 使用手引書ー Page 141 備考 1.FILE 指定子なしの場合、環境変数による装置番号とファイルの接続( “7.2.2 環境変数に よる装置番号とファイルの接続”を参照)があるときと、ないときで扱いが異なります。 備考 2.名前なしファイルの名前は、tFnnn(nnn は装置番号)を頭文字とする任意の文字列です。 詳細については、tempnam(3s) を参照してください。 7.4.1.2 STATUS 指定子 STATUS 指定子に指定する値は、ファイルの状態に対応しなければなりません。すなわち、既に 存在しているファイルに対して、NEW または SCRATCH を指定してはなりません。UNKNOWN が指定されているときは、本システムによって、ファイルの状態が決定されます。この指定子を 省略した場合、UNKNOWN を指定したものとみなされます。 以下に、STATUS 指定子とファイルの関係を記述します。 STATUS 指定子 ファイル NEW プログラムの実行を開始するまでに、存在していないファイ ルを指定します。 OLD SHR プログラムの実行を開始するときに既存のファイルまたはプ ログラムの実行中に新たに生成されたファイルを指定しま す。 SCRATCH プログラムの実行を開始するまでに、存在していないファイ ルであり、かつ、プログラムの終了またはファイルがクロー ズされるときに、以下のように処理が異なるファイルに対し て指定します。 (注 1) FILE 指定子あり。または、環境変数による割当てあり。 CLOSE 文に STATUS='KEEP' が指定されていないと、 ファイルは削除されます。 FILE 指定子および環境変数による割当てなし。 ファイルは削除されます。 UNKNOWN ファイルの状態が分からず、本システムにゆだねる場合に指 定します。 本システムでは以下の処理を行います。 FILE 指定子あり。 プログラムの実行を開始するまでに存在していないとき は NEW、存在しているときは OLD。 FILE 指定子なし。 環境変数による割当てがないときは SCRATCH、割当て があるときは OLD。 REPLACE ファイルの状態にかかわらず、新たにファイルを生成する場 合に指定します。 本システムでは以下の処理を行います。 ファイルあり。 FILE 指定子または環境変数により指定されたファイルま たは fort.nn を削除した後、指定されたファイルまたは fort.nn を生成します。(注 2) ファイルなし。 FILE 指定子または環境変数により指定されたファイルま たは fort.nn を生成します。 (注 2) Fortran 使用手引書ー Page 142 注 1) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、FILE 指定子および環境変数による割 当ての有無にかかわらず、ファイルは削除されます。 注 2) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、fort.nn は削除、生成されません。 7.4.1.3 RECL 指定子 この指定子は、直接探査として接続されるファイルの場合は、ファイル上の各 Fortran 記録の長さ を指定します。直接探査入出力文を実行する前に、この指定子が指定されている OPEN 文を実行 しなければなりません。存在するファイルに対して指定した値は、ファイルを構成する Fortran 記 録の長さと同じでなければなりません。 順番探査として接続されるファイルの場合は、ファイル上の各 Fortran 記録の最大長を指定します。 この指定子を省略した場合、2147483647 を指定したものとみなされます。 この指定子の値は、正の値でなければなりません。 以下に、ACCESS 指定子と RECL 指定子の関係を記述します。 RECL 指定子あり ACCESS 指定子 SEQUENTIAL DIRECT なし 翻訳時オプション -X9 が有効な場合 翻訳時オプション -X9 が無効な場合 RECL 指定子なし 実行時の診断メッセー ジ(jwe0097i-w)が出 ファイルは順番探 ファイルは順番探査と 力され、ファイルは順 査として接続され して接続されます。 番探査として接続され ます。 ます。 ファイルは直接探査と ファイルは直接探査と エラー して接続されます。 して接続されます。 翻訳時の診断メッセー ジ(jwd1449i-i)が出 ファイルは順番探 ファイルは順番探査と 力され、ファイルは直 査として接続され して接続されます。 接探査として接続され ます。 ます。 7.4.1.4 ACTION 指定子 READ と指定したときは、指定された装置番号と接続されたファイルをオープンするときのオー プンモードに、'r' を指定します。すなわち、接続されたファイルに対して WRITE 文および PRINT 文を実行することはできません。 WRITE と指定したときは、順番探査に対しては指定された装置番号と接続されたファイルをオー プンするときのオープンモードに 'w' を指定します。 すなわち、 接続されたファイルに対して READ 文、BACKSPACE 文および REWIND 文を実行することはできません。直接探査に対しては WRITE を指定しても READWRITE とみなされます。 READWRITE または BOTH と指定したときは、指定された装置番号と接続されたファイルをオー プンするときのオープンモードに 'r+' または 'w+' を指定します。すなわち、接続されたファイル に対して、許されるすべての入出力文の実行ができます。ただし、read 権だけが与えられている ファイルをオープンするときは、オープンモードに 'r' を指定します。したがって、READWRITE または BOTH を指定していても、WRITE 文を実行したときに、実行時のエラーとなります。 この指定子を省略した場合、READWRITE を指定したものとみなされます。 Fortran 使用手引書ー Page 143 以下に ACTION 指定子とオープンモードの関係を示します。 アクセス 方法 ファイルの STATUS NEW OLD SHR ACTION 指定子 READ WRITE w+ READ r WRITE w READWRITE BOTH r+ (注 1) WRITE SCRATCH READWRITE BOTH REPLACE NEW OLD SHR WRITE READWRITE BOTH w+ (注 2) READ エラー w WRITE READWRITE BOTH w+ READ r WRITE r+ READWRITE BOTH r+ (注 2) READ 直接探査 WRITE SCRATCH READWRITE BOTH 名前なしファイルに対する ACTION='READ' はエラーです。 w+ 翻訳時オプション -Xf6 または -Xf7 を指定しない場合、存在しない r+ (注 2) ファイルに対する ACTION='READ' はエラーです。 r WRITE エラー w+ READWRITE BOTH w+ (注 2) READ REPLACE 名前なしファイルに対する ACTION='READ' はエラーです。 w 翻訳時オプション -Xf6 または -Xf7 を指定しない場合、存在しない w+ (注 1) ファイルに対する、 ACTION='READ' はエラーです。 r エラー w READ 備考 エラー w READWRITE BOTH READ 順番探査 OPEN モード 注 1) read 権だけが与えられているファイルをオープンしようとした場合、'r' モードでオープン されます。 注 2) read 権だけが与えられているファイルをオープンしようとした場合、エラーとなります。 Fortran 使用手引書ー Page 144 7.4.1.5 BLOCKSIZE 指定子 この指定子は、順番探査入出力のバッファサイズをバイト数で指定します。BLOCKSIZE 指定子 を省略した場合、バッファサイズは、書式つき順番探査入出力では 8K バイト、書式なし順番探 査入出力では 1M バイトです。 7.4.2 再結合時の OPEN 文の指定子の値 CLOSE 文の実行によって外部装置を解除しないで、その装置を同じ実行可能プログラム中で同じ ファイルに再び接続した場合、OPEN 文で指定した BLANK 指定子、DELIM 指定子、PAD 指定 子、ERR 指定子および IOSTAT 指定子以外の指定子の値が、直前に接続された外部装置の状態と 異なるとき、OPEN 文の実行時の動作が異なります。 FORTRAN66 または FORTRAN77 言語仕様では、直前に接続された外部装置の状態を有効にし、 正常終了します。 Fortran 95 言語仕様では、診断メッセージ(jwe1115i-w)が出力され、直前に接続された外部装置 の状態を有効にします。 例: プログラム ap.f OPEN(10,FILE='XX.DAT',POSITION='APPEND') WRITE(10,*) 123 OPEN(10,FILE='XX.DAT',POSITION='REWIND') WRITE(10,*) 456 END 実行結果 % frt -X7 ap.f; a.out; cat XX.DAT 123 456 % frt -X9 ap.f; a.out; cat XX.DAT jwe1115i-w line 3 The value of POSITION specifier in an OPEN statement is different from that currently in effect (unit=10). error occurs at MAIN__ line 3 loc 00010778 offset 00000024 MAIN__ at loc 00010754 called from o.s. taken to (standard) corrective action, execution continuing. error summary (Fortran) error number error level error count jwe1115i w 1 total error count = 1 123 456 7.4.3 書式付き入出力と書式なし入出力の混在 書式付き入出力として接続されているファイルに書式なしデータ転送を行ったとき、または、書 式なし入出力として接続されているファイルに書式付きデータ転送を行ったとき、入出力文の実 行動作が異なります。 FORTRAN66 または FORTRAN77 言語仕様では、入出力文の書式に従い、データ転送を行い、正 常終了します。 Fortran 95 言語仕様では、診断メッセージ(jwe0113i-e)を出力し、すでに接続されている書式に 従いデータ転送を行います。 Fortran 使用手引書ー Page 145 例: プログラム fm.f OPEN(10,FILE='XX.DAT',FORM='UNFORMATTED') WRITE(10,*)123 END 実行結果 % frt -X7 fm.f; a.out; cat XX.DAT 123 % frt -X9 fm.f; a.out; cat XX.DAT jwe0113i-e line 2 A(an) formatted I/O statement cannot be executed for a unit connected to unformatted (unit=10). error occurs at MAIN__ line 2 loc 00010770 offset 0000001c MAIN__ at loc 00010754 called from o.s. taken to (standard) corrective action, execution continuing. error summary (Fortran) error number error level jwe0113i e error count 1 total error count = 1 7.4.4 RECL 指定子があり、ACCESS 指定子がない OPEN 文 FORTRAN66 または FORTRAN77 言語仕様では、RECL 指定子があり、ACCESS 指定子がない OPEN 文は、ACCESS 指定子として ACCESS='DIRECT' が省略値となります。 Fortran 95 言語仕様では、RECL 指定子があり、ACCESS 指定子がない OPEN 文は、ACCESS 指定 子として ACCESS='SEQUENTIAL' が省略値となります。 例:RECL 指定子があり、ACCESS 指定子がない OPEN 文 OPEN(1,RECL=80) FORTRAN66 および FORTRAN77 言語仕様では、ACCESS='DIRECT' が省略値になります。 7.5 CLOSE 文の指定子 ここでは、CLOSE 文に指定できる STATUS 指定子について説明します。他の指定子は、“7.7.1 入出力文の制御情報”を参照してください。 7.5.1 STATUS 指定子 この指定子は、装置番号と接続されているファイルを存在させておくか削除するかの指定を行い ます。 ファイルを存在させておくか削除するかは、この指定子と OPEN 文の STATUS 指定子により決定 されます。 Fortran 使用手引書ー Page 146 以下に、OPEN 文の STATUS 指定子と CLOSE 文の STATUS 指定子の関係について示します。 CLOSE 文 OPEN 文 KEEP 指定なし DELETE NEW OLD SHR REPLACE CLOSE 文の実行後も CLOSE 文の実行後は CLOSE 文の実行後も 存在します。 存在しません。 存在します。 SCRATCH 名前なしファイルの CLOSE 文の実行後は CLOSE 文の実行後は 場合、CLOSE 文の実 存在しません。 存在しません。 行後は存在しません。 備考. OPEN 文で UNKNOWN を指定したときは、ファイルの状態として、NEW、OLD、SCRATCH のどれかが決定されます。 7.6 INQUIRE 文 ここでは INQUIRE 文について説明します。 7.6.1 INQUIRE 文の問合せ指定子 INQUIRE 文の指定子に指定する文字型のスカラ変数名または配列要素名の長さが、設定する文字 定数より小さい場合は、NAME 指定子と他の指定子とで扱いが異なります。 以下に、INQUIRE 文で設定される文字定数の扱いについて示します。 問合せ指定子の長さ≧文字定数の長さ NAME 指定子 他の指定子 問合せ指定子の長さ<文字定数の長さ NAME 指定子 他の指定子 実行時の診断メッ 実行時の診断メッ セージを出力し、出 文字定数の長さだけ先頭から設定します。 セージを出力し、空 力の長さだけ先頭か 残りには、空白を詰めます。 白を設定します。 ら設定します。 各問合せ指定子に設定される値は、ファイル名による INQUIRE 文と装置番号による INQUIRE 文 で異なります。表 7.1 および表 7.2 は、それぞれの文で設定される値を示したものです。 表 7.1 ファイル名による INQUIRE 文で設定される値 ファイルが存在している 使用中(注 1) 未使用(注 2) ファイルが存在して いない EXIST 真 真 偽 OPENED 真 NUMBER ○ 偽 -1 偽 -1 NAMED 真 真(注 10) 真(注 10) NAME ○ ○(注 11) ○(注 11) FLEN ○ 0 0 ACCESS ○ "UNDEFINED" "UNDEFINED"(注 8) SEQUENTIAL ○ "UNKNOWN" "UNKNOWN"(注 8) 問合せ指定子 Fortran 使用手引書ー Page 147 ファイルが存在している 使用中(注 1) 未使用(注 2) ファイルが存在して いない DIRECT ○ "UNKNOWN" "UNKNOWN"(注 8) ACTION ○ "UNDEFINED" "UNDEFINED"(注 8) READ ○ "UNKNOWN" "UNKNOWN"(注 8) WRITE ○ "UNKNOWN" "UNKNOWN"(注 8) READWRITE ○ "UNKNOWN" "UNKNOWN"(注 8) FORM ○ "UNDEFINED" "UNDEFINED"(注 8) FORMATTED ○ "UNKNOWN" "UNKNOWN"(注 8) UNFORMATTED ○ "UNKNOWN" "UNKNOWN"(注 8) BINARY ○ "UNKNOWN" "UNKNOWN"(注 8) RECL ○(注 3) 0 0 NEXTREC ○(注 4) 0 0 BLANK ○(注 5) "UNDEFINED" "UNDEFINED"(注 8) PAD ○(注 5) "YES"(注 7) "YES"(注 8) POSITION ○(注 6) "UNDEFINED" "UNDEFINED"(注 8) DELIM ○(注 5) "UNDEFINED" "UNDEFINED"(注 8) BLOCKSIZE ○(注 9) 0 0 CARRIAGECONTROL ○(注 5) "UNDEFINED" "UNDEFINED"(注 8) CONVERT ○(注 12) "UNKNOWN" "UNKNOWN"(注 8) 問合せ指定子 真 / 偽 :4 バイトの論理値です。 ○ :確定した値が設定されます。 注 1) 使用中とは、該当する装置番号に対して入出力文が既に実行されていることです。 注 2) 未使用とは、該当する装置番号に対して入出力文が実行されていないことです。 注 3) 直接探査の場合、OPEN 文で指定した値が設定されます。また、順番探査の場合、OPEN 文の RECL 指定子に指定した値、2147483647(RECL 指定子を省略した場合)または 0(翻 訳時オプション -X9 が有効でない場合)が設定されます。 注 4) 直接探査の場合だけ設定され、他の場合は 0 が設定されます。 注 5) 書式付き入出力の場合だけ設定され、他の場合は "UNDEFINED" が設定されます。 注 6) 順番探査の場合だけ設定され、他の場合は "UNDEFINED" が設定されます。 注 7) 翻訳時オプション -X9 が有効でない場合、"UNDEFINED" が設定されます。 注 8) 翻訳時オプション -X9 が有効でない場合、空白が設定されます。 注 9) 順番探査の場合だけ設定され、他の場合は 0 が設定されます。 注 10)翻訳時オプション -Xf6 または -Xf7 を指定している場合、偽が設定されます。 注 11)翻訳時オプション -Xf6 または -Xf7 を指定している場合、空白が設定されます。 注 12)書式なし入出力の場合だけ設定され、他の場合は "NATIVE" が設定されます。 備考 1.翻訳時オプション -X9 が有効でない場合、文字型の返却値については、小文字で返却され ます。 備考 2.不定値の設定は、文字型の指定子については空白、整数型の指定子については 0 を設定し ます。 備考 3.Fortran システムとして確定値が設定できない場合は、-1、0、空白、"UNKNOWN" または "UNDEFINED" を設定します。 Fortran 使用手引書ー Page 148 表 7.2 装置番号による INQUIRE 文で設定される値 装置番号が範囲内(注 1) 問合せ指定子 ファイルと結合されている (注 3) ファイルと結合 されていない (注 4) 使用中(注 5) 未使用(注 6) 装置番号が範囲外 (注 2) EXIST 真 真 真 偽 OPENED 真 NUMBER ○ 真 -1 偽 -1 偽 -1 NAMED 真(注 7) 偽 偽 偽 NAME ○(注 8) "" "" "" FLEN ○ 0 0 0 ACCESS ○ "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) SEQUENTIAL ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) DIRECT ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) ACTION ○ "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) READ ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) WRITE ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) READWRITE ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) FORM ○ "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) FORMATTED ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) UNFORMATTED ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) BINARY ○ "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) RECL ○(注 9) 0 0 0(注 14) NEXTREC ○(注 10) 0 0 0(注 14) BLANK ○(注 11) "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) PAD ○(注 11) "YES"(注 13) "YES"(注 13) "YES"(注 14) POSITION ○(注 12) "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) DELIM ○(注 11) "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) BLOCKSIZE ○(注 13) 0 0 0 CARRIAGECON TROL ○(注 15) "UNDEFINED" "UNDEFINED" "UNDEFINED"(注 14) CONVERT ○(注 16) "UNKNOWN" "UNKNOWN" "UNKNOWN"(注 14) 真 / 偽 :4 バイトの論理値です。 ○ :確定した値が設定されます。 "" :空白を示します。 注 1) 注 2) 注 3) 注 4) 装置番号が範囲内とは、装置番号が 0 から 2147483647 までの範囲内にあることです。 装置番号が範囲外とは、装置番号が 0 から 2147483647 までの範囲外にあることです。 装置番号とファイルが接続されている状態です。 装置番号とファイルが接続されていない状態です。 Fortran 使用手引書ー Page 149 注 5) 注 6) 注 7) 注 8) 注 9) 該当する装置番号に対して入出力文が既に実行されていることです。 該当する装置番号に対して入出力文が実行されていないことです。 名前なしファイルの場合、偽が設定されます。 名前なしファイルの場合、空白が設定されます。 直接探査の場合、OPEN 文で指定した値が設定されます。また、順番探査の場合、OPEN 文の RECL 指定子に指定した値、2147483647(RECL 指定子を省略した場合)または 0(翻 訳時オプション -X9 が有効でない場合)が設定されます。 注 10)直接探査の場合だけ設定され、他の場合は 0 が設定されます。 注 11)書式付き入出力の場合だけ設定され、他の場合は "UNDEFINED" が設定されます。 注 12)順番探査の場合だけ設定され、他の場合は "UNDEFINED" が設定されます。 注 13)順番探査の場合だけ設定され、他の場合は 0 が設定されます。 注 14)翻訳時オプション -X9 が有効でない場合、空白が設定されます。 注 15)書式付き順番探査出力の場合だけ設定され、他の場合は "UNDEFINED" が設定されます。 注 16)書式なし入出力の場合だけ設定され、他の場合は "NATIVE" が設定されます。 備考 1.翻訳時オプション -X9 が有効でない場合、文字型の返却値については、小文字で返却され ます。 備考 2.不定値の設定は、文字型の指定子については空白、整数型の指定子については 0 を設定し ます。 備考 3.Fortran システムとして確定値が設定できない場合は、-1、0、空白、"UNKNOWN" または "UNDEFINED" を設定します。 7.6.2 言語仕様レベルによる INQUIRE 文の動作 INQUIRE 文で返却される値についての詳細は、 “7.6.1 INQUIRE 文の問合せ指定子”を参照して ください。 7.6.2.1 ACTION 指定子の返却値 ACTION='READWRITE' または ACTION='BOTH' で扱われているファイルに対して、INQUIRE 文 の ACTION 指定子を問い合わせた場合、FORTRAN66 または FORTRAN77 言語仕様では、"BOTH" が返却されます。 Fortran 95 言語仕様では、"READWRITE" が返却されます。 7.6.2.2 INQUIRE 文の問合せ指定子に返却される文字定数 NAME 指定子を除く問合せ指定子に返却される文字定数は、FORTRAN66 または FORTRAN77 言 語仕様では、小文字で返却されます。ただし、実行時オプション -q を指定した場合、大文字で返 却されます。 Fortran 95 言語仕様では、実行時オプション -q の指定に関係なく大文字で返却されます。 例: CHARACTER(LEN=10) CH OPEN(10,ACCESS='SEQUENTIAL') INQUIRE(10,ACCESS=CH) 上記の Fortran プログラムを実行すると、FORTRAN66 または FORTRAN77 言語仕様では、CH に文字列 "sequential" が返却されます。 Fortran 95 言語仕様では、CH に文字列 "SEQUENTIAL" が返却されます。 7.6.2.3 PAD 指定子の返却値 FORTRAN66 または FORTRAN77 言語仕様では、ファイルが使用中でない場合、"undefined" また は空白が返却されます。Fortran 95 言語仕様では、"YES" が返却されます。 Fortran 使用手引書ー Page 150 7.6.2.4 ファイル INQUIRE 文の問合せ指定子の返却値 FORTRAN66 または FORTRAN77 言語仕様では、ファイルが存在していない場合、ACCESS 指定 子、SEQUENTIAL 指定子、DIRECT 指定子、ACTION 指定子、READ 指定子、WRITE 指定子、 READWRITE 指定子、FORM 指定子、FORMATTED 指定子、UNFORMATTED 指定子、BLANK 指定子、POSITION 指定子および DELIM 指定子には、空白が返却されます。 Fortran 95 言語仕様では、"UNDEFINED" または "UNKNOWN" が返却されます。 7.6.2.5 装置 INQUIRE 文の問合せ指定子の返却値 FORTRAN66 または FORTRAN77 言語仕様では、指定した装置番号が 0 から 2147483647 以外の場 合、ACCESS 指定子、SEQUENTIAL 指定子、DIRECT 指定子、ACTION 指定子、READ 指定子、 WRITE 指定子、READWRITE 指定子、FORM 指定子、FORMATTED 指定子、UNFORMATTED 指 定子、BLANK 指定子、POSITION 指定子および DELIM 指定子には、空白が返却されます。 Fortran 95 言語仕様では、"UNDEFINED" または "UNKNOWN" が返却されます。 7.7 入出力文の使用方法 ここでは、利用者が目的とする入出力を行うための、入出力文の使用方法について説明します。 ファイル位置付け入出力文については、“7.9 ファイル位置付け文”を参照してください。 入出力文は、すべての入出力装置に対して適用できるわけではありません。以下に、入出力文と 適用できる入出力装置の関係を示します。 入出力文 装置 端末装置 書式付き順番探査入出力文 書式なし順番探査入出力文 直接探査入出力文 並びによる入出力文 変数群入出力文 直接探査記憶装置 可 不可 可 可 7.7.1 入出力文の制御情報 ここでは、入出力文の構成要素である制御情報について説明します。 UNIT 指定子、FMT 指定子、IOSTAT 指定子、ERR 指定子、END 指定子および EOR 指定子につ いて説明します。 7.7.1.1 UNIT 指定子 UNIT 指定子に * を指定したとき、または装置番号を省略した入出力文における装置番号は、本シ ステムの標準値または実行時オプションの指示に従います。 Fortran 使用手引書ー Page 151 以下の表に、このときに決定される装置番号について示します。 入出力文 実行時オプション Fortran システムで出力する診断メッセージ -mu_no で指定した u_no の値 標準値 0 * 指定の READ 文 装置番号を省略した READ 文 -ru_no で指定した u_no の値 5 * 指定の WRITE 文 PRINT 文 -pu_no で指定した u_no の値 6 備考.実行時オプションで指定した値が標準値より優先されます。 7.7.1.2 FMT 指定子 入出力データは、編集記述子によって、数値データ、論理型データ、文字型データ、2 進定数表 現されているデータ、8 進定数表現されているデータまたは 16 進定数表現されているデータとし て扱われ、編集されます。例えば、実数型の出力並びに対して I 形編集記述子を指定すれば、整 数型の数値データとして編集出力します。 以下の表に、編集記述子と入出力並びの型について示します。 編集記述子 入出力並びの型 L I F,E,EN, ES,D,Q A G B Z O 1 バイトの論理型 2 バイトの論理型 4 バイトの論理型 8 バイトの論理型 ○ △ △ ○ ○ ○ ○ ○ 1 バイトの整数型 2 バイトの整数型 4 バイトの整数型 8 バイトの整数型 △ ○ △ ○ ○ ○ ○ ○ 実数型 倍精度実数型 4 倍精度実数型 △ △ ○ ○ ○ ○ ○ ○ 複素数型 倍精度複素数型 4 倍精度複素数型 △ △ ○ ○ ○ ○ ○ ○ 文字型 × × × ○ ○ ○ ○ ○ ○: △: ×: 許される組合せです。 矛盾した組合せです。ただし、警告メッセージを出力し、編集記述子に合った編集が行わ れます。 許されない組合せなので、メッセージを出力し、入出力処理を終了します。 Fortran 使用手引書ー Page 152 7.7.1.3 IOSTAT 指定子 IOSTAT 指定子には、入出力文の実行によって、次のどれかの条件を識別する値が代入されます。 - 誤り条件が発生しています。 - ファイル終了条件が発生しています。 - 記録終了条件が発生しています。 - 誤り条件、ファイル終了条件および記録終了条件のいずれも発生していません。 “表 7.3 誤り条件、ファイル終了条件および記録終了条件”に、誤り条件、ファイル終了条件お よび記録終了条件が発生した場合、IOSTAT 指定子に代入される整数値について示します。誤り 条件、ファイル終了条件および記録終了条件が発生しない場合、IOSTAT 指定子には 0 が代入さ れます。 IOSTAT 指定子が指定されている入出力文で誤り条件、ファイル終了条件、記録終了条件が発生 したとき、その旨の診断メッセージは出力されません。また、標準修正および利用者の修正処理 は行われません。詳細は、“8.1 エラー制御”を参照してください。 表 7.3 誤り条件、ファイル終了条件および記録終了条件 対応する入出力文 IOSTAT 指定子に代入 される値 順番探査入出力文 直接探査入出力文 並びによる入出力文 変数群入出力文 BACKSPACE 文 OPEN 文 1 各入出力文 エラー識別番号 ファイル終了 ファイル終了記録を検出し 条件 ました。 順番探査 READ 文 並びによる READ 文 変数群 READ 文 -1 内部ファイルの終わりを超 ファイル終了 えて Fortran 記録を読み込み 条件 ました。 内部ファイル READ 文 -1 停留入力文で入力並びの長 記録終了条件 さが Fortran 記録の長さを超 えています。 停留入力文 -2 条件 内容 誤り条件(回 ファイルの入出力操作中に 復不可能エ 回復不可能なエラーが発生 ラー) しました。 誤り条件 (その他) 入出力文でエラーが発生し ています。 7.7.1.4 ERR 指定子 入出力文の実行中に、誤り条件が発生し、プログラムの実行を制御する必要がある場合に ERR 指 定子を指定します。誤り条件は、“表 7.3 誤り条件、ファイル終了条件および記録終了条件”に 示した内容です。 ERR 指定子が指定されている入出力文で誤り条件が発生した場合、その旨の診断メッセージは出 力されません。また、標準修正および利用者の修正処理は行われません。 Fortran 使用手引書ー Page 153 7.7.1.5 END 指定子 順番探査入出力文の実行中に、ファイル終了条件が発生し、プログラムの実行を制御する必要が ある場合に END 指定子を指定します。ファイル終了条件は、 “表 7.3 誤り条件、ファイル終了条 件および記録終了条件”に示した内容です。 END 指定子が指定されている入力文でファイル終了条件が発生したとき、その旨の診断メッセー ジは出力されません。また、標準修正および利用者の修正処理は行われません。 7.7.1.6 EOR 指定子 停留入力文の実行中に、記録終了条件が発生し、プログラムの実行を制御する必要がある場合に EOR 指定子を指定します。記録終了条件は、 “表 7.3 誤り条件、ファイル終了条件および記録終 了条件”に示した内容です。 EOR 指定子が指定されている入力文で記録終了条件が発生したとき、その旨の診断メッセージは 出力されません。また、標準修正および利用者の修正処理は行われません。 7.7.2 順番探査入出力文 順番探査入出力文は、順編成ファイルの書式付き Fortran 記録および書式なし Fortran 記録を入出 力します。 書式付き Fortran 記録は、書式付き順番探査入出力文で入出力できます。また、書式なし Fortran 記録は、書式なし順番探査入出力文で入出力できます。 7.7.2.1 書式付き順番探査入出力文 書式付き順番探査入出力文は、文字コードからなるデータを書式仕様に従って順番に入出力する ものです。一般に、この入出力文は、その内容を目で見る必要があるとき使用します。 書式付き順番探査 READ 文は、UNIT 指定子で指定されたファイルの、現在位置付けられている Fortran 記録を、書式仕様に従って入力します。この READ 文に入力並びが指定されている場合、 Fortran 記録を、書式仕様の編集記述子によって内部コードに編集し、入力並びの各項目に入力し ます。入力並びの指定されていない書式付き順番探査 READ 文では Fortran 記録を読み飛ばす処理 を行います。 書式付き順番探査 WRITE 文は、書式仕様で編集された Fortran 記録を、UNIT 指定子で指定され たファイルの、現在位置付けられている位置に出力します。この WRITE 文に出力並びが指定され ている場合、各出力並び項目を、書式仕様の編集記述子によって文字コードに編集し、Fortran 記 録として出力します。出力並びの指定されていない書式付き順番探査 WRITE 文は、改行文字だけ からなる Fortran 記録を出力します。書式仕様に $ 編集記述子が指定されている場合は、改行文字 を含まない Fortran 記録を出力します。 Fortran 使用手引書ー Page 154 以下に書式付き順番探査入出力文で入出力されるデータ例を示します。 REAL A,B INTEGER I,J A = 1.5 ! 3fc00000(16 進数値表現 ) が A に代入されます。 I = 100 ! 00000064(16 進数値表現 ) が I に代入されます。 WRITE(1,10) I,A ! 2031303020312e35(16 進数値表現 ) が ! Fortran 記録として代入されます。 REWIND 1 ! ファイルの始点に位置付けられます。 READ(1,10)J,B ! J および B に以下の値が入力されます。 ! J : 00000064(16 進数値表現 ) ! B : 3fc00000(16 進数値表現 ) 10 FORMAT(1X,I3,1X,F3.1) STOP END 7.7.2.2 書式なし順番探査入出力文 書式なし順番探査入出力文は、内部コードからなる Fortran 記録を順番に入出力します。一般に、 この入出力文は、その内容を目で見る必要がないとき使用します。 書式なし順番探査入出力文は、端末装置に対して実行できません。 書式なし入力文で入力することができる Fortran 記録は、以下の Fortran 処理系によって出力した Fortran 記録です。 - M/GS シリーズおよび VPP シリーズの Fortran 処理系で出力した書式なし Fortran 記録 - Solaris 向け Fortran&C Package および Parallelnavi の Fortran 処理系で出力した書式なし Fortran 記録 - Windows 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 - Linux 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 書式なし順番探査 READ 文は、UNIT 指定子で指定されたファイルの、現在位置付けられている Fortran 記録を入力します。この READ 文に入力並びが指定されている場合、それぞれの入力並び 項目へ入力並びで指定された順番に、Fortran 記録のデータをそのまま入力します。このとき Fortran 記録のデータのバイト数が入力並び項目のバイト数の総計より少ないならば、エラーとなり、多 いならば、残りのデータを読み捨てます。入力並びの指定されていない書式なし順番探査 READ 文では Fortran 記録を読み飛ばす処理を行います。 書式なし順番探査 WRITE 文は、出力並び項目を、出力並びで指定された順番に、UNIT 指定子で 指定されたファイルの現在位置付けられている位置に、Fortran 記録として出力します。出力並び の指定されていない書式なし順番探査 WRITE 文は、記録長 0 の Fortran 記録を出力します。 Fortran 記録の長さは、出力並び項目のバイト数の総計です。 Fortran 使用手引書ー Page 155 以下に書式なし順番探査入出力文で入出力されるデータの例を示します。 REAL A,B INTEGER I,J A = 1.5 I = 100 WRITE(1,*) A,I REWIND 1 READ(1,*) B,J ! ! ! ! ! ! ! ! 3fc00000(16 進数値表現 ) が A に代入されます。 00000064(16 進数値表現 ) が I が代入されます。 3fc0000000000064(16 進数値表現 ) が Fortran 記録として代入されます。 ファイルの始点に位置付けられます。 B および J へ以下の値が入力されます。 B : 3fc00000(16 進数値表現 ) J : 00000064(16 進数値表現 ) STOP END 7.7.3 直接探査入出力文 直接探査入出力文は、直接編成ファイルの任意の位置に書式付き Fortran 記録または書式なし Fortran 記録を入出力するときに使用します。 直接探査入出力文を実行するためには、それ以前に同一ファイルに対して、OPEN 文が実行され ていなければなりません。 OPEN 文の TOTALREC 指定子が指定されている場合、指定子で指定された記録数の範囲で入出力 できます。なお、直接編成ファイルに対して順番探査入出力文により Fortran 記録の追加をしては なりません。 直接編成ファイルを新たに存在させる場合、直接編成ファイルは初期化されません。 7.7.3.1 直接探査 READ 文 直接探査 READ 文は、FMT 指定子が指定されている場合とされていない場合では、データの入力 方法が異なります。 書式付き直接探査 READ 文は、 REC 指定子で指定された記録番号の Fortran 記録を書式仕様に従っ て、UNIT 指定子で指定された装置番号に接続されているファイルから入力します。この READ 文に入力並びが指定されている場合、Fortran 記録を書式仕様の編集記述子によって内部コードに 編集し、入力並びの各項目に入力します。入力並びの指定されていない書式付き直接探査 READ 文では Fortran 記録を読み飛ばす処理を行います。 書式なし直接探査 READ 文は、REC 指定子で指定された記録番号の Fortran 記録を UNIT 指定子 で指定された装置番号に接続されているファイルから入力します。この READ 文に入力並びが指 定されている場合、すべての入力並び項目へデータが入力されるまで、Fortran 記録の読込みを行 います。入力並びの指定されていない書式なし直接探査 READ 文では Fortran 記録を読み飛ばす処 理を行います。 7.7.3.2 直接探査 WRITE 文 直接探査 WRITE 文は、FMT 指定子が指定されている場合とされていない場合では、データの出 力方法が異なります。 書式付き直接探査 WRITE 文は、書式仕様で編集された Fortran 記録を REC 指定子で指定された記 録番号の位置へ出力します。この WRITE 文に出力並びが指定されている場合、各出力並び項目を 書式仕様の編集記述子によって文字データに編集し、Fortran 記録として出力します。出力並びが 指定されていない書式付き直接探査 WRITE 文では、空白だけの Fortran 記録を出力します。 Fortran 使用手引書ー Page 156 書式なし直接探査 WRITE 文は、各出力並び項目を出力並び項目で指定された順番に、REC 指定 子で指定された記録番号の位置へ出力します。出力並びが指定されていない書式なし直接探査 WRITE 文では、ゼロだけの Fortran 記録を出力します。一つの Fortran 記録は一つの論理記録を形 成し、各出力並び項目のバイト数の総計が、一つの論理記録の長さより長い場合、出力並び項目 のデータを複数の Fortran 記録として出力します。 7.7.3.3 旧仕様の直接探査入出力文の記述の制限 旧仕様の直接入出力文のあとに“;”を指定して文を区切ることはできません。 また、旧仕様の直接入出力文のあとに“!”を指定して注釈を記述することもできません。 例:旧仕様の直接探査入出力文の記述の制限 read(1'2) i ; if (i==1) goto 1 read(1'2) i ! direct read 7.7.3.4 直接探査入出力におけるデータ転送エラー 直接探査として接続されているファイルへの書式なしデータ転送において、出力項目並びの大き さが Fortran 記録の大きさよりも大きい場合または入力項目並びの大きさが Fortran 記録の大きさ よりも小さい場合、FORTRAN66 または FORTRAN77 言語仕様では、次の Fortran 記録に書き出 し、正常終了します。 Fortran 95 言語仕様では、実行時の診断メッセージ(jwe1162i-w)を出力し、次の Fortran 記録に転 送します。 例: プログラム di.f OPEN(10,FILE='XX.DAT',FORM='UNFORMATTED',ACCESS='DIRECT',RECL=4) WRITE(10,REC=1)1.0_8 INQUIRE(10,NEXTREC=i) PRINT*,'NEXTREC=',i END 実行結果 % frt -X7 di.f; a.out NEXTREC = 3 % frt -X9 di.f; a.out jwe1162i-w line 2 On output to a file connected for unformatted direct access, the output list must not specify more values than can fit into the Fortran record (unit=10). error occurs at MAIN__ line 2 loc 000107c4 offset 0000001c MAIN__ at loc 000107a8 called from o.s. taken to (standard) corrective action, execution continuing. NEXTREC = 3 error summary (Fortran) error number error level error count jwe1162i w 1 total error count = 1 7.7.4 変数群入出力文 変数群入出力文は、あらかじめ NAMELIST 文によって宣言された変数群名とそれに属するスカラ 変数名および配列変数名に対して、順編成ファイルおよび内部ファイル上の文字列からなる変数 群 Fortran 記録との間でデータ転送を行う入出力文です。 Fortran 使用手引書ー Page 157 直接探査で接続されているファイルの記録を変数群書式を用いて読んだり書いたりしてはいけま せん。 変数群書式による入出力において、内部ファイルの記録を読んだり書いたりすることができます。 内部ファイル入出力文に変数群書式を指定した場合も含めて変数群入出力文として説明します。 7.7.4.1 変数群 READ 文 変数群 READ 文は、 入力される変数群名によって指定された要素の型と、入力される変数群 Fortran 記録の定数の型が一致していなければなりません。以下に、変数群 READ 文における要素の型と 定数の型との対応を示します。 要素の型 定数の型 複素数型 文字型 16 進型 △ (注 1) × △ (注 2) △ (注 7) (注 8) △ (注 3) × △ (注 2) ○ (注 8) × △ (注 2) △ (注 7) (注 8) ○ △ (注 2) △ (注 7) (注 8) ○ × (注 7) (注 8) 論理型 整数型 実数型 1 バイトの論理型 2 バイトの論理型 4 バイトの論理型 8 バイトの論理型 ○ △ (注 1) 1 バイトの整数型 2 バイトの整数型 4 バイトの整数型 8 バイトの整数型 △ (注 3) ○ 実数型 倍精度実数型 4 倍精度実数型 △ (注 4) ○ (注 5) ○ 複素数型 倍精度複素数型 4 倍精度複素数型 △ (注 4) (注 6) (注 9) △ (注 5) (注 6) (注 9) △ (注 6) (注 9) 文字型 ○ △ × 注 1) 注 2) 注 3) 注 4) 注 5) 注 6) 注 7) 注 8) × × × × :正常に動作することを示します。 :許されない対応ですが、修正解釈を行って動作することを示します。 :許されない対応なので、入力処理を終了することを示します。 論理型の編集を行います。 文字型の編集を行います。 整数型の編集を行います。 実数型の編集を行います。 定数の右端に小数点があるものとして、実数型の編集を行います。 実部に編集結果を入力し、虚部には値 0 を設定します。 翻訳時オプション -Xf6 または -Xf7 を指定した場合、16 進型はすべて“○”とします。 翻訳時オプション -X9 が有効な場合、16 進型は文字データとして扱います。したがって、 要素の型が文字型のときのみ“○”、その他の型は“△”とします。翻訳時オプションに ついては、“2.2 翻訳時オプション”を参照してください。 注 9) 翻訳時オプション -X9 が有効な場合、W レベルの実行時メッセージが出力されます。 Fortran 使用手引書ー Page 158 備考. 入力処理は、要素の型に合った編集を行いますが、定数の型が 16 進型および文字型の場 合、定数の型に合った編集を行います。 NAMELIST 配列変数名に対する文字定数の扱い 配列変数名に対する文字定数の扱いは、要素の型が文字型か文字型以外かによって異なります。 要素の型が文字型の場合、一つの配列要素に対して一つの文字定数を一対一に対応するように入 力し、その文字定数の長さが配列要素の長さを超えていても、次の配列要素にあふれを及ぼすこ とはありません。以下に、要素の型が文字型の場合の文字定数の扱いについて示します。 例:文字型の配列変数名に対する文字定数 CHARACTER(LEN=4),DIMENSION(5) :: HA NAMELIST/NAMEH/HA READ(1,NML=NAMEH) ① 変数群名 NAMEH に対する READ 文 装置番号 1 に対する変数群 Fortran 記録が次のように設定されているものとします。 &NAMEH HA = 2*'NAMELIST READ STATEMENT' / ①で入力した結果は次のとおりです。(文字表現) HA(1) 'NAME' HA(2) 'NAME' HA(3) 値は変わらず HA(4) 値は変わらず HA(5) 値は変わらず 要素の型が文字型以外の場合、最初の配列要素に対応する文字定数を配列全体に対して入力しま す。 すなわち、文字定数の長さが一つの要素より長い場合、指定した文字定数分を要素を超えて入力 します。文字定数の長さが配列全体の長さより短い場合、残りの要素の値は変わりません。ただ し、一つの要素の途中まで入力されている場合、要素内の残りには空白が入力されます。 2 番目以降の配列要素に対しては、各配列要素と一対一に対応し、その文字定数の長さが配列要 素の長さを超えていても、次の配列要素にあふれを及ぼすことはありません。以下に、要素の型 が文字型以外の場合の文字定数の扱いについて示します。 例:文字型を除く配列変数名に対する文字定数 INTEGER,DIMENSION(5) :: IA NAMELIST/NAMEI/IA READ(1,NML=NAMEI) ① 変数群名 NAMEI に対する READ 文 装置番号 1 に対する変数群 Fortran 記録が次のように設定されているものとします。 &NAMEI IA = 2*'NAMELIST READ STATEMENT' / ①で入力した結果は次のとおりです。(文字表現) IA(1) 'NAME' IA(2) 'NAME' IA(3) ' REA' IA(4) 'D ST' IA(5) 'ATEM' IA(1) の処理で配列 IA 全体に文字定数を入力します。 Fortran 使用手引書ー Page 159 NAMELIST 入力編集動作 変数群 READ 文は、入力編集を行うときの変数群書式を、要素の型、定数の型および定数の大き さから次のように定めます。 定数の型が文字型以外、かつ、要素の型が文字型以外の場合、要素の型に合わせて編集を行い、 その編集記述子は Gw です。ここで w は、入力対象となる定数の大きさ(区切りから次の区切り までの大きさ)です。 定数の型が文字型の場合、文字型の編集を行い、その編集記述子は Aw です。ここで w は、文字 定数を表すアポストロフィからこれに対応するアポストロフィまでの大きさ、引用符からこれに 対応する引用符までの大きさまたは文字定数の文字の長さです。 定数の型が文字型以外、かつ、要素の型が文字型の場合、文字型の編集を行い、その編集記述子 は Aw です。 7.7.4.1.1 変数群入力における変数群記録 変数群入力における変数群記録(namelist record)は、次のどちらかの形です。 &name [v=c[,c]...[,v=c[,c]...]...]/ &name [v=c[,c]...[,v=c[,c]...]...]&end name は、対応する変数群入出力文に指定した変数群名です。 v は、変数群名 name に対応する NAMELIST 文に指定した変数名またはそれに準ずる配列要素、部 分配列または文字部分列です。 c は、空値または次のどちらかの形です。 const r*const r* const は、ホレリス定数、2 進定数、8 進定数および 16 進定数を除く定数表現です。 r は、繰返し数であり、符号なし整定数です。r*const は、const を r 個連続して書いたものと同じ です。r* は、空値を r 個連続して書いたものと同じです。 入力する項目が文字型であり、以下の条件をすべて満たしていれば、アポストロフィまたは引用 符で文字定数を囲む必要はありません。 - 文字定数の中に値区切り子とみなされる空白、コンマ、斜線またはアンド記号を含んでいな い。 - 文字定数の中に名前とみなされる左括弧、右括弧、パーセント記号を含んでいない。 - 文字定数が複数の Fortran 記録にまたがっていない。 - 空白でない先頭の文字がアポストロフィまたは引用符以外の文字である。 - 入力する項目の形が、r*const でない。 文字定数の囲み文字としてのアポストロフィまたは引用符を省略した場合、その文字定数は、最 初の空白、コンマ、斜線の終わりで終了するものとみなされます。また、文字列中のアポストロ フィまたは引用符は、2 連アポストロフィまたは 2 連引用符としては扱われません。 7.7.4.2 変数群 WRITE 文 変数群 WRITE 文は、変数群名に属するスカラ変数名および配列変数名に対して、それぞれの型に 合った出力編集を行い、変数群 Fortran 記録を出力します。 ここでは、出力編集を行うときの出力形式(編集記述子)について説明します。 Fortran 使用手引書ー Page 160 スカラ変数名に対する出力形式は、スカラ変数名に続いて等号、続いて編集結果、更に定数の区 切りとしてコンマを出力します。 配列変数名に対する出力形式は、配列変数名に続いて等号、続いて各配列要素に対する編集結果 をコンマで区切って出力します。 以下に、要素の型に対する出力形式を示します。 要素の型 出力形式(編集記述子) 1 バイトの論理型 G1,1H,(注 1) 2 バイトの論理型 G1,1H,(注 1) 4 バイトの論理型 G1,1H,(注 1) 8 バイトの論理型 G1,1H,(注 1) 1 バイトの整数型 G4,1H,(注 1) 2 バイトの整数型 G6,1H,(注 1) 4 バイトの整数型 G11,1H,(注 1) 8 バイトの整数型 G20,1H,(注 1) 実数型 倍精度実数型 4 倍精度実数型 複素数型 倍精度複素数型 4 倍精度複素数型 1P,E15.8,1H,(注 1)、0P,G16.9,1H,(注 1) 1P,E22.15,1H,(注 1)、0P,G23.16,1H,(注 1) 1P,E43.34E4,1H,(注 1)、0P,G44.35E4,1H,(注 1) 1H(,1P,E15.8,1H,,E15.8,2H),(注 2)、 1H(,0P,G16.9,1H,,G16.9,2H),(注 2) 1H(,1P,E22.15,1H,,E22.15,2H),(注 2)、 1H(,0P,G23.16,1H,,G23.16,2H),(注 2) 1H(,1P,E43.34E4,1H,,E43.34E4,2H),(注 2)、 1H(,0P,G44.35E4,1H,,G44.35E4,2H),(注 2) 1H', 要素の内容 ,2H',(注 3)、 、 長さ n バイトの文字型 1H", 要素の内容 ,2H",(注 4) 要素の内容 ,1H,(注 5) 注 1) G 形編集記述子または E 形編集記述子で出力された値の直後が終わりを示す / または &end の場合、1H, は省略されます。 注 2) G 形編集記述子または E 形編集記述子で出力された値の直後が終わりを示す / または &end の場合、2H), は 1H) となります。 注 3) 囲み記号の引用符をもつ文字定数の直後が変数群出力の終わりを示す / または &end の場 合、2H', は 1H' となります。 注 4) 囲み記号のアポストロフィをもつ文字定数の直後が変数群出力の終わりを示す / または &end の場合、2H", は 1H" となります。 注 5) 囲みなし文字定数の直後が変数群出力の終わりを示す / または &end の場合、1H, は省略さ れます。 備考 1.文字型以外の出力編集の結果で意味のない空白が現われたならばその空白を削除して出 力するので、実際の出力長は編集記述子の欄の幅の合計より小さくなることがあります。 備考 2.実数型および複素数型において、 “1P,Ew1.d1”となるか“0P,Gw2.d2”となるかは、デー タの絶対値 x が 0 または 0.1 ≦ x < 10**d2 ならば、“0P,Gw2.d2”となり、その他ならば “1P,Ew1.d1”となります。 Fortran 使用手引書ー Page 161 7.7.4.3 変数群入出力の言語仕様レベルによる違い 文字型の出力 FORTRAN66 または FORTRAN77 言語仕様では、 文字列の前後に囲み記号のアポストロフィをもっ た文字定数が出力されます。 Fortran 95 言語仕様では、OPEN 文で DELIM 指定子を省略するか、または OPEN 文を実行しない 場合、DELIM 指定子の省略値は NONE と解釈されます。 この場合、文字列の前後に囲み記号のアポストロフィまたは引用符をもたない文字定数が出力さ れます。 例: CHARACTER(LEN=5) :: CH='XXXXX' NAMELIST /X/CH OPEN(10) WRITE(10,NML=X) 上記の Fortran プログラムを実行すると、FORTRAN66 または FORTRAN77 言語仕様では、以 下のように出力されます。 &X CH='XXXXX' &end Fortran 95 言語仕様では、以下のように出力されます。 &X CH=XXXXX/ 変数群出力文の終わりを示す形式 FORTRAN66 または FORTRAN77 言語仕様では、変数群出力文の終わりは &end で出力されます。 Fortran 95 言語仕様では、変数群出力文の終わりは、/ で出力されます。 例: INTEGER :: IH=123 NAMELIST /X/IH WRITE(10,NML=X) 上記の Fortran プログラムを実行すると、FORTRAN66 または FORTRAN77 言語仕様では、以 下のように出力されます。 &X IH=123 &end Fortran 95 言語仕様では、以下のように出力されます。 &X IH=123/ 変数群入力の空白文字の扱い FORTRAN66 または FORTRAN77 言語仕様では、空白文字は入力データの一部として扱われます。 Fortran 95 言語仕様では、空白文字は値区切り子として扱われます。ただし、囲み記号でくくられ ている場合、値区切り子ではなく、入力データとして扱われます。 Fortran 使用手引書ー Page 162 例: INTEGER,DIMENSION(3) :: IH NAMELIST /X/IH READ(*,NML=X) 入力データを IH=1 □ 2 □ 3, とすると (□:空白を示します。) 、FORTRAN66 または FORTRAN77 言語仕様では、以下のように扱われます。 IH(1) = 10203 IH(2) = 0 IH(3) = 0 Fortran 95 言語仕様では、以下のように扱われます。 IH(1) = 1 IH(2) = 2 IH(3) = 3 変数群入力の入力データに指定された 16 進定数の扱い FORTRAN66 または FORTRAN77 言語仕様では、16 進定数として扱われます。 Fortran 95 言語仕様では、文字定数として扱われます。 例: CHARACTER(LEN=5) CH NAMELIST /X/CH READ(*,NML=X) 入力データを CH=Z3132333435, とすると、FORTRAN66 または FORTRAN77 言語仕様では、以 下のように扱われます。 CH = '12345' Fortran 95 言語仕様では、以下のように扱われます。 CH = 'Z3132' 変数群入力の入力データに指定されたホレリス定数の扱い FORTRAN66 または FORTRAN77 言語仕様では、ホレリス定数として扱われます。 Fortran 95 言語仕様では、文字定数として扱われます。 例: CHARACTER(LEN=5) CH NAMELIST /X/CH READ(*,NML=X) 入力データを CH=3H123, とすると、FORTRAN66 または FORTRAN77 言語仕様では、以下の ように扱われます。 CH = '123 ' Fortran 95 言語仕様では、以下のように扱われます。 CH = '3H123' 囲まれた文字定数が複数の Fortran 記録にまたがる場合の 2 レコード目以降の先頭 1 バイ トの出力 FORTRAN66 または FORTRAN77 言語仕様では、空白が出力されます。 Fortran 使用手引書ー Page 163 Fortran 95 言語仕様では、 空白は出力されず、2 レコード目以降の先頭 1 バイトに値が出力されます。 例: CHARACTER(LEN=1000) CH NAMELIST /X/CH WRITE(10,NML=X) FORTRAN66 または FORTRAN77 言語仕様では、以下のように出力されます。 CH='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX □ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' ↑ 1 バイト目に空白が出力されます。 ← 1 レコード ← 2 レコード Fortran 95 言語仕様では、以下のように扱われます。 CH='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' ↑ 1 バイト目に値が出力されます。 ← 1 レコード ← 2 レコード 変数群入力の繰返し形式のデータの扱い FORTRAN66 または FORTRAN77 言語仕様では、r* の形で入力データを与えた場合、空値に続く 値が r 個分連続したデータとして扱われます。また、r* または r*c の形で入力データを与え、* が Fortran 記録の最後の文字の場合、次の Fortran 記録に最初に現れる値が r 個分連続したデータとし て扱われます。 Fortran 95 言語仕様では、空値が繰返し数の個数分連続したデータとして扱われます。 例: INTEGER :: I(4)=(/1,2,3,4/) NAMELIST /X/I READ(*,NML=X) 入力データを I=2* □ 30,40, とする(□:空白を示します)と、FORTRAN66 または FORTRAN77 言語仕様では、以下のように扱われます。 I(1) I(2) I(3) I(4) = = = = 30 30 40 4 Fortran 95 言語仕様では、以下のように扱われます。 I(1) I(2) I(3) I(4) = = = = 1 2 30 40 変数群出力文の変数群名および変数名の出力 FORTRAN66 または FORTRAN77 言語仕様では、変数群名および変数名はプログラム中で記述さ れた文字で出力されます。 Fortran 95 言語仕様では、変数群名および変数名は英大文字で出力されます。 Fortran 使用手引書ー Page 164 例: INTEGER :: Iu = 1 NAMELIST /Xu/Iu WRITE(10,NML=Xu) 上記の Fortran プログラムを実行すると、FORTRAN66 または FORTRAN77 言語仕様では、以 下のように出力されます。 &Xu Iu=1 &end Fortran 95 言語仕様では、以下のように出力されます。 &XU IU=1/ 変数群 Fortran 記録の出力 FORTRAN66 または FORTRAN77 言語仕様では、以下の形式で出力されます。 第一レコード 第二レコード以降 最終レコード □ &name □ v=c[,c]...[,v=c[,c]...]... □ &end Fortran 95 言語仕様では、以下の形式で出力されます。 第一レコード以降 □ &name v=c[,c]...[,v=c[,c]...].../ ここで、□は空白、name は変数群名、v および c は変数群要素並びと値を表します。 7.7.5 並びによる入出力文 並びによる入出力文は、並びによる書式に従って、順編成ファイルおよび内部ファイル上の文字 列からなる並びによる Fortran 記録との間でデータ転送を行う入出力文です。 内部ファイル入出力文に並びによる書式を指定した場合も含めて並びによる入出力文として説明 します。 7.7.5.1 並びによる READ 文 並びによる READ 文は、並びによる書式に従って、外部ファイルおよび内部ファイル上の並びに よる Fortran 記録を入力並びの要素に転送します。 入力並びの要素の型と対応するデータ項目の型は同じでなければなりません。 Fortran 使用手引書ー Page 165 以下に入力並びの要素の型とデータ項目の型の対応を示します。 要素の型 定数の型 論理型 整数型 実数型 複素数型 文字型 1 バイトの論理型 2 バイトの論理型 4 バイトの論理型 8 バイトの論理型 ○ △ (注 1) △ (注 1) × △ (注 2) 1 バイトの整数型 2 バイトの整数型 4 バイトの整数型 8 バイトの整数型 △ (注 3) ○ △ (注 3) × △ (注 2) 実数型 倍精度実数型 4 倍精度実数型 △ (注 4) ○ (注 5) ○ × △ (注 2) 複素数型 倍精度複素数型 4 倍精度複素数型 △ (注 4) (注 6) (注 7) △ (注 5) (注 6) (注 7) △ (注 6) (注 7) ○ △ (注 2) 文字型 × × × × ○ ○ △ × :正常に動作することを示します。 :許されない対応ですが、修正解釈を行って動作することを示します。 :許されない対応なので、入力処理を終了することを示します。 注 1) 注 2) 注 3) 注 4) 注 5) 注 6) 注 7) 論理型の編集を行います。 文字型の編集を行います。 整数型の編集を行います。 実数型の編集を行います。 定数の右端に小数点があるものとして、実数型の編集を行います。 実部に編集結果を入力し、虚部には値 0 を設定します。 翻訳時オプション -X9 が有効な場合、W レベルの実行時メッセージを出力します。 備考. 入力処理は、要素の型に合った編集を行いますが、定数の型が文字型の場合、定数の型に 合った編集を行います。 並び入力の配列変数名に対する文字定数の扱い 配列変数名に対する文字定数の扱いは、要素の型が文字型か文字型以外かによって異なります。 要素の型が文字型の場合、一つの配列要素に対して一つの文字定数が一対一に対応するように入 力され、その文字定数の長さが一つの配列要素の長さを超えていても、次の配列要素にあふれを 及ぼすことはありません。 要素の型が文字型以外の場合、1 番目の配列要素に対応する文字定数が、配列全体に対して入力 されます。すなわち、文字定数の長さが一つの要素より長い場合、指定した文字定数分を要素を 超えて入力します。文字定数の長さが配列全体の長さより短い場合は残りの要素の値は変わりま せん。ただし、一つの要素の途中まで入力されている場合、要素内の残りには空白が入力されま す。2 番目以降の配列要素に対しては、それぞれの配列要素と一対一に対応し、文字定数の長さ が一つの配列要素の長さを超えていても、次の配列要素にあふれを及ぼすことはありません。 Fortran 使用手引書ー Page 166 例:配列変数名に対する文字型データの入力 CHARACTER(LEN=4),DIMENSION(5):: CHAR5 INTEGER,DIMENSION(5):: I4 : READ(5,*)CHAR5 ! 文字型の配列要素に対する並びによる READ 文 READ(5,*)I4 ! 文字型以外の配列要素に対する並びによる READ 文 装置番号 5 に対する並びによる Fortran 記録は以下の形式で与えられたものとします。 3*'ABCDEFGHIJKLMNOPQ'/ 3*'ABCDEFGHIJKLMNOPQ'/ CHAR5 および I4 への入力結果は次のとおりです。 CHAR5(1) 'ABCD' I4(1) 'ABCD' CHAR5(2) 'ABCD' I4(2) 'ABCD' CHAR5(3) 'ABCD' I4(3) 'ABCD' CHAR5(4) 値は変わらず I4(4) 'MNOP' CHAR5(5) 値は変わらず I4(5) 'Q ' I4(1) の処理で配列 I4 全体に文字定数を入力します。 並びによる入力編集動作 並びによる READ 文は、入力編集を行うときの書式仕様を、要素の型、定数の型および定数の大 きさから次のように定めます。 定数の型が文字型以外、かつ、要素の型が文字型以外の場合、要素の型に合わせて編集を行い、 その編集記述子は Gw です。ここで w は、入力対象となる定数の大きさ(区切りから次の区切り までの大きさ)です。 定数の型が文字型の場合、文字型の編集を行い、その編集記述子は Aw です。ここで w は、文字 定数を表すアポストロフィからこれに対応するアポストロフィまでの大きさ、文字定数を表す引 用符からこれに対応する引用符までの大きさ、または文字定数を表す文字の長さです。 定数の型が文字型以外、かつ、要素の型が文字型の場合、文字型の編集を行い、その編集記述子 は Aw です。 7.7.5.2 並びによる WRITE 文 並びによる WRITE 文は、並びによる書式に従って、編集された並びによる Fortran 記録を出力し ます。 Fortran 使用手引書ー Page 167 以下に並びによる WRITE 文が、出力編集を行うときの編集記述子について示します。 要素の型 出力形式 ( 編集記述子 ) 1 バイトの論理型 G1,1H □ ( 注 1) 2 バイトの論理型 G1,1H □ ( 注 1) 4 バイトの論理型 G1,1H □ ( 注 1) 8 バイトの論理型 G1,1H □ ( 注 1) 1 バイトの整数型 G4,1H □ ( 注 1) 2 バイトの整数型 G6,1H □ ( 注 1) 4 バイトの整数型 G11,1H □ ( 注 1) 8 バイトの整数型 G20,1H □ ( 注 1) 実数型 倍精度実数型 4 倍精度実数型 複素数型 倍精度複素数型 4 倍精度複素数型 1P,E15.8,1H □ ( 注 1)、0P,G16.9,1H □ ( 注 1) 1P,E22.15,1H □ ( 注 1)、0P,G23.16,1H □ ( 注 1) 1P,E43.34E4,1H □ ( 注 1)、 0P,G44.35E4,1H □ ( 注 1) 1H(,1P,E15.8,1H,,E15.8,2H) □ ( 注 2)、 1H(,0P,G16.9,1H,,G16.9,2H) □ ( 注 2) 1H(,1P,E22.15,1H,,E22.15,2H) □ ( 注 2)、 1H(,0P,G23.16,1H,,G23.16,2H) □ ( 注 2) 1H(,1P,E43.34E4,1H,,E43.34E4,2H) □ ( 注 2)、 1H(,0P,G44.35E4,1H,,G44.35E4,2H) □ ( 注 2) Gn,1H □ ( 注 3)( 注 6)、 長さ n バイトの文字型 1H',Gn,2H' □ ( 注 4)( 注 6)、 1H",Gn,2H" □ ( 注 5)( 注 6) □ :空白を示します。 注 1) G 形編集記述子または E 形編集記述子で出力された値の直後が Fortran 記録の終わりの場 合、1H □は省略されます。 注 2) G 形編集記述子または E 形編集記述子で出力された値の 1 バイトあとが Fortran 記録の終 わりの場合、2H) □は 1H) となります。 注 3) 囲みなし文字定数の直後が Fortran 記録の終わりの場合、1H □は省略されます。 注 4) 囲み記号の引用符をもつ文字定数の直後が Fortran 記録の終わりの場合、2H' □は 1H' とな ります。 注 5) 囲み記号のアポストロフィをもつ文字定数の直後が Fortran 記録の終わりの場合、 2H" □は 1H" となります。 注 6) 翻訳時オプション -X9 が有効でない場合、最後の空白は出力されません。 備考 1.文字型以外の出力編集の結果で意味のない空白が現われたならばその空白を削除して出 力するので、実際の出力長は編集記述子の欄の幅の合計より小さくなることがあります。 備考 2.実数型および複素数型において、 “1P,Ew1.d1”となるか“0P,Gw2.d2”となるかは、デー タの絶対値 x が 0 または 0.1 ≦ x < 10**d2 ならば、“0P,Gw2.d2”となり、その他ならば “1P,Ew1.d1”となります。 Fortran 使用手引書ー Page 168 例:並びによる WRITE 文 INTEGER :: YY = 2002, MM = 09, DD = 10 CHARACTER(LEN=15) :: CH = 'YEAR MONTH DATE' INTEGER,DIMENSION(2,3) :: TABLE WRITE(6,*) YY,CH(1:4),MM,CH(6:10),DD,CH(12:15) OPEN(6,DELIM='QUOTE') WRITE(6,*) YY,CH(1:4),MM,CH(6:10),DD,CH(12:15) OPEN(6,DELIM='APOSTROPHE') WRITE(6,*) YY,CH(1:4),MM,CH(6:10),DD,CH(12:15) TABLE = RESHAPE((/1,2,3,4,5,6/),(/2,3/)) WRITE(6,*)((TABLE(I,J),I=2,1,-1),J=3,1,-1) END 上記 Fortran プログラムを実行すると、以下のように出力されます。 2002 YEAR 9 MONTH 10 DATE 2002 "YEAR" 9 "MONTH" 10 "DATE" 2002 'YEAR' 9 'MONTH' 10 'DATE' 6 5 4 3 2 1 7.7.5.2.1 並び出力における囲みなし文字定数の出力形式 FORTRAN66 または FORTRAN77 言語仕様では、値は区切られません。 Fortran 95 言語仕様では、値は 1 個の空白で区切られます。 例: CHARACTER(LEN=10) :: CH = ' ' WRITE(*,*)'Year',2002 WRITE(CH,*)'Month',9 WRITE(*,'(A10)')CH END 上記の Fortran プログラムを実行すると、FORTRAN66 または FORTRAN77 言語仕様では、以 下のように、続けて出力されます。 Year2002 Month9 Fortran 95 言語仕様では、以下のように、空白で区切られて出力されます。 Year 2002 Month 9 7.7.6 内部ファイル入出力文 内部ファイル入出力文は、内部ファイル上の文字列から、指定された書式に対応する Fortran 記録 との間でデータ転送を行う入出力文です。 内部ファイル入出力文の説明については、指定する書式仕様に対応する入出力文の説明を参照し てください。 7.7.7 停留入出力文 前進入出力文を実行すると、 ファイル位置を入力または出力した直後の Fortran 記録に進めますが、 停留入出力文では、ファイル位置を直後の Fortran 記録に進めずに、一つの Fortran 記録内のデー タを続けて入出力することができます。 Fortran 使用手引書ー Page 169 このため、停留入出力文を実行すると、ファイル位置が Fortran 記録の途中になることがあります。 停留入力文には、ファイル位置により、そのあとの処理を制御するために、SIZE 指定子と EOR 指定子を指定することができます。SIZE 指定子は、実際に入力したデータの文字数を通知します。 また、EOR 指定子を使用することにより、現在の Fortran 記録の終わりを超えて入力したときに、 指定した文番号へ分岐することができます。 以下の例は、ADVANCE='NO' を READ 文に指定して入力し、SIZE、EOR 指定子で、データの入 力を制御するものです。 例: CHARACTER(LEN=20) NAME INTEGER NO ! 1-20 : NAME ! 21-28 : NO OPEN(10,FORM='FORMATTED') DO READ(10,FMT='(A20)',ADVANCE='NO',EOR=10,SIZE=IS,END=20) NAME IF (IS < 20) CYCLE READ(10,FMT='(I8)',ADVANCE='NO',EOR=10,SIZE=IS,END=20,IOSTAT=IO) NO IF (IS < 8) CYCLE GO TO 30 10 CYCLE 30 PRINT*,NAME,' ',NO,' ',IS END DO GO TO 40 20 PRINT*,'END OF DATA ' 40 END 7.8 入出力文の組合せ 入出力文が実行されるときは、その前にどのような入出力文が実行されているかによって処理が 異なります。ここでは、書式なし順番探査入出力文、書式付き順番探査入出力文(並びによる入 出力文または変数群入出力文を含む)、直接探査入出力文、ファイル位置付け文、OPEN 文および CLOSE 文に対する組合せの前後関係処理について説明します。ここで説明する入出力文の組合せ は、同一装置番号に対する前後関係処理です。 Fortran 使用手引書ー Page 170 以下の二つの表に、入出力文の前後関係による処理を示します。 直前の入出力文 現在の 入出力文 書式付き順番 探査 READ 文 書式付き 書式付き 書式なし 書式なし 書式付き 書式なし BACK END 順番探査 順番探査 順番探査 順番探査 直接探査 直接探査 SPAC FILE READ 文 WRITE 文 READ 文 WRITE 文 入出力文 入出力文 E 文 文 × (注 1) × × × × ○ ○ (注 7) 書式付き順番 ○ 探査 WRITE 文 (注 2) ○ × × × × ○ ○ (注 6) 書式なし順番 探査 READ 文 × × ○ × (注 1) × × ○ ○ (注 7) 書式なし順番 探査 WRITE 文 × × ○ (注 2) ○ × × ○ ○ (注 7) 書式付き直接 探査入出力文 × × × × ○ × (注 8) × × 書式なし直接 探査入出力文 × × × × × (注 8) ○ × × BACKSPACE 文 ○ ○ (注 3) ○ ○ (注 3) × × ○ ○ (注 5) ENDFILE 文 ○ (注 4) ○ ○ (注 4) ○ × × ○ 無操作 (注 7) REWIND 文 ○ ○ ○ ○ × × ○ ○ OPEN 文 ○ ○ ○ ○ ○ ○ ○ ○ CLOSE 文 ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ :正常に動作することを示します。 × :エラーメッセージを出力し、何らかの修正処理を行うことを示します。 無操作:何も動作しないので、無意味なことを示します。 注 1) 直前の WRITE 文で書いた Fortran 記録よりあとの Fortran 記録は不定なので、READ 文を 実行してはなりません。 注 2) 現在の WRITE 文で書いた Fortran 記録よりあとの Fortran 記録は不定となります。 注 3) ファイル終了記録を出力したあとで BACKSPACE 動作が行われます。 注 4) READ 文が読み込んだ次の Fortran 記録に EOF が書き出されます。 注 5) ファイル終了記録に対して BACKSPACE 動作が行われます(実際は、既にファイル終了記 録の直前に位置付けられているので無操作となります)。 注 6) 翻訳時オプション -X7 が無効な場合、実行時の診断メッセージ(jwe0111i-e)が出力され ます。翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。 注 7) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。 注 8) 翻訳時オプション -X9 が無効な場合、正常に動作します。 備考. ここで、書式付き READ 文および書式付き WRITE 文には、並びによる入出力文および変 数群入出力文も含まれます。 Fortran 使用手引書ー Page 171 直前の入出力文 現在の入出力文 REWIND 文 OPEN 文 CLOSE 文 EOF 検出 (注 1) なし 書式付き順番探査 READ 文 ○ (注 2) ○ ○ (注 6) ○ (注 7) ○ (注 8) 書式付き順番探査 WRITE 文 ○ (注 2) ○ ○ (注 6) ○ (注 7) ○ (注 8) 書式なし順番探査 READ 文 ○ (注 2) ○ ○ (注 6) ○ (注 7) ○ (注 8) 書式なし順番探査 WRITE 文 ○ (注 2) ○ ○ (注 6) ○ (注 7) ○ (注 8) 書式付き直接探査 入出力文 × ○ × × × (注 3) 書式なし直接探査 入出力文 × ○ × × × (注 3) BACKSPACE 文 無操作 ○ ○ (注 6) ○ ○ (注 4) (注 10) ENDFILE 文 ○ (注 5) ○ (注 5) ○ (注 6) 無操作 (注 9) ○ (注 5) REWIND 文 無操作 ○ 無操作 (注 9) ○ 無操作 OPEN 文 ○ ○ ○ ○ ○ CLOSE 文 ○ ○ 無操作 ○ ○ ○ :正常に動作することを示します。 × :エラーメッセージを出力し、何らかの修正処理を行うことを示します。 無操作:何も動作しないので、無意味なことを示します。 注 1) EOF 検出とは、入出力動作によってファイル終了記録が検出されたことを示します。 注 2) REWIND 文の前後で書式付き順番探査入出力文と書式なし順番探査入出力文の組合せは 許されません。 注 3) 既に生成されているファイルに対しても、必ず、OPEN 文を実行しなければなりません。 注 4) ファイル終了記録に対して BACKSPACE 動作が行われます(実際は、既にファイル終了記 録の直前に位置付けられているので無操作となります)。 注 5) データのないファイルが生成されます。 注 6) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。指定していない 場合、ファイル名 'fort.nn'(nn: 装置参照番号)のファイルに、入出力動作が行われます。 注 7) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。指定していない 場合、ファイル終了記録からの入出力動作となります。 注 8) 翻訳時オプション -Xf6 または -Xf7 を指定していない場合、ファイル名 'fort.nn'(nn: 装置 参照番号)のファイルに、入出力動作が行われます。 注 9) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、エラーとなります。 注 10)翻訳時オプション -Xf6 または -Xf7 を指定した場合、無操作となります。指定していない 場合、ファイル終了記録に対して BACKSPACE 動作が行われます(実際は、既にファイル 終了記録の直前に位置付けられているので無操作となります)。 Fortran 使用手引書ー Page 172 備考. ここで、書式付き READ 文および書式付き WRITE 文には、並びによる入出力文および変 数群入出力文も含まれます。 7.8.1 入出力文の許されない組合せ 入出力文の組合せには、探査方法およびファイルの状態により、許されない組合せがあります。 許されない組合せが生じた場合は、エラー処理を行い、それぞれに定められた修正処理を行って 実行を継続します。 7.8.1.1 書式付き順番探査入出力文との組合せ 現在の入出力文が書式付き順番探査入出力文、並びによる入出力文および変数群入出力文の場合、 直前の入出力文が次に示すものであってはなりません。 - 書式なし順番探査入出力文 - 直接探査入出力文 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、直前の入出力文が上記の他に、次に示す ものであってはなりません。 - ENDFILE 文 - CLOSE 文 また、現在の入出力文が READ 文の場合、直前の入出力文が WRITE 文であってはなりません。た だし、入出力装置が端末装置のときはこの限りではありません。 現在の文が WRITE 文の場合、直前の文が ENDFILE 文であってはなりません。ただし、翻訳時オ プション -X7 または -X6 が有効な場合は、エラーではありません。 7.8.1.2 書式なし順番探査入出力文との組合せ 現在の入出力文が書式なし順番探査入出力文の場合、直前の入出力文が次に示すものであっては なりません。 - - - - 書式付き順番探査入出力文 並びによる入出力文 変数群入出力文 直接探査入出力文 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、直前の入出力文が上記の他に、次に示す ものであってはなりません。 - ENDFILE 文 - CLOSE 文 また、現在の入出力文が READ 文の場合、直前の入出力文が WRITE 文であってはなりません。 現在の文が WRITE 文の場合、直前の文が ENDFILE 文であってはいけません。ただし、翻訳時オ プション -X7 または -X6 が有効な場合は、エラーではありません。 7.8.1.3 直接探査入出力文との組合せ 現在の入出力文が直接探査入出力文の場合、直前の入出力文が次に示すものであってはなりませ ん。 Fortran 使用手引書ー Page 173 - - - - - 順番探査入出力文 並びによる入出力文 変数群入出力文 ファイル位置付け文 CLOSE 文 7.8.1.4 ファイル位置付け文との組合せ 順番探査入出力文は、ファイル位置付け文との組合せにより、入出力動作の対象となるファイル に対して位置付け制御を行うことができます。 現在の入出力文がファイル位置付け文の場合、直前の入出力文が次に示すものであってはなりま せん。各ファイル位置付け文について以下に示します。 現在の文が BACKSPACE 文または REWIND 文の場合 - 直接探査入出力文 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、直前の入出力文が上記の他に、次に示す ものであってはなりません。 - CLOSE 文 現在の文が ENDFILE 文の場合 - 直接探査入出力文 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、直前の入出力文が上記の他に、次に示す ものであってはなりません。 - ENDFILE 文 - CLOSE 文 7.9 ファイル位置付け文 順番探査入出力文は、ファイル位置付け文との組合せにより、入出力動作の対象となるファイル に対して位置付け制御を行うことができます。ここでは、ファイル位置付け文による位置付け制 御について説明します。 ファイル位置付け文には、以下の三つがあります。 - BACKSPACE 文(“7.9.1 BACKSPACE 文”を参照) - ENDFILE 文( “7.9.2 ENDFILE 文”を参照) - REWIND 文(“7.9.3 REWIND 文”を参照) 7.9.1 BACKSPACE 文 BACKSPACE 文を実行すると、指定された装置に接続しているファイルは、そのファイルに現在 記録が存在する場合、現在の記録の前に位置付けられます。そのファイルに現在記録が存在しな い場合、直前の記録の前に位置付けられます。そのファイルに現在記録も直前記録もない場合、 ファイル位置は変わりません。BACKSPACE 文が暗黙的にファイル終了記録を書いた場合には、 ファイルは、ファイル終了記録の直前記録の前に位置付けられます。 直前の入出力文が順番探査 READ 文の場合 ファイルの位置付けを直前の Fortran 記録になるように設定します。 Fortran 使用手引書ー Page 174 例:READ 文実行後の BACKSPACE 文の動作 DIMENSION IDATA(5), NDATA(5) : ! ①の READ 文の実行の前は、Fortran 記録 2 の直前に : ! 位置付けられていたものとする READ(1)IDATA ! ① Fortran 記録 2 の読込み BACKSPACE 1 ! ② Fortran 記録 2 の直前に位置付ける READ(1)NDATA ! ③ Fortran 記録 2 の読込み : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 Fortran 記録 3 ①の読込み動作 ②の位置付け動作 ③の読込み動作 結果として、IDATA と NDATA には同一のデータが読み込まれたことになります。 直前の入出力文が順番探査 WRITE 文の場合 ファイル終了記録を出力した後、ファイルの位置付けを直前の Fortran 記録となるように位置付け ます。 例:WRITE 文実行後の BACKSPACE 文の動作 DIMENSION IDATA(5), NDATA(5) : ! ①の WRITE 文の実行の前は、Fortran 記録 1 の直後に : ! 位置付けられていたものとする WRITE(1)IDATA ! ① Fortran 記録 2 の書出し BACKSPACE 1 ! ②ファイル終了記録を出力したあとで、Fortran 記録 2 の ! 直前に位置付ける READ(1)NDATA ! ③ Fortran 記録 2 の読込み : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 EOF ①の書出し動作 ファイル終了記録の出力 ②の位置付け動作 ③の読込み動作 結果として、IDATA で出力したデータが NDATA に読み込まれたことになります。 Fortran 使用手引書ー Page 175 直前の入出力文が ENDFILE 文の場合 ファイル終了記録の直前に位置付けます。 7.9.2 ENDFILE 文 ENDFILE 文を実行すると、そのファイルの直後記録として、ファイル終了記録が出力され、ファ イルは、そのファイルの最後の記録となるファイル終了記録の後ろに位置付けられます。 直前の入出力が READ 文の場合 ENDFILE 文は順編成ファイルの場合だけ許されます。 例 1:READ 文実行後の ENDFILE 文の動作(翻訳時オプション -Xf6 または -Xf7 を指定しない場合) DIMENSION IDATA(5) : ! ①の READ 文の実行の前は、Fortran 記録 2 の直前に : ! 位置付けられていたものとする READ(1)IDATA ! ① Fortran 記録 2 の読込み後、この Fortran 記録 2 の ! 最後に位置付ける ENDFILE 1 ! ② Fortran 記録 3 の先頭に EOF を書き出す : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 ①の読込み動 作 Fortran 記録 3 Fortran記録4 EOF ②実行後の位置付け ファイル終了記録の出力 EOF Fortran 使用手引書ー Page 176 例 2:READ 文実行後の ENDFILE 文の動作(翻訳時オプション -Xf6 または -Xf7 を指定した場合) DIMENSION IDATA(5) : ! ①の READ 文の実行の前は、Fortran 記録 2 の直前に : ! READ(1)IDATA ! ① Fortran 記録 2 の読込み後、この Fortran 記録 2 の ! ENDFILE 1 位置付けられていたものとする 最後に位置付ける ! ②ファイル終了記録の直前に位置付ける : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 Fortran記録3 Fortran記録4 EOF ①の読込み動 作 ②の位置付け動作 結果として、Fortran 記録 3 および Fortran 記録 4 は、読み飛ばされたことになります。 直前の入出力文が WRITE 文の場合 現在の Fortran 記録の直後にファイル終了記録を出力し、ファイルの位置付けをファイル終了記録 の直前になるように設定します。 例:WRITE 文実行後の ENDFILE 文の動作 DIMENSION IDATA(5) : ! ①の WRITE 文の実行前は、Fortran 記録 1 の直後に : ! 位置付けられていたものとする WRITE(1)IDATA ! ① Fortran 記録 2 の書出し ENDFILE 1 ! ②ファイル終了記録を出力し、ファイル終了記録の ! 直後に位置付ける : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 EOF ①の書出し動作 ②実行後の位置付け ファイル終了記録の出力 Fortran 使用手引書ー Page 177 直前の文が BACKSPACE 文の場合 翻訳時オプション -Xf6 または -Xf7 を指定しない場合、現在の Fortran 記録の直後にファイル終了 記録を出力します。翻訳時オプション -Xf6 または -Xf7 を指定した場合、その BACKSPACE 文の 前の入出力状況が INPUT 系か OUTPUT 系かによって動作が異なります。INPUT 系(BACKSPACE 文の直前に READ 文が実行されていた)ならば、直前の文が READ 文の場合と同じ動作を行いま す。また、OUTPUT 系(BACKSPACE 文の直前に WRITE 文または ENDFILE 文が実行されてい た)ならば、直前の文が WRITE 文の場合と同じ動作を行います。 例 1:BACKSPACE 文実行後の ENDFILE 文の動作(翻訳時オプション -Xf6 または -Xf7 を指定し ない場合) DIMENSION IDATA(5) : ! ①の WRITE 文実行前は、Fortran 記録 1 の直後に : ! 位置付けられていたものとする WRITE(1)IDATA ! ① Fortran 記録 2 の書出し BACKSPACE 1 ! ②ファイル終了記録を出力した後で、 ! Fortran 記録 2 の直前に位置付ける ENDFILE 1 ! ③ Fortran 記録 2 を消去したあとで、 ! ファイル終了記録の直後に位置付ける : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 EOF ①の書出し動作 ②の位置付け動作 Fortran 記録 1 ファイル終了記録の出力 EOF ③の位置付け動作 Fortran 使用手引書ー Page 178 例 2:BACKSPACE 文実行後の ENDFILE 文の INPUT 系の動作(翻訳時オプション -Xf6 または -Xf7 を指定した場合) DIMENSION IDATA(5) : ! ①の READ 文実行前は、Fortran 記録 3 の直前に : ! 位置付けられていたものとする READ(1) IDATA ! ① Fortran 記録 3 の読込み後、 ! この Fortran 記録 3 の最後に位置付ける BACKSPACE 1 ! ② Fortran 記録 3 の直前に位置付ける BACKSPACE 1 ! ③ Fortran 記録 2 の直前に位置付ける ENDFILE 1 ! ④ファイル終了記録の直前に位置付ける : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 Fortran 記録 3 ①の読込み動作 ③の位置付け動作 ②の位置付け動作 ④の位置付け動作 Fortran 記録 4 EOF Fortran 使用手引書ー Page 179 例 3:BACKSPACE 文実行後の ENDFILE 文の OUTPUT 系の動作(翻訳時オプション -Xf6 または -Xf7 を指定した場合) DIMENSION IDATA(5) : ! ①の WRITE 文実行前は、Fortran 記録 1 の直後に : ! 位置付けられていたものとする WRITE(1)IDATA ! ① Fortran 記録 2 の書出し BACKSPACE 1 ! ②ファイル終了記録を出力したあとで、 ! Fortran 記録 2 の直前に位置付ける ENDFILE 1 ! ③ Fortran 記録 2 を消去したあとで、 ! ファイル終了記録の直後に位置付ける : : <ファイルの状況> Fortran 記録 1 Fortran 記録 2 EOF ①の書出し動作 ②の位置付け動作 Fortran 記録 1 ファイル終了記録の出力 EOF ③の位置付け動作 直前の入出力文が REWIND 文の場合 ファイルの先頭にファイル終了記録を出力し、ファイルの位置付けをファイル終了記録の直後に なるように設定します。 Fortran 使用手引書ー Page 180 例:REWIND 文実行後の ENDFILE 文の動作 DIMENSION IDATA(5) : ! ①の READ 文実行前は、Fortran 記録 2 の直前に : ! 位置付けられていたものとする READ(1)IDATA ! ① Fortran 記録 2 の直後に位置付ける REWIND 1 ! ②ファイルの先頭(最初の Fortran 記録 1 の直前)に位置付ける ENDFILE 1 ! ③すべての Fortran 記録を消去したあと、 ! ファイル終了記録を出力し、ファイル終了記録の直後に位置付ける : : <ファイルの状況> ファイルの先頭 Fortran 記録 1 Fortran 記録 2 Fortran 記録 3 EOF ①の読込み動作 ②の位置付け動作 EOF ③実行後の位置付け ファイル終了記録の出力 結果として、ファイル終了記録だけが存在するファイルが作られる。 7.9.3 REWIND 文 ファイルが順番探査として接続されている場合、ファイルの位置付けをファイルの先頭の Fortran 記録の直前になるように設定します。 7.10 IBM370 形式 -IEEE 形式浮動小数点データ入出力変換 ここでは、IBM370 形式と IEEE 形式の浮動小数点データの変換について説明します。 7.10.1 浮動小数点データと入出力文との関係 実行時オプション -C を指定した場合または OPEN 文の CONVERT 指定子に "IBM" を指定した場 合、以下の機能が有効になります。 書式なし READ 文の実行時に、IBM370 形式浮動小数点データで作成されている書式なし Fortran 記録を入力し、IEEE 形式浮動小数点データに変換して、入力並びに設定することができます。ま た、書式なし WRITE 文の実行時に、出力並びに設定されている IEEE 形式浮動小数点データを IBM370 形式浮動小数点データに変換して、書式なし Fortran 記録へ出力することができます。実 行時オプションについては、 “3.3 実行時オプション”を参照してください。 Fortran 使用手引書ー Page 181 以下に、IBM370 形式浮動小数点データのデータフォーマットの内部表現を示します。IEEE 形式 浮動小数点データのデータフォーマットの内部表現については、“5.1.3 実数型および複素数型 データ”を参照してください。 実数型 以下は、IBM370 形式浮動小数点データの実数型における符号(s) 、指数部(e)、仮数部(f)の ビット構成を示しています。 s e 31 30 f 24 23 0 倍精度実数型 以下は、IBM370 形式浮動小数点データの倍精度実数型における符号(s) 、指数部(e)、仮数部 (f)のビット構成を示しています。 s 63 62 e f 56 55 0 以下は IBM370 形式浮動小数点データの流れを示しています。 Fortran オブジェクトプログラム (IEEE 形式浮動小数点データで演算) 書式なし WRITE 文 書式なし READ 文 Fortran 入出力ライブラリ データ変換 (IEEE 形式 データ変換 IBM370 形式) (IBM370 形式 IEEE 形式) ファイル(IBM370 形式浮動小数点データ) 対象となる入出力文は、以下の二つです。 - 書式なし順番探査入出力文 - 書式なし直接探査入出力文 Fortran 使用手引書ー Page 182 対象となる Fortran 記録は、以下の書式なし Fortran 記録です。 - M/GS シリーズおよび VPP シリーズの Fortran 処理系で出力した書式なし Fortran 記録 - Solaris 向け Fortran&C Package および Parallelnavi の Fortran 処理系で出力した書式なし Fortran 記録 - Windows 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 - Linux 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 書式なし Fortran 記録については、“7.3.2 書式なし Fortran 記録”を参照してください。 変換対象となる入出力並びの型は、以下の四つです。 - - - - 実数型 倍精度実数型 複素数型 倍精度複素数型 ただし、複素数型または倍精度複素数型の場合は、実部および虚部をそれぞれ実数型または倍精 度実数型として変換されます。 また、実数型、倍精度実数型、複素数型、倍精度複素数型以外の型の入出力並びが指定されてい る場合は、変換されません。 以下に浮動小数点データの変換における精度上の留意点について説明します。 入出力並びの型 表現範囲 指数部 実数型 IBM370 10 – 78~ 10 75 形式 IEEE 形式 10 –37~ 10 38 READ 文 WRITE 文 (IBM370 形式 (IEEE 形式か から IEEE 形 ら IBM370 形 式へ変換) 式へ変換) 10 –37~ 10 38 の範囲で変換 変換可能 可能 (注 1) IBM370 24 ビット表現 形式 仮数部 指数部 倍精度実数型 IEEE 形式 24 ビット表現 (隠れビットを 含む) IBM370 10 – 78~ 10 75 形式 IEEE 形式 10 – 307 ~ 10 308 変換可能 最大 3 ビット のビット損失 の可能性あり (注 2) 10 –78 ~ 10 75 変換可能 の範囲で変換 可能 (注 1) IBM370 56 ビット表現 形式 仮数部 IEEE 形式 最大 3 ビット のビット損失 変換可能 53 ビット表現 の可能性あり (隠れビットを (注 3) 含む) 注 1) この範囲外ではオーバフローまたはアンダフローが発生する可能性があります。 注 2) 指数の値により仮数部の先頭に最大 3 ビットのゼロを付加する場合、変換時に最大 3 ビッ トの損失が生じます。 注 3) 仮数部の表現範囲上、最大 3 ビットの損失の可能性があります。 Fortran 使用手引書ー Page 183 備考. 変換時にビットの損失が生じた場合、誤差を最小限にするために仮数部の最終ビットをつ ねに 1 とする処理を行います。また、この場合、実行時オプション -M を指定すると w レ ベルの診断メッセージを出力します。 7.10.2 エラー処理 ここでは、IEEE 形式 -IBM370 形式浮動小数点の変換におけるエラー処理について述べます。 以下にエラー事象および標準修正処理を示します。 変換形式 入出力 実数型 IEEE 形式→ IBM370 形式 の変換 (WRITE 文 ) IBM370 形式 → IEEE 形式 の変換 (READ 文 ) エラー事象 入力データ中に無限大 データを検出しました。 jwe0145i-w 最大値 入力データ中に非数デー タを検出しました。 jwe0145i-w 最大値 変換後にビット損失が発 生しました。 jwe0147i-w (注) - 変換後に指数オーバフ ローが発生しました。 jwe0142i-w 最大値 jwe0144i-w ゼロ jwe0146i-w 最大値 入力データ中に非数デー タを検出しました。 jwe0146i-w 最大値 変換後に指数オーバフ ローが発生しました。 jwe0141i-w 最大値 変換後に指数アンダフ ローが発生しました。 jwe0143i-w ゼロ jwe0147i-w (注) - 変換後に指数アンダフ 倍精度 ローが発生しました。 実数型 入力データ中に無限大 データを検出しました。 実数型 診断 標準修正処理 メッセージ 倍精度 変換後にビット損失が発 実数型 生しました。 注)実行時オプション -M を指定したときに、この診断メッセージが出力されます。 7.11 エンディアン入出力変換 ここでは、リトルエンディアンデータとビッグエンディアンデータの変換について説明します。 7.11.1 リトルエンディアンデータと入出力文との関係 実行時オプション -T を指定するか、または OPEN 文の CONVERT 指定子に 'LITTLE_ENDIAN' を 指定することにより、リトルエンディアンデータを入出力することができます。実行時オプショ ンについては、 “3.3 実行時オプション”を参照してください。 - 書式なし READ 文で、リトルエンディアンデータで作成されている書式なし Fortran 記録を入 力し、ビッグエンディアンデータに変換して、入力並びに設定することができます。 - 書式なし WRITE 文で、出力並びに設定されているビッグエンディアンデータをリトルエン ディアンデータに変換して、書式なし Fortran 記録へ出力することができます。 Fortran 使用手引書ー Page 184 以下はリトルエンディアンデータの流れを示しています。 Fortran オブジェクトプログラム 書式なし WRITE 文 書式なし READ 文 Fortran 入出力ライブラリ データ変換 (ビッグエンディアン リトルエンディアン) データ変換 (リトルエンディアン ビッグエンディアン) ファイル(リトルエンディアンデータ) 対象となる入出力文は、以下の二つです。 - 書式なし順番探査入出力文 - 書式なし直接探査入出力文 対象となる Fortran 記録は、以下の書式なし Fortran 記録です。 - M/GS シリーズおよび VPP シリーズの Fortran 処理系で出力した書式なし Fortran 記録 - Solaris 向け Fortran&C Package および Parallelnavi の Fortran 処理系で出力した書式なし Fortran 記録 - Windows 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 - Linux 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 書式なし Fortran 記録については、“7.3.2 書式なし Fortran 記録”を参照してください。 変換対象となる入出力並びの型は、以下の型です。 - - - - - - - - - - - - - - 1 バイトの整数型 2 バイトの整数型 4 バイトの整数型 8 バイトの整数型 実数型 倍精度実数型 4 倍精度実数型 複素数型 倍精度複素数型 4 倍精度複素数型 1 バイトの論理型 2 バイトの論理型 4 バイトの論理型 8 バイトの論理型 Fortran 使用手引書ー Page 185 7.12 標準ファイル ここでは、入出力文で使用する標準ファイルについて説明します。 7.12.1 標準ファイルとオープンモード 標準ファイルとオープンモードの関係を以下に示します。 指定方法 (指定がないと端末) command<file-name 入出力ファイル 標準入力ファイル 標準出力ファイル 標準エラー出力ファイル オープンモード r command<<eof-sym r command>file-name w command>>file-name a command2>file-name w command2>>file-name a 7.12.2 標準ファイルに対する入出力文の制限 標準入力ファイル、標準出力ファイルおよび標準エラー出力ファイルに対しては、順番探査入出 力文、補助入出力文のみ扱うことができます。 標準入力ファイルは、ACTION='READ' の扱いです。また、標準出力ファイルおよび標準エラー出 力ファイルは、ACTION='WRITE' の扱いです。 標準入力ファイル、標準出力ファイルおよび標準エラー出力ファイルに対して、FILE 指定子を指 定した OPEN 文を実行すると、今までの接続は解除され、新たにファイル(一般ファイル、また は一時ファイル)がオープンされます。これ以降は、標準入力、標準出力および標準エラー出力 の装置番号に対する扱いは、通常のファイルとして扱われます。 7.12.3 入出力文とシーク可能/不可能ファイルの関係 シーク可能ファイルとは、シーク動作可能なファイルのことを示し、以下のように区別します。 シーク可 / 不可 ファイルタイプ シーク可能ファイル 通常ファイル ブロック型特殊ファイル シーク不可能ファイル 文字型特殊ファイル FIFO 特殊ファイル 備考.ファイルタイプとは、stat および fstat システムコールで得られる情報です。 次に示す入出力文および編集記述子は、シーク可能ファイルでなければなりません。シーク不可 能ファイルに対して実行すると、診断メッセージが出力され、文は無視されます。 - - - - - - REWIND 文 BACKSPACE 文 ENDFILE 文(INPUT 系) 直接探査入出力文 書式なし順番探査入出力文 TL 形編集記述子および T 形編集記述子(結果的に、TL 形と同じ動作をする場合のみ) Fortran 使用手引書ー Page 186 7.13 ACTION 指定子による入出力文の制限 ACTION 指定子で指定された値に対して、使用できる入出力文に制限があります。 ACTION 指定子 入出力文 READ WRITE READWRITE READ 文 ○ × ○ WRITE 文 × ○ ○ PRINT 文 × ○ ○ REWIND 文 ○ × ○ BACKSPACE 文 ○ × ○ OPEN 文 ○ ○ ○ CLOSE 文 ○ ○ ○ ENDFILE 文 (翻訳時オプション -Xf6 または -Xf7 を指定しない場合) - ○ ○ ENDFILE 文 (INPUT) (翻訳時オプション -Xf6 または -Xf7 を指定した場合) ○ - ○ ENDFILE 文 (OUTPUT) (翻訳時オプション -Xf6 または -Xf7 を指定した場合) - ○ ○ ○ × - :正常に動作することを示します。 :エラーメッセージを出力し、何らかの修正処理を行うことを示します。 :無操作であることを示します。 7.14 実数値の有効けた数 本システムにおける実数値の有効けた数を以下に示します。この有効けた数を超えて、書式付き 入出力文でデータ転送を行った場合、誤差が生ずることがあります。 入出力並びの型 有効けた数 実数型 9 けた 倍精度実数型 16 けた 4 倍精度実数型 35 けた 複素数型 9 けた 倍精度複素数型 16 けた 4 倍精度複素数型 35 けた Fortran 使用手引書ー Page 187 7.15 入出力バッファ 順番探査入出力実行時に使用される入出力バッファを変更する方法を以下に示します。これらを 同時に指定した場合、その優先順位は、OPEN 文の BLOCKSIZE 指定子、環境変数、実行時オプ ションの順番です。 指定 バッファサイズ 優先順位 OPEN 文の BLOCKSIZE 指定子 指定した値 最も高い 環境変数(fuxxbf) 指定した値 ↑ 実行時オプション(-g) 指定した値 ↓ なし 書式付き順番探査入出力 8K バイト 書式なし順番探査入出力 1M バイト 最も低い 7.16 編集記述子 ここでは、編集記述子について説明します。 7.16.1 整数型の G 形編集 FORTRAN66 または FORTRAN77 言語仕様では、整数型の入出力並びに対応する編集記述子が Gw.d 形または Gw.dEe 形の場合、Iw.m 形編集として入出力されます。 Fortran 95 言語仕様では、Iw 形編集として入出力されます。 例: WRITE(*,'(G10.5)')123 上記の WRITE 文を実行すると、FORTRAN66 または FORTRAN77 言語仕様では、以下のよう に出力されます。 □□□□□ 00123 (□は空白を表します) Fortran 95 言語仕様では、以下のように出力されます。 □□□□□□□ 123 (□は空白を表します) 7.16.2 書式付き出力文の文字出力 書式付き出力文の E 形編集、EN 形編集、ES 形編集、D 形編集、Q 形編集、G 形編集、L 形編集 および Z 形編集で出力した場合、文字 E、D、Q の出力は言語レベルにより異なります。 FORTRAN66 または FORTRAN77 言語仕様では、小文字で出力されます。 ただし、実行時オプション -q を指定すると、大文字で出力することができます。 Fortran 95 言語仕様では、実行時オプション -q の指定に関係なく大文字で出力されます。 例: WRITE(*,FMT='(1H E15.5)')6.5432 上記の Fortran プログラムを実行すると、FORTRAN66 または FORTRAN77 言語仕様では、 0.65432e+01 と出力されます。 Fortran 95 言語仕様では、0.65432E+01 と出力されます。 Fortran 使用手引書ー Page 188 7.16.3 G 形編集記述子の編集結果 値 0 または値が 0 の変数を G 形編集で編集した場合、FORTRAN66 または FORTRAN77 言語仕様 では、E 形編集記述子で編集されます。 Fortran 95 言語仕様では、F 形編集記述子で編集されます。 7.16.4 文字列編集記述子の診断メッセージ FORTRAN66 または FORTRAN77 言語仕様では、 実行時に w レベルの診断メッセージ(jwe0159i-w) が出力され、システムの処理として、入力データが書式中の文字列に置き換えられます。 Fortran 95 言語仕様では、実行時に e レベルの診断メッセージ(jwe1181i-e)が出力され、システ ムの処理として、入出力並びが無視されます。 7.16.5 X 形編集記述子の効果 X 形編集記述子(nX)が、出力における書式仕様として使用された場合には、FORTRAN77 プロ グラムまたは Fortran 95 プログラムと FORTRAN66 プログラムでは、その動作が異なります。 FORTRAN77 および Fortran 95 言語仕様では、Fortran 記録の文字の位置を n 文字分だけ進んだ位 置に設定するだけで、空白は挿入されません。 FORTRAN66 言語仕様では、n 個の空白が Fortran 記録に挿入されます。 次のような場合にだけその動作が異なります。 出力の書式仕様が次の形式の場合に、 FORMAT(5H FFFF,I4,T2,4X,I2) FORTRAN77 および Fortran 95 プログラムでは、 FORTRAN66 プログラムでは、 □ FFFFjjii □□□□□ jjii となります(ii は I4 に対応する変数の数値の下位 2 けた、jj は I2 に対応する変数の数値、 □は空白とします)。 ただし、FORTRAN77 および Fortran 95 プログラムにおいても、最初に用意される Fortran 記録は、 空白で埋められているので、一般的な使用法では問題ありません。 7.16.6 L 形編集記述子 Lw 形編集記述子に対応する入力の型が論理定数でない場合、FORTRAN66 または FORTRAN77 言 語仕様では .FALSE. を設定し、正常終了します。Fortran 95 言語仕様では、実行時の診断メッセー ジ(jwe1202i-w)が出力されます。 Fortran 使用手引書ー Page 189 例: プログラム l.f LOGICAL :: L=.TRUE. OPEN (10,FILE="a.file") READ (10,"(L1)") L PRINT *,L END ファイル a.file 1 実行結果 % frt l.f ; a.out f % frt -X9 l.f ; a.out jwe1202i-w line 3 Invalid LOGICAL input (unit=10). error occurs at MAIN__ line 3 loc 00010830 offset 00000020 MAIN__ at loc 00010810 called from o.s. taken to (standard) corrective action, execution continuing. T error summary (Fortran) error number error level error count jwe1202i w 1 total error count = 1 7.16.7 D、E、F、G、I、L、B、O および Z 編集記述子の w、d の省略値 D、E、F、G、I、L、B、O および Z 編集記述子において、欄幅 w、小数部のけた数 d を省略する ことができます。 w を省略した場合、以下のけた数が補われて、編集されます。 I1 I2 I4 I8 R4 変数の型 R8 R16 C8 C16 C32 B 形編集 9 17 33 65 33 65 129 33 65 O 形編集 4 7 12 23 12 23 44 12 Z 形編集 3 5 9 17 9 17 33 I 形編集 4 6 11 20 11 11 L 形編集 2 2 2 2 2 F 形編集 15 15 15 22 E 形編集 15 15 15 D 形編集 15 15 G 形編集 4 6 編集記述子 I1 I2 I4 I8 R4 R8 L1 L2 L4 L8 129 9 17 33 65 23 44 4 7 12 23 9 17 33 3 5 9 17 11 11 11 11 4 6 11 20 2 2 2 2 2 2 2 2 2 15 22 43 15 22 43 15 15 15 22 22 15 22 43 15 22 43 15 15 15 22 15 22 15 22 43 15 22 43 15 15 15 22 11 20 15 22 43 15 22 43 2 2 2 2 :1 バイトの整数型 :2 バイトの整数型 :4 バイトの整数型 :8 バイトの整数型 :実数型 :倍精度実数型 Fortran 使用手引書ー Page 190 :4 倍精度実数型 :複素数型 :倍精度複素数型 :4 倍精度複素数型 :1 バイトの論理型 :2 バイトの論理型 :4 バイトの論理型 :8 バイトの論理型 R16 C8 C16 C32 L1 L2 L4 L8 7.16.8 実数型特殊データの編集 E 形編集記述子、D 形編集記述子、Q 形編集記述子、G 形編集記述子、F 形編集記述子、EN 形編 集記述子および ES 形編集記述子のフォーマットを、Xw.d(X:E、D、Q、G、F、EN、ES のどれ か)とした場合、出力幅 w けたに対して左詰めで、Inf、NaN を出力し、残ったけたを空白で埋め ます。負の値の場合は、-Inf、-NaN を出力します。 また、S 形編集記述子、SP 形編集記述子または SS 形編集記述子により符号を制御することもで きます。 文字列(Inf、-Inf、NaN、-NaN)は、実数型の変数の入力データとしても使用できます。正符号 “+”は、付けても付けなくてもかまいません。 以下に、それぞれの文字列に対応した、実際に変数に設定される値を示します。 4 倍精度 文字列 +NaN 単精度 0x7fffffff 倍精度 0x7fffffff ffffffff 0x7fffffffffffffff ffffffffffffffff -NaN 0xffffffff 0xffffffff ffffffff 0xffffffffffffffff ffffffffffffffff +Inf 0x7f800000 0x7ff00000 00000000 0x7fff000000000000 0000000000000000 -Inf 0xff800000 0xfff00000 00000000 0xffff000000000000 0000000000000000 7.17 磁気テープファイル入出力機能 ここでは、磁気テープファイル入出力機能について説明します。本機能は、環境変数または OPEN 文において、対象となる装置番号が磁気テープファイルと接続された場合にアクセス可能です。 対象となる入出力文は以下のとおりです。 - - - - ー 書式なし順番探査入出力文 書式付き順番探査入出力文 ファイル接続文 ファイル位置付け文 ファイル問合せ文 7.17.1 磁気テープファイルと装置番号の接続 ここでは、磁気テープファイルと装置番号の接続方法について説明します。 7.17.1.1 環境変数による磁気テープファイルと装置番号の接続 環境変数によって磁気テープファイルと装置番号を接続することができます。 Fortran 使用手引書ー Page 191 以下に使用例を示します。 例:磁気テープファイルと装置番号 1 を接続する Fortran プログラム OPEN(1) READ(1,100) : コマンド列 % setenv fu01 /dev/rmt/0n % a.out 7.17.1.2 OPEN 文の FILE 指定子による磁気テープファイルと装置番号の接続 OPEN 文のファイル指定子により、磁気テープファイルと装置番号を接続することができます。 以下に使用例を示します。 例:磁気テープファイルと装置番号 10 を接続する Fortran プログラム OPEN(10,FILE='/dev/rmt/0n',...) READ(10,100) I : 7.17.2 磁気テープファイル入出力機能の留意点 ここでは、磁気テープファイル入出力機能の使用上の留意点を説明します。 - プログラムが異常終了した場合、テープの位置付けられている場所が不明になることがあり ます。mt(1) コマンドを使用してテープを適切な位置に位置付け直してください。 - 実行時オプション -g は効果がありません。 7.18 入出力統計情報 ここでは、入出力統計情報について説明します。 7.18.1 入出力統計情報が出力するファイル 実行時オプション -Oi を指定した場合、環境変数 IOINF に指定したファイルに入出力統計情報が 出力されます。環境変数を指定していない、または指定したファイル名が誤っている場合、標準 出力ファイルに出力されます。 例:入出力統計情報をファイル ioinf.file に出力する場合 % setenv IOINF ioinf.file % a.out -Wl,-Oi Fortran 使用手引書ー Page 192 7.18.2 入出力統計情報が出力する情報 情報の出力形式と各項目の説明を以下に示します。 file name : fort.10 unit 10 buffer size read size/ count/ time 8192 12/ write size/ count/ time 12/ 1/ 0.509 1/ 0.13 seek file count size 1 12 ac sf - file name(ファイル名) ファイル名が出力されます。標準ファイルを指定した場合、ファイル名は stdin,stdout,stderr と 出力されます。 - unit(装置参照番号) 装置参照番号が出力されます。 - buffer size(バッファサイズ) 入出力文によって、獲得されたバッファのサイズが出力されます。単位はバイトです。 - read size(read サイズ) read(2) または fread(3S)(fgets(3S) を含む)によって入力されたデータの合計サイズが出力さ れます。単位はバイトです。 - read count(read 回数) read(2) または fread(3S)(fgets(3S) を含む)の発行回数が出力されます。回数が 2147483647 を 超えた場合、'*' が出力されます。 - read time(read 時間) read(2) または fread(3S)(fgets(3S) を含む)の実行にかかった時間の合計が出力されます。単 位はミリ秒です。時間が 1000000000 ミリ秒(約 277 時間)を超えた場合、'*' が出力されます。 - write size(write サイズ) write(2) または fwrite(3S)(putc(3S) を含む)によって出力されたデータの合計サイズが出力さ れます。単位はバイトです。 - write count(write 回数) write(2) または fwrite(3S)(putc(3S) を含む)の発行回数が出力されます。回数が 2147483647 を超えた場合、'*' が出力されます。 - write time(write 時間) write(2) または fwrite(3S)(putc(3S) を含む)の実行にかかった時間の合計が出力されます。単 位はミリ秒です。時間が 1000000000 ミリ秒(約 277 時間)を超えた場合、'*' が出力されます。 - lssek count(lseek 回数) lseek(2) または fseek(3S)(rewind(3S) を含む)の発行回数が出力されます。 - file size(ファイルサイズ) ファイルサイズが出力されます。単位はバイトです。ファイルサイズの獲得に失敗した、ま たは stdout,stderr を指定した場合、'*' が出力されます。 - ac(アクセス種別と書式種別) 順番探査(s)/直接探査(d)アクセスの種別と書式付き(f)/書式なし(u)/ BINARY 書式(b)の種別が出力されます。 7.18.3 入出力統計情報における注意事項 - プログラムの実行中に異常終了が発生した場合、出力結果は保証されません。 - 環境変数 IOINF に指定したファイルが存在する場合、入出力統計情報はそのファイルに追加 されます。 Fortran 使用手引書ー Page 193 7.19 EBCDIC-ASCII 文字コード入出力変換 ここでは、IBM370 EBCDIC 文字コードデータと ASCII 文字コードデータの変換について説明しま す。 7.19.1 EBCDIC 文字コードデータと入出力文との関係 実行時オプション -G を指定した場合、以下の機能が有効になります。 書式なし READ 文の実行時に、IBM370 EBCDIC 文字コードで作成されている書式なし Fortran 記 録を入力し、ASCII 文字コードに変換して、入力並びに設定することができます。また、書式な し WRITE 文の実行時に、出力並びに設定されている ASCII 文字コードを IBM370 EBCDIC 文字 コードに変換して、書式なし Fortran 記録へ出力することができます。 実行時オプションについては、“3.3 実行時オプション”を参照してください。 以下は、IBM370 EBCDIC 文字コードのデータの流れを示しています。 Fortran オブジェクトプログラム (ASCII 文字コードのデータ ) 書式なし WRITE 文 書式なし READ 文 Fortran 入出力ライブラリ データ変換 (ASCII 文字コード→ IBM370 EBCDIC 文字コード ) データ変換 (IBM370 EBCDIC 文字コード→ ASCII 文字コード ) ファイル (IBM370 EBCDIC 文字コード ) 対象となる入出力文は、以下の二つです。 - 書式なし順番探査入出力文 - 書式なし直接探査入出力文 対象となる Fortran 記録は、以下の書式なし Fortran 記録です。 - M/GS シリーズおよび VPP シリーズの Fortran 処理系で出力した書式なし Fortran 記録 - Solaris 向け Fortran&C Package および Parallelnavi の Fortran 処理系で出力した書式なし Fortran 記録 - Windows 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 - Linux 向け Fortran&C Package の Fortran 処理系で出力した書式なし Fortran 記録 書式なし Fortran 記録については、“7.3.2 書式なし Fortran 記録”を参照してください。 変換対象となる入出力並びの型は、文字型です。 第 8 章 プログラムのデバッグ 実行可能プログラムでエラーが発生したとき、異常終了したとき、または利用者が目的とした結 果を得られないときは、その原因を追求し、原始プログラムの修正を行う必要があります。 本章では、これらの原因を見い出す手段として、本システムが用意している各種のデバッグ機能 について説明します。 8.1 エラー制御 Fortran プログラムの実行中にエラーが発生した場合、次のような処置が行われます。 - 診断メッセージが出力されます。 - エラーの種類により実行が継続されます。 これらのエラー発生時の処置は、エラーモニタによって制御されます。 利用者は、実行時にエラーモニタの機能を使って、個々のエラーに対する処置の制御を自分で行 うことができます。その処置の制御を、次に示します。 - - - - 実行可能プログラムの実行を打ち切る回数の制御 エラーに対するメッセージの最大出力回数の制御 トレースバックマップを出力するかどうかの制御 利用者が用意する(または定義する)エラー処理ルーチンを呼ぶかどうかの制御 利用者が、これらの制御を必要としない場合、本システムで用意されている標準値( “表 8.1 エ ラー制御表の標準値”参照)が使用されます。 8.1.1 エラーモニタ Fortran プログラムの実行中にエラーが発生した場合、エラーモニタが呼び出されます。エラーモ ニタは、発生したエラーに対応するエラー制御表内のエラー項目の情報によって、各種のエラー 処理を行います。 エラーモニタは次のことを行います。 - エラーの発生が打切り回数に達しているか調べ、打切り回数に達していればその旨を通知し ます。 - エラーに対するメッセージ出力回数を調べ、最大出力回数を超えていなければ診断メッセー ジを出力します。 - トレースバックマップの出力の指定があればその出力を行います。ただし、他言語のプログ ラムと結合されているときは、出力されないトレースバックマップ情報があります。 - エラーの発生が打切り回数に達した場合、実行可能プログラムの終了処理を行います。打切 り回数に達していない場合は、エラーの修正処置を行ったあとに実行を継続させます。 エラーの修正処置には、本システムで用意されている標準修正処理と利用者が用意する修正処理 があります。利用者が修正処理を用意する場合、その処置をするプログラムを作成しなければな りません。 Fortran 使用手引書ー Page 195 エラーが発生してからのエラーモニタの呼出し関係を以下に示します。 ライブラリ 利用者プログラム 1. ライブラリの 呼出し エラーモニタ 2. エラーの検出 4. エラー制御表にした がってエラーの処理 を行う。 3. エラーモニタの 呼出し 標準修正か? NO YES 標準修正処理を 行う 5. 利用者の修正 出口ありか? NO YES 利用者の修正 ルーチンの呼出し 利用者の修正ルーチン 6. 利用者によるエラーの修正 1 ~ 6:ライブラリでエラーを検出したときの呼出し関係 エラーモニタの動作は、エラー制御表内のエラー項目によって制御されます。エラー制御表は、 エラー識別番号に対応するエラー項目の集まりからなっています。 エラー項目の構成は、以下のようになっています。これらの項目は、エラー処理ルーチンで参照 および設定することができます。 0 4 8 12 estop mprint ecount inf uexit ecode 未使用 estop エラー打切り回数です。0 ~ 255 の値が設定されています。0 は、無制限を示します。 mprint メッセージの最大出力回数です。0 ~ 255 の値が設定されています。0 は出力しないこと を示します。 ecount プログラムの実行中に発生したエラーの回数が記録されます。0 ~ 255 の値が設定されて います。 inf ビットでエラーの処理のための制御情報を示します。 Fortran 使用手引書ー Page 196 ビット 0 診断メッセージの先頭に制御文字が与えられているとき 1、与えられていないとき 0 (“8.1.2.3 ERRSET サービスサブルーチン”参照) 。 ビット 1 利用者がこのエラー項目を修正可能なとき 1、修正不可能なとき 0。 ビット 2 ecount が 255 を超えたとき 1、255 以下のとき 0。 ビット 3 診断メッセージとともにバッファの内容を出力するとき 1、バッファの内容を出力し ないとき 0。 ビット 4 未使用。 ビット 5 メッセージを出力するとき 1、メッセージを mprint の値によって出力するとき 0。 ビット 6 トレースバックマップを出力するとき 1、出力しないとき 0。 ビット 7 未使用。 uexit 利用者が用意した修正ルーチンの番地が格納されます。標準修正の場合、最後のビット が 1 となります。 ecode エラーのレベルを示します。 = 0:i レベルのエラーを示します。 メッセージを出力したあとにプログラムの実行を続けます。 = 4:w レベルのエラーを示します。 エラーの発生した文を一部修正したあとにプログラムの実行を続けます。 = 8:e レベルのエラーを示します。 エラーの発生した文を無視します。実行は打切り回数(標準は 10 回)によって、続 行または中断します。 = 12:s レベルのエラーを示します。 エラーの発生した文を無視します。実行は打切り回数(標準は 1 回)によって、続 行または中断します。 = 16:u レベルのエラーを示します。 プログラムの実行を打ち切ります。 エラー制御表内の各エラー項目は、エラー項目の修正が不可能なものを除いて、実行時にエラー 処理サービスサブルーチン ERRSET を使用して、その内容を変えることが可能です。 エラー識別番号に対応するエラー項目の標準値は、本システムで、表 8.1 に示すように定められ ています。 Fortran 使用手引書ー Page 197 表 8.1 エラー制御表の標準値 番号 11 ~ 14 17 ~ 18 19 メッ エラー エラー セージ バッファの トレースバック 打切り 項目の 最大出 内容出力 マップの出力 回数 修正 力回数 10 5 可能 出力しません 出力します 1 1 不可能 出力しません 出力しません 1 1 不可能 出力しません 出力します 不可能 出力しません 標準 エラー 修正 レベル あり e なし u なし u 出力しません なし u 20 1 1 21 ~ 22 28 1 1 可能 出力しません 出力します あり s 1 1 可能 出力しません 出力します あり s 42 10 5 可能 出力しません 出力します あり e 55 10 5 可能 出力しません 出力します あり e 62 10 5 可能 出力しません 出力します あり e 64 ~ 65 10 5 可能 出力しません 出力します あり e 71 ~ 72 74 10 5 可能 出力しません 出力します あり e 10 5 可能 出力しません 出力します あり e 80 ~ 82 10 5 可能 出力しません 出力します あり e 83 ~ 86 無制限 10 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 無制限 10 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 無制限 10 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 111 ~ 115 120 10 5 可能 出力しません 出力します あり e 10 5 可能 出力しません 出力します あり e 122 10 5 可能 出力しません 出力します あり e 131 ~ 134 10 5 可能 出力しません 出力します あり e 140 ~ 147 151 無制限 10 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 152 無制限 1 可能 出力しません 出力しません あり w 153 ~ 154 無制限 10 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 無制限 1 可能 出力しません 出力しません あり w 5 可能 出力しません 出力します あり w 171 ~ 172 無制限 10 5 可能 出力しません 出力します あり e 173 ~ 175 176 無制限 10 5 可能 出力します 出力します あり w 5 可能 出力しません 出力します あり e 182 ~ 183 無制限 10 1 可能 出力しません 出力しません あり w 5 可能 出力します 出力します あり e 87 ~ 89 97 102 ~ 103 104 105 155 ~ 157 158 ~ 159 162 184 ~ 189 Fortran 使用手引書ー Page 198 番号 190 202 ~ 255 256 メッ エラー エラー セージ バッファの トレースバック 打切り 項目の 最大出 内容出力 マップの出力 回数 修正 力回数 1 無制限 可能 出力しません 出力しません 10 5 可能 出力しません 出力します 1 無制限 可能 出力しません 出力します 標準 エラー 修正 レベル あり w あり e あり w 257 10 5 可能 出力しません 出力します あり s 259 ~ 282 10 5 可能 出力しません 出力します あり e 291 ~ 292 301 10 5 可能 出力しません 出力します なし e 10 5 可能 出力しません 出力します あり w 304 5 可能 出力しません 出力します あり w 306 無制限 1 出力しません なし u 308 1 1 311 ~ 318 320 1 無制限 無制限 10 5 不可能 出力しません 可能 出力しません 出力します あり s 可能 出力しません 出力します あり w 可能 出力しません 出力します あり w 322 10 5 可能 出力しません 出力します あり w 323 ~ 324 329 無制限 1 5 可能 出力しません 出力します あり w 1 可能 出力しません 出力します あり s 可能 出力しません 出力します あり w 可能 出力しません 出力します あり s 330 1001 無制限 無制限 1 1 1003 ~ 1006 1031 1 1 可能 出力しません 出力します あり s 1 1 可能 出力しません 出力します あり s 1032 無制限 5 可能 出力しません 出力しません あり w 1033 無制限 5 可能 出力しません 出力します あり i 1034 無制限 1 5 可能 出力しません 出力します あり w 不可能 出力しません 出力します なし u 5 可能 出力しません 出力します あり w 1038 無制限 1 1 可能 出力しません 出力します あり s 1039 1 1 不可能 出力しません 出力します なし u 1035 1036 1 1 1040 ~ 1041 1042 無制限 1043 無制限 1 可能 出力しません 出力します あり s 5 可能 出力しません 出力しません あり w 5 可能 出力しません 出力しません あり i 1044 ~ 1045 1 1 出力します なし u 1071 ~ 1072 10 5 可能 出力しません 出力します あり e 1111 ~ 1113 10 5 可能 出力しません 出力します あり e 1114 ~ 1115 1117 無制限 10 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 1141 ~ 1143 1161 10 5 可能 出力しません 出力します あり e 1 1 可能 出力しません 出力します あり s 5 可能 出力しません 出力します あり w 1162 ~ 1163 無制限 不可能 出力しません Fortran 使用手引書ー Page 199 メッ エラー エラー セージ バッファの トレースバック 番号 打切り 項目の 最大出 内容出力 マップの出力 回数 修正 力回数 1164 1 1 可能 出力しません 出力します 1181 10 5 可能 出力しません 出力します 5 1201 ~ 1203 無制限 可能 出力します 出力します 1301 10 5 可能 出力しません 出力します 標準 エラー 修正 レベル あり s あり e あり w あり e 無制限 10 1303 ~ 1304 1305 1 5 可能 出力しません 出力します あり i 5 可能 出力しません 出力します あり e 1 可能 出力しません 出力します あり s 10 1355 ~ 1370 1371 無制限 1372 10 5 可能 出力しません 出力します あり e 5 可能 出力しません 出力します あり w 5 可能 出力しません 出力します あり e 無制限 1 1375 ~ 1378 1 1381 ~ 1387 5 可能 出力しません 出力します あり w 1 可能 出力しません 出力します あり s 1 可能 出力しません 出力します あり s 1390 ~ 1392 1393 1 1 可能 出力しません 出力します あり s 10 5 可能 出力しません 出力します あり e 1394 ~ 1395 1 1 可能 出力しません 出力します あり s 1396 ~ 1414 1415 10 5 可能 出力しません 出力します あり e 1 1 可能 出力しません 出力します あり s 1416 ~ 1417 10 5 可能 出力しません 出力します あり e 1418 ~ 1419 1551 1 1 可能 出力しません 出力します あり s 10 5 可能 出力しません 出力します あり e 無制限 無制限 可能 出力しません 1 1 1563 ~ 1564 不可能 出力しません 出力します あり w 出力しません なし u 1302 1373 1561 1565 ~ 1566 無制限 無制限 可能 出力しません 出力します あり w 1569 ~ 1571 無制限 無制限 1 1 1572 ~ 1575 可能 出力しません 出力します あり w 可能 出力しません 出力します あり s 可能 出力しません 出力します あり i 可能 出力しません 出力しません あり w 1582 無制限 1652 無制限 無制限 5 エラーモニタは、エラーが発生したときの修正状況を、次の形式でトレースバックマップのあと に出力します。 taken to (standard) corrective action, execution continuing. taken to (user) corrective action, execution continuing. standard :標準修正されたことを示します。 user :利用者によって修正されたことを示します。 または Fortran 使用手引書ー Page 200 8.1.2 エラー処理サービスサブルーチン 実行時のエラー発生に対して、その処理を利用者が制御するためにいくつかのサービスサブルー チンが用意されています。 利用者は、これらのサービスサブルーチンを使ってエラーモニタの機能を最大限に活用すること ができます。 これらのサービスサブルーチンは、エラー制御表内のエラー項目をプログラム実行中の間だけ、 動的に制御したり、トレースバックマップを出力したり、利用者が用意したエラー処理を実行し たりするものです。 8.1.2.1 ERRSAV サービスサブルーチン ERRSAV サービスサブルーチンは、指定されたエラー項目の先頭 8 バイトを、利用者が用意した 8 バイトの領域に退避させたいときに使用します。 呼出し形式は、以下の形式です。 CALL ERRSAV( errno , darea ) errno 基本整数型スカラ。エラー制御表内のエラー項目に対応するエラー識別番号。 darea 8 バイトの文字型スカラ。指定されたエラー項目が退避される 8 バイトの領域の名前。 8.1.2.2 ERRSTR サービスサブルーチン ERRSTR サービスサブルーチンは、利用者が用意した領域にあるエラー項目を、指定されたエラー 識別番号に対応するエラー制御表内のエラー項目に格納するものです。これによって、そのエラー が発生した場合、新しいエラー項目の情報により、エラーの処理が制御されます。 呼出し形式は、以下の形式です。 CALL ERRSTR( errno , darea ) errno 基本整数型スカラ。格納すべきエラー制御表内のエラー項目に対応するエラー識別番号。 darea 8 バイトの文字型スカラ。利用者が用意したエラー項目をもつ 8 バイトの領域の名前。 例:ERRSAV および ERRSTR サービスサブルーチンの使用例 CHARACTER(LEN=8) ERR113 !(1)ESTOP,(2)MPRINT,(3)ECOUNT,(4)INF CALL ERRSAV(113,ERR113) WRITE(ERR113(1:2),'(2a1)') 0,0 CALL ERRSTR(113,ERR113) OPEN(10,FILE="X.DAT",FORM="FORMATTED") DO I=1,15 WRITE(10)I END DO CLOSE(10,STATUS="DELETE") END Fortran 使用手引書ー Page 201 8.1.2.3 ERRSET サービスサブルーチン ERRSET サービスサブルーチンは、指定されたエラー識別番号に対応するエラー制御表内のエ ラー項目の個々の制御情報を変更したいときに使用します。ここで変更できる制御情報は、エラー 打切り回数、メッセージの最大出力回数、トレースバックマップの出力の有無およびエラーの修 正処置です。 呼出し形式は、以下の形式です。 CALL ERRSET( errno , estop , mprint , trace , uexit , r ) errno 基本整数型スカラ。変更すべきエラー項目に対応するエラー識別番号。 estop 基本整数型スカラ。エラー打切り回数。指定された値が、0 以下であれば変更されませ ん。255 より大きければエラー打切り回数は無制限となります。 mprint 基本整数型スカラ。メッセージの最大出力回数。指定された値が 0 ならば変更されませ ん。負ならば最大出力回数は 0 回となります。255 より大きければ最大出力回数は無制限 となります。 trace 基本整数型。値とトレースバックマップの出力の制御情報の関係を以下に示します。 = 0:トレースバックマップの出力の制御情報は変更されません。 = 1:トレースバックマップを出力しないように変更されます。 = 2:トレースバックマップを出力するように変更されます。 1、2 以外の場合は 0 とみなします。 uexit エラーの修正処置として 0、1 または利用者定義の修正サブルーチンの名前を指定します。 0 の場合は変更されません。1 の場合は本システムの標準修正を行うようにすることを意 味します。利用者定義の修正サブルーチンの名前を指定する場合、この名前は外部手続 名として宣言されていなければなりません。 r 基本整数型スカラ。errno が 132 以外の場合はエラー識別番号を指定します。ここで、 r > errno であれば、errno から r までの範囲のエラー識別番号に対応するエラー項目群を estop、mprint、trace、uexit に従って変更することを意味します。r ≦ errno であれば、r を無視します。必要のない場合は、r ≦ errno の値を指定します。errno が 132 の場合、 r = 1 であれば、データを出力するとき、書式仕様で定められた Fortran 記録がファイル のレコードの長さより大きい場合、次の Fortran 記録の先頭に一つの空白を付加して新し いレコードとして、出力されます。r ≠ 1 であれば、次の Fortran 記録の先頭に、空白は 付加されません。例 2 を参照してください。 ERRSET サービスサブルーチンの各引数のうち、mprint、trace および uexit を変更しない場合は、 0 を指定します。 例 1: EXTERNAL FIXUP CALL ERRSET(202,50,-1,0,FIXUP,205) この例は、エラー識別番号 202 から 205 までに対応するエラー項目群を次のように変更する ものです。 Fortran 使用手引書ー Page 202 - - - - エラー打切り回数を 50 回とします。 エラーが発生してもメッセージを出力しません。 トレースバックマップの出力制御情報は変更しません。 エラーの修正処理を利用者定義の FIXUP ルーチンで行うようにします。 例 2: CALL ERRSET(132,0,0,0,0,1) この例は、出力操作のときに書式仕様で定められた Fortran 記録がファイルのレコードの長さ より大きい場合、次の Fortran 記録の先頭に一つの空白をつけて新しいレコードとするよう指 示するものです。 8.1.2.4 ERRTRA サービスサブルーチン ERRTRA サービスサブルーチンは、現在実行中のプログラム単位までのトレースバックマップを 出力したいときに使用します。このトレースバックマップの形式は、 “4.2.2 トレースバックマッ プ”を参照してください。なお、このサービスサブルーチンが呼ばれたあとは、そのまま実行の 継続が行われます。 呼出し形式は、以下の形式です。 CALL ERRTRA 8.1.3 エラーモニタの使用方法 利用者は、エラー処理サービスサブルーチンおよび利用者定義のエラー修正サブルーチンを用意 して、エラーに関する各種のサービス機能を活用することができます。ここでは、これらの機能 の活用の方法およびその際の注意事項を説明します。 8.1.3.1 利用者が用意するエラー修正サブルーチン 利用者が用意するエラー修正サブルーチンは、ERRSET サービスサブルーチンによってエラー項 目にそのサブルーチン名を指定しなければなりません。 エラーモニタは、該当するエラー項目に利用者のエラー修正サブルーチンの指定があれば、次の ような形式でそのエラー修正サブルーチンを呼び出します。 CALL user( ret , errno [ , data1 , … , datan ] ) user 利用者のエラー修正サブルーチンの名前。 ret 復帰コードの入る 4 バイトの整数型スカラ。利用者のエラー修正サブルーチンで値を設 定しなければなりません。 errno 検出されたエラーのエラー識別番号。 data1,…,datan エラー修正サブルーチンで使用するスカラ変数名または配列要素名の並び。 利用者のエラー修正サブルーチンに渡される上記の引数は、以下のようになります。 - 入出力のエラー “8.1.4 入出力エラーの処理”で示す引数が渡されます。 - 組込み関数のエラー “8.1.5 組込み関数エラーの処理”で示す引数が渡されます。 Fortran 使用手引書ー Page 203 - 組込みサブルーチンのエラー “8.1.6 組込みサブルーチンエラーの処理”で示す引数が渡されます。 - 例外ハンドリングのエラー “8.1.7 例外ハンドリングエラーの処理”で示す引数が渡されます。 - 入出力、組込み手続、割込みを除くエラー “8.1.8 その他のエラーの処理”で示す引数が渡されます。 利用者が、エラー修正サブルーチンを作成する場合には、以下のような制限があるので注意が必 要です。 - 入出力文の使用に関する制限 入出力のエラーが発生した場合、その原因となった入出力文と同じ装置番号に対する入出力 文は使用できません。たとえば、装置番号 10 に対する入出力文を実行中のエラーであれば、 装置番号 10 に対する入出力文は使用できません。 - 組込み関数の使用に関する制限 組込み関数のエラーが発生した場合、利用者のエラー修正サブルーチン内でその原因となっ た組込み関数を使用できません。たとえば、SQRT の引用で引数の値が誤りであったとすれ ば、利用者のエラー修正サブルーチン内で SQRT の引用はできません。また、べき乗演算子 を含む式の使用などの場合に暗黙に引用される組込み関数も同様となります。 - 組込みサブルーチンの使用に関する制限 組込みサブルーチンのエラーが発生した場合、利用者のエラー修正サブルーチン内でその原 因となった組込みサブルーチンを使用できません。 - 復帰コード 利用者のエラー修正サブルーチンで渡された引数 data1、data2、…を変更しなかった場合、復 帰コード ret に 0 を設定しなければなりません。また、渡された引数 data1、data2、…を変更 した場合、復帰コード ret に 1 を設定しなければなりません。ただし、エラーモニタから呼び 出されたときは ret に 1 が設定されているので、利用者のエラー修正サブルーチンで渡された 引数を変更した場合は ret に 1 を設定する必要はありません。これらの処理を誤った場合、結 果は保証されません。 復帰コードの値として 0 または 1 だけが設定できます。0、1 以外の値を設定しても結果は保 証されません。 - 引数の型 エラー修正サブルーチンを Fortran 言語で記述する場合、引数の型を呼出し元の CALL 文の実 引数の型と一致させなければなりません。 8.1.3.2 組込み関数で発生するエラーの注意 組込み関数で引数に誤りがあった場合、その引数を組込み関数内の局所的な変数に代入し、エラー モニタを呼び出します。エラーモニタに渡されるのは、この局所的な変数です。したがって、利 用者のエラー修正サブルーチンでは、この局所的な変数を修正する必要があります。誤った引数 で組込み関数を呼び出しているプログラム単位内の引数の値を修正しても意味がありません。 8.1.3.3 利用者によるエラー処理の例 利用者によるエラー処理の例を、以下に示します。この例は、誤った入力データ(1234567890123) を入力して、エラー識別番号 171 を出力し、利用者のエラー修正サブルーチン FIXUP で、入力 データを(9999)に修正して処理を継続するものです。 Fortran 使用手引書ー Page 204 例:利用者によるエラー処理 実行プログラム EXTERNAL FIXUP CALL ERRSET(171, 0, 0, 0, FIXUP, 0) READ(5, *)I WRITE(6, 100)I 100 FORMAT(1H , 5X, 'I=', I4) STOP END 利用者のエラー修正サブルーチン SUBROUTINE FIXUP(IRET, INO, I4CONV) IF (INO.EQ.171) THEN I4CONV = 9999 IRET = 1 END IF RETURN END (入力データ) 1234567890123 (出力形式) jwe0171i-e エラー識別番号 171 に対応する診断メッセージ トレースバックマップ情報の出力 taken to (user) corrective action, execution continuing. I=9999 8.1.4 入出力エラーの処理 IOSTAT 指定子、ERR 指定子、END 指定子または EOR 指定子が指定されている入出力文の実行 中に各指定子の対象となる誤り条件が発生した場合、エラーモニタによるエラー制御は行われず、 各指定子に合った処理が行われます。各指定子については、“7.7.1.3 IOSTAT 指定子”、 “7.7.1.4 ERR 指定子”、 “7.7.1.5 END 指定子” 、“7.7.1.6 EOR 指定子”を参照してください。 誤り条件が発生した場合、一般的に実行中のファイル内の位置や入力並びの値は、不定となりま す。 入出力文の実行中に発生するエラーに対するシステムの標準修正処理および利用者が修正可能な 処理などについては、 表 8.2 に示します。利用者修正プログラムに渡される引数は次のとおりです。 - 復帰コード - エラー識別番号 - “表 8.2 入出力に関するエラー処理”に示されているデータ Fortran 使用手引書ー Page 205 表 8.2 入出力に関するエラー処理 番号 21 ~ 22 28 標準修正 利用者の 修正処理 利用者修正プログラムに 渡すデータ data1 data2 プログラムを終了します 修正は不可能 UNIT なし プログラムを終了します 修正は不可能 UNIT なし 42 文を無視します 修正は不可能 UNIT なし 55 文を無視します 修正は不可能 UNIT なし 62 文を無視します 修正は不可能 UNIT なし 64 ~ 65 文を無視します 修正は不可能 UNIT なし 71 ~ 72 74 文を無視します 修正は不可能 UNIT なし 文を無視します 修正は不可能 UNIT 80 文を無視します 修正は不可能 UNIT なし REC 81 文を無視します 修正は不可能 82 文を無視します 修正は不可能 なし なし UNIT 83 ~ 85 指定子に値を設定しないで、処理 修正は不可能 を続行します 86 指定子に値を設定しないで、処理 修正は不可能 を続行します UNIT なし 文を無視します 修正は不可能 UNIT なし ACCESS 指定子に DIRECT が指定 修正は不可能 されたものとみなします UNIT なし 修正は不可能 UNIT なし 104 POSITION 指定子を無視して、処 修正は不可能 理を続行します UNIT なし 105 文を無視します 修正は不可能 UNIT なし 111 ~ 115 文を無視します 120 文を無視します 122 文を無視します 修正は不可能 UNIT なし 修正は不可能 UNIT なし 修正は不可能 UNIT なし 87 ~ 89 97 102 ~ 103 文を無視します なし 131 以降の入出力並びを無視します 修正は不可能 132 入力の場合、レコードを超えた データを無視します 出力の場合、レコードを超えた 修正は不可能 データを次の論理レコードに出力 します UNIT なし 133 以降の要素を無視します 修正は不可能 UNIT なし 134 以降の入出力並びを無視します 修正は不可能 UNIT なし 140 変換せずに処理を続行します 修正は不可能 UNIT なし FDATA UDATA 変換後のデー 141 ~ 142 変換後のデータを最大値にします タを FDATA に代入します なし Fortran 使用手引書ー Page 206 番号 標準修正 利用者の 修正処理 利用者修正プログラムに 渡すデータ data1 data2 変換後のデー タを FDATA に代入します FDATA UDATA IEEE 浮動小数点データの値に よって変換後の値を以下のように 変換後のデー 145 ~ 146 します タを FDATA に代入します 無限大データ:最大値 非数データ :最大値 FDATA UDATA 143 ~ 144 変換後のデータをゼロにします 147 変換後のデータの仮数部の最終 ビットを 1 とします 修正は不可能 UNIT なし 151 以降の入出力並びを無視します 修正は不可能 UNIT なし 152 編集記述子に合った編集を行いま 修正は不可能 す UNIT なし 153 開始の左括弧を補います 修正は不可能 UNIT なし 154 書式仕様中の30を超えた入れ子を 修正は不可能 無視します UNIT なし 155 編集記述子を無視して、書式仕様 修正は不可能 の最後の右括弧とみなします UNIT なし 156 反復子を無視して、書式仕様の最 修正は不可能 後の右括弧とみなします UNIT なし 157 書式仕様を示 正しくない文字を無視して、書式 す文字を 仕様の最後の右括弧とみなします FCODE に代 入します FCODE なし 158 右括弧を補い書式制御を続行しま 修正は不可能 す UNIT なし 159 書式中の文字列を入力データに置 修正は不可能 き換えます UNIT なし 162 入出力並びを無視して、書式制御 修正は不可能 を続行します UNIT なし 171 1 バイト、2 バイトまたは 4 バイト の入力項目が負の場合、指定でき る最小の値とみなします I4CNVを修正 1 バイト、2 バイトまたは 4 バイト します の入力項目が正の場合、指定でき る最大の値とみなします I4CNV なし 172 8 バイトの入力項目のデータが負 の場合、指定できる最小の値とみ なします I8CNVを修正 8 バイトの入力項目のデータが正 します の場合、指定できる最大の値とみ なします I8CNV なし Fortran 使用手引書ー Page 207 番号 標準修正 利用者の 修正処理 修正した文字 173 ~ 175 正しくない文字を 0 とみなします を IDATA に 代入します 176 データの絶対値が、 2 – 126 × 2 – 23 より小さい(入力項 目が実数型)、2 – 1022 × 2 – 52 より小 さい(入力項目が倍精度実数型) または 2 – 16382 × 2 – 112 より小さい (入力項目が 4 倍精度実数型)場 合、真の 0 を設定します データの絶対値が、 2 127 × ( 1 + 1.0 – 2 –23 ) より大き い(入力項目が実数型)、 FCONV を修 2 1023 × ( 1 + 1.0 – 2 –52 ) より大き 正します い(入力項目が倍精度実数型) または 2 16383 × ( 1 + 1.0 – 2 –112 ) より大きい(入力項目が 4 倍精度 実数型)場合、符号を変えないで、 利用者修正プログラムに 渡すデータ data1 data2 IDATA なし FCONV なし UNIT なし UNIT なし 2 127 × ( 1 + 1.0 – 2 –23 ) (入力項目が実数型)、 2 1023 × ( 1 + 1.0 – 2 –52 ) (入力項目が倍精度実数型)または 2 16383 × ( 1 + 1.0 – 2 –112 )(入力項 目が4倍精度実数型)を設定します 182 ~ 183 文字型の編集を行います 修正は不可能 184 定数を無視して、文を終了します 修正は不可能 185 反復数または定数を無視して、文 修正は不可能 を終了します UNIT なし 186 ~ 188 項目名を無視して、文を終了しま 修正は不可能 す UNIT なし 189 文を無視します 修正は不可能 UNIT なし 190 要素数を超えている定数を無視し 修正は不可能 て処理を続行します UNIT なし 文を無視します 修正は不可能 UNIT なし 1114 指定子に 4 バイトの整数型の最大 修正は不可能 値を設定して、処理を続行します UNIT なし 1115 指定子を無視して処理を続行しま 修正は不可能 す UNIT なし 1117 文を無視します 修正は不可能 UNIT なし 1161 プログラムを終了します 修正は不可能 UNIT なし 1162 入出力並びを複数のFortran記録と 修正は不可能 して入出力します UNIT なし 1111 ~ 1113 Fortran 使用手引書ー Page 208 番号 利用者の 修正処理 標準修正 利用者修正プログラムに 渡すデータ data1 data2 1163 変数に 4 バイトの整数型の最大値 修正は不可能 を設定して処理を続行します なし なし 1164 プログラムを終了します 修正は不可能 UNIT なし 1181 入力並びを無視して、処理を続行 修正は不可能 します UNIT なし 1201 修正した文字 正しくない文字を 0 とみなします を IDATA に 代入します IDATA なし 1202 入力項目の値は変更せずに、処理 修正は不可能 を続行します UNIT なし 1203 要素の型に従って編集処理を行 い、処理を続行します UNIT なし 修正は不可能 UNIT :外部ファイルの場合は装置番号(基本整数型) 、内部ファイルの場合は -1 を渡します。 IDATA :入力データ上の誤っている文字。 (1 バイトの文字型) FCODE:配列で与える書式仕様中の誤っている書式コード。(1 バイトの文字型) REC :記録変数。(4 バイトの整数型) I4CNV :書式変換された結果の整数を設定する領域。(4 バイトの整数型) I8CNV :書式変換された結果の整数を設定する領域。(8 バイトの整数型) FCONV:書式変換された結果の実数を設定する領域。(実数型) FDATA:IEEE-IBM370 データ変換された結果の実数を設定する領域。 (実数型) UDATA:IEEE-IBM370 データ変換処理が、入出力で行われた場合は、UNIT と同じです。サブルー チンで行われた場合は、基本整数型の正の最大値を渡します。(基本整数型) 8.1.5 組込み関数エラーの処理 組込み関数で検出するエラーの原因、システムの標準修正処理について、表 8.3 に示します。利 用者修正プログラムに渡される引数は次のとおりです。 - 復帰コード - エラー識別番号 - “表 8.3 組込み関数に関するエラー処理”に示されているデータ 表 8.3 組込み関数に関するエラー処理 番号 202 203 204 引用の形式 SIN(X) COS(X) DSIN(DX) DCOS(DX) QSIN(QX) QCOS(QX) エラー発生の原因 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 |X|>=8.23e+05 NaN X なし |DX|>=3.53d+15 NaN DX なし |QX|>=2**62* π NaN QX なし Fortran 使用手引書ー Page 209 番号 205 引用の形式 CSIN(CX) CCOS(CX) エラー発生の原因 213 なし NaN X なし Inf X なし DX なし DX2>=710.475 (DSIGN(Inf,DSIN(DX1)), DSIGN(Inf,DCOS(DX1))) DX2<=-710.475 (DSIGN(Inf,DSIN(DX1)), -DSIGN(Inf,DCOS(DX1))) DX2>=710.475 (DSIGN(Inf,DCOS(DX1)), -DSIGN(Inf,DSIN(DX1))) DX2<=-710.475 (DSIGN(Inf,DCOS(DX1)), DSIGN(Inf,DSIN(DX1))) |QX1|>=2**62* π (NaN,NaN) QX2>=11357.125 (QSIGN(Inf,QSIN(QX1)), QSIGN(Inf,QCOS(QX1))) QX2<=-11357.125 (QSIGN(Inf,QSIN(QX1)), -QSIGN(Inf,QCOS(QX1))) QX2>=11357.125 (QSIGN(Inf,QCOS(QX1)), -QSIGN(Inf,QSIN(QX1))) QX2<=-11357.125 (QSIGN(Inf,QCOS(QX1)), QSIGN(Inf,QSIN(QX1))) |X|>=8.23e+05 COTAN(X) |X| が特異点 (0, ± π , ± 2 π ,...) に接近しています DCOTAN(DX) QX2 (NaN,NaN) |X| が特異点 (± π /2, ± 3 π /2,...) に接近しています DTAN(DX) なし |DX1|>=3.53d+15 TAN(X) 212 QX1 (SIGN(Inf,COS(X1)), SIGN(Inf,SIN(X1))) CQCOS(CQX) COTAN(X) なし X2<=-89.415 210 TAN(X) DX2 X2>=89.415 (SIGN(Inf,COS(X1)), -SIGN(Inf,SIN(X1))) CQSIN(CQX) 211 なし (SIGN(Inf,SIN(X1)), -SIGN(Inf,COS(X1))) CDCOS(CDX) CQCOS(CQX) DX1 X2<=-89.415 208 CQSIN(CQX) なし (SIGN(Inf,SIN(X1)), SIGN(Inf,COS(X1))) CDSIN(CDX) 209 X2 X2>=89.415 CCOS(CX) CDCOS(CDX) なし (NaN,NaN) 206 CDSIN(CDX) X1 |X1|>=8.23e+05 CSIN(CX) 207 標準修正処理 |DX|>=3.53d+15 利用者修正 プログラムに 渡すデータ data1 data2 NaN Fortran 使用手引書ー Page 210 番号 引用の形式 DTAN(DX) |DX| が特異点 ( ± π /2, ± 3 π /2,...) に接近しています DCOTAN(DX) |DX| が特異点 (0, ± π , ± 2 π ,...) に接近しています 214 215 エラー発生の原因 QTAN(QX) QCOTAN(QX) QTAN(QX) 216 QCOTAN(QX) ASIN(X) 217 ACOS(X) DASIN(DX) 218 DACOS(DX) QASIN(QX) 219 QACOS(QX) |QX|>=2**62* π |QX| が特異点 ( ± π /2, ± 3 π /2,...) に接近しています |QX| が特異点 (0, ± π , ± 2 π ,...) に接近しています X>1.0 X<-1.0 X>1.0 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 Inf DX なし NaN QX なし Inf QX なし NaN X なし NaN DX なし NaN QX なし X<-1.0 DX>1.0 DX<-1.0 DX>1.0 DX<-1.0 QX>1.0 QX<-1.0 QX>1.0 QX<-1.0 220 ATAN2(X1,X2) X1=0.0 かつ X2=0.0 NaN X1 X2 221 DATAN2(DX1,DX2) DX1=0.0 かつ DX2=0.0 NaN DX1 DX2 222 QATAN2(QX1,QX2) QX1=0.0 かつ QX2=0.0 NaN QX1 QX2 X>=89.415 Inf X<=-89.415 -Inf X なし |X|>=89.415 Inf DX>=710.475 Inf DX<=-710.475 -Inf DX なし |DX|>=710.475 Inf 223 SINH(X) COSH(X) 224 DSINH(DX) DCOSH(DX) Fortran 使用手引書ー Page 211 番号 引用の形式 エラー発生の原因 標準修正処理 QX>=11357.125 Inf QX<=-11357.125 -Inf |QX|>=11357.125 Inf 226 SQRT(X) X<0.0 227 DSQRT(DX) QSINH(QX) 利用者修正 プログラムに 渡すデータ data1 data2 QX なし NaN X なし DX<0.0 NaN DX なし 228 QSQRT(QX) QX<0.0 NaN QX なし 229 EXP(X) X>=88.722 Inf X なし 230 DEXP(DX) DX>=709.782 Inf DX なし 231 QEXP(QX) QX>=11356.5 Inf QX なし 232 CEXP(CX) X1>=88.722 (SIGN(Inf,COS(X1)), SIGN(Inf,SIN(X1))) X1 なし 233 CEXP(CX) |X2|>=8.23e+05 (NaN,NaN) X2 なし 234 CDEXP(CDX) DX1>=709.782 (DSIGN(Inf,DCOS(DX1)), DSIGN(Inf,DSIN(DX1))) DX1 なし 235 CDEXP(CDX) |DX2|>=3.53d+15 (NaN,NaN) DX2 なし 236 CQEXP(CQX) QX1>=11356.5 (QSIGN(Inf,QCOS(QX1)), QSIGN(Inf,QSIN(QX1))) QX1 なし 237 CQEXP(CQX) |QX2|>=2**62* π (NaN,NaN) QX2 なし X>=128.0 Inf X なし DX>=1024.0 Inf DX なし QX>=16384.0 Inf QX なし X>=38.531 Inf X なし DX>=308.254 Inf DX なし QX>=4932.0625 Inf QX なし X=0.0 -Inf X<0.0 NaN X=0.0 -Inf X<0.0 NaN X なし X=0.0 -Inf X<0.0 NaN 225 QCOSH(QX) 238 239 240 241 242 243 EXP2(X) 2.0**X DEXP2(DX) 2.0**DX QEXP2(QX) 2.0**QX EXP10(X) 10.0**X DEXP10(DX) 10.0**DX QEXP10(QX) 10.0**QX ALOG(X) 244 ALOG10(X) ALOG2(X) Fortran 使用手引書ー Page 212 番号 引用の形式 エラー発生の原因 標準修正処理 DX=0.0 -Inf DX<0.0 NaN DX=0.0 -Inf DX<0.0 NaN DX=0.0 -Inf DX<0.0 NaN QX=0.0 -Inf QX<0.0 NaN QX=0.0 -Inf QX<0.0 NaN QX=0.0 -Inf QX<0.0 NaN 247 CLOG(CX) CX=(0.0,0.0) 248 CDLOG(CDX) 249 CQLOG(CQX) DLOG(DX) 245 DLOG10(DX) DLOG2(DX) QLOG(QX) 246 QLOG10(QX) QLOG2(QX) 250 GAMMA(X) 251 DGAMMA(DX) 252 QGAMMA(QX) 253 ALGAMA(X) 254 DLGAMA(DX) 255 QLGAMA(QX) LGT(C1,C2) 256 LGE(C1,C2) LLT(C1,C2) LLE(C1,C2) DX なし QX なし (Inf,NaN) CX なし CDX=(0.0,0.0) (Inf,NaN) CDX なし CQX=(0.0,0.0) (Inf,NaN) CQX なし X<=0.0 NaN X>=35.039860 Inf X なし DX<=0.0 NaN DX>=171.6243 Inf DX なし QX<=0.0 NaN QX>=1.755q+03 Inf QX なし X<=0.0 NaN X>=0.403711e+37 Inf X なし DX<=0.0 NaN DX>=2.55634d+305 Inf DX なし QX<=0.0 NaN QX>=1.048q+4928 Inf QX なし C3 なし C1 または C2 の文字 列の中に ASCII コー エラーとなった引数の ドに対応しない ASCII 照合順序を 26(16 進 EBCDIC コードを指 数で 1A) とみなします 定しました 何もしません IBSET(I,POS) 257 IBCLR(I,POS) BTEST(I,POS) 利用者修正 プログラムに 渡すデータ data1 data2 POS の値が範囲を超 何もしません えています 計算結果を .FALSE. とし ます なし 259 IX1**IX2 IX1=0 かつ IX2<0 計算結果を 0 とします IX1 IX2 260 JX1**JX2 JX1=0 かつ JX2<0 計算結果を 0 とします JX1 JX2 Fortran 使用手引書ー Page 213 番号 引用の形式 エラー発生の原因 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 261 X**IX X=0.0 かつ IX<0 Inf X IX 262 X1**X2 X1=0.0 かつ X2<0.0 Inf X1 X2 263 X1**X2 X1 X2 264 DX**IX X1<0.0 かつ X2/=0.0 NaN Inf DX=0.0 かつ IX<0 DX IX 265 DX**JX DX=0.0 かつ JX<0 Inf DX JX 266 DX1**DX2 DX1=0.0 かつ DX2<0 Inf DX1 DX2 267 DX1**DX2 DX1<0.0 かつ DX2/=0.0 NaN DX1 DX2 268 QX**IX QX=0.0 かつ IX<0 Inf QX IX 269 QX**JX QX=0.0 かつ JX<0 Inf QX JX 270 QX1**QX2 QX1=0.0 かつ QX2<0.0 NaN QX1 QX2 271 QX1**QX2 QX1<0.0 かつ QX2/=0.0 Inf QX1 QX2 272 QX1**QX2 計算結果が 2**16384 を超えて います Inf QX1 QX2 273 CX**IX CX=(0.0,0.0) かつ IX<0 (NaN,NaN) CX IX 274 CDX**IX CDX=(0.0,0.0) かつ IX<0 (NaN,NaN) CDX IX 275 CDX**JX CDX=(0.0,0.0) かつ JX<0 (NaN,NaN) CDX JX 276 CQX**IX CQX=(0.0,0.0) かつ IX<0 (NaN,NaN) CQX IX 277 CQX**JX CQX=(0.0,0.0) かつ JX<0 (NaN,NaN) CQX JX 278 QX1/QX2 計算結果が 2**16384 を超えて います Inf QX1 QX2 計算結果を 0.0 とします QX1 QX2 NaN QX1 QX2 計算結果を 2**63-1 としま す JX1 JX2 279 QX1/QX2 280 QX1/QX2 計算結果が 2**(-16382) より小 さいです QX2=0 JX1+JX2 281 JX1-JX2 JX1*JX2 JX1**JX2 計算結果が 2**63-1 を超えています Fortran 使用手引書ー Page 214 番号 引用の形式 282 JX1/JX2 DASINQ(DX) 1358 DACOSQ(DX) 1359 ATAN2Q(X1,X2) 1364 なし Inf DX なし NaN X なし NaN DX なし X1=0.0 かつ X2=0.0 NaN X1 X2 DX1=0.0 かつ DX2=0.0 NaN DX1 DX2 |X|>=4.72e+07 NaN X なし |DX|>=2.03d+17 NaN DX なし |X|>=4.72e+07 NaN X なし |DX|>=2.03d+17 NaN DX なし |DX| が特異点 ( ± 1, ± 3,...) に接 近しています ACOSQ(X) 1363 X DTANQ(DX) 1357 1362 Inf COTANQ(X) ASINQ(X) DATAN2Q(DX1, DX2) SIND(X) COSD(X) DSIND(DX) DCOSD(DX) TAND(X) COTAND(X) DTAND(DX) DCOTAND(DX) JX1=0 のとき計算結果を 0 とします JX1/=0 のとき計算結果を 2**63-1 とします QX2 |X| が特異点 (0, ± 2, ± 4,...) に 接近しています DCOTANQ(DX) 標準修正処理 QX1 |X| が特異点 ( ± 1, ± 3,...) に接 近しています 1356 1361 JX2=0 TANQ(X) 1355 1360 エラー発生の原因 利用者修正 プログラムに 渡すデータ data1 data2 |DX| が特異点 (0, ± 2, ± 4,...) に 接近しています X>1.0 X<-1.0 X>1.0 X<-1.0 DX>1.0 DX<-1.0 DX>1.0 DX<-1.0 Fortran 使用手引書ー Page 215 番号 引用の形式 TAND(X) |X| が特異点 (± 90, ± 270,...)に 接近しています COTAND(X) |X| が特異点 (0, ± 180, ± 360,...) に接近しています DTAND(DX) |DX| が特異点 (± 90, ± 270,...)に 接近しています 1365 1366 DCOTAND(DX) ASIND(X) 1367 ACOSD(X) DASIND(DX) 1368 DACOSD(DX) 1369 ATAN2D(X1,X2) 1370 エラー発生の原因 DATAN2D(DX1, DX2) ISHFTC(I,SHIFT 1371 [,SIZE]) 1372 IBITS(I,POS,LEN) 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 Inf X なし Inf DX なし NaN X なし NaN DX なし X1=0.0 かつ X2=0.0 NaN X1 X2 DX1=0.0 かつ DX2=0.0 NaN DX1 DX2 SIZE<=0 または SIZE>BIT_SIZE(I) SIZE に BIT_SIZE(I) を設 定して処理を続行します |SHIFT|>SIZE SHIFT に SIZE の値を設定 して処理を続行します |DX| が特異点 (0, ± 180, ± 360,...) に接近しています X>1.0 X<-1.0 X>1.0 X<-1.0 DX>1.0 DX<-1.0 DX>1.0 DX<-1.0 LEN<0 または LEN> BIT_SIZE(I)-POS POS<0 または POS>= BIT_SIZE(I)-LEN なし 計算結果を 0 とします なし SHIFT に BIT_SIZE(I) を設 定して処理を続行します なし 1373 ISHFT(I,SHIFT) |SHIFT|> BIT_SIZE(I) MATMUL( 1375 MATRIX_A, MATRIX_B) MATRIX_A の最終 次元と MATRIX_B プログラムを終了します の 1 次元の寸法が異 なります なし Fortran 使用手引書ー Page 216 番号 引用の形式 SPREAD(SOURCE, 1376 DIM,NCOPIES) ALL(MASK[,DIM]) ANY(MASK[,DIM]) COUNT(MASK [,DIM]) エラー発生の原因 DIM<=0 または DIM> (SOURCE の 次元数 )+1 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 プログラムを終了します なし プログラムを終了します なし DIM<=0 または DIM> (MASK の次元数 ) SUM(ARRAY, DIM[,MASK]) PRODUCT(ARRAY, DIM[,MASK]) 1377 MAXVAL(ARRAY, DIM[,MASK]) MINVAL(ARRAY, DIM[,MASK]) UBOUND(ARRAY [,DIM]) LBOUND(ARRAY [,DIM]) SIZE(ARRAY[,DIM]) DIM<=0 または DIM> (ARRAY の次元数 ) Fortran 使用手引書ー Page 217 番号 引用の形式 エラー発生の原因 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 MAXLOC(ARRAY, DIM[,MASK]) または MAXLOC(ARRAY [,MASK]) MINLOC(ARRAY, DIM[,MASK]) または MINLOC(ARRAY [,MASK]) SUM(ARRAY, DIM[,MASK]) または SUM(ARRAY [,MASK]) ARRAY と MASK の プログラムを終了します 形状が異なります なし PACK(ARRAY, 1381 MASK[,VECTOR]) VECTOR の配列要 素数が MASK の真 プログラムを終了します の配列要素数より小 さいです なし UNPACK(VECTOR, 1382 MASK[,FIELD]) VECTOR の配列要 素数が MASK の真 プログラムを終了します の配列要素数より小 さいです なし MASK と FIELD の 形状が異なります なし 1378 PRODUCT(ARRAY, DIM[,MASK]) または PRODUCT(ARRAY [,MASK]) MAXVAL(ARRAY, DIM[,MASK]) または MAXVAL(ARRAY [,MASK]) MINVAL(ARRAY, DIM[,MASK]) または MINVAL(ARRAY [,MASK]) PACK(ARRAY, MASK[,VECTOR]) 1383 UNPACK(VECTOR, MASK[,FIELD]) プログラムを終了します Fortran 使用手引書ー Page 218 番号 引用の形式 CSHIFT(ARRAY, SHIFT[,DIM]) エラー発生の原因 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 DIM<=0 または DIM> プログラムを終了します (ARRAY の次元数 ) なし SHIFT の形状が正し プログラムを終了します くありません なし EOSHIFT(ARRAY, SHIFT 1386 [,BOUNDARY] [,DIM]) BOUNDARY の形状 プログラムを終了します が正しくありません なし RESHAPE(SOURCE, SHAPE 1387 [,PAD] [,ORDER]) SOURCE の大きさが SHAPE の各要素の プログラムを終了します 値の積より小さいで す なし RESHAPE(SOURCE, SHAPE と ORDER SHAPE の形状が異なってい プログラムを終了します [,PAD][,ORDER]) ます なし 1384 EOSHIFT(ARRAY, SHIFT [,BOUNDARY] [,DIM]) CSHIFT(ARRAY, SHIFT[,DIM]) 1385 EOSHIFT(ARRAY, SHIFT [,BOUNDARY] [,DIM]) 1390 ORDER の各要素の RESHAPE(SOURCE, 値は 1 から SHAPE SHAPE 1391 の寸法までの組合せ プログラムを終了します [,PAD][,ORDER]) でなければなりませ ん REPEAT(STRING, 1392 NCOPIES<0 プログラムを終了します NCOPIES) 1393 NEAREST(X,S) S=0.0 SIZE(ARRAY[,DIM]) ARRAY が大きさ引 継ぎ配列のとき 1394 UBOUND(ARRAY DIM<1 または DIM>(ARRAY の次 [,DIM]) 元数 ) なし なし プログラムを終了します なし プログラムを終了します なし Fortran 使用手引書ー Page 219 番号 1395 引用の形式 エラー発生の原因 RESHAPE(SOURCE, SHAPE[,PAD] [,ORDER]) SOURCE と PAD の 型パラメタが異なっ ています PACK(ARRAY, MASK [,VECTOR]) ARRAY と VECTOR の型パラメタが異 なっています UNPACK(VECTOR, MASK[,FIELD]) VECTOR と FIELD の型パラメタが異 なっています 標準修正処理 利用者修正 プログラムに 渡すデータ data1 data2 プログラムを終了します なし 計算結果を HUGE(A) とし ます なし TSOURCE と MERGE(TSOURCE, FSOURCE の型パラ FSOURCE,MASK) メタが異なっていま す EOSHIFT(ARRAY, ARRAY と SHIFT BOUNDARY の型パ [,BOUNDARY] ラメタが異なってい [,DIM]) ます 1396 MODULO(A,P) QX1+QX2 1397 QX1-QX2 QX1*QX2 1398 QX1*QX2 QTANQ(QX) 1399 QCOTANQ(QX) QASINQ(QX) 1400 QACOSQ(QX) 1401 1402 QATAN2Q(QX1, QX2) QSIND(QX) QCOSD(QX) P=0 計算結果の絶対値が 2**16384(オーバフ Inf ロー)以上になる QX1 QX2 計算結果の絶対値が 2**(-16382)(アン 計算結果を 0.0q0 とします ダフロー)以下にな ります QX1 QX2 Inf QX なし NaN QX なし QX1=0.0 かつ QX2=0.0 NaN QX1 QX2 |QX|>=2**62*180 NaN QX なし |QX| が特異点 (± 1, ± 3,...)に接 近しています |QX| が特異点 (0, ± 2, ± 4,...) に接 近しています QX>1.0 QX<-1.0 QX>1.0 QX<-1.0 Fortran 使用手引書ー Page 220 番号 1403 引用の形式 QTAND(QX) QX なし Inf QX なし NaN QX なし QX1=0.0 かつ QX2=0.0 NaN QX1 QX2 |X1|>=5.24e+05 (NaN,NaN) X1 なし CSINQ(CX) X2>=56.925 (SIGN(Inf,SINQ(X1)), SIGN(Inf,COSQ(X1))) CSINQ(CX) X2<=-56.925 (SIGN(Inf,SINQ(X1)), -SIGN(Inf,COSQ(X1))) X2 なし CCOSQ(CX) X2>=56.925 (SIGN(Inf,COSQ(X1)), -SIGN(Inf,SINQ(X1))) CCOSQ(CX) X2<=-56.925 (SIGN(Inf,COSQ(X1)), SIGN(Inf,SINQ(X1))) |DX1|>=2.25d+15 (NaN,NaN) DX1 なし CDSINQ(CDX) DX2>=452.30 (DSIGN(Inf,DSINQ(DX1)), DSIGN(Inf,DCOSQ(DX1))) CDSINQ(CDX) DX2<=-452.30 (DSIGN(Inf,DSINQ(DX1)), -DSIGN(Inf,DCOSQ(DX1))) DX2 なし CDCOSQ(CDX) DX2>=452.30 (DSIGN(Inf,DCOSQ(DX1)), -DSIGN(Inf,DSINQ(DX1))) CDCOSQ(CDX) DX2<=-452.30 (DSIGN(Inf,DCOSQ(DX1)), DSIGN(Inf,DSINQ(DX1))) |QX1|>=2**63 (NaN,NaN) QX1 なし 1404 QCOTAND(QX) QASIND(QX) 1405 QACOSD(QX) 1407 QATAN2D(QX1, QX2) CSINQ(CX) CCOSQ(CX) |QX|>=2**62*90 |QX| が特異点 ( ± 90, ± 270,...) に 接近しています |QX| が特異点 (0, ± 180, ± 360,...) に接近しています QX>1.0 QX<-1.0 QX>1.0 QX<-1.0 1408 1409 CDSINQ(CDX) CDCOSQ(CDX) 1410 1411 標準修正処理 NaN QCOTAND(QX) QTAND(QX) 1406 エラー発生の原因 利用者修正 プログラムに 渡すデータ data1 data2 CQSINQ(CQX) CQCOSQ(CQX) Fortran 使用手引書ー Page 221 番号 引用の形式 エラー発生の原因 標準修正処理 CQSINQ(CQX) QX2>=7230.125 (QSIGN(Inf,QSINQ(QX1)), QSIGN(Inf,QCOSQ(QX1))) CQSINQ(CQX) QX2<=-7230.125 (QSIGN(Inf,QSINQ(QX1)), -QSIGN(Inf,QCOSQ(QX1))) CQCOSQ(CQX) QX2>=7230.125 (QSIGN(Inf,QCOSQ(QX1)), -QSIGN(Inf,QSINQ(QX1))) CQCOSQ(CQX) QX2<=-7230.125 (QSIGN(Inf,QCOSQ(QX1)), QSIGN(Inf,QSINQ(QX1))) 1413 X**JX X=0.0 かつ JX<0 Inf 1414 CX**JX CX=(0.0,0.0) かつ JX<0 (NaN,NaN) 1412 1415 SELECTED_REAL _KIND(P,R) 利用者修正 プログラムに 渡すデータ data1 data2 QX2 なし X JX CX JX P および R が省略さ プログラムを終了します れています なし 1416 X1**X2 計算結果が 2**128 を超えています Inf X1 X2 1417 DX1**DX2 計算結果が 2**1024 を超えています Inf DX1 DX2 VECTOR の要素数 PACK(ARRAY, は ARRAY の要素数 1418 MASK[,VECOR]) 以上でなければなり プログラムを終了します ません EOSHIFT(ARRAY, ARRAY が構造型の SHIFT 場合、BOUNDARY 1419 プログラムを終了します [,BOUNDARY] を省略してはなりま [,DIM]) せん C1、C2、C3 IX、IX1、IX2 JX、JX1、JX2 X、X1、X2 DX、DX1、DX2 QX、QX1、QX2 CX CDX CQX π なし なし :1 バイトの文字型データです。C3 には 26(16 進で 1A) の値が入っています。 :4 バイトの整数型のデータです。 :8 バイトの整数型のデータです。 :実数型のデータです。 :倍精度実数型のデータです。 :4 倍精度実数型のデータです。 :複素数型のデータであり、CX は (X1,X2) を意味します。 :倍精度複素数型のデータであり、CDX は (DX1,DX2) を意味します。 :4 倍精度複素数型のデータであり、CQX は (QX1,QX2) を意味します。 :定義であり、π ≒ 3.141592…です。 備考. 利用者修正プログラムに渡される引数の番地は、組込み関数またはサービスサブルーチン を利用するときに渡した引数の番地とは異なります(値は同じです)。 8.1.6 組込みサブルーチンエラーの処理 組込みサブルーチンで検出するエラーの原因、システムの標準修正処理について、表 8.4 に示し ます。利用者修正プログラムに渡される引数は次のとおりです。 Fortran 使用手引書ー Page 222 - 復帰コード - エラー識別番号 - “表 8.4 組込みサブルーチンに関するエラー処理”に示されているデータ 表 8.4 組込みサブルーチンに関するエラー処理 番号 引用の形式 エラー発生の原因 標準修正処理 利用者修正 プログラムに 渡すデータ LEN<0 または LEN>BIT_SIZE(FROM) TO に 0 を設定します MVBITS(FROM, 1301 FROMPOS, LEN,TO,TOPOS) FROMPOS<0 または FROMPOS>= TO に 0 を設定します BIT_SIZE(FROM)-LEN TOPOS<0 または TOPOS>= TO に 0 を設定します BIT_SIZE(FROM)-LEN 文字列 DATE が、8 文 字に満たない場合 DATE_AND_TIME 文字列 TIME が、10 文 ([DATE,TIME, ZONE,VALES]) 字に満たない場合 文字列 ZONE が、5 文 字に満たない場合 DATE_AND_TIME 配列 VALUES の大き 1303 ([DATE,TIME, さが、7 に満たない場 ZONE,VALES]) 合 1302 1304 RANDOM_SEED ([SIZE,PUT,GET]) 1305 RANDOM_SEED ([SIZE,PUT,GET]) なし DATE の長さだけ情報 を設定します TIME の長さだけ情報 を設定します なし ZONE の長さだけ情報 を設定します VALUES の大きさだ け情報を設定します PUT の配列の大きさが PUT の大きさだけ SIZE よりも小さい場 シード値を設定します 合 GET の配列の大きさが GET の大きさだけ SIZE よりも小さい場 シード値を設定します 合 SIZE,PUT,GET が 2 個 プログラムを終了しま 以上、同時に指定され す た場合 なし なし なし 8.1.7 例外ハンドリングエラーの処理 本システムにおける例外ハンドリング処理は、浮動小数点演算における例外、除算例外およびア クセス例外などです。ただし、実行時オプション -i( “3.3 実行時オプション”参照)を指定した ときは、例外ハンドリングエラーに対する処理は行われません。 なお、例外処理については、 “8.2.2 異常終了プログラムのデバッグ”を参照してください。 例外ハンドリングの修正処理を、表 8.5 に示します。 Fortran 使用手引書ー Page 223 表 8.5 割込み発生時の修正処理 利用者が修正 できる処理 利用者修正 プログラムに 渡すデータ 11 浮動小数点演算で結果の値が |3.40282347e+38|( 実数型 )、 プログラムを |1.797693134862316d+308| 終了します ( 倍精度実数型 ) より大きい値 です 修正は不可能 なし 12 浮動小数点演算で結果の値が |1.17549435e-38|( 実数型 )、 プログラムを |2.225073858507201d-308| 終了します ( 倍精度実数型または倍精度複 素数型 ) より小さい値です 修正は不可能 なし 13 固定小数点数の除算で除数が 0 プログラムを です 終了します 修正は不可能 なし 14 固定小数点数の除算で除数が 0 プログラムを または商の絶対値が 2**31 以 終了します 上です 修正は不可能 なし 17 実行時オプション -t の指定に より、プログラムが終了しま した プログラムを 終了します 修正は不可能 なし 18 実行時オプション -a の指定に より、プログラムが異常終了 しました プログラムを 終了します 修正は不可能 なし 19 不当なアクセスなどによりプ ログラムが異常終了しました プログラムを 終了します 修正は不可能 なし 20 異常終了処理中に再び、異常 終了が発生しました プログラムを 終了します 修正は不可能 なし 292 浮動小数点演算で無効な演算 を実行しました プログラムを 終了します 修正は不可能 なし 番号 備考 1. 割込みの原因 標準修正処理 標準修正処理で結果レジスタに値が設定されるときは、そのレジスタの符号は変更され ません。また、最大値は以下の値です。 - 実数型の場合、3.40282347e+38 - 倍精度実数型の場合、1.797693134862316d+308 備考 2. 4 倍精度実数型の演算では、上記の割込みエラーを捕捉せずに、SIGTRAP が発生するこ とがあります。 8.1.8 その他のエラーの処理 本システムで検出するエラーで入出力、組込み手続およびプログラム割込み以外のエラーの処理 を、表 8.6 に示します。利用者修正プログラムに渡される引数は次のとおりです。 - 復帰コード - エラー識別番号 - “表 8.6 その他のエラー処理”に示されているデータ Fortran 使用手引書ー Page 224 表 8.6 その他のエラー処理 番号 301 304 標準修正処理 利用者が修正 できる処理 n 番目の引数が省略されたもの 修正は不可能 とみなして処理を続行します CALL PRNSET(IX) IX<0 のとき IX=0 修正は不可能 IX>15 のとき IX=15 として処理を続行します 利用者修正 プログラムに 渡すデータ なし IX 306 プログラムを終了します 修正は不可能 なし 308 プログラムを終了します 修正は不可能 なし 311 ~ 318 320 引数の検査を継続します 修正は不可能 なし 処理を続行します 修正は不可能 なし 322 ~ 324 329 処理を続行します 修正は不可能 なし プログラムを終了します 修正は不可能 なし 330 処理を続行します 修正は不可能 なし 1001 プログラムを終了します 修正は不可能 なし 1003 ~ 1006 プログラムを終了します 1031 プログラムを終了します 修正は不可能 なし 修正は不可能 なし 並列数を CPU 数とみなして処 修正は不可能 理を続行します なし 1032 1033(注) プログラムを終了します 1034 プログラムを終了します 修正は不可能 なし 修正は不可能 なし 1038 ~ 1041 プログラムを終了します 修正は不可能 なし 1042 並列数を num として処理を続 行します 修正は不可能 なし 1043 処理を続行します 修正は不可能 なし 1044 ~ 1045 プログラムを終了します 修正は不可能 なし 1071 ~ 1072 処理を続行します 修正は不可能 なし 1141 ~ 1143 処理を続行します 1551 処理を続行します 1561 処理を続行します 修正は不可能 なし 修正は不可能 なし 修正は不可能 なし 1563 ~ 1564 プログラムを終了します 修正は不可能 なし 1565 ~ 1566 処理を続行します 1569 処理を続行します 修正は不可能 なし 修正は不可能 なし 1570 ~ 1571 引数の検査を継続します 修正は不可能 なし 1572 ~ 1575 プログラムを終了します 1582 処理を続行します 1652 処理を続行します 修正は不可能 なし 修正は不可能 なし 修正は不可能 なし IX:基本整数型 Fortran 使用手引書ー Page 225 注)診断メッセージ(jwe1033i-i)は、並列実行中にプログラムが終了したことを通知します。こ の診断メッセージは、例えば、STOP 文、EXIT サービスサブルーチンを実行したり、エラー の発生回数が打切り回数に達して、並列実行中にプログラムが終了した場合に、逐次実行時 と結果が異なる可能性があることを示しています。 8.2 デバッグのための機能 ここでは、Fortran プログラムのデバッグを行うための検査機能、実行時異常終了したときに出力 されるデバッグ情報について説明します。 8.2.1 デバッグを行うための検査機能 デバッグのための検査機能には、以下の機能があります。 - 引数の妥当性の検査( “8.2.1.1 引数の妥当性の検査(ARGCHK 機能)”を参照) - 添字式および部分列範囲の検査( “8.2.1.2 添字式および部分列範囲の検査(SUBCHK 機能)” を参照) - 未定義データの引用の検査( “8.2.1.3 未定義データの引用の検査(UNDEF 機能) ”を参照) - 形状適合の検査(“8.2.1.4 形状適合の検査(SHAPECHK 機能) ”を参照) - 拡張検査(“8.2.1.5 拡張検査(EXTCHK 機能) ”を参照) これらの機能を有効にする場合は、翻訳時オプション -H を指定してください。 同様な機能として、翻訳時オプション -Eg を提供しています。翻訳時オプション -Eg は、手続の 特性などのプログラム単位間の誤りを Fortran 原始プログラムの翻訳時に検査します。 翻訳時オプション -H および -Eg については、“2.2 翻訳時オプション”を参照してください。 8.2.1.1 引数の妥当性の検査(ARGCHK 機能) 翻訳時オプション -Ha を指定すると、副プログラム(サブルーチンまたは関数)を引用したとき に、副プログラムの仮引数と引用元の実引数について、検査されます。ただし、以下の場合につ いては、検査されません。 - 実引数が POINTER 属性をもつ実体名の場合(実引数が構造型の変数であり、その成分が POINTER 属性をもつ場合も含まれます) - 実引数が部分配列または配列式の場合 - 仮手続名による副プログラムを引用した場合 - 実引数が末端成分に割付け配列をもつ構造型の変数の場合 検査される項目について、以下に説明します。 8.2.1.1.1 引数の個数の検査 仮引数の個数に対して、実引数の個数が一致するかどうかが検査されます。この実引数の個数に は、選択戻り指定子も含まれます。 引数の個数が一致しない場合、診断メッセージ(jwe0313i-w)が出力されます。 8.2.1.1.2 引数の型の検査 仮引数の型とそれに対応する実引数の型が一致しているかどうか検査されます。引数の型が一致 しない場合、診断メッセージ(jwe0315i-w)が出力されます。 Fortran 使用手引書ー Page 226 ただし、以下の場合は引数の型の検査は行われません。 - 仮引数が手続名または * のとき - 実引数が外部手続名または選択戻り指定子のとき(仮引数と実引数のそれぞれが型をもつ外 部手続名の場合は検査されます) 実引数および仮引数が構造型の変数の場合、構造型成分の型が一致しているかどうか検査されま す。一致していない場合、診断メッセージ(jwe1561i-w)が出力されます。 引数の型が文字型の場合は、仮引数の長さが対応する実引数の長さを超えていないかどうか検査 されます。長さが超えている場合、診断メッセージ(jwe0317i-w)が出力されます。 8.2.1.1.3 引数の属性の検査 仮引数とそれに対応する実引数の属性が一致しているかどうか検査されます。引数の属性が一致 しない場合、診断メッセージ(jwe0314i-w)が出力されます。実引数が INTENT(IN) 属性をもって いるとき、対応する仮引数が INTENT(IN) 属性をもっていない場合、診断メッセージ(jwe0314i-w) が出力されます。実引数が式の結果または定数のとき、副プログラム内で仮引数に値を設定して いる文を記述していると、診断メッセージ(jwe0318i-w)が出力されます。 以下に、仮引数と実引数の対応を示します。 仮引数 実引数 スカラ変数 スカラ変数、部分列、配列要素、定数、スカラ式の結果 配列 全体配列、部分配列、配列要素、配列要素の部分列、配列式の結果 仮手続 * 外部手続、組込み関数、モジュール手続 文番号 8.2.1.1.4 関数の型の検査 関数副プログラムで定義されている関数の型と引用元の外部手続の型が一致しているかどうか検 査されます。関数の型が一致しない場合、診断メッセージ(jwe0311i-w)が出力されます。 関数の型が文字型の場合は、長さが一致しているかどうか検査されます。関数の長さが一致しな い場合、診断メッセージ(jwe0312i-w)が出力されます。 関数副プログラムをサブルーチン副プログラムとして引用した場合、またはサブルーチン副プロ グラムを関数副プログラムとして引用した場合、診断メッセージ(jwe0330i-w)が出力されます。 8.2.1.1.5 引数の大きさの検査 仮引数が配列の場合、その大きさが対応する実引数の大きさを超えていないかどうか検査されま す。ただし、最終次元の上限が * または上下限が定数 1 の仮配列の場合、その大きさは対応する 実引数の大きさに等しいものとみなされ、検査されません。 仮引数が文字型の形状引継ぎ配列であり、仮配列と実引数配列の長さ型パラメタが異なっている 場合、診断メッセージ(jwe1571i-w)が出力されます。 仮配列の大きさが実引数の大きさを超えている場合、診断メッセージ(jwe0316i-w)が出力され ます。仮引数の配列に対応する実引数の大きさは、以下に示す大きさとなります。 実引数の属性 実引数の大きさ 配列 配列全体の大きさ 配列要素 指定された配列要素から配列の最後までの大きさ 配列要素の部分列 指定された配列要素の部分列の先頭から配列の最後までの大きさ Fortran 使用手引書ー Page 227 8.2.1.1.6 明示的引用仕様の検査 明示的引用仕様が必要な外部手続の引用において、明示的引用仕様が存在しない場合、診断メッ セージ(jwe1569i-w)が出力されます。 8.2.1.1.7 形状引継ぎ配列の次元数の検査 仮引数が形状引継ぎ配列の場合、仮配列と実引数配列の次元数が一致しているかどうか検査され ます。次元数が異なる場合、診断メッセージ(jwe1570i-w)が出力されます。 8.2.1.2 添字式および部分列範囲の検査(SUBCHK 機能) 翻訳時オプション -Hs を指定すると、引用した添字式および部分列範囲が宣言した添字式および 部分列範囲と矛盾していないかという検査が行われます。ただし、以下の場合は、検査されません。 - POINTER 属性をもつ実体名を引用した場合(構造型の成分が POINTER 属性をもつ場合も含 まれます) - 形状引継ぎ配列を引用した場合 - ベクトル添字で指定された部分配列を引用した場合 - 部分配列な実引数に対応する仮引数を引用した場合 - 配列選別代入のブロック中にある配列を引用した場合 - 名前付き定数を引用した場合 - 部分列の親列がスカラ定数の場合 - 末端成分に割付け配列をもつ構造型の変数の場合 検査は、翻訳時と実行時に行われます。翻訳時に検出された場合は、w レベルの診断メッセージ が出力されます。以下に実行時の検査項目について説明します。 8.2.1.2.1 配列の引用に対する検査 部分列、配列要素、部分配列を引用したとき、その添字式または部分列範囲が宣言した範囲内に あるかどうか検査されます。宣言した範囲内にない場合、診断メッセージ(jwe0320i-w)が出力 されます。また、形状明示配列の上限が下限より小さい値の場合、診断メッセージ(jwe1566i-w) が出力されます。 -Ha オプションを同時に指定している場合は、最終次元の上限が * または上下限が定数 1 の仮配 列に対しては、配列要素や部分列が、対応する実引数の範囲内にあるかどうか検査されます。実 引数の範囲内にない場合、診断メッセージ(jwe0322i-w)が出力されます。 8.2.1.2.2 部分配列の引用に対する検査 部分配列添字が添字三つ組である部分配列を引用した場合、第一番目の添字値と幅を足したとき、 その値がオーバフローまたはアンダフローするかどうか検査されます。オーバフローまたはアン ダフローする場合、診断メッセージ(jwe1565i-w)が出力されます。 8.2.1.3 未定義データの引用の検査(UNDEF 機能) 翻訳時オプション -Hu を指定すると、引用したデータが定義されているかどうか検査されます。 ただし、翻訳時オプション -Hs を同時に指定し、SUBCHK 機能の検査で、診断メッセージ jwe0320i-w、jwe0322i-w、jwe1565i-w、jwe1566i-w が検出されている場合、UNDEF 機能は無効と なります。また、以下の場合については、検査されません。 Fortran 使用手引書ー Page 228 - POINTER 属性をもつ実体名を引用した場合(構造型の成分が POINTER 属性をもつ場合も含 まれます) - 形状引継ぎ配列を引用した場合 - ベクトル添字で指定された部分配列を引用した場合 - ポインタを引用した場合 - 部分配列な実引数に対応する仮引数を引用した場合 - 配列選別代入のブロック中にあるデータを引用した場合 - 末端成分に割付け配列をもつ構造型の変数を引用した場合 - 構造体成分で末端成分の割付け配列を引用した場合 以下に、未定義データの検査について説明します。 8.2.1.3.1 未定義データの検査 モジュールの宣言部または共通ブロックに含まれない変数を引用した場合、そのデータに値が定 義されているかどうか検査されます。配列変数を引用したとき、配列要素ごとに検査が行われま す。また、構造型の変数を引用した場合、構造型の変数の成分ごとに検査が行われます。値を定 義していない場合、診断メッセージ(jwe0323i-w)が出力されます。 関数副プログラムの終了時に、関数結果に値が定義されているかどうか、検査が行なわれます。 関数結果に値が定義されていない場合、診断メッセージ (jwe0323i-w) が出力されます。その際の 行番号は関数副プログラムの END 文になります。 データ値として、以下の値をもつ場合、診断メッセージ(jwe0323i-w)が出力されますが、Fortran プログラムは正しいので、修正する必要はありません。 1 バイトの整数型 2 バイトの整数型 4 バイトの整数型 8 バイトの整数型 実数型 倍精度実数型 4 倍精度実数型 複素数型 倍精度複素数型 4 倍精度複素数型 文字型 :-117 :-29813 :-1953789045 :-8391460049216894069 :-5.37508134e-32 :-4.696323204354320d-253 :-9.0818487627532284154072898964213742q-4043 :(-5.37508134e-32,-5.37508134e-32) :(-4.696323204354320d-253,-4.696323204354320d-253) :(-9.0818487627532284154072898964213742q-4043, -9.0818487627532284154072898964213742q-4043) :Z'8B' 8.2.1.3.2 割付け配列の検査 割付け配列を引用した場合、割付け配列が割り付けられているかどうか検査されます。割り付け られていない場合、診断メッセージ(jwe0324i-w)が出力されます。 8.2.1.3.3 仮引数の実在検査 OPTIONAL 属性をもつ仮引数を参照した場合、その仮引数が実在しているかどうか検査されます。 実在していない場合、診断メッセージ(jwe1575i-s)が出力されます。 8.2.1.4 形状適合の検査(SHAPECHK 機能) 翻訳時オプション -He を指定すると、配列式または配列式を含む代入文において形状適合である かどうか検査されます。形状適合していない場合、診断メッセージ(jwe0329i-s)が出力されます。 Fortran 使用手引書ー Page 229 8.2.1.5 拡張検査(EXTCHK 機能) 翻訳時オプション -Hx を指定すると、モジュールの宣言部および共通ブロックに属する変数を引 用した場合、その変数に値が定義されているかどうか、ポインタを引用した場合、ポインタが結 合されているかどうか、および DO 構文の増分値、FORALL 構文の刻み幅、配列構成 DO 制御の 増分値および添字三つ組の刻み幅が 0 以外の値かどうか検査されます。 モジュールの宣言部および共通ブロックに属する変数がデータ値として、特定の値をもつ場合、 診断メッセージ(jwe0323i-w)が出力されますが、Fortran プログラムとしては正しいので、修正 する必要はありません。この値については、 “8.2.1.3 未定義データの引用の検査(UNDEF 機能)” を参照してください。 指示先と結合していないポインタを引用した場合、診断メッセージ(jwe1572i-s)が出力されます。 DO 構文の増分値、FORALL 構文の刻み幅、配列構成 DO 制御の増分値および添字三つ組の刻み 幅が 0 の場合、診断メッセージ(jwe1573i-s)が出力されます。 DO 構文の範囲内の手続引用において DO 変数の値が更新されているかどうか検査されます。更新 されている場合、診断メッセージ(jwe1574i-s)が出力されます。 翻訳時オプション -Hx を指定した場合、副プログラム内の RETURN 文または END 文を実行する と、その有効域で局所的な変数は、SAVE 属性をもつ変数を除いて、不定になります。 -Hx オプションを指定すると、-Hu オプションも同時に指定されたと解釈されます。-Hu オプショ ンの機能については、 “8.2.1.3 未定義データの引用の検査(UNDEF 機能)”を参照してください。 -Hx オプションを指定する場合は、以下の注意が必要です。 - 共通ブロックに属する変数に値を設定しているプログラム単位は、初期値設定プログラム単 位を含め、すべて -Hx オプションを指定して翻訳しなければなりません。すべてのプログラ ム単位に -Hx オプションを指定していない場合、正しい結果が得られない場合があります。 例:誤った -Hx オプションの使用 ファイル a.f90 block data init common /cmn/ j data j/200/ end block data ファイル b.f90 program main common /cmn/ j print *,j end program 翻訳コマンド % frt a.f90 -c % frt b.f90 a.o -Hx a.f90 を翻訳する際にも -Hx オプションを指定しなければなりません。 - モジュールを -Hx オプションを指定して翻訳した場合、そのモジュールを引用しているすべ てのプログラム単位を、-Hx オプションを指定して翻訳しなければなりません。すべてのプ ログラム単位に -Hx オプションを指定していない場合、正しい結果が得られない場合があり ます。 Fortran 使用手引書ー Page 230 例:誤った -Hx オプションの使用 ファイル a.f90 module mod integer :: j end module ファイル b.f90 program main use mod j = 200 call sub end program ファイル c.f90 subroutine sub use mod print *,j end subroutine 翻訳コマンド % frt a.f90 -Am -c -Hx % frt b.f90 -Am -c % frt c.f90 -Am a.o b.o -Hx b.f90 を翻訳する際にも -Hx オプションを指定しなければなりません。 8.2.2 異常終了プログラムのデバッグ Fortran プログラムの実行中に異常終了事象が発生した場合、異常終了事象の原因追及の手助けと なる情報が出力された後、完了コード 240 でプログラムが終了されます。 8.2.2.1 異常終了の原因 Fortran システムが捕捉するシグナルとそれに対応するシグナルコードを以下に示します。 翻訳時オプション -NRnotrap が有効な場合、浮動小数点演算の例外事象(jwe0011i-e、jwe0012i-e、 jwe0013i-e および jwe0292i-e)は捕捉されません。翻訳時オプション -NRnotrap については、 “2.2 翻訳時オプション”を参照してください。 実行時オプション -i を指定した場合には、以下のすべての例外が捕捉されません。 Fortran 使用手引書ー Page 231 表 8.7 捕捉シグナルと対応するシグナルコード シグナル番号 SIGILL(04)* SIGFPE(08) シグナル番号の意味 不当な命令の実行 算術例外 1 2 3 4 5 6 7 8 シグナルコード ILL_ILLOPC ILL_ILLOPN ILL_ILLADR ILL_ILLTRP ILL_PRVOPC ILL_PRVREG ILL_COPROC ILL_BADSTK 1 3 4 5 FPE_INTDIV* FPE_FLTDIV FPE_FLTOVF FPE_FLTUND 7 FPE_FLTINV 1 BUS_ADRALN 2 BUS_ADRERR 3 BUS_OBJERR シグナルコードの意味 不正なオペランドコード 不正なオペランド 不正なアドレス・モード 不正なトラップ 特権オペランド 特権レジスタ コプロセッサエラー 内部スタックエラー 固定小数点零除算例外 浮動小数点零除算例外 浮動小数点オーバフロー例外 浮動小数点アンダフロー例外 (注) 無効な浮動小数点処理 アドレス境界付けが無効 アドレスが物理的に存在しない 対象固有のハードウェアエラー SIGBUS(10)* 記憶保護例外 SIGSEGV(11)* 1 SEGV_MAPERR アドレスが対象にマップされて いない セグメンテーション例外 2 SEGV_ACCERR マップされた対象への許可が無 効 SIGXCPU(30)* CPU 占有時間による打 切り -- -- -- 注) 翻訳時オプション -NRtrap および実行時オプション -u(浮動小数点アンダフロー割込み検 出指示)を指定した場合に捕捉されるシグナルです。 備考 . * 印のシグナルは、実行時オプション -i(本システムでシグナルを捕捉しない指示)を指 定した場合に core ファイルが生成されます。 8.2.2.2 異常終了時の出力情報 捕捉されたシグナルに応じて、以下の情報が標準エラー出力ファイルに出力されます。標準エラー 出力ファイルへ出力できない場合には、端末装置に出力されます。 8.2.2.2.1 一般的な異常終了時の出力情報 SIGILL、SIGBUS または SIGSEGV のどれかを捕捉した場合に出力されます。これらの情報に続い てトレースバックマップが出力されます。 jwe0019i-u The program was terminated abnormally with signal number SSSSSSS. signal identifier = NNNNNNNNNNN,(Detailed information) SSSSSSS:SIGILL、SIGBUS または SIGSEGV を示します。 NNNNNNNNNNN :異常終了の要因となったシグナルコードを示します。 (Detailed information) :上記シグナルコード NNNNNNNNNNN に対応する詳細情報を示します。 SIGBUS または SIGSEGV の原因がスタックオーバフローである可能性が高い場合、以下の情報を 付加します。 The cause of this exception may be stack-overflow. Fortran 使用手引書ー Page 232 8.2.2.2.2 SIGXCPU の出力情報 SIGXCPU が捕捉された場合、以下の情報が出力されます。 jwe0017i-u The program was terminated with signal number SIGXCPU. 8.2.2.2.3 実行時オプション -a を指定した場合の出力情報 実行時オプション -a を指定し、SIGIOT を捕捉した場合に出力されます。プログラム実行終了時 にプログラムが使用していた一時ファイルは削除されずに強制的に異常終了され、core ファイル が生成されます。 jwe0018i-u The program was terminated abnormally due to runtime option -a with signal number SIGIOT. 8.2.2.2.4 異常終了処理中に再び異常終了が発生した場合の出力情報 異常終了処理中に再び異常終了が発生した場合、以下の情報が出力されます。 jwe0020i-u An error was detected during an abnormal termination process. 8.3 fdb コマンド fdb コマンドは、Fortran プログラム、C/C++ 言語プログラムおよびアセンブラ・プログラムのシ ンボリック・デバッガです。なお、コマンドの詳細は、オンライン・マニュアル fdb(1) を参照し てください。 8.3.1 起動と終了 ここでは、fdb コマンドの起動と終了について説明します。 8.3.1.1 ./a.out のデバッグ fdb コマンドの起動時に実行可能ファイルを指定しない場合、'./a.out' ファイルが実行可能ファイル として採用され、デバッグの対象となります。カレント・ディレクトリにファイル名 'core' が存在 する場合は、コア・ファイルを出力する原因となったソースが行番号付きで表示されます。 重要:カレント・ディレクトリにコア・ファイルが存在する場合は、プログラムが終了する原因 となった行を現在行とし、その行を含んでいるファイルが現在ファイルとして扱われます。 コア・ファイルが存在しない場合は、main 関数を含むファイルを現在ファイルとし、main 関数内 の最初の実行可能行が現在行として扱われます(もし、MAIN__ 関数を含むファイルが存在する 場合は、そのファイルが現在ファイルとして扱われ、現在行は、MAIN__ 関数内の最初の実行可 能行になります)。 例 1:コア・ファイル core がない場合 fujitsu{ffc}: fdb FDB [Fujitsu Debugger for C/C++ and Fortran] Version 5.00MT/OMP Please wait to analyze the DEBUG information. fdb* Fortran 使用手引書ー Page 233 例 2:コア・ファイル core がある場合 fujitsu{ffc}: fdb FDB [Fujitsu Debugger for C/C++ and Fortran] Version 5.00MT/OMP Please wait to analyze the DEBUG information. Program terminated with SIGSEGV(11). 3 ra(100000) = 1.0 0x00010a94 (MAIN__ + 0x10) std %f2,[%o0+176] fdb* なお、fdb コマンドでは実行時に発生するシグナル事象を受け付けています。この場合で、継続実 行したいときは、必要に応じて continue コマンドを実行してください。 8.3.1.2 プログラムのデバッグ fdb コマンドの起動時に実行可能ファイルが指定されると、そのファイルがデバッグの対象となり ます。指定されたコア・ファイル名またはデフォルトのファイル名 core が存在する場合は、コア・ ファイルを出力する原因となったソースが行番号付きで表示されます。 例 1:コア・ファイル core がない場合 fujitsu{ffc}: fdb program FDB [Fujitsu Debugger for C/C++ and Fortran] Version 5.00MT/OMP Please wait to analyze the DEBUG information. fdb* 例 2:コア・ファイル core がある場合 fujitsu{ffc}: fdb program FDB [Fujitsu Debugger for C/C++ and Fortran] Version 5.00MT/OMP Please wait to analyze the DEBUG information. Program terminated with SIGSEGV(11). 3 ra(100000) = 1.0 0x00010a94 (MAIN__ + 0x10) std %f2,[%o0+176] fdb* 例 3:実行可能ファイル 'program' をコア・ファイル 'coredump' 付きでデバッグする場合 fujitsu{ffc}: fdb program coredump FDB [Fujitsu Debugger for C/C++ and Fortran] Version 5.00MT/OMP Please wait to analyze the DEBUG information. Program terminated with SIGSEGV(11). 3 ra(100000) = 1.0 0x00010a94 (MAIN__ + 0x10) std %f2,[%o0+176] fdb* 8.3.1.3 デバッガの終了 quit コマンドでデバッガを終了します。このとき、デバッガを終了するかどうかが確認されます。 例: fdb* quit Quit OK? (y/n) y fujitsu{ffc}: 8.3.1.4 INTERRUPT 'Control+c' で動作中のプログラムが強制終了されます。このとき、受けとったシグナルおよび強制 終了された行の情報が表示されます。 Fortran 使用手引書ー Page 234 例: Signaled SIGINT(2): MAIN__() at line 2 in test22.f. 2 10 j = j + 1 fdb* 8.3.2 プログラムの実行 ここでは、fdb 配下でのプログラムの実行について説明します。 8.3.2.1 run コマンドによるプログラムの実行 run コマンドでプログラムが実行されます。プログラムが実行を開始するとその旨を示すメッセー ジが表示されます。また、プログラムが終了するとその旨を示すメッセージが表示されます。 例: fdb* run The program: a.out starting. : The program: a.out terminated. fdb* 8.3.2.2 入出力をリダイレクトしたプログラムの実行 run コマンドに入出力のリダイレクトの指示を行うと、入出力をリダイレクトしてプログラムが実 行されます。 例 1:標準出力をファイル 'ofile' にリダイレクトする場合 fdb* run > ofile The program: a.out > ofile starting. : 例 2:標準入力を端末ファイル '/dev/pts/2' からリダイレクトする場合 fdb* run < /dev/pts/2 The program: a.out < /dev/pts/2 starting. : 8.3.2.3 デバッグ中のプログラムの強制終了 kill コマンドでデバッグ中の停止しているプログラムが強制終了されます。このとき、強制終了し てよいかを確認します。 例: fdb* kill Kill OK? (y/n) y fdb* 8.3.3 ブレークポイント ここでは、ブレークポイントの設定や削除について説明します。 8.3.3.1 ブレークポイントの設定 break コマンドでブレークポイントが設定されます。定義されたブレークポイントに対して、以下 の情報を表示します。 Fortran 使用手引書ー Page 235 - - - - ユーザが指定した順に割り振られた番号 行番号または関数に対応する最適なアドレス / 定義されたアドレス 定義された行番号または関数名 / 定義されたアドレスに対応する最適な行番号 行または関数が含まれているファイル名 例 1:ソースファイル test14.f の 13 行目にブレークポイントを設定 fdb* break `test14.f`13 #1 0x10ad0 (i_subent_ + 0) at line 13 in test14.f 例 2:サブルーチン i_sub の先頭にブレークポイントを設定 fdb* break i_sub_ #2 0x10ab8 (i_sub_ + 0x4) at line 12 in test14.f 例 3:アドレス 0x10af0 にブレークポイントを設定 fdb* break *0x10af0 #3 0x10af0 (i_subent1_ + 0) at line 14 in test14.f 例 4:現在ファイルの 15 行目に一時ブレークポイントを設定 fdb* oncebreak 15 #4 0x10b04 (i_subent1_ + 0x14) at line 15 in test14.f 例 5:現在ファイルの現在行にブレークポイントを設定 fdb* break #5 0x10a60 (MAIN__ + 0) at line 1 in test14.f fdb* また、Fortran プログラムで、モジュールまたは内部副プログラムを使用している場合には、以下 に示す方法で関数名を指定します。その他の手続名を指定する場合は、“8.3.11 Fortran プログラ ムをデバッグする上での注意事項”を参照してください。 - モジュール module 内のモジュール副プログラム sub は、module@sub_ と指定します。 - モジュール module 内のモジュール副プログラム sub 内にある内部副プログラム insub は、 module@sub@insub_ と指定します。 - 副プログラム sub 内の内部副プログラム insub は、sub@insub_ と指定します。 例 6:モジュール mo 内のモジュール副プログラム sub にブレークポイントを設定 fdb* break mo@sub_ #6 0x11114 (mo.sub_ + 0x4) at line 5 in test14.f fdb* 例 7:モジュール mo 内のモジュール副プログラム sub 内にある内部副プログラム insub にブレー クポイントを設定 fdb* break mo@sub@insub_ #7 0x11160 (mo.sub.insub_ + 0x14) at line 12 in test14.f fdb* 例 8:副プログラム sub 内の内部副プログラム sub2 にブレークポイントを設定 fdb* break sub@sub2_ #8 0x110a8 (sub.sub2_ + 0xc) at line 8 in test14.f fdb* Fortran 使用手引書ー Page 236 8.3.3.2 定義されているブレークポイントの表示 show break コマンドで現在定義されているブレークポイントが、定義された順に番号を付けて表 示されます。この番号は、ブレークポイントの削除などを行うときに使用します。表示される情 報は、“8.3.3.1 ブレークポイントの設定”で表示した情報と同じです。 例: fdb* show break Num Address #1 0x00010ad0 #2 0x00010ab8 #4 0x00010b04 #5 0x00010a60 : fdb* Specify Enable Enable Enable Enable Stop? Yes Yes Once Yes Where (i_subent_ + 0x0) at line 13 in test14.f (i_sub_ + 0x4) at line 12 in test14.f (i_subent1_ + 0x14) at line 15 in test14.f (MAIN__ + 0x0) at line 1 in test14.f 8.3.3.3 ブレークポイントの削除 ブレークポイントの場所を指定した delete コマンドは、指定されたブレークポイントを削除しま す。ブレークポイントが削除されると、ブレークポイントの割り付けられた番号、アドレス、関 数名、行番号およびファイル名を表示します。 例 1:ソースファイル test14.f の 15 行目のブレークポイントを削除 fdb* delete `test14.f`15 Breakpoint #4:0x00010b04 (i_subent1_ + 0x14) at line 15 in test14.f was deleted. 例 2:現在ファイルの 10 行目のブレークポイントを削除 fdb* delete 10 Breakpoint #6:0x00010aa4 (MAIN__ + 0x44) at line 10 in test14.f was deleted. 例 3:アドレス 0x10af0 のブレークポイントを削除 fdb* delete *0x10af0 Breakpoint #3:0x00010af0 (i_subent1_ + 0x0) at line 14 in test14.f was deleted. fdb* 例 4:サブルーチン func の先頭のブレークポイントを削除 fdb* delete func_ Breakpoint #7:0x00010b7c (func_ + 0x4) at line 19 in test14.f was deleted. 例 5:番号 #2 のブレークポイントを削除 fdb* delete #2 Breakpoint #2:0x00010ab8 (i_sub_ + 0x4) at line 12 in test14.f was deleted. fdb* 8.3.3.4 全ブレークポイントの削除 ブレークポイントの場所を指定しない delete コマンドで、すべてのブレークポイントが削除され ます。このとき、ブレークポイントを削除してよいかが確認されます。 例: fdb* delete Delete all breakpoints? (y/n) y All breakpoints was deleted. fdb* Fortran 使用手引書ー Page 237 8.3.3.5 ブレークポイントの無視 skip コマンドで、指定された回数だけブレークポイントを無視するように変更されます。 例 1:番号 #1 のブレークポイントを 1 回無視 fdb* skip #1 1 Breakpoint #1:0x00010ad0 (i_subent_ + 0x0) at line 13 in test14.f will be skipped next once. 例 2:番号 #3 のブレークポイントを 2 回無視 fdb* skip #3 2 Breakpoint #3:0x00010af0 (i_subent1_ + 0x0) at line 14 in test14.f will be skipped next twice. 例 3:番号 #2 のブレークポイントを 10 回無視 fdb* skip #2 10 Breakpoint #2:0x00010ab8 (i_sub_ + 0x4) at line 12 in test14.f will be skipped next 10 times. 8.3.4 プログラムのスタック ここでは、関数のトレースの表示およびマシンレジスタの表示について説明します。 8.3.4.1 すべてのトレースの表示 traceback コマンドで関数のトレースが呼び出された順にすべて表示されます。表示される情報は、 以下のとおりです。 - 関数名とその引数。ただし、引数がなければ表示されません。また、引数に文字列へのポイ ンタが含まれているときは、その文字列の先頭アドレスとその内容が表示されます。 - 呼び出された各関数が存在する呼出し元の行番号。 - 関数が含まれているファイル名。 例: fdb* traceback #0 0x00010b04 (i_subent1_ + 0x14) () at line 15 in test14.f #1 0x8001f0bc (jwe_icfc + 0x44) (0x25f60, 0x0, 0x1, 0x80075a24, 0x6, 0x25f60) #2 0x00010a64 (MAIN__ + 0x4) () at line 2 in test14.f #3 0x00010a48 (main + 0x2c) (0x1, 0xdffefde4, 0xdffefdec, 0x0, 0x0, 0x8) #4 0x00010a04 (_start + 0x7c) () fdb* 8.3.4.2 現在のトレースの表示 frame コマンドで現在の関数のトレースが表示されます。表示される情報は、“8.3.4.1 すべての トレースの表示”を参照してください。 例: fdb* frame Frame no #0 : i_subent1_() at line 15 in test14.f. fdb* 8.3.4.3 現在のレジスタ値の表示 show reg コマンドで現在の汎用レジスタおよびステータスレジスタの値が表示されます。 Fortran 使用手引書ー Page 238 8.3.4.4 現在の浮動小数点レジスタ値の表示 show freg コマンドで現在の浮動小数点レジスタの値が表示されます。 8.3.4.5 現在の全レジスタ値の表示 show regs で現在の汎用レジスタ、浮動小数点レジスタおよびステータスレジスタの値が表示され ます。 浮動小数点レジスタの値については、浮動小数点形式に変換した値も表示されます。 8.3.5 実行制御 ここでは、ブレークポイントなどで停止した実行の継続や、ステップ実行などの実行制御につい て説明します。 8.3.5.1 実行の継続 continue コマンドは停止しているプログラムの実行を継続します。 例 1:実行の継続 fdb* continue Continue program: a.out 例 2:3 回目のブレークポイントに出会うまで実行を継続 fdb* continue 3 Continue program: a.out and skip next 2 breakpoints 8.3.5.2 ステップ実行 step コマンドにより指定された行だけ文が実行されます。 例 1:1 行だけ文を実行 fdb* step Stepped : MAIN__() at line 2 in test14.f. 2 call i_sub() 例 2:2 行文を実行 fdb* step 2 Stepped : i_subent1_() at line 15 in test14.f. 15 i_sub_val = 4 fdb* 8.3.5.3 マシン命令でステップ実行 stepi コマンドにより指定された数のマシン命令を実行します。 例 1:1 マシン命令だけ実行 fdb* stepi Stepped : i_subent2_() at line 17 in test14.f. 17 i_sub_val = 5 0x00010b30 (i_subent2_ + 0x18) sethi %hi(0x97),%o0 fdb* Fortran 使用手引書ー Page 239 例 2:4 マシン命令だけ実行 fdb* stepi 4 Stepped : i_subent2_() at line 18 in test14.f. 18 call i_subend() 0x00010b40 (i_subent2_ + 0x28) jmpl %o0+%g0,%g0 fdb* 8.3.5.4 次まで実行 until コマンドにより指定された行番号までプログラムが実行されます。 例:行番号 9 まで実行 fdb* until 9 Stepped : MAIN__() at line 9 in test14.f. 9 call ii_subent2() fdb* 8.3.5.5 関数の終りまで実行 until return コマンドにより現在停止している関数を呼び出した関数に復帰するまで実行されます。 例: The program: test14.out starting. Breakpoint #2: MAIN__() at line 2 in test14.f. 2 call i_sub() fdb* step Stepped : i_subent1_() at line 15 in test14.f. 15 i_sub_val = 4 fdb* until return Stepped : MAIN__() at line 3 in test14.f. 3 call i_subent() fdb* 8.3.6 変数の内容の表示と設定 ここでは、変数の内容の表示や変数への値の設定について説明します。 8.3.6.1 変数などの値をフォーマットにしたがって表示 print コマンドで変数、ポインタの値が表示されます。フォーマットを省略した場合は、変数であ れば宣言された型が、ポインタであれば 16 進数表示が採用されて値が表示されます。フォーマッ トの形式については“8.3.10 式の表示”を参照してください。 Fortran 使用手引書ー Page 240 例: fdb* print i1 Result = 1 fdb* print i2 Result = (2, 0) fdb* print i2(1) Result = 2 fdb* print i4 Result = 4 fdb* print &i4 Result = (integer(4),pointer) 0x25d00 fdb* print r4 Result = 1.00000000e+00 fdb* print &r4 Result = (real(4),pointer) 0x25d04 fdb* print c8 Result = (3.00000000e+00, 1.00000000e+00) fdb* print l1 Result = .true. fdb* print l4 Result = .false. fdb* print :x r4 Result = 0x3f800000 fdb* dump :cb1 *0x25d0d 0x00025d0d: 1:'\001' fdb* dump :cb3 *0x25d0d 0x00025d0d: 1:'\001' 0:'\000' 0:'\000' fdb* dump :dw1 *0x25d0d 0x00025d0d: 16777280 fdb* 8.3.6.2 値の設定 set コマンドによりプログラム変数、レジスタおよび指定されたアドレスの領域に値が設定されま す。 例 1:変数 i に値 10 を設定 fdb* set i = 10 fdb* 例 2:out レジスタ 2 に値 0x45 を設定 fdb* set $o2 = 0x45 fdb* 例 3:eax レジスタに値 0x9 を設定 fdb* set $eax = 0x9 fdb* 例 4:アドレス 0xf7fff870 の領域に値 2 を設定 fdb* set *0xf7fff870 = 2 fdb* Fortran 使用手引書ー Page 241 8.3.7 プログラムをマシン命令で表示 disas コマンドにより指定したアドレスまたは指定したアドレスからアドレスまでの逆アセンブル したアセンブル・ソースが表示されます。 例:現在停止しているアドレスの命令を表示 fdb* disas 0x00010a88 (MAIN__ + 0x4) or %g0,1,%o1 8.3.8 アドレス・マップの表示 show map コマンドで現在のアドレス・マップが表示されます。また、ダイナミックリンクされて いるライブラリも表示されます。 8.3.9 ソースファイル ここでは、ソースファイルを扱う機能について説明します。 8.3.9.1 ソースの表示 list コマンドで数行のソースを行番号付きで表示されます。行番号とは、ファイルの最初の行を 1 行目とした通し番号です。 例: fdb* list 1 2 3 4 5 6 7 8 9 10 fdb* program main integer(1) i1 integer(2) i2(2) integer(4) i4 real(4) r4 real(8) r8 complex(8) c8 complex(16) c16 logical(1) l1 logical(4) l4 8.3.9.2 ソースファイル名の表示 show source コマンドで現在使用しているソースファイル名が表示されます。 例: fdb* show source Now source is "/fujitsu/sample/test3.f". fdb* 8.3.10 式の表示 ここでは、print コマンドや set コマンドに指定する式について説明します。 8.3.10.1 式 式は変数、定数および演算子の組合せです。 Fortran 使用手引書ー Page 242 8.3.10.2 変数 変数はデバッグ対象プログラム中に存在する変数か、特殊変数“$ レジスタ名”を意味します。 8.3.10.2.1 Fortran プログラムでの変数 - 構造体変数 構造体成分は、variable.member または variable%member として参照します。variable だけを指 定した場合は、構造体を構成するすべての成分を参照したことになります。 - 配列変数 配列要素は、variable(number,number,...) として参照します。number には、式は記述できませ ん。また、すべての要素を参照するには、variable を指定します。 - 文字列変数 文字部分列は、variable(number) として参照します。 - 複素数変数 複素数の実数部または虚数部だけを参照することはできません。すなわち、variable と指定し た場合は、実数部および虚数部の両方を参照したことになります。 - ポインタ変数 アドレスを参照する場合には、Fortran 95 仕様のポインタおよびアドレス保持変数とも &variable を指定します。 また、ポインタの指し示す先を参照する場合は、CRAY 仕様のポインタ変数では variable を、 Fortran 95 仕様のポインタでは variable を指定します。 8.3.10.2.2 C 言語プログラムでの変数 - 構造体変数 構造体メンバは、variable が構造体を示す場合は variable.member として、また、variable が構 造体へのポインタを示す場合は variable->member として参照します。variable だけを指定した 場合は、variable が構造体を示す場合は構造体を構成するすべてのメンバを参照したことにな り、variable が構造体へのポインタを示す場合は構造体へのアドレスを参照したことになりま す。 - 共用体変数 共用体メンバは、variable が共用体を示す場合は variable.member として、また、variable が共 用体へのポインタを示す場合は variable->member として参照します。variable だけを指定した 場合は、variable が共用体を示す場合は共用体を構成するすべてのメンバを参照したことにな り、variable が共用体へのポインタを示す場合は共用体へのアドレスを参照したことになりま す。 - 配列変数 配列要素は、variable[number][number]... して参照します。すべての要素を参照するには、 variable を指定します。 - ポインタ変数 アドレスを参照する場合は、variable を指定します。また、ポインタの指し示す先を参照する 場合は、*variable または variable[number] を指定します。 - 列挙変数 列挙変数は、variable として参照します。参照値は、列挙子リストのどれかになります。 Fortran 使用手引書ー Page 243 8.3.10.3 定数 プログラム言語 (FortranまたはC言語)で許されている定数が記述できます。 詳しくは、 “8.3.10.3.1 Fortran プログラムでの定数”および“8.3.10.3.2 C 言語プログラムでの定数”を参照してください。 8.3.10.3.1 Fortran プログラムでの定数 - 整定数 符号に続けて数字列を記述します。符号は省略できます。 - 実定数 小数点付きの整定数または英字 e の後に整定数を記述します。 - 倍精度実定数 小数点付きの整定数または英字 d の後に整定数を記述します。 - 4 倍精度実定数 小数点付きの整定数または英字 q の後に整定数を記述します。 - 複素定数 ( 実部 , 虚部 ) と記述します。 - 倍精度複素定数 ( 実部 , 虚部 ) と記述します。 - 4 倍精度複素定数 ( 実部 , 虚部 ) と記述します。 - 論理定数 .f.、.false.、.t. および .true. と記述します。 - 文字定数 文字列の前後をダブルクォテーション(")で囲みます。 - ホレリス定数 サポートしていません。 - 16 進定数 0x... と記述します。... は 16 進数を示します。 - 8 進定数 0... と記述します。... は 8 進数を示します。 - 2 進定数 サポートしていません。 - 配列定数 サポートしていません。 - 構造体定数 サポートしていません。 8.3.10.3.2 C 言語プログラムでの定数 - 浮動小数点定数 小数点付きの 10 進定数または英字 e の後に 10 進定数を記述します。 - 16 進定数 0x... と記述します。... は 16 進数を示します。 Fortran 使用手引書ー Page 244 - 10 進定数 符号に続けて数字列を記述します。符号は省略できます。 - 8 進定数 0... と記述します。... は 8 進数を示します。 - 列挙定数 列挙子を指定します。 - 文字定数 サポートしていません。 8.3.10.4 演算子 以下にあげる演算子が使用可能です。()(括弧)を使用することにより式の入れ子ができます。 8.3.10.4.1 Fortran プログラムでの演算子 使用可能な演算子を以下の表に示します。 演算子 %. 説明 メンバ参照 () 配列参照および括弧 - 単項負記号 + 単項正記号 ** * / + - 数値演算子 = 代入文 < <= == /= > >= .LT. .LE. .EQ. .NE. .GT. .GE. スカラ関係演算子 .NOT. .AND. .OR. .EQV. .NEQV. 論理演算子 8.3.10.4.2 C 言語プログラムでの演算子 使用可能な演算子を以下の表に示します。 演算子 . -> 説明 メンバ参照 [] 配列参照 () 括弧 ++ インクリメント演算子 -- デクリメント演算子 - 単項マイナス + 単項プラス ! 論理否定 ~ ビット否定 & アドレス演算子 Fortran 使用手引書ー Page 245 演算子 * 説明 間接操作 */% 乗法演算子 +- 加法演算子 << >> シフト演算子 < <= > >= 関係演算子 == != 等値/不等値演算子 |^& ビット演算子 || && 論理演算子 = 代入文 8.3.11 Fortran プログラムをデバッグする上での注意事項 Fortran は原始プログラムで記述した手続名を加工するため、手続名を指定する場合は、Fortran と 同じ規則で加工した名前で指定しなければなりません。詳細は、 “11.2 外部名の加工”を参照し てください。 変数名は、大文字と小文字は等価に扱われます。ただし、共通ブロック名でデータを参照する場 合は、Fortran と同じ規則で加工した名前で指定しなければなりません。詳細は、“11.8.3.3 外部 変数によるデータの受渡し”を参照してください。 第 9 章 最適化機能 この章では、最適化機能を有効に活用するための機能や、注意事項について説明します。 9.1 オブジェクトモジュールの大きさ 最適化機能項目によっては、コンパイラが出力するオブジェクトモジュール(命令とデータ)の 大きさが大幅に増加する場合があります。したがって、実行時に必要とする記憶領域の大きさも 増加します。 オブジェクトモジュールの大きさに影響するのは、以下の四つの機能項目です。 - - - - ループアンローリング ソフトウェアパイプライニング インライン展開 ストライピング 9.1.1 ループアンローリング ループアンローリングとは、ループ内のすべての実行文をループ内に n 重に展開し、その代わり ループの回転数を n 分の 1 に縮小する最適化です。 その展開数は、回転数およびループ内の実行文の数などから、コンパイラにより最適な値が決め られます。 ループ内の文が多重に展開されるので、オブジェクトモジュールの大きさが増加します。 ループアンローリングは、翻訳時オプション -Knounroll を指定することにより、抑止することが できます。 また、翻訳時オプション -Eu を指定することにより、最適化された DO ループとその展開数を示 すメッセージを出力することができます。 配列代入および配列式(配列記述と呼びます)を含む文に対しては、ループアンローリングは以 下のように行われます。ただし、-Eu によるメッセージは出力されません。 - 配列記述は、内部的には一重または多重の DO ループに展開され、その最内ループはループ アンローリングの対象になります。 - 上のことから、配列記述を含む DO ループは、ソースプログラム上は最内ループであっても、 内部的には最内ループにはなりません。したがって、ループアンローリングの対象にはなり ません。 9.1.2 ソフトウェアパイプライニング ソフトウェアパイプライニングとは、命令レベルの並列化が可能なマシンにおいて、ループ内の 命令ができるだけ並列実行されるように命令を並び替える最適化です。 Fortran 使用手引書ー Page 247 ソフトウェアパイプライニングは、ループの任意の回転における実行文とそれ以降の回転におけ る実行文を重ね合わせた命令スケジューリングを行うため、ループアンローリング同様、オブジェ クトモジュールの大きさが増加します。 翻訳時オプション -Eu を指定することにより、最適化されたことを意味するメッセージを出力す ることができます。 9.1.3 インライン展開 利用者定義の手続をインライン展開した場合、ある一つのプログラム単位当たりのオブジェクト モジュールの増加量は、下記の式で示すことができます。 インライン展開の対象になる利用者定義の手続がいくつかある場合は、それぞれの利用者定義の 手続の増加量の総和がプログラム単位全体での増加量です。 (命令列の大きさ+データ部の大きさ)×展開の回数 命令列の大きさは、実行文の種類と数から決まります。 データ部の大きさは、共通ブロック、仮引数、割付け配列、親子結合された要素を除く変数、配 列および定数の大きさです。 ある利用者定義の手続が同じプログラム単位内で何度もインライン展開された場合、データ部は 1 回分の大きさだけ増加します。 ある利用者定義の外部手続またはモジュール手続について、翻訳された原始プログラム内のすべ ての引用(呼出し)がインライン展開されたとしても、利用者定義の外部手続またはモジュール 手続は削除されず、そのオブジェクトモジュールはつねに出力されます。これは、すでに翻訳済 みのプログラム単位から呼び出される可能性があるためです。 しかし、利用者定義の内部手続については、翻訳された原始プログラム内のすべての引用(呼出 し)がインライン展開された場合、利用者定義の内部手続は削除され、そのオブジェクトモジュー ルが出力されないことがあります。 翻訳時オプション -Ei を指定することにより、展開された場所と手続名を示すメッセージを出力 することができます。 9.1.4 ストライピング ストライピングとは、自動ベクトル化の技術を応用して、ループ内の実行文を一定数(この数を ストライプ長と言います)だけ展開する最適化です。ストライピングを適用することにより、ルー プの繰返しのよるオーバヘッドが少なくなる、またはソフトウェアパイプライニングが促進され るという効果が期待できます。 例: DO I=1,N A(I) = B(I) + C(I) ENDDO ストライプ長 4(-Kstriping=4)で展開することが指定された場合、以下の例のように 実行文がループ内で展開されます。 Fortran 使用手引書ー Page 248 DO I=1,N,4 TMP_B1 = B(I) TMP_B2 = B(I+1) TMP_B3 = B(I+2) TMP_B4 = B(I+3) TMP_C1 = C(I) TMP_C2 = C(I+1) TMP_C3 = C(I+2) TMP_C4 = C(I+3) TMP_A1 = TMP_B1 + TMP_C1 TMP_A2 = TMP_B2 + TMP_C2 TMP_A3 = TMP_B3 + TMP_C3 TMP_A4 = TMP_B4 + TMP_C4 A(I) = TMP_A1 A(I+1) = TMP_A2 A(I+2) = TMP_A3 A(I+3) = TMP_A4 ENDDO ストライピングは、ループ内の文が多重に展開されるので、ループアンローリング同様、オブジェ クトモジュールの大きさが増加します。また、多くの翻訳時間を必要とする場合があります。実 行性能に関しても、使用するレジスタが増加するため実行性能が低下する場合があるので注意が 必要です。 9.2 実行結果の精度 以下に示すような誤りのあるプログラムに対して最適化を行った場合、最適化のレベルにより実 行結果が異なることがあるので、注意する必要があります。 - 値が定義されていない変数を引用している - 許されない形式の値が格納されている変数を引用している - 配列宣言を超える添字で配列要素を引用している - その他の文法に違反した使い方をしている 9.3 実行場所の移動による影響 翻訳時オプション -Kpreex を指定した場合、最適化(不変式の先行評価)によりプログラムの論 理上実行されないはずの命令が実行され、エラーになる場合があります。 ただし、計算結果およびその精度に影響を与えることはありません。 実行場所の移動による影響は、組込み関数の引用、配列要素の引用および除算で発生する可能性 があります。 Fortran 使用手引書ー Page 249 以下に、実行場所の移動による影響の例を示します。 例 1:組込み関数の引用 最適化後(ソースイメージ) dimension a(100) : do i=1,100 if(x.gt.0.0) then a(i)=alog(x) end if end do : dimension a(100) : t=alog(x) do i=1,100 if(x.gt.0.0) then a(i)=t end if end do : [説明] 左側のプログラムでは、alog の引数が 0.0 以上のときだけ関数を呼び出すようにしているの で副作用は生じません。最適化(不変式の先行評価)により、alog(x) がループ外に移動さ れて必ず実行するようになります。その結果、もし変数 x の値が負ならば、組込み関数 alog で引数が 0.0 以下である旨のエラーメッセージが出力されるようになります。 例 2:配列要素の引用 最適化後(ソースイメージ) subroutine sub(a,b,n) dimension a(n),b(n) : do i=1,n if(j.le.n) then a(i)=b(j)*f end if end do : subroutine sub(a,b,n) dimension a(n),b(n) : t=b(j)*f do i=1,n if(j.le.n) then a(i)=t end if end do : [説明] 左側のプログラムでは、変数 j が n 以下のときだけ配列要素 b(j) を引用しているので、配列 b の宣言範囲を超えることはありません。最適化(不変式の先行評価)により、配列要素 b(j) がループ外に移動されて、j の値に関係なく引用されます。その結果、配列の宣言範囲を超 えて引用されるようになります。プログラムの範囲外を引用すると、記憶保護例外(読出し) である旨のエラーメッセージが出力されて、プログラムの実行が中断します。 Fortran 使用手引書ー Page 250 例 3:除算 最適化後(ソースイメージ) subroutine sub(a,n,f) dimension a(n) : do i=1,n if(f.ne.0.0) then a(i)=b/f else a(i)=0.0 end if end do : subroutine sub(a,n,f) dimension a(n) : t=b/f do i=1,n if(f.ne.0.0) then a(i)=t else a(i)=0.0 end if end do : [説明] 左側のプログラムでは、変数 f が 0.0 でないときだけ除算を行っているので、除算例外のエ ラーが発生することはありません。最適化(不変式の先行評価)により、除算 b/f がループ 外に移動されて、f の値に関係なく実行されます。その結果、もし変数 f の値が 0.0 であれ ば、除算例外である旨のエラーメッセージが出力されて、プログラムの実行が中断します。 9.4 演算評価方法変更の最適化による影響 翻訳時オプション -Keval を指定した場合、演算評価方法の変更の最適化が行われ、その結果、計 算結果に誤差を生じる場合があります。また、非常にまれではありますが、指数けたあふれなど の演算例外が発生する場合があります。 以下、演算評価方法変更の最適化の一つである除算の乗算化による影響について説明します。 除算の乗算化は、浮動小数点型の除算に対して行われます。 以下に、除算の乗算化による影響の例を示します。 例:除算の乗算化 最適化後(ソースイメージ) dimension a(100),b(100) : do i=1,100 a(i)=b(i)/c end do : dimension a(100),b(100) : t=1.0/c do i=1,100 a(i)=b(i)*t end do : [説明] 変数 c はループ内で一定です。最適化(除算の乗算化)により、変数 c の逆数をループの外 で計算し、ループ内の除算は逆数による乗算に変更されます。すなわち、一つの除算が除算 と乗算の二つの演算によって計算されるようになります。t=1.0/c の計算結果が、変数 c の 型がもつ精度(有効けた)内に収まらない場合(下位けたが切り捨てられる)は、この最適 化を行わない場合に対して精度差が生じます。また、変数 c の値によっては、ループの外で 逆数を計算するとき、指数けたあふれの演算例外が発生する場合があります。 Fortran 使用手引書ー Page 251 9.5 実行順序の変更による影響 共通式の除去や不変式の移動などの最適化により、演算命令の実行順序が変更されてプログラム 割込みエラーの発生位置や回数が変わる場合がありますので、デバッグの際は注意を要します。 なお、定数どうしの演算で演算割込みが発生するようなものについては、翻訳時に定数演算を行 わず、実行時にもち越すので、それらの演算割込みは実行時に発生することになります。 9.6 割当て形 GO TO 文の分岐先 割当て形 GO TO 文の文番号並びは、記述するのであれば正確でなければなりません。 すなわち、割当て形 GO TO 文では、その文の文番号並びに記述された文番号以外の文番号へ分岐 してはなりません。 コンパイラは、文番号並びに記述された文番号のどれかに分岐するものとして最適化するので、 もしそれ以外の文番号に分岐した場合は、意図した結果が得られない場合があります。 文番号並びが省略されている場合は、コンパイラ(最適化)は分岐する可能性のあるすべての文 番号をプログラムを解析して求めます。したがって、分岐する文番号が明らかな場合は、陽に記 述したほうがより最適化されます。 9.7 仮引数での影響 仮引数に関して、文法に違反した使い方をすると、利用者が意図した結果が得られないことがあ るので、注意する必要があります。 同じ実引数との結合 同じ手続のそれぞれの仮引数は、別の変数とみなして最適化されます。したがって、異なる仮引 数に対して同じ実引数が対応するような呼出しがある場合、意図した結果が得られない場合があ ります。実引数が異なる変数でも、それらが領域を共有している場合は同様です。文法では、こ のような仮引数に対して、その副プログラム内で直接および間接に値を再定義することを禁止し ています。 以下に、同じ実引数との結合による影響の例を示します。 例:同じ実引数との結合による影響 主プログラム program main equivalence (q,r) : call sub(x,x) call sub(q,r) : end サブルーチン副プログラム subroutine sub(y,z) dimension c(100) : do i=1,100 : y=a/i : c(i)=z+10.0 : end do : end この文は、z=a/i と 等価です。 Fortran 使用手引書ー Page 252 [説明] 仮引数 y と仮引数 z は別の変数として最適化されます。このため、DO ループ内では変数 z の 値は不変であるとみなされ、最適化(不変式の移動)により z+10.0 はループの外に移動され ます。その結果、z+10.0 の演算結果に y=a/i の演算結果は反映されません。また、変数 z が DO ループ内で値が変わる場合(z+10.0 が移動されない場合)でも、もし変数 y と変数 z が DO ループ内でレジスタ上に割り当てられると、z+10.0 の演算に y=a/i の演算結果は反映さ れません。これは、変数 y と変数 z に異なるレジスタが割り当てられるためです。 共通ブロック内のデータとの結合 仮引数と共通ブロック内の変数は結合していない(利用者が文法に違反した記述をしていない) とみなして最適化されます。したがって、仮引数が共通ブロック内の変数と結合している場合、 意図した結果が得られない場合があります。 以下に、共通ブロック内のデータとの結合による影響の例を示します。 例 1:共通ブロック内のデータとの結合による影響 主プログラム サブルーチン副プログラム program main common /com/ a : call sub(a) : end subroutine sub(x) common /com/ a : do i=1,100 y=x*2.0 a=float(i) z=x*2.0 end do : end 共通ブロック 変数 a 仮引数 結合 共通式 この文は、x=float(i) と等価です。 変数 x [説明] 仮引数 x と共通ブロック内の変数 a は別の変数として最適化されます。このため、DO ループ 内の x*2.0 は共通式であるとみなされ、最適化(共通式の除去)により z=x*2.0 は z=y に変 更されます。その結果、z には a=float(i) で代入した値が反映されません。文法では、同じ 実体に対して、仮引数と共通ブロックで同時に結合して値を定義することを禁止しています。 したがって、同じ実体を仮引数で結合したり共通ブロックで結合したりすると、意図した結 果が得られない場合があります。このような使い方は、文法に違反しているので、仮引数に よる結合または共通ブロックによる結合のどちらかに統一すべきです。 Fortran 使用手引書ー Page 253 例 2:共通ブロック内のデータとの結合による影響 主プログラム サブルーチン副プログラム subroutine sub1(x) real x program main real a common /c/a subroutine sub2 real a common /c/a z=x+y a=v call sub1(a) call sub2 end end w=x+y end 共通ブロック 変数 a 仮引数 結合 変数 x [説明] sub1 内にある sub2 の呼出しによって共通ブロック実体 a の値が変更されます。同時に共通 ブロック実体 a と結合している仮引数 x も変更されます。しかし、コンパイラは、このこと を認識できないので、sub2 の呼出し前後の x+y は、最適化(共通式の除去)の対象となりま す。最適化の結果、sub2 の呼出しのあとの w=x+y は w=z に変更され、sub2 の呼出しによって 変更された変数 x の値が w の結果に反映されなくなります。 ENTRY 文を利用した結合 ENTRY 文を含む副プログラムをある入口名、関数名またはサブルーチン名で呼出し、実引数を仮 引数と結合したとします。そして、その実引数(の番地)を副プログラムに渡したと考えて、あ とでその変数を実引数にせずに、別の入口名、関数名またはサブルーチン名でその副プログラム を呼び出して、副プログラム内でその変数を引用すると問題が生じる場合があります。 以下に、入口名を利用した結合による影響の例を示します。 例:入口名を利用した結合による影響 主プログラム program main x=10.0 call sub(x) サブルーチン副プログラム subroutine sub(x) サブルーチン名 :sub : return do i=1,n : call ent x=x+100.0 : end do end entry ent : y=x*x+10.0 : return end 入口名 :ent Fortran 使用手引書ー Page 254 [説明] このような場合、文法上は、call ent(x)、entry ent(x) としなければなりません。 9.8 インライン展開の制約事項 実引数と仮引数の対応関係などいくつかの制約事項があるため、インライン展開の候補になった 利用者定義の手続が、必ずしもインライン展開されるとは限りません。インライン展開可能な手 続は、外部手続、内部手続およびモジュール手続です。 以下に、インライン展開の制約事項を示します。 9.8.1 呼び出される利用者定義の手続に関する制約事項 - 実行文の数が許容限度を超える場合 利用者定義の手続の実行文の数が許容限度を超える場合、その利用者定義の手続はインライ ン展開されません。 許容限度の値は、翻訳時オプション -x のパラメタで変更することができます。許容範囲の標 準値は、コンパイラが自動的に決定します。 - 配列の大きさが許容限度を超える場合 利用者定義の手続の共通ブロック、仮引数および割付け配列を除く配列(すなわち、利用者 定義の手続内に局所的、かつ、領域が静的に割り付けられる配列)の大きさの合計が、許容 限度を超える場合、その利用者定義の手続はインライン展開されません。 許容限度の標準値は無限大です。許容限度の値は、翻訳時オプション -x のパラメタで変更す ることができます。 - インライン展開の制約となる文を含んでいる場合 以下に示す文を含む手続はインライン展開されません。 ・ ALLOCATE 文 ・ DEALLOCATE 文 ・ ASSIGN 文 ・ 割当て形 GO TO 文 ・ NAMELIST 文 ・ 変数群入出力文 ・ SAVE 文 共通ブロックの全体または共通ブロックの要素を除く変数(すなわち、利用者定義の手 続に局所的な変数)を有効にする SAVE 文がある場合、その利用者定義の手続はインラ イン展開されません。 ・ RETURN 文 整数式を指定した RETURN 文がある場合、インライン展開されません。 ・ NULLIFY 文 ・ CONTAINS 文 Fortran 使用手引書ー Page 255 - インライン展開の制約となる手続の場合 以下の手続はインライン展開されません。 ・ ・ ・ ・ ・ ・ ・ VOLATILE 属性をもつ手続 関数結果が配列である手続 関数結果が VOLATILE 属性をもつ手続 親有効域のモジュールが PRIVATE 属性をもつ変数をもつモジュール手続 親有効域のモジュールが割付け配列をもつモジュール手続 割付け配列を参照結合している手続 ENTRY 文で定義されたモジュール手続 - 初期値をもつ変数または配列の値が変更される場合 ・ DATA 文または型宣言文で初期値を指定した変数の値が、直接または間接に変更される 可能性がある場合、その利用者定義の手続はインライン展開されません。 ・ 親有効域のモジュールで、DATA 文または型宣言文で初期値を指定した変数の値が、直 接または間接に変更される可能性がある場合、そのモジュール内のモジュール手続はイ ンライン展開されません。 - ENTRY 文を含んでいる場合 以下の ENTRY 文を含む副プログラムはインライン展開されません。 ・ 関数名またはサブルーチン名と入口名で指定されている仮引数が異なる場合 9.8.2 呼び出す側と呼び出される側の関係に関する制約事項 - 実引数と仮引数の対応に誤りがある場合 ・ 実引数と仮引数の個数が異なる ・ 実引数と仮引数の型や属性が異なる - 実引数と仮引数の対応が以下に示す場合 ・ 仮引数が仮手続名であり、それに対応する実引数が組込み関数である ・ 仮引数が * であり、それに対応する実引数が文番号である ・ 実引数に配列記述(配列式)がある ・ 仮引数が OPTIONAL 属性をもつ ・ 仮引数が POINTER 属性をもつ ・ 仮引数が ALLOCATABLE 属性をもつ ・ 仮引数が VOLATILE 属性をもつ ・ 仮引数が形状引継ぎ配列である - 利用者定義の外部手続の引用方法に誤りがある場合 ・ 外部関数副プログラムを外部サブルーチン副プログラムとして引用している ・ 外部サブルーチン副プログラムを外部関数副プログラムとして引用している ・ 外部関数副プログラムで定義している型と異なる型で引用している - 呼び出す利用者定義の外部手続およびモジュール手続が以下に示す場合 ・ 仮称指定で局所名に指定された手続 9.8.3 利用者定義の外部手続の名前に関する制約事項 同じ名前の利用者定義の外部手続がある場合、プログラムのエラーとなりインライン展開されま せん。 - - - - 同じ名前の外部サブルーチン副プログラムがある 同じ名前の外部関数副プログラムがある 同じ名前の初期値設定プログラム単位がある 名前がない初期値設定プログラム単位が二つ以上ある Fortran 使用手引書ー Page 256 翻訳時オプション -Ei を指定することにより、実際にインライン展開されたかどうかを示すメッ セージを出力することができます。 その場合、インライン展開されなかったときは、その理由を示すメッセージも出力されます。 9.9 CRAY 仕様のポインタ変数での影響 ポインタ変数は LOC 組込み関数で、そのポインタ変数に対応するアドレス保持変数にアドレスが とられたデータのみ共用関係にあると判断しています。ただし、共通ブロック実体、構造体成分 または結合実体のアドレスがとられた場合、それぞれ同じ共通ブロック、構造体または結合対応 に属するほかのデータとも共用関係があると判断します。 また、アドレス保持変数に LOC 組込み関数以外を使用してアドレスを設定した場合は利用者が意 図した結果が得られないことがあります。 さらに、アドレス保持変数が仮引数で渡ってきたときは、対応するポインタ変数が以下に示す変 数とは共用関係にないと判断しているため、利用者は十分な注意が必要です。 - ほかの仮引数。ほかの仮引数がアドレス保持変数ならば、対応するポインタ変数。 - 共通ブロックに属する変数。 9.10 翻訳時オプション -Kcommonpad の影響 分割コンパイルする場合は、共通ブロックを含むファイルに対して翻訳時オプション -Kcommonpad を指定した場合、同じ名前の共通ブロックを含む他のファイルに対しても、翻訳時 オプション -Kcommonpad を指定しなければなりません。 (例 1 を参照) 複数のファイルに対して翻訳時オプション -Kcommonpad=N を指定して翻訳する場合、N の値は同 じでなければなりません。 また、同じ共通ブロック名に対し、その要素を変えて使用している場合、翻訳時オプション -Kcommonpad を指定するとプログラムが正しく実行されないことがあります。(例 2 を参照) 例 1: a.f common/cmn/a,b integer,dimension(10) :: a = 1,b = 2 : b.f common/cmn/a,b integer,dimension(10) :: a,b print *,b : a.f、b.f 共に共通ブロック cmn を含んでいるので、翻訳時オプション -Kcommonpad を指定す る場合、a.f および b.f の両方に指定しなければなりません。 Fortran 使用手引書ー Page 257 例 2: subroutine sub_a common/cmn/a,b real(4),dimension(10) :: a = 1.0,b = 2.0 : subroutine sub_b common /cmn/x complex(4),dimension(10) :: x print *,x : サブルーチン sub_a、sub_b において、共通ブロック cmn の要素が異なるため、翻訳時オプ ション -Kcommonpad を指定した場合の動作は保証されません。 9.11 最適化制御行(OCL)の利用 最適化にとって有効な情報をソースプログラム上に記述することにより、最適化の効果をより高 めることができます。 9.11.1 最適化制御行の記法 最適化制御行は行の第 1 けたから第 5 けたが "!OCL " である行です。!OCL で始まる行は、通常は 注釈行として扱われますが、翻訳時オプション -Kocl を指定することにより、最適化制御行とみ なされ、オペランドが有効になります。 以下に記法を示します。 !OCL i [,i] .... i:最適化指示子 9.11.2 最適化制御行の記述位置 最適化制御行は、最適化指示子の種類によって記述できる位置が決まっています。 最適化制御行は、プログラム単位、DO ループ単位、文単位または配列代入文単位に指定します。 プログラム単位、DO ループ単位、文単位、配列代入文単位は、以下のように定義されます。 - プログラム単位 各プログラム単位の先頭。 - DO ループ単位 DO 文の直前の位置。ただし、最適化制御行と DO 文との間に注釈行または DO ループ単位に 指定可能な他の最適化制御行を含んでもかまいません。 - 文単位 文の直前の位置。 - 配列代入文単位 配列代入文の直前の位置。 9.11.3 最適化指示子 表 9.1 に最適化制御行に記述できる最適化指示子を示します。 Fortran 使用手引書ー Page 258 表 9.1 最適化制御行に記述できる最適化指示子 最適化指示子 意味 指定可能な最適化制御行 プログ DO 文単位 配列代 ループ ラム 入文 単位 単位 単位 範囲内にある配列代入文は、 融合が促進されます。また、 指定された最適化指示子がす べての配列代入文に対して有 効となります。 × × × ○ ARRAY_MERGE (array1,array2[,array3]...) 次元数の少ない配列を次元数 または の多い配列へマージすること ARRAY_MERGE を指示します。 (base_array:array1[,array2]...) ○ × × × ARRAY_SUBSCRIPT (array1[,array2]...) 配列の次元移動を行うことを 指示します。 ○ × × × BCOPY 配列間の転送を行うループお よび配列へ定数値 0 を設定す るループを、memcpy(3C) およ び memset(3C) 関数に変換する ことを指示します。 ○ ○ × ○ NOBCOPY 配列間の転送を行うループお よび配列へ定数値 0 を設定す るループを、memcpy(3C) およ び memset(3C) 関数に変換しな いことを指示します。 ○ ○ × ○ EVAL 式の評価順序を変更する最適 化を有効にします。 ○ ○ × ○ NOEVAL 式の評価順序を変更する最適 化を無効にします。 ○ ○ × ○ FMADD M&A 命令を使用します。 ○ ○ × ○ NOFMADD M&A 命令を使用しません。 ○ ○ × ○ FRECIPRO 浮動小数点数の除算に関して、 逆数を使った最適化を有効に します。 ○ ○ × ○ NOFRECIPRO 浮動小数点数の除算に関して、 逆数を使った最適化を無効に します。 ○ ○ × ○ IF(k) IF 文、IF THEN 文または ELSE IF 文の各文の条件式が 成立する真率 k を指定します。 × × ○ × IXODR(var1,var2[,var3]...) 指定された順序(var1、var2、 …)で多重 DO ループの並び 換えを実施します。 × ○ × × ARRAYFUSION[,opt] ENDARRAYFUSION Fortran 使用手引書ー Page 259 最適化指示子 意味 指定可能な最適化制御行 プログ DO 文単位 配列代 ループ ラム 入文 単位 単位 単位 MFUNC[(level)] マルチ演算関数化を行うこと を指示します。 ○ ○ × ○ NOMFUNC マルチ演算関数化を行わない ことを指示します。 ○ ○ × ○ NOARRAYPAD(array1) 配列要素へのパディングを行 わないことを指示します。 ○ × × × NOLOOPFUSION ループを融合する機能を無効 にします。 ○ ○ × × PREEX 不変式の先行評価の最適化を 有効にします。 ○ ○ × ○ NOPREEX 不変式の先行評価の最適化を 無効にします。 ○ ○ × ○ PREFETCH[(level)] コンパイラの自動 prefetch 機 能を有効にします。 ○ ○ × × NOPREFETCH コンパイラの自動 prefetch 機 能を無効にします。 ○ ○ × × PREFETCH_CACHE_LEVEL どのキャッシュレベルにデー タをプリフェッチするかを指 (c-level) 示します。 ○ ○ × × PREFETCH_INFER プリフェッチのためのアドレ ス計算を省略し、既存の情報 から距離を推測してプリ フェッチすることを指示しま す。 ○ ○ × × PREFETCH_NOINFER プリフェッチのためのアドレ ス計算を省略し、既存の情報 から距離を推測してプリ フェッチすることを指示しま せん。 ○ ○ × × prefetch 命令を生成する際、 ループの m1 回転後に参照され るデータを対象とすることを 指示します。 ○ ○ × × prefetch 命令を生成する際、 ループの m1 回転後に参照また は定義されるデータを対象と PREFETCH_ITERATION_L2 することを指示します。 (m1) ただし、本機能では 2 次 キャッシュにのみプリフェッ チする prefetch 命令を対象と します。 ○ ○ × × PREFETCH_ITERATION (m1) Fortran 使用手引書ー Page 260 最適化指示子 意味 指定可能な最適化制御行 プログ DO 文単位 配列代 ループ ラム 入文 単位 単位 単位 PREFETCH_READ (name[,level={1|2}]) 参照されているデータに対し て prefetch 命令を生成するこ とを指示します。 × × ○ × PREFETCH_STRONG strong prefetch 命令を生成する ことを指示します。 ○ ○ × × PREFETCH_NOSTRONG strong prefetch 命令を生成する ことを指示しません。 ○ ○ × × PREFETCH_WRITE (name[,level={1|2}]) 定義されているデータに対し て prefetch 命令を生成するこ とを指示します。 × × ○ × STRIPING[(m2)] ストライピングの最適化を有 効にします。 ○ ○ × ○ NOSTRIPING ストライピングの最適化を無 効にします。 ○ ○ × ○ TILING[(m1)] タイリング機能を有効にしま す。 ○ ○ × ○ NOTILING タイリング機能を無効にしま す。 ○ ○ × ○ UNROLL(m3) DO ループをアンローリングさ せます。 ○ ○ × ○ UNROLL('full') フルアンローリング機能を有 効にします。 ○ ○ × ○ ○ :最適化指示子を最適化制御行に指定できます。 × :最適化指示子を最適化制御行に指定できません。 array1,array2,array3,base_array:配列名 k :0 ~ 100 までの符号なし整定数 level :機能レベル c-level :キャッシュレベル(1 ~ 3 までの符号なし整定数) m1 :1 ~ 2147483647 までの符号なし整定数 m2 :1 ~ 100 までの符号なし整定数 m3 :0 ~ 100 までの符号なし整定数 name :配列要素名 opt :最適化指示子 var1,var2,var3 :DO 変数 !OCL ARRAYFUSION[,opt] !OCL ENDARRAYFUSION 複数の配列代入文の融合を促進させる場合、範囲の開始と終了のそれぞれに !OCL ARRAYFUSION と !OCL ENDARRAYFUSION を記述することにより、その範囲内の融合が促進されます。ただし、 この最適化制御行を記述しても、範囲内の配列代入文すべてが融合されるとは限りません。また、 opt には最適化指示子を指定でき、範囲内のすべての配列代入文に対して有効となります。 Fortran 使用手引書ー Page 261 以下に、指定の例を示します。 例: REAL,DIMENSION(10) :: A,B,C … !OCL ARRAYFUSION A = B + … 有効範囲 C = C + … !OCL ENDARRAYFUSION … !OCL ARRAY_MERGE(array1,array2[,array3]...) 配列のマージを指示します。対象とする配列変数は、上下限が定数式な形状明示配列です。 制約事項については、 “9.19.2 局所的な配列変数マージの対象変数の制約事項”と同じ制約事項 があります。 本機能は、宣言式内および宣言部分の定数式には適用されません。 以下に、指定の例を示します。 例 1: !OCL ARRAY_MERGE(A,B,C) INTEGER,DIMENSION(101,102,103) :: A,B,C CALL SUB(A) … PRINT *,B(101,102,103) A = C A(101,102,103) = C(1,2,3) このようなプログラムを -Kocl を指定して翻訳した場合、コンパイラは、以下のようなプロ グラムと見なして翻訳します。 INTEGER,DIMENSION(3,101,102,103) :: TMP ! A を 1 次元目の 1 要素にマージ :TMP(1,101,102,103) ! B を 1 次元目の 2 要素にマージ :TMP(2,101,102,103) ! C を 1 次元目の 3 要素にマージ :TMP(3,101,102,103) CALL SUB(TMP(1,:,:,:)) ! 配列名を形状をもつ配列要素に変更 … PRINT *,TMP(2,101,102,103) TMP(1,:,:,:) = TMP(3,:,:,:) TMP(1,101,102,103) = TMP(3,1,2,3) 注)TMP はコンパイラで生成した変数です。 Fortran 使用手引書ー Page 262 例 2: !OCL ARRAY_MERGE(A,B) PROGRAM MAIN INTEGER,DIMENSION(100,101,102) :: A,B … CALL SUB(A) END SUBROUTINE SUB(C) INTEGER,DIMENSION(100) :: C … END 本機能を使用した場合、MAIN 側の手続 SUB の引数は、A が1次元目に要素を追加した生成変 数に変更するため、SUB 側の引数 C(100) との結合が正しく得られないことがあります。 !OCL ARRAY_MERGE(base_array:array1[,array2]...) ベースの配列変数に配列変数をマージします。マージすることにより、組込み関数の引数キーワー ドに DIM および MASK が指定可能な組込み関数には影響があります。 LBOUND、UBOUND などの DIM が指定可能な組込み関数および MASK が指定可能な組込み関数 に影響があります。ベースの変数の最終次元の要素にマージされます。対象とする配列変数は、 上下限が定数式な形状明示配列(局所的な配列および共通ブロック実体)です。 制約事項については、 “9.19.2 局所的な配列変数マージの対象変数の制約事項”の制約項目の共 通ブロック実体を除く項目が制約事項です。本機能は、宣言式内および宣言部分の定数式には適 用されません。 以下に、指定の例を示します。 例 1: !OCL ARRAY_MERGE(A:B,C) INTEGER,DIMENSION(10,11,12,2) :: A INTEGER,DIMENSION(10,11,12) :: B,C … A = 1 B = 1 C(1,2,3) = 1 以下のように配列がマージされます。 INTEGER,DIMENSION(10,11,12,4) :: A A = 1 A(:,:,:,3) = 1 A(1,2,3,4) = 1 例 2: !OCL ARRAY_MERGE(A:B,C) INTEGER,DIMENSION(1,2,3,4) :: A,X INTEGER,DIMENSION(1,2,3) :: B,C … X = A ! 翻訳時にエラーとなります。 A = RESHAPE((/(i,i=1,24)/),(/1,2,3,4/)) ! 代入の右辺と左辺の形状が異なり、実行結果は保証されません。 PRINT *,UBOUND(A,4) ! 6 が出力される。 Fortran 使用手引書ー Page 263 !OCL ARRAY_SUBSCRIPT(array1[,array2]...) 配列の次元位置の移動を指示します。対象とする配列変数は、割付け配列および上下限が定数式 な形状明示配列(局所的な配列、共通ブロック実体および仮引数)です。 制約事項については、 “9.18.2 配列宣言の次元移動の対象変数の制約事項”の制約項目の結合実 体を除く項目が制約事項です。 本機能は、宣言式内および宣言部分の定数式には適用されません。 以下に、指定の例を示します。 例 1: !OCL ARRAY_SUBSCRIPT(A) INTEGER,DIMENSION(101,102,103,5) :: A CALL SUB(A) … PRINT *,A(1,2,3,4) このようなプログラムを -Kocl オプションを指定して翻訳した場合、コンパイラは、以下の ようなプログラムと見なして翻訳します。 INTEGER,DIMENSION(5,101,102,103) :: A CALL SUB(A) … PRINT *,A(4,1,2,3) 例 2: !OCL ARRAY_SUBSCRIPT(A) PROGRAM MAIN INTEGER,DIMENSION(100,101,102,3) :: A … CALL SUB(A) END SUBROUTINE SUB(B) INTEGER,DIMENSION(100) :: B … END 本機能を使用した場合、MAIN 側の手続 SUB の引数は、A(3,100,101,102) の配列と SUB 側の引 数 B(100) と結合しますが、使用すると配列の次元数が異なるため、結果が正しく得られない ことがあります。 例 3: !OCL ARRAY_SUBSCRIPT(A) INTEGER,DIMENSION(1,2,3,4) :: A,B … B = A ! 翻訳時にエラーとなります。 A = RESHAPE((/(i,i=1,24)/),(/1,2,3,4/)) ! 代入の右辺と左辺の形状が異なり、実行結果は保証されません。 PRINT *,UBOUND(A,4) ! 3 が出力される。 !OCL BCOPY 配列間の転送を行うループおよび配列へ定数値 0 を設定するループを、memcpy(3C) および memset(3C) 関数にそれぞれ変換することを指示します。-KSPARC64_GP2 および -O3 オプション 以上が有効な場合に意味があります。 Fortran 使用手引書ー Page 264 以下に、指定の例を示します。 例: !OCL BCOPY DO I=1,N A(I) = B(I) C(I) = 0 END DO A(I) = B(I) が memcpy 関数に変換され、C(I) = 0 が memset 関数に変換されます。 !OCL IF(k) IF 文、IF THEN 文または ELSE IF 文の直前に記述し、IF 文の条件の成立確率(真率)を k で指定 します。k は 0 から 100 までの符号なし 10 進数で、確率を百分率(パーセント)で示します。こ の情報は、広域命令スケジューリングなどの最適化が使用します。 k の値は、正確であればあるほど効果的ですが、実際の値と一致させる必要はありません。ただ し、条件の成立する確率が、成立しない確率よりも高いのか(51% 以上)または低いのか(49% 以下)は、正確に指定する必要があります。これが不正確な場合、全く効果がないか、または逆 効果を招く場合かあります。この最適化制御行の指定がない IF 文の条件の成立確率は、51% と見 なして最適化されます。 IF 文の条件の成立確率が偏っていて、かつ、IF 文の配下で実行される部分の実行頻度が高く性能 に影響する場合に、この最適化制御行を指定すると効果的です。 以下に、指定の例を示します。 例 1: !OCL IF(95) IF( 条件 ) 文 95% の確率で条件が成立し、文が実行されることを指定しています。 例 2: !OCL IF(10) IF ( 条件 ) THEN 文1 ELSE 文2 END IF 10% の確率で条件が成立し、文 1 が実行されることを指定しています。逆に言うと、90% の 確率で文 2 が実行されることを指定しています。 例 3: !OCL IF(10) IF ( 条件 1) THEN 文1 !OCL IF(95) ELSE IF( 条件 2) 文2 ELSE 文3 END IF Fortran 使用手引書ー Page 265 10% の確率で条件 1 が成立し、文 1 が実行されることを指定しています。 条件 1 が成立しない場合、95% の確立で条件 2 が成立し、文 2 が実行され、5% の確立で文 3 が実行されることを指定しています。 !OCL IXODR(var1,var2[,var3]...) 多重 DO ループの並び替えを指示します。これにより、最適な DO ループの並びとなり実行性能 を向上させることができます。ただし、並び替えたときに結果が異なるなど、入れ替えが不可能 な場合には、並び替えを行いません。 以下に、指定の例を示します。 例: SUBROUTINE SUB(A,B,C,N,M,M1,M2) REAL(KIND=4) A(N,M),B(N,M),C(N,M) !OCL IXODR(I,J) DO I=1,M1 DO J=1,M2 A(I,J) = A(I,J) + B(J,I) + C(J,I) END DO END DO IXODR の指定のない場合は、DO 変数 I で並列化されますが、IXODR の指定によりループを入 れ替え DO 変数 J で並列化されます。変数 M2 が変数 M1 より十分に大きい場合、並列化の効果 が大きくなります。 !OCL MFUNC[(level)] DO ループ内の組込み関数および配列代入文の組込み関数および演算をマルチ演算関数に変換す ることを指示します。level には、1、2 または 3 を指定することができます。level の詳細について は、翻訳時オプション -Kmfunc を参照してください。 以下に、指定の例を示します。 例 1:プログラム単位で記述した場合 !OCL MFUNC REAL(KIND=8),DIMENSION(10) :: A,B,C,D,E,F,G DO I=1,10 B = I F = I+1 A(I) = LOG(B(I)) E(I) = LOG(F(I)) END DO D = LOG(C)+LOG(G) END LOG(B(I))、LOG(F(I)) と LOG(C)、LOG(G) がマルチ演算関数に変換されます。 Fortran 使用手引書ー Page 266 例 2:ループ単位で記述した場合 REAL(KIND=8),DIMENSION(10) :: A,B,C,D,E,F,G !OCL MFUNC DO I=1,10 B = I F = I+1 A(I) = LOG(B(I)) E(I) = LOG(F(I)) END DO D = LOG(C)+LOG(G) END LOG(B(I))、LOG(F(I)) がマルチ演算関数に変換されます。 例 3:配列代入文単位で記述した場合 REAL(KIND=8),DIMENSION(10) :: A,B,C,D,E,F,G DO I=1,10 B = I F = I+1 A(I) = LOG(B(I)) E(I) = LOG(F(I)) END DO !OCL MFUNC D = LOG(C)+LOG(G) END LOG(C)、LOG(G) がマルチ演算関数に変換されます。 !OCL NOMFUNC DO ループ内の組込み関数および配列代入文の組込み関数および演算をマルチ演算関数に変換し ないことを指示します。 以下に、指定の例を示します。 例: !OCL MFUNC REAL(KIND=8),DIMENSION(10) :: A,B,C,D,E,F,G !OCL NOMFUNC DO I=1,10 B = I F = I+1 A(I) = LOG(B(I)) E(I) = LOG(F(I)) END DO D = LOG(C)+LOG(G) END LOG(C)、LOG(G) がマルチ演算関数に変換されます。 !OCL NOARRAYPAD(array1) 指定された配列要素へのパディング処理を行わないことを指示します。翻訳時オプション -Karraypad_const[=N] または -Karraypad_expr=N が有効な場合に意味があります。 Fortran 使用手引書ー Page 267 以下に、指定の例を示します。 例: !OCL NOARRAYPAD(A) PROGRAM MAIN INTEGER,DIMENSION(100,100) :: A COMMON /X/A PRINT *,UBOUND(A) PRINT *,SIZE(A,1),SIZE(A,2) CALL SUB END PROGRAM !OCL NOARRAYPAD(A) SUBROUTINE SUB INTEGER,DIMENSION(100,100) :: A COMMON /X/A PRINT *,UBOUND(A) PRINT *,SIZE(A,1),SIZE(A,2) END SUBROUTINE 配列 A の1次元目に対して、パディング処理は行われません。 !OCL NOLOOPFUSION 指定されたループと隣接したループの融合を抑止することを指示します。 以下に、指定の例を示します。 例: !OCL NOLOOPFUSION DO I=1,N 文 END DO DO J=1,N 文 END DO DO K=1,N 文 END DO I と J のループは融合されません。J と K のループは融合されます。 !OCL PREFETCH[(level)] !OCL NOPREFETCH !OCL PREFETCH_CACHE_LEVEL(c-level) !OCL PREFETCH_INFER !OCL PREFETCH_NOINFER !OCL PREFETCH_ITERATION(m1) !OCL PREFETCH_ITERATION_L2(m1) !OCL PREFETCH_STRONG !OCL PREFETCH_NOSTRONG コンパイラの自動プリフェッチ機能を指示します。自動プリフェッチ機能とは、コンパイラが自 動的に prefetch 命令を挿入するのに最適な位置を判断し、prefetch 命令を生成する機能です。 Fortran 使用手引書ー Page 268 !OCL PREFETCH_READ(name[,level={1|2}]) 参照されているデータに対するプリフェッチを指示します。name にはプログラム中で参照されて いるデータ(配列要素)を指定します。添字には、式も指定可能です。level={1|2} を指定するこ とにより、どのキャッシュレベルにデータをプリフェッチするかを指示します。デフォルトは、 level=1 です。なお、参照かつ定義されているデータに関しては、PREFETCH_WRITE を使用して ください。 !OCL PREFETCH_WRITE(name[,level={1|2}]) 定義されているデータに対するプリフェッチを指示します。name にはプログラム中で定義されて いるデータ(配列要素)を指定します。添字には、式も指定可能です。level={1|2} を指定するこ とにより、どのキャッシュレベルにデータをプリフェッチするかを指示します。デフォルトは、 level=1 です。 以下に、指定の例を示します。 例 1:A(INDX(I+16)) をプリフェッチする場合 DO I = 1,N !OCL PREFETCH_READ(A(INDX(I+16))) T = T + A(INDX(I)) END DO 例 2:INDX(I+32) および A(INDX(I+16)) をプリフェッチする場合 DO I = 1,N !OCL PREFETCH_READ(INDX(I+32)) !OCL PREFETCH_READ(A(INDX(I+16))) T = T + A(INDX(I)) END DO また、キャッシュ使用効率の関係上、コンパイラの自動プリフェッチ機能と排他制御したい場合 は、以下のように OCL を組み合わせることにより実現可能です。 例 3: !OCL DO !OCL !OCL !OCL NOPREFETCH I = 1,N,4 PREFETCH_READ(A(I+16)) PREFETCH_READ(C(I+16)) PREFETCH_WRITE(B(I+16)) B(I) = A(I) + C(I) B(I+1) = A(I+1) + C(I+1) B(I+2) = A(I+2) + C(I+2) B(I+3) = A(I+3) + C(I+3) END DO !OCL STRIPING[(m2)] ストライピングの最適化を行うことを指示します。ストライプ長(展開数)を m2 で指定するこ とができます。m2 は 1 から 100 までの値を指定することができます。m2 の値が省略された場合、 デフォルト値 2 が有効になります。ソースプログラムでループの回転数が既知の場合、m2 に回転 数を超える値を指定しても、コンパイラが自動的に決定した展開数が有効となります。 Fortran 使用手引書ー Page 269 以下に、指定の例を示します。 例 1: !OCL STRIPING DO I=1,N 文 END DO 文をストライプ長 2 で展開することを指示します。 例 2: !OCL STRIPING(4) DO I=1,N 文 END DO 文をストライプ長 4 で展開することを指示します。 例 3: !OCL STRIPING(8) DO I=1,4 文 END DO ループの回転数 (4) を超えるストライプ長 (8) を指定しているので、ストライプ長はコンパ イラが自動的に決定した展開数が有効となります。 例 4: !OCL STRIPING(4) SUBROUTINE SUB() : : DO I=1,N 文 END DO DO I=1,N 文 END DO プログラム単位の先頭に指定した場合、プログラム内のすべての DO ループが対象となりま す。 !OCL NOSTRIPING 指定されたループのストライピングの最適化を抑止することを指示します。 以下に、指定の例を示します。 例 1: !OCL NOSTRIPING DO I=1,N 文 END DO ストライピングの最適化を行いません。 Fortran 使用手引書ー Page 270 !OCL UNROLL(m3) DO 変数をもつ DO 構文の直前に記述し、ループアンローリングの展開数(多重度)を m3 で指定 します。m3 は 0 から 100 までの値を指定することができます。 m3 が 0 または 1 の場合は、ループアンローリングされません。 また、ソースプログラムでループの回転数が既知の場合は、m3 に回転数を超える値が指定されて も、ソースプログラムの回転数が優先されます。 この最適化制御行が指定されていないループの展開数(多重度)は、ループの回転数、ループ内 の実行文の数と種類および使用されているデータの型などから、コンパイラが最適と思われる値 を決めます。 以下に、指定の例を示します。 例 1: !OCL UNROLL(8) DO I=1,N 文 END DO 文を 8 重に展開することを指定しています。 例 2: !OCL UNROLL(1) DO I=1,N 文 END DO 文を 1 重に展開する、すなわち、ループアンローリングの最適化を行わないことを指定して います。 例 3: !OCL UNROLL(80) DO I=1,50 文 END DO ループの回転数(50)を超える展開数(80)を指定しているので、展開数は 50 とみなされます。 !OCL UNROLL('full') ループの展開数(多重度)に 'full' を指定した場合、ソースプログラムの回転数だけ実行文を展開 します。 以下に、指定の例を示します。 例 1: !OCL UNROLL('full') DO I=1,N 文 END DO 文をループの回転数と同じ N 重に展開することを指定しています。 Fortran 使用手引書ー Page 271 例 2: !OCL UNROLL('full') DO m=1,N DO l=1,N DO k=1,N DO j=1,N DO i=1,N 文 END DO END DO END DO END DO END DO 文を N*N*N*N*N 重に展開することを指定しています。 注)OCL が指定されたループを含め、すべての内側ループが展開されるので、翻訳時間が増 大する可能性があります。 9.12 プロファイル情報の利用 プログラムの実行状況を示す情報(プロファイル情報と呼びます)をいったんファイルに出力し て、それをコンパイラが参照しながら最適化することにより、より高速なオブジェクトモジュー ルを生成することができます。 プロファイル情報を利用した最適化は、以下の 2 段階を経て行われます。 【第 1 段階】プロファイル情報の生成 通常の翻訳時オプションのほかに、-Kpg を指定して翻訳します。 このオプションを指定して翻訳したプログラムを実行すると、特定のファイル(後述)にプロファ イル情報が生成されます。 【第 2 段階】プロファイル情報の使用 通常の翻訳時オプションのほかに、-Kpu を指定して翻訳します。 このオプションを指定して翻訳すると、第 1 段階で作成されたプロファイル情報を最適化に活か した、より高速なオブジェクトモジュールが得られます。 第 1 段階と第 2 段階は、一緒に行うことはできません。また、-Kpg と一緒に指定した翻訳時オプ ションと、-Kpu と一緒に指定した翻訳時オプションは、並び順も含めて一致しなければなりませ ん。異なる場合、メッセージが出力され翻訳が中断されます。以下に、プロファイル情報を利用 してロードモジュールを作成し、それを実行するまでのコマンドの例を示します。 % % % % frt sample.f -Kfast -Kpg a.out frt sample.f -Kfast -Kpu a.out 1. プロファイル情報を生成する準備 2. プロファイル情報を実際に生成 3. プロファイル情報を利用して最適化 4. 高速化されたロードモジュールの実行 1 および 2 が第 1 段階、3 が第 2 段階です。 プロファイル情報は、ソースプログラムの名前の後ろに ".d" を付加した名前のファイル(プロファ イル情報ファイル)に生成されます。すでにファイルがある場合は、累積する形で情報が書き込 まれます。そのとき、以前に作成したときと翻訳時オプションが一致しているかどうかが調べら れ、一致しない場合は実行が中断されます。 Fortran 使用手引書ー Page 272 以下に、三つの入力データについてプログラム実行し、プロファイル情報を累積するコマンドの 例を示します。これらは、すべて第 1 段階の作業です。 % % % % % % frt sample.f frt sample.f -Kfast -Kpg [rm sample.f.d] a.out < case1.data a.out < case2.data a.out < case3.data 最適化制御行で IF 文の条件の成立確率が指定されている場合、プロファイル情報が優先し、その 最適化制御行は無効になります。なお、分岐(IF 文など)がまったくないプログラムや最適化に より分岐がすべて削除された場合は、プロファイル情報ファイルは生成されませんし、参照もさ れません。 9.13 実行マシン属性の選択 オブジェクトモジュールが動作するマシンの属性を翻訳時オプションで指定することにより、そ のマシンに最も適したオブジェクトモジュールが出力され、より高速化することができます。 9.13.1 マシン属性の種類 マシンの属性としては、以下の 2 種類があります。 CPU の種類を示すもの これを指定する翻訳時オプションとして、-KSPARC64_GP/SPARC64_GP2/SPARC64VI/ ULTRA/ULTRA1/ULTRA2 があります。このオプションが指定されない場合は、-KULTRA2 が指 定されたものとみなされます。このオプションを指定することにより、各 CPU に適した命令スケ ジューリングが行われます。 SPARC アーキテクチャの世代を示すもの これを指定する翻訳時オプションとして、-KV8/V8PFMADD/V8PLUS/V9/V9FMADD があります。 このオプションが指定されない場合は、-KV8 が指定されたものとみなされます。 9.13.2 マシン属性の自動選択機能 翻訳時オプション -Kfast を指定することにより、マシンの属性をコンパイラに自動的に選択させ ることができます。 -Kfast が指定された場合、コンパイラは、コンパイラが動作しているマシンの属性を実行マシン の属性として採用します。すなわち、コンパイラは、-KSPARC64_GP/SPARC64_GP2/ SPARC64VI/ULTRA1/ULTRA2 および -KV8/V8PLUS からコンパイラが動作しているマシンに適し たオプションを自動的に選択します。 9.13.3 実行マシン属性の注意事項 -KV8PFMADD または -KV9FMADD が有効なときに、multiply add/subtract 浮動小数点演算命令が 生成されます。この命令は、実行性能を向上させますが、精度に影響を与えることがあります。 この命令を抑止するには、-KNOFMADD オプションを指定してください。 9.14 スタック割付けの影響 翻訳時オプション -Nautoobjstack または -Kauto を指定してスタックへの割付けを行った場合、次 のような影響があります。 Fortran 使用手引書ー Page 273 スタック領域の上限値がプログラムが使用するメモリ量より少なく設定されている場合、領域が 確保できなくなり、異常終了することがあります。その場合、スタック領域の上限値を大きくす る必要があります。 上限値を参照・変更するには csh ならば limit コマンド、sh ならば ulimit コマンドを使用して行う ことができます。また、NQS によりバッチリクエストとして実行する場合、対応するバッチキュー のスタック領域の上限値(Per-process stack size limit)を大きくする必要があります。 以下に各オプション指定による影響の例を示します。 例 1:-Nautoobjstack を指定した場合 % cat a.f90 subroutine sub(n) real(kind=8) :: a(n) a=1. print *,a(n) end call sub(2000000) end % limit stacksize stacksize 8192 kbytes % frt a.f90 ; a.out 1.000000000000000 % frt a.f90 -Nautoobjstack ; a.out セグメント例外(コアダンプしました) スタック領域が不足したため異常終了しました。 そこで、stacksize に unlimited を指定して、再度、翻訳を行います。 % limit stacksize unlimited % limit stacksize stacksize 制限なし % frt a.f90 -Nautoobjstack ; a.out 1.000000000000000 スタック領域を大きくしたことにより正常終了するようになりました。 例 2:-Kauto を指定した場合 % cat b.f90 real(kind=8) :: a(2000000) a=1. print *,a(1) end % limit stacksize stacksize 8192 kbytes % frt b.f90 ; a.out 1.000000000000000 % frt b.f90 -Kauto ; a.out セグメント例外 (コアダンプしました) % limit stacksize unlimited % limit stacksize stacksize 制限なし % frt b.f90 -Kauto ; a.out 1.000000000000000 Fortran 使用手引書ー Page 274 9.15 配列の形状を変更する機能の影響 翻訳時オプション -Karraypad_const[=N] または -Karraypad_expr=N で変更された配列の上限の増加 は、UBOUND 関数と SIZE 関数の結果にも反映されます。また、fdb コマンドや SUBCHK 機能に おいても、増加後の上限がソースプログラムに記述されていたかのように動作します。 翻訳時オプション -Karraypad_const[=N] および -Karraypad_expr=N を使用する場合、実行可能プロ グラムを構成するすべてのプログラム単位に対して同一のオプションを指定して翻訳しなければ なりません。 本機能は、個々の配列ごとに単独で適用され、EQUIVALENCE 文や COMMON 文による記憶列結 合や引数結合を考慮しません。そのため、本機能を使用することにより、正しくない結果が得ら れる場合もあるため注意が必要です。 以下に例を示します。 例 1: PROGRAM MAIN REAL,DIMENSION(1024*1024)::A CALL SUB(A,1024,1024) : SUBROUTINE SUB(X,M,N) REAL,DIMENSION(M,N)::X : このようなプログラムを -Karraypad_expr=1 オプションを指定して翻訳した場合、コンパイ ラは、以下のようなプログラムと見なして翻訳します。 PROGRAM MAIN REAL,DIMENSION(1024*1024+1)::A CALL SUB(A,1024,1024) : SUBROUTINE SUB(X,M,N) REAL,DIMENSION(M+1,N)::X : 本機能を使用しない場合、MAIN 側の A(1025) は、SUB 側の X(1,2) と結合しますが、使用する と A(1025) は、X(1025,1) と結合することになるので異なる結果が得られます。 例 2: INTEGER A(3,3),B(3,3) A(:,1)=B(1,:) A(:,2)=RESHAPE((/1,2,3/),(/3/)) このようなプログラムを -Karraypad_const=1 を指定して翻訳した場合、それぞれの代入文の 右辺と左辺の形状が異なってしまうため、これらの実行結果は保証されません。 9.16 strong prefetch 命令の影響 翻訳時オプション -Kprefetch_strong が有効な場合、strong prefetch 命令を生成します。プリフェッ チ処理は、機能特性上、対象配列の範囲外をアクセスするときがあり、場合によっては当該プロ セスが確保していない領域に及ぶことがあります。その際、通常の prefetch 命令が使用されてい る場合は、そのまま処理が続行されますが、strong prefetch 命令が使用されている場合は、エラー となり実行が中断されます。 Fortran 使用手引書ー Page 275 9.17 プリフェッチを実施したことによる実行性能への影響について 翻訳時オプション -Kprefetch[=level] が有効な場合、level に応じたプリフェッチが実施されますが、 ループのキャッシュ効率や IF 分岐の有無、添字の複雑さによっては、意図している効果が得られ ない場合があります。特に level=4 以上が有効な場合には、その現象が顕著に発生する可能性が高 くなります。また、-Kprefetch_infer が有効な場合においても同様の現象が発生する可能性があり ます。 9.18 配列宣言の次元移動 ここでは、配列宣言の次元移動について説明します。 9.18.1 配列宣言の次元移動の影響 翻訳時オプション -Karray_subscript で配列の次元位置を移動します。移動することにより、組込 み関数の引数キーワードに DIM および MASK が指定可能な組込み関数および形状をもつ組込み 関数に影響があります。 翻訳時オプション -Karray_subscript を使用する場合は、実行可能プログラムを構成するすべての プログラム単位に対して同一のオプションを指定して翻訳しなければなりません。対象とする配 列変数は、割付け配列および上下限が定数式な形状明示配列(局所的な配列、共通ブロック実体 および仮引数)です。 本機能は、宣言式内および宣言部分の定数式には適用されません。個々の配列ごとに単独で適用 され、引数結合を考慮しません。そのため、本機能を使用することにより、正しくない結果が得 られる場合もあるため注意が必要です。 以下に例を示します。 例 1: INTEGER,DIMENSION(101,102,103,5)::A CALL SUB(A) : PRINT *,A(1,2,3,4) このようなプログラムを -Karray_subscript オプションを指定して翻訳した場合、コンパイ ラは、以下のようなプログラムと見なして翻訳します。 INTEGER,DIMENSION(5,101,102,103)::A CALL SUB(A) : PRINT *,A(4,1,2,3) 例 2: PROGRAM MAIN INTEGER,DIMENSION(100,101,102,3) :: A : CALL SUB(A) END SUBROUTINE SUB(B) INTEGER,DIMENSION(100) :: B : END Fortran 使用手引書ー Page 276 本機能を使用した場合、MAIN 側の手続 SUB の引数は、A(3,100,101,102) の配列と SUB 側の引 数 B(100) と結合しますが、使用すると配列の次元数が異なるため、結果が正しく得られない ことがあります。 例 3: INTEGER , DIMENSION(1,2,3,4) :: A : A=RESHAPE((/(i,i=1,24/),(/1,2,3,4/)) ! 代入の右辺と左辺の形状が異なり、実行結果は保証されません。 PRINT *,UBOUND(A,4) ! 3 が出力される。 9.18.2 配列宣言の次元移動の対象変数の制約事項 制約となる配列変数は、SAVE 属性、TARGET 属性、初期値、結合実体、名前付き定数、自動割 付け配列、構造型、文字型、モジュール内で宣言した変数、アドレス保持変数、ポインタ変数、 変数群要素および関数結果です。 9.19 配列変数マージ ここでは、配列宣言のマージについて説明します。 9.19.1 配列変数マージの影響 翻訳時オプション -Karray_merge で複数の配列を一つの配列にマージします。 対象とする配列変数は、上下限が定数式な形状明示配列です。本機能は、宣言式内および宣言部 分の定数式には適用されません。コンパイラが自動的に 1 次元目の要素を追加し、要素をマージ します。マージの順番は不定です。配列名の引用を形状をもつ配列要素に置き換える、および次 元数が1次元増えるため翻訳にエラー、もしくは意図した結果にならないことがあるため注意が 必要です。個々の配列ごとに単独で適用され、引数結合を考慮しません。そのため、本機能を使 用することにより、正しくない結果が得られる場合もあるため注意が必要です。 以下に例を示します。 例 1: INTEGER,DIMENSION(101,102,103)::A,B,C CALL SUB(A) : PRINT *,B(101,102,103) A=C A(101,102,103)=C(1,2,3) このようなプログラムを -Karray_merge オプションを指定して翻訳した場合、コンパイラは、 以下のようなプログラムと見なして翻訳します。 INTEGER,DIMENSION(3,101,102,103)::TMP ! A を 1 次元目の 1 要素にマージ :TMP(1,101,102,103) ! B を 1 次元目の 2 要素にマージ :TMP(2,101,102,103) ! C を 1 次元目の 3 要素にマージ :TMP(3,101,102,103) CALL SUB(TMP(1,:,:,:)) ! 配列名を形状をもつ配列要素に変更 : PRINT *,TMP(2,101,102,103) TMP(1,:,:,:) = TMP(3,:,:,:) TMP(1,101,102,103)=TMP(3,1,2,3) Fortran 使用手引書ー Page 277 注)TMP は、コンパイラで生成した変数です。 例 2: PROGRAM MAIN INTEGER,DIMENSION(100,101,102) :: A,B : CALL SUB(A(1,1,1)) END SUBROUTINE SUB(C) INTEGER,DIMENSION(100) :: C : END 本機能を使用した場合、MAIN 側の手続 SUB の引数は、A が1次元目に要素を追加した生成変 数に変更するため、SUB 側の引数 C(100) との結合が正しく得られないことがあります。 翻訳時オプション -Karray_merge_common で共通ブロック実体の配列をマージします。 対象とする配列変数は、上下限が定数式な形状明示配列であり、共通ブロック名が指定されて配 列の大きさが同じものを対象とします。この場合に共通ブロック名を作成します。_0_+ 共通ブ ロック名を作成します。 共通ブロック実体は、すべて同じ配列の大きさでなければなりません。本機能は、宣言式内およ び宣言部分の定数式には適用されません。コンパイラが自動的に 1 次元目の要素を追加し、要素 をマージします。マージの順番は不定です。配列名の引用を形状をもつ配列要素に置き換える、 および次元数が1次元増えるため翻訳にエラー、もしくは意図した結果にならないことがあるた め注意が必要です。個々の配列ごとに単独で適用され、引数結合を考慮しません。そのため、本 機能を使用することにより、正しくない結果が得られる場合もあるため注意が必要です。 以下に例を示します。 例 1: INTEGER,DIMENSION(101,102,103)::A,B,C COMMON /COM/ A,B,C CALL SUB(A) : PRINT *,B(101,102,103) このようなプログラムを -Karray_merge_common オプションを指定して翻訳した場合、コンパ イラは、以下のようなプログラムと見なして翻訳します。 INTEGER,DIMENSION(3,101,102,103)::TMP COMMON /_0_COM/ TMP CALL SUB(TMP(1,:,:,:)) ! 配列名を形状をもつ配列要素に変更 : PRINT *,TMP(2,101,102,103) 注)TMP は、コンパイラで生成した変数です。 9.19.2 局所的な配列変数マージの対象変数の制約事項 制約となる配列変数は、共通ブロック実体、結合実体、仮引数、SAVE 属性、TARGET 属性、 THREADPRIVATE 属性、初期値、自動割付け配列、構造型、文字型、名前付き定数、モジュール 内で宣言した変数、アドレス保持変数、ポインタ変数、変数群要素および関数結果です。 Fortran 使用手引書ー Page 278 9.19.3 共通ブロック実体の配列変数マージの対象変数の制約事項 制約となる配列変数は、OpenMP Fortran 仕様のディレクティブを含むプログラム単位、結合実体、 TARGET 属性、初期値、自動割付け配列、構造型、文字型および変数群要素です。 9.20 memcpy(3C) および memset(3C) 関数への変換を実施したことによる影響 翻訳時オプション -Kbcopy が有効な場合、memcpy(3C) および memset(3C) 関数への変換が行われ ますが、本機能は、スレッド並列かつ配列のサイズがキャッシュより大きい場合に性能向上が期 待できます。その他の場合には、性能が低下することがありますので注意が必要です。 9.21 マルチ演算関数の呼出しについて マルチ演算関数とは、1 回の呼出しで複数の引数に対する同種の組込み関数計算および演算を行 うことにより、実行性能を向上させた関数です。本システムでは、翻訳時オプション -Kmfunc ま たは最適化制御行 mfunc を指定することにより、コンパイラがループを解析し、可能ならばマル チ演算関数に置き換えます。 複雑なループなどコンパイラが解析できない場合のために、ユーザプログラムからマルチ演算関 数を直接 CALL して利用することもできます。 以下の注意が必要です。 - サイズを指定する引数 n は、32 ビットモードの場合は 4 バイトの整数型、64 ビットモードの 場合は 8 バイトの整数型にしてください。 - マルチ演算関数の外部手続名は、C 言語の外部手続名になっています。このため、Fortran プ ログラムから呼び出す場合は、$pragma 指定子で、外部手続名の加工方法を変更してください。 表 9.2 にユーザプログラムから直接呼び出すことができるマルチ演算関数を示します。 表 9.2 ユーザプログラムから直接呼び出すことができるマルチ演算関数一覧 関数/演算 EXP LOG SIN COS 引数の型 real(4) 呼出し形式 v_exp(x,n,y) 計算内容 y(i) = exp(x(i)) real(8) v_dexp(x,n,y) y(i) = dexp(x(i)) real(4) v_log(x,n,y) y(i) = log(x(i)) real(8) v_dlog(x,n,y) y(i) = dlog(x(i)) real(4) v_sin(x,n,y) y(i) = sin(x(i)) real(8) v_dsin(x,n,y) y(i) = dsin(x(i)) real(4) v_cos(x,n,y) y(i) = cos(x(i)) real(8) v_dcos(x,n,y) y(i) = dcos(x(i)) real(4) v_scn(x,n,y) y(i) = sin(x(i)) z(i) = cos(x(i)) real(8) v_dscn(x,n,y) y(i) = dsin(x(i)) z(i) = dcos(x(i)) real(8) v_adxd(x1,x2,n,y) y(i) = x1(i)**x2(i) real(8) v_adxd1(x,a,n,y) y(i) = x(i)**a SIN & COS べき乗演算 Fortran 使用手引書ー Page 279 以下にマルチ演算関数を呼出し例を示します。 例 1: INTEGER,PARAMETER :: N=1000 REAL(KIND=8) :: A REAL(KIND=8),DIMENSION(N) :: X,Y,Z : A = 0.2D0 DO I=1,N Y(I) = DEXP(X(I)) Z(I) = X(i)**A END DO 64 ビットモードの場合 INTEGER(KIND=8),PARAMETER :: N=1000 REAL(KIND=8) :: A REAL(KIND=8),DIMENSION(N) :: X,Y,Z EXTERNAL V_DEXP !$PRAGMA C(V_DEXP) EXTERNAL V_ADXD1 !$PRAGMA C(V_ADXD1) : A = 0.2D0 CALL V_DEXP(X,N,Y) CALL V_ADXD1(X,A,N,Z) 32 ビットモードの場合 INTEGER,PARAMETER :: N=1000 REAL(KIND=8) :: A REAL(KIND=8),DIMENSION(N) :: X,Y,Z EXTERNAL V_DEXP !$PRAGMA C(V_DEXP) EXTERNAL V_ADXD1 !$PRAGMA C(V_ADXD1) : A = 0.2D0 CALL V_DEXP(X,N,Y) CALL V_ADXD1(X,A,N,Z) 例 2: IF 構文の中で関数が呼ばれている場合、計算すべき要素だけを配列に格納することにより、 マルチ演算関数を使用することができます。 INTEGER,PARAMETER :: N=1000 REAL(KIND=8) :: X,Y,Z REAL(KIND=8),EXTERNAL :: FUNC : DO I=1,N X = .. IF (X.GT.A) THEN Y = Y + SIN(X) Z = Z + COS(X) END IF END DO Fortran 使用手引書ー Page 280 64 ビットモードの場合 INTEGER,PARAMETER :: N=1000 INTEGER(KIND=8) :: J REAL(KIND=8) :: X,Y,Z REAL(KIND=8),DIMENSION(N) :: WX,WY,WZ EXTERNAL V_DSCN !$PRAGMA C(V_DSCN) : J = 0 DO I=1,N X = .. IF (X.GT.A) THEN J = J + 1 WX(J) = X END IF END DO CALL V_DSCN(WX,J,WY,WZ) DO I=1,J Y = Y + WY(I) Z = Z + WZ(I) END DO 32 ビットモードの場合 INTEGER,PARAMETER :: N=1000 INTEGER :: J REAL(KIND=8) :: X,Y,Z REAL(KIND=8),DIMENSION(N) :: WX,WY,WZ EXTERNAL V_DSCN !$PRAGMA C(V_DSCN) : J = 0 DO I=1,N X = .. IF (X.GT.A) THEN J = J + 1 WX(J) = X END IF END DO CALL V_DSCN(WX,J,WY,WZ) DO I=1,J Y = Y + WY(I) Z = Z + WZ(I) END DO 第10章 モジュールおよびモジュール引用の注 意事項 モジュール名を指定した USE 文を、モジュール引用といいます。 ここでは、モジュールおよびモジュール引用が存在する入力ファイルを翻訳するための注意事項 について説明します。 10.1 モジュールおよびモジュール引用の翻訳方法 翻訳時オプション -Am(“2.2 翻訳時オプション”参照)を指定することにより、モジュールお よびモジュール引用が存在するファイルを翻訳することができます。その処理は、以下のように なります。 a) モジュールに対するオブジェクトは、 カレントディレクトリにファイル名 .o で作成されます。 b) モジュールに対する翻訳中間情報ファイルは、モジュール名 .mod で以下のディレクトリに作 成されます。 - 翻訳時オプション -Mdirectory で指定したディレクトリ - 翻訳時オプション -Mdirectory を省略した場合は、カレントディレクトリ c) モジュールに対する翻訳中間情報ファイルは、以下の順で検索されます。 - 翻訳時オプション -Mdirectory で指定したディレクトリ - カレントディレクトリ - 翻訳時オプション -Idirectory で指定したディレクトリ 結合編集時にモジュールに対するオブジェクトファイルを明示的に指定する必要があります。 モジュールとそのモジュール引用が同じファイルに存在し、モジュールがそのモジュール引用よ り前に記述された場合は、モジュールを引用するための翻訳時オプションを指定する必要はあり ません。この場合、モジュールに対する翻訳中間情報ファイルは作成されません。 例 1:モジュールがそのモジュール引用より前に記述された場合 ファイル名 : a.f90 module mod integer :: value = 1 end module program main use mod print *,value end program 翻訳コマンド % frt a.f90 Fortran 使用手引書ー Page 282 以下のどちらかの条件の場合、翻訳時オプション -Am(“2.2 翻訳時オプション”参照)を指定 する必要があります。 - モジュールとそのモジュール引用が同じファイルに存在し、モジュールがそのモジュール引 用よりあとに記述されている。 - モジュールとそのモジュール引用が異なるファイルに存在する。 例 2:モジュールがそのモジュール引用よりあとに記述された場合 ファイル名 : a.f90 program main use mod print *,value end program module mod integer :: value = 1 end module 翻訳コマンド % frt a.f90 -Am 例 3:異なるファイルにモジュールとモジュール引用が記述された場合 1 ファイル名 : a.f90 module mod integer :: value = 1 end module ファイル名 : b.f90 program main use mod print *,value end program 翻訳コマンド % frt a.f90 -Am -c % frt b.f90 a.o -Am または % frt a.f90 -Am -c % frt b.f90 -Am -c % frt a.o b.o 例 4:異なるファイルにモジュールとモジュール引用が記述された場合 2 ファイル名 00000: a.f90 module mod integer :: value = 1 end module ファイル名 : b.f90 program main use mod value = value + 1 call external_sub end program Fortran 使用手引書ー Page 283 ファイル名 : c.f90 subroutine external_sub use mod print *,value end subroutine 翻訳コマンド % frt a.f90 -Am -c % frt b.f90 -Am -c % frt c.f90 a.o b.o -Am または % % % % frt frt frt frt a.f90 -Am -c b.f90 -Am -c c.f90 -Am -c a.o b.o c.o 例 5:翻訳時オプション -Am、-I および -M の指定 ファイル名 : a.f90 module mod1 integer :: value = 1 end module ファイル名 : b.f90 module mod2 use mod1 integer :: value2 = 2 contains subroutine mod2_sub value = value2 + 1 end subroutine end module 翻訳コマンド % frt a.f90 -Am -c モジュール mod1 のためのモジュール情報ファイル mod1.mod は、カレントディレクトリ に生成されます。 % frt a.f90 -Am -c -M directory モジュール mod1 のためのモジュール情報ファイル mod1.mod は、翻訳時オプション -M で指定したディレクトリに生成されます。 % frt b.f90 -Am -c -I directory 1) モジュール mod1 のためのモジュール情報ファイル mod1.mod は、翻訳時オプション -I で指定したディレクトリおよびカレントディレクトリが検索されます。 2) モジュール mod2 のためのモジュール情報ファイル mod2.mod は、カレントディレク トリに生成されます。 % frt b.f90 -Am -c -I input_directory -M output_directory 1) モジュール mod1 のためのモジュール情報ファイル mod1.mod は、翻訳時オプション -M および -I で指定したディレクトリおよびカレントディレクトリが検索されます。 2) モジュール mod2 のためのモジュール情報ファイル mod2.mod は、翻訳時オプション -M で指定したディレクトリに生成されます。 Fortran 使用手引書ー Page 284 例 6:翻訳時オプション -Am の指定 ファイル名 : a.f90 module mod integer :: value = 1 end module ファイル名 : b.f90 program main use mod value = value + 1 call external_sub end program ファイル名 : c.f90 subroutine external_sub use mod print *,value end subroutine 翻訳コマンド % frt a.f90 -Am -c : a.o および mod.mod が生成されます。 翻訳コマンド % frt a.f90 -Am : プログラムがないため、a.out は、生成されません。 翻訳コマンド % frt a.f90 b.f90 c.f90 -Am : a.o、b.o、c.o、mod.mod および a.out が生成されます。 10.2 モジュールの更新とモジュール引用プログラムの再翻訳 以下のどちらかの場合、モジュール引用を記述しているプログラム単位も再翻訳しなければなり ません。 - モジュールの宣言部の PUBLIC 属性をもつ要素を更新した場合 - PUBLIC 属性をもつモジュール副プログラムの手続の特性を変更した場合 10.3 モジュールと制限事項 モジュールおよびモジュール引用において、以下の翻訳時オプションは、同じでなければなりま せん。 - - - - - -Xf6、-Xf7、-X6、-X7 または -X9 オプション -AA オプション -AU オプション -Kcommonpad オプション -Karray_subscript オプション 第 11 章 言語間結合 この章では、Fortran とほかの言語を結合する場合の仕様および注意事項について説明します。 11.1 言語間結合のための仕様 本システムでは、言語間結合をするために、以下の拡張言語仕様を提供しています。 - - - - 組込み関数 VAL、実引数の %VAL 指定 VALUE 文、VALUE 属性指定子 CHANGEENTRY 文 $pragma 指定子 また、翻訳時オプションとして以下の機能を提供しています。 - 外部手続名の加工方法を変更する翻訳時オプション -ml、-mldefault(“11.2 外部名の加工” 参照) - 文字型の引数の値の渡し方を変更する翻訳時オプション -Az(“11.4.1 文字型の引数の受渡 し”参照) 11.1.1 引数の値渡し 本システムでは、外部手続引用の実引数は、通常、アドレス渡しとなります( “11.4 引数の受渡 し”参照) 。この実引数を値渡しにしたい場合に、組込み関数 VAL または %VAL を用います。 VAL は翻訳時オプション -Nobsfun が有効な場合に、組込み関数となります。 組込み関数 VAL および %VAL は、外部手続引用の実引数だけに指定することができます。値渡 しとする実引数は、1 バイトの整数型、2 バイトの整数型、4 バイトの整数型、1 バイトの論理型、 2 バイトの論理型、4 バイトの論理型、実数型または倍精度実数型のスカラ式でなければなりませ ん。以下に組込み関数 VAL の例を示します。 例:組込み関数 VAL external csub call csub(val(2),3) end ! 第 1 引数は値渡し、第 2 引数はアドレス渡しとなります 11.1.2 引数の値受取り 本システムでは、外部手続の仮引数は、通常、アドレス受取りとなります( “11.4 引数の受渡し” 参照)。この仮引数を値受取りにしたい場合に、仮引数に VALUE 属性を指定します。VALUE 属 性は VALUE 文または型宣言文の VALUE 属性指定子で指定することができます。 値受取りとする仮引数は、1 バイトの整数型、2 バイトの整数型、4 バイトの整数型、1 バイトの 論理型、2 バイトの論理型、4 バイトの論理型、実数型または倍精度実数型のスカラ変数名でなけ ればなりません。以下に VALUE 文の例を示します。 Fortran 使用手引書ー Page 286 例:VALUE 文 subroutine csub(i,k) value :: i ! 第 1 引数は値受取り、第 2 引数はアドレス受取りとなります print *, i,k end 11.1.3 CHANGEENTRY 文 CHANGEENTRY 文は、翻訳時オプション -ml との組合せで、外部手続名の加工方法を変更しま す。外部手続名の加工方法の変更の詳細については、 “11.2 外部名の加工”を参照してください。 例:CHANGEENTRY 文 changeentry :: csub call csub( ) end 11.1.4 $pragma 指定子 $pragma 指定子は、以下の形式で、注釈の記述個所に指定できます。 !$pragma c (prc) prc は、外部手続名でなければなりません。$pragma 指定子は、prc に指定された手続が C 言語で 記述された手続であることを指定し、外部手続名の加工方法を変更します。外部手続名の加工方 法の変更の詳細については、 “11.2 外部名の加工”を参照してください。 例:$pragma 指定子 external csub : call csub end !$pragma c(csub) ! csub は、C 言語で記述された手続の呼出しとして扱われます。 11.2 外部名の加工 オブジェクトの外部名は、原始プログラムで記述した手続名を加工して出力されます。他言語で Fortran の手続名を参照する場合は、Fortran と同じ規則で加工した名前を原始プログラムに記述す る必要があります。 表 11.1 に、Fortran の手続名の加工方法を示します。 表 11.1 Fortran の手続名の加工方法 手続名 主プログラム名 加工名 MAIN__ 外部手続名 外部手続名 _ 組込み関数名 f_ 組込み関数名 g_ 組込み関数名 pv_ 組込み関数名 v_ 組込み関数名 vm_ 組込み関数名 Fortran 使用手引書ー Page 287 手続名 加工名 BLOCK DATA 文に名 前の指定がある場合 初期値設定 プログラム単位 BLOCK DATA 文に名 前の指定がない場合 初期値設定プログラム単位名 _ _BLKDT__ スタートアップルーチン名 main 備考 1. 翻訳時オプション -AU が指定されていない場合、外部手続および名前の指定がある初期値 設定プログラム単位の加工名はすべて小文字に統一されます。 備考 2.スタートアップルーチンは、Fortran を起動するルーチンです。 注意 . jwe_ で始まる外部名は、本システムで使用するため、外部手続の名前として使用しないで ください。 翻訳時オプション -AU が指定された場合の外部名は原始プログラムで指定したつづりになりま す。 外部手続名の加工方法は、翻訳時オプション -mldefault の指定により変更することができます。翻 訳時オプション -mldefault の指定は、CHANGEENTRY 文および $pragma 指定子に指定された手続 を除くすべての外部手続名に対して有効になります。表 11.2 に -mldefault オプション指定時の外 部名の加工方法を示します。 表 11.2 翻訳時オプション -mldefault の指定と外部名の加工方法 翻訳時オプション -mldefault の指定 外部名の加工方法 -mldefault=cdecl 外部手続名 -mldefault=frt または -mldefault 指定なし 外部手続名 _ CHANGEENTRY 文に指定された手続の外部名の加工方法は、翻訳時オプション -ml の指定により 異なります。表 11.3 に CHANGEENTRY 文に指定された手続の外部名の加工方法を示します。 表 11.3 CHANGEENTRY 文に指定された手続の外部名の加工方法 翻訳時オプション -ml の指定 外部名の加工方法 -ml=cdecl 外部手続名 -ml=frt 外部手続名 _ -ml 指定なし -mldefault オプションの指定に従います 表 11.4 に $pragma 指定子に指定された手続の外部名の加工方法を示します。 表 11.4 $pragma 指定子に指定された手続の外部名の加工方法 $pragma 指定子の指定 c(prc) 外部名の加工方法 外部手続名 11.3 関数値の受渡し 翻訳時オプション -KV8 が有効な場合、複素数型、倍精度複素数型および 4 倍精度複素数型の関 数値の返却は、実引数域を使用します。この場合、結果域の番地を第 1 引数で受渡し、実際の引 数は、第 2 引数以降で受け渡されます。 Fortran 使用手引書ー Page 288 文字型の関数値の返却は、実引数域を使用します。この場合、結果域の番地を第 1 引数、結果域 の長さを第 2 引数でそれぞれ受渡し、実際の引数は第 3 引数以降で受け渡されます。 11.4 引数の受渡し 手続間の引数の受渡しは、標準ではアドレス渡しとなります。Fortran から値渡しをする場合は、 実引数に組込み関数 VAL または %VAL(“11.1.1 引数の値渡し”参照)を指定してください。 Fortran で値受取りとする場合は、仮引数に VALUE 属性(“11.1.2 引数の値受取り”参照)を指 定してください。 11.4.1 文字型の引数の受渡し 文字型の引数を受け渡す場合は、引数長も実引数として渡します。引数長を表す実引数は、指定 されたすべての引数の後ろに、文字型の引数の個数分だけ存在します。 また、Fortran の文字列の末尾には、\0(ヌル文字)は設定されていません。文字列の末尾に、\0 (ヌル文字)を追加して渡したい場合、以下のどちらかの対応が必要です。 - Fortran の定数の末尾に \0(ヌル文字)を追加する。 - 翻訳時オプション -Az を指定する。(引数に文字定数を指定した場合) 11.4.2 翻訳時オプション -Az の注意事項 翻訳時オプション -Az を指定することにより、FORTRAN77 以前の仕様で記述されたプログラム で一部動作が保証されません。 例:-Az call sub('12') end subroutine sub(i) integer(4) i if (i.ne.'12') print *,'ok' end 上記プログラムの call 文は、以下のように変更してください。 call sub('12 ') 11.5 外部変数によるデータの受渡し Fortran の共通ブロック名の外部名は、以下の変換規則によって変換されます。 共通ブロックの指定 外部名 名前付き共通ブロック 共通ブロック名 _ 無名共通ブロック _BLNK__ 共通ブロック名のつづりは、翻訳時オプション -AU が指定されていない場合は小文字です。翻訳 時オプション -AU が指定されている場合、原始プログラムに記述したつづりとなります。 11.6 データ属性の対応 Fortran プログラムと他言語のプログラムとの間でデータを受け渡す場合は、データ属性の対応を とる必要があります。Fortran データの内部表現については、“5.1 データの表現”を参照して下 さい。 Fortran 使用手引書ー Page 289 11.7 Fortran プログラムの制御 Fortran プログラムの実行は、Fortran ライブラリのスタートアップルーチン(main)が呼び出され、 main ルーチンからユーザプログラム MAIN__ が呼び出されます。このため、最初に制御を渡すプ ログラムが Fortran 以外の言語で記述されている場合、以下の注意が必要です。 - 最初に制御が渡るプログラムの関数名は MAIN__ でなければなりません。 - main という関数名は、使用してはいけません。 11.8 C プログラムとの結合 ここでは、Fortran プログラムと C プログラムを結合して一つのプログラムを作成する方法および 注意事項について説明します。 11.8.1 結合方法の概要 Fortran プログラムと C プログラムを静的に結合して実行することができます。 以下の図に、Fortran プログラムと C プログラムを翻訳して結合させる方法を示します。 Fortran 原始プログラム Fortran コンパイラ frt(1) C 原始プログラム C コンパイラ C オブジェクト プログラム Fortran オブジェクト プログラム 各種 ライブラリ リンカ 実行可能 プログラム 実行時 データ 実行 標準出力および 診断メッセージ Fortran 使用手引書ー Page 290 11.8.2 手続の呼出し Fortran から C の手続を呼び出す場合、または C から Fortran の手続を呼び出す場合には、手続名 の加工方法を同じにする必要があります。Fortran の手続名の加工方法については、 “11.2 外部名 の加工”を参照してください。 以下に手続呼出しの例を示します。 例:Fortran プログラムから C の関数を呼び出す場合 Fortran プログラム: EXTERNAL SUB CALL SUB( ) END C プログラム: void sub_( ) { printf ("%s\n","** sub **"); } Fortran の手続呼出し SUB は、外部名の加工により sub_ となるため、C の関数名は、sub_ を 使用します。 例:C プログラムから Fortran の手続を呼び出す例 C プログラム: void sub( ); c_( ) { sub( ); } Fortran プログラム: SUBROUTINE SUB( ) CHANGEENTRY :: SUB PRINT *,'** SUB **' END Fortran のサブルーチン SUB の外部名の加工方法を C に合わせるため、手続名を CHANGEENTRY 文に指定し、翻訳時オプション -ml=cdecl を指定して翻訳します。 11.8.2.1 C のプログラムに最初に制御を渡す方法 最初に制御が渡るプログラムが C で記述される場合、その関数名は MAIN__ でなければなりませ ん。また、main は、存在してはいけません。 例:C のプログラムに最初に制御を渡す例 C プログラム: void sub_( ); MAIN__( ) { sub_( ); } Fortran 使用手引書ー Page 291 11.8.2.2 C の標準ライブラリを呼び出す方法 Fortran から C の標準ライブラリを呼び出す場合、以下の方法があります。 - Fortran から直接呼び出す方法 この場合、Fortran プログラム中で呼び出す C の標準ライブラリを CHANGEENTRY 文に指定 し、-ml=cdecl オプションを指定して翻訳する必要があります( “11.2 外部名の加工”参照)。 また、Fortran と C では引数の受渡し方法が違うので注意が必要です。 (“11.4 引数の受渡し” および“11.8.3.2 引数によるデータの受渡し”参照) 。 例:C の標準ライブラリの呼出し Fortran プログラム:a.f95 integer :: strcmp changeentry :: strcmp character(LEN=5) :: st1,st2 st1 = 'ABCD\0' ; st2 = 'ABCD\0' if (strcmp(st1,st2)==0) print *," same string " end 翻訳および実行: % frt a.f95 -ml=cdecl % a.out same string % - C のユーザ関数から間接的に呼び出す方法 この場合、 Fortran プログラム中で呼び出す C の標準ライブラリを意識する必要はありません。 11.8.3 データの受渡し ここでは、C プログラムと Fortran プログラムとの間でデータの受け渡しを行う方法を、以下の項 目について説明します。 - - - - 関数値によるデータの受渡し(“11.8.3.1 関数値によるデータの受渡し”参照) 引数によるデータの受渡し( “11.8.3.2 引数によるデータの受渡し”参照) 外部変数によるデータの受渡し(“11.8.3.3 外部変数によるデータの受渡し”参照) ファイルによるデータの受渡し(“11.8.3.4 ファイルによるデータの受渡し”参照) 11.8.3.1 関数値によるデータの受渡し ここでは、C プログラムと Fortran プログラムとの間での、関数値によるデータの受渡しについて 説明します。 Fortran 使用手引書ー Page 292 11.8.3.1.1 C での Fortran の関数値の受取り Fortran の関数値と、C でのその呼出しおよび受取り方法を以下の表に示します。 Fortran が返却する関数値 C 側の受取り方 C から Fortran を呼び出す例 INTEGER(1) INTEGER(2) INTEGER(4) INTEGER(8) REAL(4) REAL(8) REAL(16) LOGICAL(1) LOGICAL(2) LOGICAL(4) LOGICAL(8) signed char short int int long long int float double long double unsigned char short int int long long int res = sub_( ); COMPLEX(4) COMPLEX(8) COMPLEX(16) void または構造体 void または構造体 void または構造体 sub_(&res); または res = sub_();(注) CHARACTER void sub_(&res,len); 構造型 構造体 res = sub_( ); : 呼び出す Fortran の手続名。 関数値の返却域。対応する型については、 “11.8.3.5 C とのデータ属性の対応”を参照 してください。 : 関数値の文字長。 sub_ res len 注) 翻訳時オプション -KV8 が有効な場合は、第一引数に設定されます。翻訳時オプション -KV9 が有効な場合は、関数値に設定されます。 例 1:整数型関数値の受取り C プログラム: int ifun_( ); int i; i = ifun_( ); Fortran プログラム: FUNCTION IFUN( ) INTEGER IFUN IFUN = 100 END 例 2:倍精度実数型関数値の受取り C プログラム: double r8fun_( ); double r8; r8 = r8fun_( ); Fortran プログラム: FUNCTION R8FUN( ) REAL(8) R8FUN R8FUN = 12.2D+0 END Fortran 使用手引書ー Page 293 例 3:文字型関数値の受取り C プログラム: void cfun_( ); char cha[10]; cfun_(cha,10); Fortran プログラム: FUNCTION CFUN( ) CHARACTER (LEN=*) CFUN CFUN = "1234567890" END 文字型関数 CFUN の関数値を受け取るには、結果値の返却域の番地を第 1 引数に設定して、関 数値の長さを第 2 引数に設定します。 例 4:構造型関数値の受取り C プログラム: struct tag { int i; double fr8; } d,dfun_( ); d = dfun_( ); Fortran プログラム: FUNCTION DFUN( ) TYPE TAG INTEGER(4) I REAL(8) FR8 END TYPE TYPE (TAG)::DFUN DFUN%I = 10 DFUN%FR8 = 1.2D+0 END 11.8.3.1.2 Fortran での C の関数値の受取り C の関数値と、Fortran でのその呼出しおよび受取り方法を以下の表に示します。 C が返却する関数値 Fortran 側の受取り方 Fortran から C を呼び出す例 void CALL SUB( ) signed char short int int long long int float double long double 受け取らない INTEGER(1) INTEGER(2) INTEGER(4) または LOGICAL(4) INTEGER(8) REAL(4) REAL(8) REAL(16) char 受取り不可能 -- 構造体 構造型 RES = SUB( ) RES = SUB( ) SUB :呼び出す C の関数名。加工名については“11.2 外部名の加工”を参照してください。 RES :関数値の返却域。対応する型については、“11.8.3.5 C とのデータ属性の対応”を参照し てください。 -:存在しません。 Fortran 使用手引書ー Page 294 例 1:整数型関数値の受取り Fortran プログラム: INTEGER(4) I,IFUN I = IFUN( ) PRINT *,I END C プログラム: long int ifun_( ) { return 100; } 例 2:構造型関数値の受取り Fortran プログラム: TYPE TAG INTEGER(4) I REAL(8) FR8 END TYPE TYPE (TAG) :: DFUN,D D = DFUN() PRINT *,D%I,D%FR8 END C プログラム: struct tag { long int i; double fr8; } ; struct tag dfun_() { struct tag d; d.i = 100; d.fr8 = 1.2; return(d); } 11.8.3.2 引数によるデータの受渡し ここでは、引数によってデータの受け渡しを行う方法について説明します。 文字型の引数を受け渡す場合は実際の引数の後に引数長も実引数として渡します。詳細について は、 “11.4.1 文字型の引数の受渡し”を参照してください。 11.8.3.2.1 Fortran から C への引数の受渡し Fortran は、標準では実引数はアドレス渡しのため、C で仮引数を宣言する場合にはアドレスを受 け取るようにします。Fortran の実引数を値渡しにする場合は、組込み関数 VAL または %VAL を 実引数に指定します。これらについては、 “11.1.1 引数の値渡し”および“11.4 引数の受渡し” を参照してください。 Fortran 使用手引書ー Page 295 例:整数型、実数型引数の受渡し Fortran プログラム(主プログラム): PROGRAM FORTRAN_MAIN WRITE (*,*) " *** START *** " J = 10 K = 20 L = 30 CALL FUN1(J,K,L) F = 10.0 CALL FUN2(F) WRITE (*,*) " *** FMAIN END *** " END C プログラム: void fun1_(j,k,l) int *j,*k,*l; { printf ("J:%d K:%d L:%d \n",*j,*k,*l) ; } void fun2_(f) float *f; { printf("F:%f\n",*f) ; } 11.8.3.2.2 C から Fortran への引数の受渡し Fortran は、標準では仮引数はアドレス受取りのため、C で実引数を記述する場合にはアドレスを 渡すようにします。Fortran の仮引数を値受取りとする場合は、仮引数に VALUE 属性を指定しま す。これらについては、“11.1.2 引数の値受取り”および“11.4 引数の受渡し”を参照してく ださい。 例 1:整数型引数の受渡し C プログラム(MAIN__): MAIN__( ) { int fun_( ); int i,j,k; i = 10; j = 20; k = fun_(&i,&j); printf(" k:%d\n",k); } Fortran プログラム: INTEGER FUNCTION FUN(X,Y) INTEGER(4) X,Y WRITE(*,*) " *** FUN *** " FUN = X+Y END Fortran 使用手引書ー Page 296 例 2:文字型引数の受渡し C プログラム(MAIN__): MAIN__( ) { void fun_( ); char res[2],ch; ch = 'o'; fun_(res,2,&ch,1); printf(" res:%s\n",res); } Fortran プログラム: CHARACTER(LEN=*) FUNCTION FUN(CH) CHARACTER(LEN=*) CH FUN = CH//'k' END 文字型関数 FUN は一つの文字型の引数をもつ手続ですが、C からこの手続を呼び出すのに四 つの引数を渡します。 第 1 引数は関数値の返却域の番地を渡し、第 2 引数は関数値の長さを渡します。 第 3 引数は引数 ch の番地を渡し、第 4 引数は引数 ch の長さを渡します。 11.8.3.2.3 C への文字定数の受渡し Fortran から渡した文字定数の末尾には、\0(ヌル文字)は設定されていません。そのため、C の 中で strlen などの関数を使用する際には、以下のどちらかの対応が必要です。 - Fortran の定数の末尾に \0(ヌル文字)を追加する。 - 翻訳時オプション -Az を指定する。(引数に文字定数を指定した場合) 例: Fortran プログラム: ! call suba('12345') call suba('12345\0') end ! 末尾に \0 を追加 C プログラム: void suba_(char *str) { int i,len; printf("len=%d,[%s]\n",len=strlen(str),str); for (i=0; i < len; i++) { printf("0x%02x ",*str++); } putchar('\n'); } Fortran 使用手引書ー Page 297 11.8.3.3 外部変数によるデータの受渡し Fortran の共通ブロックに属するデータを C では構造体の外部変数で受け取ることができます。 この場合、外部変数名は以下の形式でなければなりません。 Fortran の共通ブロック C の構造体外部変数名 名前付き共通ブロック 共通ブロック名 _ 無名共通ブロック _BLNK__ Fortran の共通ブロック名の加工方法については、 “11.5 外部変数によるデータの受渡し”を参照 してください。 共通ブロック中の変数は、C の構造体メンバで参照することができます。 例 1:名前付き共通ブロック Fortran プログラム: COMMON /EXT/I,J I = 1 J = 1 CALL SUB( ) END C プログラム: struct tag { int i,j; } ext_; void sub_( ) { printf("i=%d j=%d\n",ext_.i,ext_.j); } 共通ブロック EXT を参照するためには、名前を小文字にして、末尾にアンダースコアを付け た名前 ext_ を使用します。 例 2:無名共通ブロック Fortran プログラム: COMMON // X,Y X = 1.0 Y = 2.0 CALL SUB( ) END C プログラム: struct tag { float x,y;} _BLNK__ ; void sub_( ) { printf("x=%f y=%f\n",_BLNK__.x, _BLNK__.y); } 11.8.3.4 ファイルによるデータの受渡し ファイルによってデータの受渡しを行う場合、そのファイルは CLOSE された状態でなければなり ません。 Fortran 使用手引書ー Page 298 Fortran および C 言語の CLOSE されたファイルの条件は以下の処理がなされたファイルです。 Fortran :CLOSE 文 C :close(2) 11.8.3.5 C とのデータ属性の対応 Fortran プログラムと C プログラムの間でデータを渡す場合は、データ属性の対応をとる必要があ ります。 Fortran の複素数型、倍精度複素数型および 4 倍精度複素数型に対応する型が C には存在しません が、構造体で表現することができます。 Fortran と C の対応するデータ属性を、表 11.5 に示します。 表 11.5 Fortran と C の対応するデータ属性 型 Fortran C 占有記憶域 (バイト) 1 境界合せ 1 バイトの論理型 LOGICAL(1) L1 unsigned char L1 ; 1 バイト 2 バイトの論理型 LOGICAL(2) L2 short int L2 ; 2 半語境界 4 バイトの論理型 LOGICAL(4) L4 int L4 ; 4 語境界 8 バイトの論理型 LOGICAL(8) L8 long long int L8 ; 8 倍語境界 1 バイトの整数型 INTEGER(1) I1 signed char I1 ; 1 1 バイト 2 バイトの整数型 INTEGER(2) I2 short int I2 ; 2 半語境界 4 バイトの整数型 INTEGER(4) I4 int I4 ; 4 語境界 8 バイトの整数型 INTEGER(8) I8 long long int I8 ; 8 倍語境界 実数型 REAL(4) R4 float R4 ; 4 語境界 倍精度実数型 REAL(8) R8 double R8 ; 8 倍語境界 REAL(16) R16 long double R16 ; 16 倍語境界 複素数型 COMPLEX(4) C8 struct { float r,i;} C8 ; 8 語境界 倍精度複素数型 COMPLEX(8) C16 struct { double r,i;} C16 ; 16 倍語境界 struct { long double r,i; } C32 ; 32 倍語境界 任意 1 バイト 4 倍精度実数型 4 倍精度複素数型 COMPLEX(16) C32 文字型 CHARACTER(10) S char S [10] ; 構造型 TYPE TAG INTEGER I4 REAL(8) R8 END TYPE TAG TYPE(TAG)::D struct tag { int i4; double r8; } d; 成分の記憶域 の大きささを 足した値(境 界調整値を含 む) 成分の中で最も 記憶域の大きい 型の境界 11.8.3.6 配列の記憶順序の相違 Fortran と C では、2 次元以上の配列における各配列要素の記憶順序が異なります。 したがって、配列を受け渡す場合は注意が必要です。 Fortran 使用手引書ー Page 299 Fortran と C の配列の相違を、以下の図に示します。 (C の配列) int k[2][3]; C の記憶順序 (Fortran の配列) INTEGER(4) K(2,3) Fortran の記憶順序 0 0 K(1,1) 4 k[0][0] 4 K(2,1) 8 k[0][1] 8 K(1,2) 12 k[0][2] 12 K(2,2) 16 k[1][0] 16 K(1,3) 20 k[1][1] 20 K(2,3) k[1][2] 11.8.4 C プログラムとの結合の制限事項 C プログラムと Fortran プログラムを結合する場合には、以下のような制限事項および注意事項が あります。 - Fortran プログラムと C プログラムを結合する場合、C プログラムには、main 関数が存在して はなりません。 - 関数引用の形で C プログラムを呼び出す場合、関数の型は、 “表 11.5 Fortran と C の対応す るデータ属性”に示される対応をとらなければなりません。 - C プログラムから Fortran プログラムを呼び出す場合、Fortran プログラムは、主プログラムで あってはなりません。 - 主プログラムが C プログラムの場合、その名前は MAIN__ でなければなりません。 - Fortran の割込み関連機能を使用する場合、signal(2) および clock(3C) は使用できません。 - C プログラムで signal(2)、clock(3C) を使用する場合は、実行時オプション -i により Fortran の 割込み処理を抑止する必要があります。 - 標準入出力ファイル以外のファイルは、閉じてから他言語のプログラムに渡さなければなり ません。 - 選択戻り指定子付き CALL 文は、呼出し先も Fortran の場合についてのみ有効です。選択戻り 指定子付き CALL 文で C プログラムを呼び出すと、誤動作のおそれがあるので注意してくだ さい。 - C プログラムから呼び出される Fortran のサブルーチン副プログラムは、仮引数並びに * を含 んではなりません。このようなサブルーチン副プログラムを C プログラムから呼び出すと、 誤動作のおそれがあるので注意してください。 - 翻訳時オプション -KOMP または -Kparallel を指定して翻訳した C プログラムのオブジェクト ファイルを frt コマンドで結合する場合、同じ翻訳時オプション -KOMP または -Kparallel を指 定し、オペランドとして -lmpc を指定しなければなりません。 第 12 章 並列機能 この章では、本システムを使用して、Fortran プログラムを並列処理する方法について記述してい ます。 12.1 並列処理の概要 ここでは、Fortran プログラムの並列処理の概要と本システムの並列機能の特徴について説明して います。 12.1.1 並列処理とは 並列処理という言葉は、とても広い意味に使われていますが、ここで述べる並列処理とは、独立 に動作可能な複数の CPU を同時に使って、一つのプログラムを実行することを意味します。ここ では、複数のプログラムを同時に実行するマルチジョブのことを、並列処理とは言わないことに します。 同時に複数の CPU を利用して、並列処理する様子を“図 12.1 並列処理のイメージ”に示します。 図 12.1 並列処理のイメージ DO I = 1,50 A(I) = B(I) + C(I) END DO DOループを分割して、 複数のCPU上で同時に実行する。 DO I1 = 1,25 A(I1) = B(I1) + C(I1) END DO DO I2 = 26,50 A(I2) = B(I2) + C(I2) END DO CPU0 CPU1 12.1.2 並列処理の効果 並列処理の効果は、複数の CPU を同時に使うことによって、プログラムの実行時間が短縮される ことです。例えば、“図 12.1 並列処理のイメージ”に示したように、DO ループを分割して、二 つの DO ループを並列実行できたとすると、この DO ループを実行するのにかかる時間は、理想 的には半分になります( “図 12.2 並列処理による経過時間の短縮”)。 Fortran 使用手引書ー Page 301 図 12.2 並列処理による経過時間の短縮 CPU0 経 CPU1 DO I=1,25 DO I=1,25 DO I=26,50 DO I=26,50 二つの CPU で同時に 実行されることにより、 経過時間が短縮される。 過 時 間 1個のCPU上で逐次処理 2個のCPU上で並列処理 しかし、並列処理によってプログラム実行の経過時間の短縮は可能ですが、プログラム実行に要 する CPU 時間を減らすことはできません。なぜなら、並列処理では複数の CPU を利用しますが、 それぞれの CPU の消費する CPU 時間の合計は、プログラムを逐次的に実行した場合の CPU 時間 と同等か、または、並列処理に必要なオーバヘッドの分だけ増加するためです。 並列処理プログラムの性能は、一般に、実行に要した CPU 時間の短縮ではなく、経過時間の短縮 で評価することに注意してください。逐次的に動作していたプログラムを並列処理によって実行 した場合、並列処理のためのオーバヘッドによってプロセッサ全体で消費する CPU 時間の合計は、 逐次処理時の CPU 時間よりも大きくなります。 12.1.3 並列処理で効果を得るための条件 並列処理で経過時間を短縮するためには、複数の CPU を同時に使える計算機環境が必要です。本 システムを使用して作成した並列処理プログラムは、単一の CPU しかもたないハードウェアでも 実行可能ですが、この場合には経過時間の短縮は望めません。また、複数の CPU をもつハード ウェア上でも、他のジョブが動いていて計算機全体として CPU 時間が不足しているような状況下 では、経過時間の短縮は難しくなります。これは、並列処理プログラムの実行のために、同時に 複数の CPU が割り当てられる機会が少なくなるためです。 つまり、並列処理で効果を得るためには、複数の CPU をもつハードウェア上で、かつ、システム 全体として CPU 処理能力に余裕のある環境下で、並列処理プログラムを実行する必要があります。 また、並列処理のためのオーバヘッドを相対的に小さくするため、ループの繰返し数またはルー プ中の実行文数が多いことが必要です。 12.1.4 本システムの並列機能の特徴 本システムは、自動並列化機能を提供します。 自動並列化は、本システムが自動的にプログラムを並列処理することです。自動並列化の対象と なるのは、本システムが並列化可能であると認識できる DO ループと配列操作の文に限られます が、プログラムの書き換えなどのユーザ負担を軽減できます。 また、本システムには、自動並列化を促進する最適化制御行が用意されています。最適化制御行 は、プログラマがコンパイラに自動並列化の参考になる情報を通知し、効率の良いオブジェクト 生成を促進するために用いられます。 自動並列化の機能を利用する場合、逐次実行可能な原始プログラムに、何ら手を加える必要はあ りません。したがって、プログラムが Fortran 規格に合致している限り、他の処理系へ原始プログ ラムを移植するのは容易です。 Fortran 使用手引書ー Page 302 自動並列化については、“12.2 自動並列化”を参照してください。 また、本システムは OpenMP 仕様による並列化も提供しています。OpenMP 仕様による並列化に ついては、“12.3 OpenMP 仕様による並列化”を参照してください。 12.2 自動並列化 ここでは、本システムで提供している自動並列化について説明します。 12.2.1 翻訳・実行の方法 ここでは、自動並列化機能を使うための翻訳および実行の方法について説明します。 12.2.1.1 翻訳の方法 自動並列化の機能を使用するには、翻訳時オプションとして -Kparallel を指定します。 12.2.1.1.1 自動並列化のための翻訳時オプション 自動並列化機能に関連するオプションの形式と意味を以下に説明します。 -Kparallel[ ,reduction,instance=N ,mregion_extension,ocl ] -Kpmsg parallel 自動並列化を行います。 -O3 オプションが誘導されます。-O0、-O1 または -O2 を同時に指定した場合、指定の順序に関係 なく -O3 に変更されます。-O4 を同時に指定した場合、-O4 が有効になります。 -g または -H オプションは同時に指定できません。同時に指定した場合、-Kparallel オプションは 無効になります。 本オプションは、結合編集時にも指定する必要があります。 例: % frt a.f90 -Kparallel -c % frt a.o -Kparallel reduction -Kparallel と同時に指定した場合に有効です。 リダクションの最適化(“12.2.3.1.8 リダクションによるループスライス”を参照)を行います。 この最適化を行うと、結果に精度差が生じる可能性があります。利用者は、翻訳時の診断メッセー ジにより、この最適化が行われたかどうか知ることができます。 -Kparallel と -Keval オプションを同時に指定した場合にも、リダクションの最適化を行います。 instance=N -Kparallel と同時に指定した場合に有効です。 コンパイラは実行時のスレッド数を N に想定したオブジェクトプログラムを出力します。これに よって、自動並列化された DO ループの回転数を計算する命令が軽減されて、実行性能が向上し ます。 N の値が実行時のスレッド数と異なる場合、実行時に実行を打ち切ります。詳細については、 “12.2.3.3.1 翻訳時オプション -Kparallel,instance=N 指定時の注意”を参照してください。 Fortran 使用手引書ー Page 303 mregion_extension -Kparallel と同時に指定した場合に有効です。 マルチスレッド範囲の拡大( “12.2.3.1.11 マルチスレッド範囲の拡大”を参照)を行います。こ の最適化を行うと、マルチスレッド範囲の拡大対象のループは、並列化効果の見積もりをせずに 並列実行するため、並列化効果の小さいループで性能低下することがあります。 ocl -Kparallel と同時に指定した場合に有効です。 自動並列化を促進する最適化制御行(“12.2.3.2 最適化制御行”を参照)を有効にします。 pmsg[=level] level={ 1 | 2 | 3 } -Kpmsg オプションが有効な場合、自動並列化の状況を i レベルの診断メッセージで出力します。 本オプションは、-Kparallel オプションが有効な場合に意味があります。level には、1、2 および 3 が指定できます。level の省略値は 3 です。翻訳時の診断メッセージについては、"4.1.1 翻訳時の 診断メッセージ " を参照してください。 pmsg=1 自動並列化した旨のメッセージのみを出力します。 pmsg=2 -Kpmsg=1 の出力に加えて、自動並列化されなかったことを示す簡略化されたメッセージを出力し ます。簡略化とは、同一のメッセージ番号と line 情報をもつメッセージの出力回数を 1 回にする ことを意味します。 pmsg=3 -Kpmsg=1 の出力に加えて、自動並列化されなかったことを示すメッセージを出力します。-Ef オ プションも同時に有効になります。 12.2.1.2 実行の方法 自動並列化されたプログラムを実行させるときは、環境変数 PARALLEL または OMP_NUM_THREADS で、並列に動作させるスレッドの数を指定することができます。また、環 境変数 THREAD_STACK_SIZE で、スレッド毎のスタック領域の大きさを指定することができま す。さらに、環境変数 FLIB_SPINWAIT で、スレッドの同期待ちの方法を変更することができます。 その他の実行に関する手続は、逐次実行のときと同じです。 12.2.1.2.1 環境変数 PARALLEL 環境変数 PARALLEL で、並列に動作させるスレッドの数を指定することができます。スレッド数 の決定方法の詳細については、“12.2.1.2.2 スレッド数”を参照してください。 12.2.1.2.2 スレッド数 並列に動作するスレッドの数は、まず以下の優先順位で決定されます。 Fortran 使用手引書ー Page 304 (1)環境変数 PARALLEL の指定値(注) (2)環境変数 OMP_NUM_THREADS の指定値 (3)プロセッサセットの CPU 数 (4)1 (注)結合編集時にオプション -KOMP が指定され、かつ、環境変数 FLIB_FASTOMP に TRUE が設定されているとき、環境変数 OMP_NUM_THREADS の指定値があれば、その値と 一致していなければなりません。一致していない場合にはメッセージが出力され、小さ い方の値が採用されます。 上記の優先順位で決まったスレッド数と、CPU 数の上限値を比較して、小さい方を最終的なスレッ ド数として採用します。ただし、自動並列のスレッド数が 128 を超えた場合の動作は保証されま せん。環境変数 PARALLEL に指定する値は 128 以下にしてください。 なお、CPU 数の上限値は、次のように決定されます。 - プロセッサセットが定義されている場合 ・ プロセッサセット内では、プロセッサセットの CPU 数 ・ プロセッサセット外では、システムの CPU 数 - プロセッサセットが定義されていない場合 ・ システムの CPU 数 環境変数 OMP_NUM_THREADS については、 “12.3.1.2.2 OpenMP Fortran 仕様の環境変数”を参 照してください。 Parallelnavi 環境の配下で実行する場合のスレッド数については、“付録 E Parallelnavi”を参照し てください。 12.2.1.2.3 環境変数 THREAD_STACK_SIZE 環境変数 THREAD_STACK_SIZE で、スレッド毎のスタック領域の大きさを K バイト単位で指定 することができます。スタック領域の詳細については、 “12.2.1.2.4 実行時の領域”を参照してく ださい。 12.2.1.2.4 実行時の領域 自動並列化された DO ループ内でローカルなスカラ変数(翻訳時オプション -Nnoautoobjstack が有 効な場合の自動割付けデータ実体は除く)は、スレッド毎のスタック領域に割り付けられます。 これらの変数が多い場合には、スタック領域を十分な大きさに拡張する必要があります。 スレッド毎のスタック領域は、プロセスのスタック領域と同じ大きさで確保されます。ただし、 プロセスのスタック領域の制限値が、使用可能な実装メモリと仮想メモリの大きさの小さい方を スレッド数で割った値より大きい場合、本システムがスレッド毎のスタック領域の大きさを次の ように、仮定して確保します。なお、仮想メモリの大きさとは、limit(1) コマンドの仮想記憶の最 大サイズとして表示される値です。 S = (M ⁄ T) ⁄ 5 S :スレッド毎のスタック領域の大きさ(byte) M :実装メモリと仮想メモリの小さい方の大きさ(byte) T :スレッド数 スレッド毎のスタック領域の大きさを、特定の大きさで確保したい場合には、環境変数 THREAD_STACK_SIZE を使用してください。 Fortran 使用手引書ー Page 305 12.2.1.2.5 待機スレッドの処理 環境変数 FLIB_SPINWAIT で、逐次実行中の待機スレッドの処理を調節することができます。デ フォルトは unlimited です。 unlimited : スピン待ちを行います。 0 : サスペンド待ちを行います。 <n>s : n 秒間スピン待ちし、その後サスペンド待ちに移ります。 <n>[ms] : n ミリ秒間スピン待ちし、その後サスペンド待ちに移ります。 <n> は 0 以上の整数 スピン待ちとは、CPU 時間を消費する方法で待たせる方式です。逆に、サスペンド待ちは CPU 時 間を消費せずに待たせます。スピン待ちを行う方が並列処理のオーバヘッドが少ないため、経過 時間を重視する場合には、unlimited を選択してください。CPU 時間を重視する場合は、0 を選択 してください。 12.2.1.2.6 打切り時間設定時の注意 limit(1) コマンド等により打切り時間を設定した場合、正常に動作しないことがあります。正常に 動作しない場合は、Fortran の例外ハンドリング処理を実行時オプション -Wl,-i により無効にして ください。または、実行時オプション -Wl,-t により打切り時間を設定してください。 12.2.1.2.7 サービスルーチン使用時の注意 - ALARM サービス関数 動作は保証されません。結合時に、-lpthread を指定し POSIX インターフェースを使用した場 合、ALARM サービス関数の第 2 引数に指定されたサブルーチンで並列機能と終了機能 (STOP 文、EXIT サービスサブルーチン等)を使用しなければ、動作は保証されます。 - KILL および SIGNAL サービス関数 デッドロックの危険性があります。逐次実行プログラムだけで使用してください。 - FORK サービス関数 メモリの使用量が増大し実行性能が低下する可能性があります。結合時に、-lpthread を指定 し POSIX インターフェースを使用した場合は、動作が保証されません。逐次実行プログラム だけでの使用をお勧めします。 - SYSTEM、SH および CHMOD サービス関数 メモリの使用量が 2 倍になり実行性能が低下する可能性があります。逐次実行プログラムだ けでの使用をお勧めします。 12.2.1.3 翻訳・実行の例 例 1: % frt -Kparallel,reduction,ocl test1.f % a.out 例 1 は、リダクションの最適化と最適化制御行を有効にして、原始プログラムを翻訳します。 このプログラムは、一つのスレッドを使用して動作します。 Fortran 使用手引書ー Page 306 例 2: % frt -Kparallel -Kpmsg test2.f Fortran diagnostic messages: program name(main) jwd5001i-i "test2.f", line 2: この DO ループは、並列化されました .( 名前 :i) % setenv PARALLEL 2 % a.out % setenv PARALLEL 4 % a.out 例 2 は、-Kpmsg オプションを指定して翻訳して、自動並列化されたことを確認します。環境 変数 PARALLEL に値 2 を設定して、2 個のスレッドを使用して動作させます。 次に、環境変数 PARALLEL に値 4 を設定して、4 個のスレッドを使用して動作させます。 例 3: % psrinfo 0 on-line since 30/06/00 1 on-line since 30/06/00 2 on-line since 30/06/00 3 on-line since 30/06/00 % frt -Kparallel test3.f % setenv PARALLEL 3 % a.out 09:29:00 09:29:00 09:29:00 09:29:00 まず、psrinfo コマンドで、アクティブ CPU 数(on-line の CPU 数)が 4 であることを確認し ます。次に、 環境変数 PARALLEL に値 3 を設定して、3 個のスレッドを使用して動作させます。 なお、これは、Parallelnavi がインストールされていないシステムにおいてプログラムを並列 に動作させている例です。Parallelnavi がインストールされているシステムに関しては、 “付録 E Parallelnavi”を参照してください。 12.2.2 並列化プログラムのチューニング 並列化したプログラムをチューニングする手段として、サンプリング機能を利用することができ ます。サンプリング機能により、プログラムのどの文の実行コストが高いかを知ることができま す。プログラムを高速に実行させるには、実行コストの高い文が並列に動作するようにプログラ ミングします。 Parallelnavi 環境では、プログラミング支援ツールで提供される実行時間のサンプリング機能を使 用してください。 Parallelnavi でない環境では、プロファイラで提供される実行時間のサンプリング機能を使用して ください。 サンプリング機能で並列プログラムの情報を収集するには、プログラムの実行時に環境変数を指 定します。 プログラミング支援ツールについては、 “プログラミング支援ツール使用手引書”を参照してくだ さい。プロファイラについては、“プロファイラ使用手引書”を参照してください。 12.2.3 自動並列化処理の詳細 ここでは、自動並列化処理の各機能の詳細および留意事項について説明します。 最初に自動並列化について説明し、次に自動並列化を促進するための最適化制御行について説明 します。最後に自動並列化機能を使うときの留意事項について説明します。 Fortran 使用手引書ー Page 307 12.2.3.1 自動並列化 ここでは、本システムのもつ自動並列化機能について説明します。 12.2.3.1.1 自動並列化の対象 自動並列化機能は、Fortran 原始プログラム中の DO ループ(多重 DO ループも含みます)および 配列操作の文(配列式、配列代入)を並列化の対象にします。 12.2.3.1.2 ループスライスとは 自動並列化機能は、DO ループを複数に分割します。そして分割された DO ループを並列に実行す ることで、経過時間の短縮を図ります。この並列化をループスライスと呼びます。 “図 12.3 ルー プスライスのイメージ”を示します。 図 12.3 ループスライスのイメージ DO I=1,10000 A(I)=A(I)+B(I) END DO DO I=1,5000 A(I)=A(I)+B(I) END DO DO I=5001,10000 A(I)=A(I)+B(I) END DO 12.2.3.1.3 配列操作と自動並列化 自動並列化は、DO ループの他に、配列操作の文(配列式、配列代入)を対象にします。 “図 12.4 配列操作の文の自動並列化”に配列操作の文の自動並列化のイメージを示します。 図 12.4 配列操作の文の自動並列化 INTEGER A(1000),B(1000) A = A + B A(1:500)=A(1:500)+B(1:500) A(501:1000)=A(501:1000)+B(501:1000) 12.2.3.1.4 コンパイラによる自動ループスライス 本システムは、ループスライスを行ってもデータの定義引用順序が変わらないような DO ループ を自動並列化の対象として選択して、並列実行の結果が逐次実行の結果と同じになるようにしま す。 “図 12.5 ループスライスができない DO ループの例”の DO ループは、自動ループスライスの対 象にならない例です。この DO ループでは、本来、DO 変数 I が 5000 のときに定義された配列要 素 A(5000) の値を、DO 変数 I が 5001 のときに引用しなければなりません。しかし、この DO ルー プを単純にループスライスして並列に実行すると、A(5000) を定義する前に引用する可能性があ り、実行結果を誤ることになります。 Fortran 使用手引書ー Page 308 図 12.5 ループスライスができない DO ループの例 DO I=2,10000 A(I)=A(I-1)+B(I) END DO DO I=2,5000 A(I)=A(I-1)+B(I) END DO DO I=5001,10000 A(I)=A(I-1)+B(I) END DO 12.2.3.1.5 ループ交換と自動ループスライス 多重 DO ループに対してループスライスを実施する場合、本システムは、ループスライスが可能 な DO ループを選択し、可能ならば DO ループの交換を行い、できるだけ外側の DO ループをルー プスライスします。これは、できるだけ並列処理制御の回数を少なくしてオーバヘッドを削減し、 実行性能を向上させるためです。 “図 12.6 多重 DO ループでのループ交換”は、多重 DO ループにおいて、DO ループが交換され てループスライスされた例を示しています。DO 変数 J について並列化されますが、J を外側の ループにすることで、並列処理制御の回数を少なくすることができます。 図 12.6 多重 DO ループでのループ交換 DO I=2,10000 DO J=1,10 A(I,J)=A(I-1,J)+B(I,J) END DO END DO DO J=1,10 DO I=2,10000 A(I,J)=A(I-1,J)+B(I,J) END DO END DO DO J=1,5 DO I=2,10000 A(I,J)=A(I-1,J)+B(I,J) END DO END DO 交換 DO J=6,10 DO I=2,10000 A(I,J)=A(I-1,J)+B(I,J) END DO END DO Fortran 使用手引書ー Page 309 12.2.3.1.6 ループ分割と自動ループスライス “図 12.7 DO ループの分割”の DO ループでは、配列 A は、ループスライスを行うとデータの定 義引用順序が変わるため、ループスライスすることができません。配列 B は、データの定義引用 順序が変わらないので、ループスライスできます。このような場合、配列 A を定義している文と 配列 B を定義している文を 2 つの DO ループに分割して、配列 B を定義する DO ループの方をルー プスライスします。 “図 12.7 DO ループの分割”は、DO ループが分割されてループスライスされた例を示しています。 図 12.7 DO ループの分割 DO I=2,10000 A(I)=A(I-1)+C(I) B(I)=B(I) +C(I) END DO DO I=2,10000 A(I)=A(I-1)+C(I) END DO DO I=2,10000 B(I)=B(I) +C(I) END DO DO I=2,5000 B(I)=B(I) END DO +C(I) 分割 DO I=5001,10000 B(I)=B(I) +C(I) END DO 12.2.3.1.7 ループ融合と自動ループスライス “図 12.8 DO ループの融合”では、回転数の同じ DO ループが二つ連続しています。このような 場合、ループを一つに融合することで、ループ制御のオーバヘッドを軽減するとともに、並列処 理制御の回数を減らすことができます。 “図 12.8 DO ループの融合”は、DO ループを融合してループスライスされた例を示しています。 Fortran 使用手引書ー Page 310 図 12.8 DO ループの融合 DO I=1,10000 A(I)=B(I)*C(I) END DO DO I=1,10000 D(I)=E(I)*F(I) END DO DO I=1,10000 A(I)=B(I)*C(I) D(I)=E(I)*F(I) END DO DO I=1,5000 A(I)=B(I)*C(I) D(I)=E(I)*F(I) END DO 融合 DO I=5001,10000 A(I)=B(I)*C(I) D(I)=E(I)*F(I) END DO 12.2.3.1.8 リダクションによるループスライス 翻訳時オプションに、-Kparallel と -Kreduction を同時に指定したときに自動並列化される場合があ ります。この並列化は、逐次実行のときと計算結果に精度差を生じる可能性がありますが、加算 および乗算などの交換可能な演算の順序を変更してループスライスを行います。 リダクションの対象になるのは、DO ループ内に以下の演算が含まれる場合です。 - 総和を求める演算がある場合 例:S=S+A(I) - 積を求める演算がある場合 例:P=P*A(I) - 内積を求める演算がある場合 例:P=P+A(I)*B(I) - 最小値を求める演算がある場合 例:X=MIN(X,A(I)) - 最大値を求める演算がある場合 例:Y=MAX(Y,A(I)) - 論理和を求める演算がある場合 例:N=N.OR.A(I) - 論理積を求める演算がある場合 例:M=M.AND.A(I) Fortran 使用手引書ー Page 311 “図 12.9 リダクションによる自動ループスライス”にリダクションによるループスライスの例を 示します。 図 12.9 リダクションによる自動ループスライス SUM=0 DO I=1,10000 SUM=SUM+A(I) END DO SUM2=0 DO I=5001,10000 SUM2=SUM2+A(I) END DO SUM1=0 DO I=1,5000 SUM1=SUM1+A(I) END DO SUM=SUM+SUM1+SUM2 12.2.3.1.9 ループスライスされない DO ループ 以下に示す DO ループはループスライスの対象となりません。 - 並列実行しても実行時間が短縮されないと予想される場合 - ループスライスの対象とならない型の演算を含む場合 - 外部手続、内部手続またはモジュール手続の引用を含む場合 - DO ループの形が複雑な場合 - 入出力文または組込みサブルーチンを含む場合 - データの定義引用順序が逐次実行のときと変わるおそれが有る場合 並列実行しても実行時間が短縮されないと予想される場合 DO ループの回転数が小さいまたは DO ループ内の演算数が少ない場合は、並列実行に伴うオーバ ヘッドのため、ループスライスを行うと、逐次処理した場合よりも性能が低下することがありま す。そのため、性能が向上しないと予想される DO ループについては、本システムはループスラ イスを行いません。 “図 12.10 回転数が小さく、演算数が少ない DO ループ”に回転数が小さく、演算数が少ない DO ループの例を示します。 図 12.10 回転数が小さく、演算数が少ない DO ループ DO I=1,10 ・・・回転数が小さく、かつ、演算数も少ないため、 A(I) = A(I) + B(I) END DO ループスライスの対象とはなりません。 Fortran 使用手引書ー Page 312 ループスライスの対象とならない型の演算を含む場合 以下の型の演算を含む DO ループはループスライスの対象となりません。内部 DO ループに以下 の型の演算が含まれている DO ループも同様です。 - 文字型 - 構造型 外部手続、内部手続またはモジュール手続の引用を含む場合 外部手続、内部手続またはモジュール手続の引用を含む DO ループはループスライスの対象とな りません。内部 DO ループに、外部手続、内部手続またはモジュール手続の引用が含まれている DO ループも同様です。 ただし、最適化制御行によって、並列化を促進することができます。 詳細については、“12.2.3.2 最適化制御行”を参照してください。 また、外部手続または内部手続がインライン展開された場合は、並列化の対象になります。 “図 12.11 サブルーチンの引用を含む DO ループ”にサブルーチンの引用を含む DO ループの例 を示します。 図 12.11 サブルーチンの引用を含む DO ループ DO J=1,10 ・・・サブルーチンの引用が含まれているので、 DO I=1,10000 ループスライスの対象とはなりません。 A(I,J) = A(I,J) + B(I,J) CALL SUB(A) END DO END DO DO ループの形が複雑な場合 以下に示す DO ループは、形が複雑なため、ループスライスの対象となりません。 - DO ループの内側から外側へ飛出しがある DO ループ - 複雑な構造の DO ループ “図 12.12 飛出しのある DO ループ”に飛出しのある DO ループの例を示します。 図 12.12 飛出しのある DO ループ DO J=1,10 ・・・DO ループ外への飛出しがあるため、 DO I=1,10000 ループスライスの対象とはなりません。 A(I,J) = A(I,J) + B(I,J) IF (A(I,J).LT.0) GOTO 20 END DO END DO ・ ・ ・ 20 CONTINUE Fortran 使用手引書ー Page 313 “図 12.13 複雑な構造の DO ループ”に複雑な構造の DO ループの例を示します。 図 12.13 複雑な構造の DO ループ DO J=1,10000 ・・・DO ループの構造が複雑なため、 IF (N >0) THEN ループスライスの対象とはなりません。 ASSIGN 10 TO I ELSE IF (N <0) THEN ASSIGN 20 TO I ELSE ASSIGN 30 TO I END IF GOTO I,(10,20,30) 10 A(J)=A(J)+0 20 A(J)=A(J)+1 30 A(J)=A(J)+2 END DO 入出力文または組込みサブルーチンを含む場合 入出力文または組込みサブルーチンを含む DO ループは、ループスライスの対象となりません。 組込み関数は、ループスライスの対象になるものとならないものがありますが、診断メッセージ によって知ることができます。 データの定義引用順序が逐次実行のときと変わるおそれが有る場合 “図 12.5 ループスライスができない DO ループの例”の例で説明したように、データの定義引用 順序が逐次実行のときと変わる DO ループはループスライスの対象となりません。 12.2.3.1.10 自動並列化状況の表示 自動並列化が行われたかどうか、行われたとしたらどのように行われたかを知りたいときは、翻 訳時オプションに -Kparallel と -Kpmsg を同時に指定してください。翻訳時の診断メッセージに よって、知ることができます。 自動並列化が行われなかった理由も、同様に知ることができます。 以下に診断メッセージの例を示します。 例 1:“図 12.3 ループスライスのイメージ”のプログラムを翻訳したときのメッセージ jwd5001i-i "test.f", line 2: この DO ループは、並列化されました .( 名前 :I) 例 2:“図 12.5 ループスライスができない DO ループの例”のプログラムを翻訳したときのメッ セージ jwd5201i-i "test.f", line 2: データの引用の順序が逐次実行と異なるため、この DO ルー プは並列化されません .( 名前 :A) 12.2.3.1.11 マルチスレッド範囲の拡大 マルチスレッド範囲とは、自動並列化のために複数のスレッドを生成してから解放するまでの範 囲です。通常、このマルチスレッド範囲は、“図 12.14 マルチスレッド範囲の拡大の例”のよう に、一つのマルチスレッド範囲に対して一つの並列化ループが生成されます。このとき、実行時 にマルチスレッド範囲を生成するためのコストが、並列化オーバヘッドとなります。 この二つの並列化ループに対して、マルチスレッド範囲の拡張を行うことにより、一つのマルチ スレッド範囲に対して二つの並列化ループが生成されます。その結果、マルチスレッド範囲を生 成する回数が 1 回だけになり、並列化オーバヘッドコストを削減することができます。 Fortran 使用手引書ー Page 314 図 12.14 マルチスレッド範囲の拡大の例 DO I=1,1000 A(I) = B(I) + C(I) END DO 並列化ループ マルチスレッド範囲 DO J=1,2000 D(J) = E(J) + F(J) END DO 並列化ループ マルチスレッド範囲 マルチスレッド範囲を拡大 DO I=1,1000 A(I) = B(I) + C(I) END DO マルチスレッド範囲 DO J=1,2000 D(J) = E(J) + F(J) END DO 上記以外にも、 “図 12.15 マルチスレッド範囲の拡大の例(多重ループ) ”のようなループに対し てもマルチスレッド範囲の拡大を行うことにより、並列化オーバヘッドを削減することができま す。この場合、マルチスレッド範囲を生成する回数が 1000 回だったのに対して、最適化後は 1 回 だけになります。 図 12.15 マルチスレッド範囲の拡大の例(多重ループ) DO I=1,1000 DO J=1,2000 A(J) = B(J) + C(J) END DO END DO 並列化ループ マルチスレッド範囲 マルチスレッド範囲を拡大 DO I=1,1000 DO J=1,2000 A(J) = B(J) + C(J) END DO END DO 並列化ループ マルチスレッド範囲 12.2.3.2 最適化制御行 本システムには、自動並列化を促進するために、最適化制御行(OCL:Optimization Control Line) が用意されています。 自動並列化を促進する最適化制御行を有効にするには、翻訳時オプションに -Kparallel と -Kocl を 同時に指定してください。 12.2.3.2.1 最適化制御行の記法 最適化制御行は、行の第 1 けたから第 5 けたが "!OCL " である行です。!OCL に続いて、自動並列 化用の最適化指示子を 1 個以上指定します。 Fortran 使用手引書ー Page 315 以下に記法を示します。 !OCL i [,i] .... i:自動並列化用の最適化指示子 12.2.3.2.2 最適化制御行の記述位置 最適化制御行は、最適化指示子の種類によって記述できる位置が決まっています。 自動並列化のための最適化制御行は、total 位置または loop 位置に指定します。total 位置、loop 位 置は、以下のように定義されます。 - total 位置 各プログラム単位の先頭。 - loop 位置 DO 文の直前の位置。ただし、最適化制御行と DO 文との間に注釈行または loop 位置に指定 可能な他の最適化制御行を含んでもかまいません。 例: !OCL SERIAL ← total 位置 SUBROUTINE SUB(B,C,N) INTEGER A(N),B(N),C(N) DO I=1,N A(I) = B(I) + C(I) END DO PRINT *, FUN(A) !OCL PARALLEL ← loop 位置 DO I=1,N A(I) = B(I) * C(I) END DO PRINT *, FUN(A) END 12.2.3.2.3 自動並列化と最適化指示子 自動並列化用の最適化指示子を指定した場合であっても、ループスライスの対象とならない DO ループについては、最適化指示子の効果は無効になります。ループスライスの対象とならない DO ループについては、“12.2.3.1.9 ループスライスされない DO ループ”を参照してください。 12.2.3.2.4 自動並列化用の最適化指示子 最適化制御行は、指定される最適化指示子の種類によって、機能が異なります。 “表 12.1 自動並列化用の最適化指示子一覧”を示します。自動並列化用の最適化指示子は、プロ グラマがコンパイラに自動並列化の参考になる情報を通知し、効率の良いオブジェクトを生成す るために用いられます。 Fortran 使用手引書ー Page 316 表 12.1 自動並列化用の最適化指示子一覧 最適化指示子 ARRAY_PRIVATE 意味概略 プライベート配列化機能を有効にします。 NOARRAY_PRIVATE プライベート配列化機能を無効にします。 DISJOINT[(a[,a]...)] ループスライス可能な配列(a)を指示します。 INDEPENDENT[(e[,e]...)] 手続(e)引用のある DO ループのループスライスを指示します。 NOALIAS ポインタ変数が他の変数と記憶域を共有しないことを指示しま す。 NORECURRENCE[(a[,a]...)] ループスライス可能な配列(a)を指示します。 NOVREC[(a[,a]...)] ループスライス可能な配列(a)を指示します。 SERIAL PARALLEL 自動並列化機能の有効/無効を指示します。 PSTRONG ループの回転数が小さい、または演算数が少ないために並列化さ れていないループを並列化させることを指示します。 PWEAK 二重以上のループなど、性能向上の見込みが高いループのみ並列 化の対象とすることを指示します。 REDUCTION リダクション演算の並列化を有効にします。 NOREDUCTION リダクション演算の並列化を無効にします。 TEMP[(var[,var]...)] DO ループ内で一時的に使用している変数(var)を指示します。 var1 op var2 または var1 op cnst 変数 var1 と変数 var2 の大小関係または変数 var1 と定数 cnst の大 小関係を指示します。 以下に各最適化指示子について説明します。 また、分り易さのため、本章の説明に使用する原始プログラムリストには、並列化される文に記 号(p) 、部分的に並列化される文に記号(m)および並列化されない文に記号(s)を表示して説 明します。 ARRAY_PRIVATE ARRAY_PRIVATE 指示子は、ループ内のプライベート化可能な配列を認識し、プライベート化す ることにより並列化を促進させることを本システムに指示します。 ARRAY_PRIVATE 指示子は、以下の形式です。 !OCL ARRAY_PRIVATE ARRAY_PRIVATE 指示子は、loop 位置および total 位置に記述することができます。 ARRAY_PRIVATE の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループに対して有効となります。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループに対して有効となります。 “図 12.16 ARRAY_PRIVATE 指示子の使用例”の場合、ARRAY_PRIVATE 指示子を指定するこ とにより、翻訳時オプション -Karray_private の指定がない場合でも、プライベート化可能な配列 A を認識し、プライベート化することにより並列化を促進することができます。 Fortran 使用手引書ー Page 317 図 12.16 ARRAY_PRIVATE 指示子の使用例 INTEGER(KIND=4),DIMENSION(1000) :: A,C,D INTEGER(KIND=4),DIMENSION(100,1000) :: B DATA A/1000*1/,C/1000*2/,D/1000*3/ p p p p p p !OCL ARRAY_PRIVATE DO I=1,100 DO J=1,1000 A(J) = I + D(J) B(I,J) = A(1) + C(J) ENDDO ENDDO PRINT*, A,B END NOARRAY_PRIVATE NOARRAY_PRIVATE 指示子は、ループ内のプライベート化可能な配列に対してプライベート化 しないことを本システムに指示します。 NOARRAY_PRIVATE 指示子は、以下の形式です。 !OCL NOARRAY_PRIVATE NOARRAY_PRIVATE 指示子は、loop 位置および total 位置に記述することができます。 NOARRAY_PRIVATE の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループに対して有効となります。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループに対して有効となります。 “図 12.17 NOARRAY_PRIVATE 指示子の使用例”の場合、NOARRAY_PRIVATE 指示子を指定 することにより、翻訳時オプション -Karray_private の指定されている場合でもプライベート化可 能な配列 A は、プライベート化されません。 図 12.17 NOARRAY_PRIVATE 指示子の使用例 INTEGER(KIND=4),DIMENSION(1000) :: A,C,D INTEGER(KIND=4),DIMENSION(100,1000) :: B DATA A/1000*1/,C/1000*2/,D/1000*3/ s m m p !OCL NOARRAY_PRIVATE DO I=1,100 DO J=1,1000 A(J) = I + D(J) B(I,J) = A(1) + C(J) ENDDO ENDDO PRINT*, A,B END DISJOINT[(a[,a]...)] DISJOINT 指示子は、NORECURRENCE 指示子と等価です。詳細については、NORECURRENCE 指示子の説明を参照してください。 Fortran 使用手引書ー Page 318 INDEPENDENT[(e[,e]...)] INDEPENDENT 指示子は、DO ループ内の手続を引用しても、逐次実行のときと動作が変わらな いことを本システムに指示します。これにより、手続引用のある DO ループをループスライスの 対象にします。 INDEPENDENT 指示子は、以下の形式です。 !OCL INDEPENDENT[ (e[,e]...) ] ここで、e はループスライスに影響しない手続名です。e にはワイルドカード指定も可能です。ま た、手続名を省略すると、対象範囲内のすべての手続に有効となります。ワイルドカード指定の 方法については、“12.2.3.2.5 ワイルドカード指定”を参照してください。 手続 e は、翻訳時オプション -Kthreadsafe および -Kparallel を指定して翻訳しなければなりません。 また、手続 e は、内部手続またはモジュール手続であってはなりません。 INDEPENDENT 指示子は、loop 位置および total 位置に記述することができます。 INDEPENDENT の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループに対して有効となります。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループに対して有効となります。 “図 12.18 INDEPENDENT 指定のない DO ループの例”は、手続 FUN を引用しているため、本シ ステムは、DO ループがループスライス可能であるかどうか判断できません。 図 12.18 INDEPENDENT 指定のない DO ループの例 REAL FUN,A(10000) DO I=1,10000 J = I A(I) = FUN(J) END DO ・ END FUNCTION FUN(J) INTEGER J REAL FUN FUN = SQRT(REAL(J**2+3*J+6)) END もし手続 FUN の引用のある DO ループをループスライスしても、実行結果に影響を与えないと分 かっているのであれば、 “図 12.19 INDEPENDENT 指示子の使用例”のように INDEPENDENT を 使用することにより、この DO ループはループスライスされます。 Fortran 使用手引書ー Page 319 図 12.19 INDEPENDENT 指示子の使用例 REAL FUN,A(1000) !OCL INDEPENDENT(FUN) p DO I=1,1000 p J = I p A(I) = FUN(J) p END DO ・ END RECURSIVE FUNCTION FUN(J) INTEGER J REAL FUN FUN = SQRT(REAL(J**2+3*J+6)) END 【注意事項】 INDEPENDENT 指示子に、ループスライス不可能な手続を誤って指定した場合、本システム は、誤ったループスライスを行うことがあります。なお、ループスライス不可能な手続の例 として、以下のようなループがあります。 - 手続間で依存関係がある手続 NOALIAS NOALIAS 指示子は、異なるポインタ変数が同一の記憶領域を指すことはないことを本システムに 指示します。 NOALIAS 指示子は、次の形式です。 !OCL NOALIAS NOALIAS 指示子は、loop 位置および total 位置に記述することができます。 NOALIAS の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループ中と、その内側の DO ループ中のポインタ変数を対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべてのポインタ変数を対象とします。 “図 12.20 NOALIAS 指示子の使用例”の場合、ポインタ変数が記憶領域のどこを占めるかは実行 時に決まりますが、NOALIAS 指示子を指定することにより、ポインタ変数が同一の記憶領域を指 すことはないことを翻訳時に判断することができます。 図 12.20 NOALIAS 指示子の使用例 REAL,DIMENSION(100),TARGET :: X REAL,DIMENSION(:),POINTER :: A,B A=>X(1:10) B=>X(11:20) !OCL NOALIAS DO I=1,10 B(I) = A(I)+1.0 END DO END Fortran 使用手引書ー Page 320 NORECURRENCE[(a[,a]...)] NORECURRENCE 指示子は、DO ループ内の演算対象となる配列の定義引用順序が、ループスラ イスを行っても逐次実行のときと変わらないことを本システムに指示します。 これにより、配列の定義引用順序が不明でループスライスできなかった DO ループを、ループス ライスの対象にします。 NORECURRENCE 指示子は、次の形式です。 !OCL NORECURRENCE[ (a[,a]...) ] ここで、a はループスライスが可能な配列名です。a にはワイルドカード指定も可能です。また、 配列名を省略すると、対象範囲内のすべての配列に有効となります。ワイルドカード指定に ついては、“12.2.3.2.5 ワイルドカード指定”を参照してください。 NORECURRENCE 指示子は、loop 位置および total 位置に記述することができます。 NORECURRENCE の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループに対して有効となります。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループに対して有効となります。 “図 12.21 NORECURRENCE 指定のない DO ループの例”の場合は、配列 A の添字式が別の配列 要素 L(J) のため、本システムは、配列 A がループスライスしても問題がないか判断できません。 したがって、この外側の DO ループはループスライスされません。 図 12.21 NORECURRENCE 指定のない DO ループの例 REAL,DIMENSION(1000,1000) :: A,B INTEGER,DIMENSION(1000) :: L DO J=1,1000 DO I=1,1000 A(I,L(J)) = A(I,L(J)) + B(I,J) END DO END DO END もし配列 A がループスライスしても問題がないと分かっているのであれば、 “図 12.22 NORECURRENCE 指示子の使用例”のように NORECURRENCE を使用することにより、この外 側の DO ループはループスライスされます。 図 12.22 NORECURRENCE 指示子の使用例 REAL,DIMENSION(1000,1000) :: A,B INTEGER,DIMENSION(1000) :: L !OCL NORECURRENCE(A) p DO J=1,1000 p DO I=1,1000 p A(I,L(J)) = A(I,L(J)) + B(I,J) p END DO p END DO END Fortran 使用手引書ー Page 321 【注意事項】 NORECURRENCE 指示子が、ループスライス不可能な配列を誤って指定した場合、本システ ムは、誤ったループスライスを行うことがあります。 NOVREC[(a[,a]...)] NOVREC 指示子は、翻訳時オプション -Kvppocl が有効な場合に NORECURRENCE 指示子と等価 になります。-Kvppocl が有効でない場合、意味を持ちません。詳細については、NORECURRENCE 指示子の説明を参照してください。 SERIAL SERIAL 指示子は、DO ループのループスライスを抑止する場合に使用します。 例えば、ある DO ループは、逐次実行させた方が速いとわかっている場合に使用します。 SERIAL 指示子は、次の形式です。 !OCL SERIAL SERIAL 指示子は、loop 位置および total 位置に記述することができます。 SERIAL の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループと、その内側の DO ループに対するループスライスを抑止します。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループに対するループスライスを抑止します。 “図 12.23 SERIAL 指定のないプログラムの例”のプログラムで、ループをループスライスした くない場合、 “図 12.24 SERIAL 指示子の使用例”のように SERIAL を指定することにより、ルー プのループスライスを止めることができます。 図 12.23 SERIAL 指定のないプログラムの例 p p p p p p p p REAL,DIMENSION(10,10) :: A2,B2,C2,D2,E2,F2,G2,H2 DO J=1,10 DO I=1,M A2(I,J) = A2(I,J) + B2(I,J) C2(I,J) = C2(I,J) + D2(I,J) E2(I,J) = E2(I,J) + F2(I,J) G2(I,J) = G2(I,J) + H2(I,J) END DO END DO END Fortran 使用手引書ー Page 322 図 12.24 SERIAL 指示子の使用例 REAL,DIMENSION(10,10) :: A2,B2,C2,D2,E2,F2,G2,H2 !OCL SERIAL DO J=1,10 DO I=1,M A2(I,J) = A2(I,J) + B2(I,J) C2(I,J) = C2(I,J) + D2(I,J) E2(I,J) = E2(I,J) + F2(I,J) G2(I,J) = G2(I,J) + H2(I,J) END DO END DO END PARALLEL PARALLEL 指示子は、SERIAL の効果を打ち消して、一部の DO ループだけをループスライスの 対象とする場合に使用します。 PARALLEL 指示子は、次の形式です。 !OCL PARALLEL PARALLEL 指示子は、loop 位置および total 位置に記述することができます。 PARALLEL の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループと、その内側の DO ループをループスライスの対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループをループスライスの対象とします。 “図 12.25 PARALLEL 指定のないプログラムの例”のプログラムで、ループ 2 の DO ループだけ をループスライスの対象にしたい場合、 “図 12.26 PARALLEL 指示子の使用例”のように SERIAL と PARALLEL を併用することにより、ループ 2 の DO ループだけをループスライスの対象にする ことができます。 Fortran 使用手引書ー Page 323 図 12.25 PARALLEL 指定のないプログラムの例 p p p p p p p p p p p p p p p p p p p p p p p REAL,DIMENSION(10,10) :: A1,B1,C1,D1,E1,F1,G1,H1 REAL,DIMENSION(10,10) :: A2,B2,C2,D2,E2,F2,G2,H2 REAL,DIMENSION(10,10) :: A3,B3,C3,D3,E3,F3,G3,H3 ・ DO J=1,10 DO I=1,L ← ループ 1 A1(I,J) = A1(I,J) + B1(I,J) C1(I,J) = C1(I,J) + D1(I,J) E1(I,J) = E1(I,J) + F1(I,J) G1(I,J) = G1(I,J) + H1(I,J) END DO END DO ・ ・ ・ DO J=1,10 DO I=1,M ← ループ 2 A2(I,J) = A2(I,J) + B2(I,J) C2(I,J) = C2(I,J) + D2(I,J) E2(I,J) = E2(I,J) + F2(I,J) G2(I,J) = G2(I,J) + H2(I,J) END DO END DO ・ ・ ・ DO J=1,10 DO I=1,N ← ループ 3 A3(I,J) = A3(I,J) + B3(I,J) C3(I,J) = C3(I,J) + D3(I,J) E3(I,J) = E3(I,J) + F3(I,J) G3(I,J) = G3(I,J) + H3(I,J) END DO END DO END Fortran 使用手引書ー Page 324 図 12.26 PARALLEL 指示子の使用例 !OCL SERIAL ← total 位置 REAL,DIMENSION(10,10) :: A1,B1,C1,D1,E1,F1,G1,H1 REAL,DIMENSION(10,10) :: A2,B2,C2,D2,E2,F2,G2,H2 REAL,DIMENSION(10,10) :: A3,B3,C3,D3,E3,F3,G3,H3 ・ ・ ・ DO J=1,10 DO I=1,L ← ループ 1 A1(I,J) = A1(I,J) + B1(I,J) C1(I,J) = C1(I,J) + D1(I,J) E1(I,J) = E1(I,J) + F1(I,J) G1(I,J) = G1(I,J) + H1(I,J) END DO END DO ・ ・ ・ !OCL PARALLEL p DO J=1,10 p DO I=1,M ← ループ 2 p A2(I,J) = A2(I,J) + B2(I,J) p C2(I,J) = C2(I,J) + D2(I,J) p E2(I,J) = E2(I,J) + F2(I,J) p G2(I,J) = G2(I,J) + H2(I,J) p END DO p END DO ・ ・ ・ DO J=1,10 DO I=1,N ← ループ 3 A3(I,J) = A3(I,J) + B3(I,J) C3(I,J) = C3(I,J) + D3(I,J) E3(I,J) = E3(I,J) + F3(I,J) G3(I,J) = G3(I,J) + H3(I,J) END DO END DO END PSTRONG PSTRONG 指示子は、ループの回転数が小さい、または演算数が少ないために並列化されていな いループを並列化させることを指示するために使用します。 PSTRONG 指示子は、以下の形式です。 !OCL PSTRONG PSTRONG 指示子は、loop 位置および total 位置に記述することができます。 Fortran 使用手引書ー Page 325 PSTRONG の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループとその内側 DO ループを対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループを対象とします。 “図 12.27 PSTRONG 指示子の使用例”の場合、ループの回転数が小さいことによる性能向上が 得られないため並列化が抑止されますが、PSTRONG 指示子を指定することにより、並列化する ことができます。 図 12.27 PSTRONG 指示子の使用例 REAL(KIND=4) :: A(10),B(10),C(10) !OCL PSTRONG p DO J=1,10 p A(J) = A(J) + B(J) + C(J) p END DO PRINT*, A END PWEAK PWEAK 指示子は、ループの部分的な並列化および最内ループの並列化など実行効率の向上がさ れにくいループに対して、並列化を抑止することを本システムに指示するために使用します。 PWEAK 指示子は、以下の形式です。 !OCL PWEAK PWEAK 指示子は、loop 位置および total 位置に記述することができます。 PWEAK の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループとその内側 DO ループを対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループを対象とします。 “図 12.28 PWEAK 指示子の使用例”において、PWEAK 指示子がない場合、最内ループが並列化 されます。PWEAK 指示子がある場合、並列化されません。PWEAK 指示子を指定する場合、ルー プの粒度により並列化しないほうが実行効率が良い場合に指定してください。 図 12.28 PWEAK 指示子の使用例 SUBROUTINE SUB(A,B,C,N,M,M1,M2) REAL(KIND=4) :: A(N,M),B(N,M),C(N,M) !OCL PWEAK DO I=1,M1 s DO J=I,M2 p A(I+1,J) = A(I,J) + B(I,J) + C(I,J) p END DO END DO RETURN END Fortran 使用手引書ー Page 326 REDUCTION REDUCTION 指示子は、リダクション演算が含まれる DO ループを並列化させることを本システ ムに指示するために使用します。 REDUCTION 指示子は、以下の形式です。 !OCL REDUCTION REDUCTION 指示子は、loop 位置および total 位置に記述することができます。 REDUCTION の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループとその内側 DO ループを対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループを対象とします。 “図 12.29 REDUCTION 指示子の使用例”の場合、REDUCTION 指示子を指定することにより、 翻訳時オプション -Kreduction の指定がない場合でも対象とするリダクション演算を含む DO ルー プを並列化することができます。 図 12.29 REDUCTION 指示子の使用例 REAL S,A(5000) !OCL REDUCTION p p p DO I=1,5000 S = S + A(I) END DO END NOREDUCTION NOREDUCTION 指示子は、リダクション演算が含まれる DO ループを並列化させないことを本シ ステムに指示するために使用します。 NOREDUCTION 指示子は、以下の形式です。 !OCL NOREDUCTION NOREDUCTION 指示子は、loop 位置および total 位置に記述することができます。 NOREDUCTION の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループとその内側 DO ループを対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループを対象とします。 “図 12.30 NOREDUCTION 指示子の使用例”の場合、NOREDUCTION 指示子を指定することに より、対象とするリダクション演算を含む DO ループの並列化を抑止することができます。 Fortran 使用手引書ー Page 327 図 12.30 NOREDUCTION 指示子の使用例 REAL S,A(5000) !OCL NOREDUCTION s DO I=1,5000 s S = S + A(I) s END DO END TEMP[(var[,var]...)] TEMP 指示子は、DO ループ内で引用されている変数が、その DO ループの中で一時的に使用され ていることを本システムに指示するために使用します。 これにより、並列化した DO ループの実行性能を向上させることができます。 TEMP 指示子は、以下の形式です。 !OCL TEMP[ (var[,var]...) ] ここで、var は DO ループ内で一時的に使用している変数名です。var にはワイルドカード指定も 可能です。また、変数名を省略すると、対象範囲内のすべての変数名に有効となります。ワイル ドカード指定については、“12.2.3.2.5 ワイルドカード指定”を参照してください。 TEMP 指示子は、loop 位置および total 位置に記述することができます。 TEMP の効果は、記述位置によって以下の違いがあります。 - loop 位置に記述された場合 対応する DO ループ内の指定された変数が、一時的な変数であることを示します。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループ内の指定された変数が、一時的な変数であ ることを示します。 “図 12.31 TEMP 指定のないプログラムの例”の場合、変数 T が DO ループの中でしか使用され ていなくても、T が共通ブロック要素のため、本システムは、T がサブルーチン SUB の中で参照さ れていると判断し、T の値が正しくなるようなループスライスを行います。 図 12.31 TEMP 指定のないプログラムの例 p p p p p p COMMON T REAL,DIMENSION(1000,50) :: A,B,C,D . . . DO J=1,50 DO I=1,1000 T = A(I,J) + B(I,J) C(I,J) = T + D(I,J) END DO END DO . . . CALL SUB END Fortran 使用手引書ー Page 328 この場合、DO ループの終了時の T の値が、サブルーチン SUB の中で参照されないことが分かるの であれば、“図 12.32 TEMP 指示子の使用例”のように TEMP で T を指定します。これにより、 DO ループの終了時の T の値を正しくする命令が不要になるので、実行性能が向上します。 図 12.32 TEMP 指示子の使用例 COMMON T REAL,DIMENSION(1000,50) :: A,B,C,D ・ ・ ・ !OCL TEMP(T) p DO J=1,50 p DO I=1,1000 p T = A(I,J) + B(I,J) p C(I,J) = T + D(I,J) p END DO p END DO ・ ・ ・ CALL SUB END 【注意事項】 TEMP 指示子に、一時的に使用されている変数以外の変数を誤って指定した場合、本システ ムは、誤ったループスライスを行うことがあります。 var1 op var2 var1 op cnst この指示子は、変数と変数の大小関係または変数と定数の大小関係を本システムに指示するため に使用します。 ここで var1 および var2 は、変数名です。cnst は、整定数または名前付き定数です。以下の形式です。 !OCL var1 op var2 !OCL var1 op cnst op に指定できる関係演算子を以下に示します。 演算子 意味 .LT. および < 小さい .LE. および <= 小さいか等しい .EQ. および == 等しい .NE. および /= 等しくない .GT. および > 大きい .GE. および >= 大きいか等しい var1 op var2 または var1 op cnst 指示子は、loop 位置および total 位置に記述することができます。 var1 op var2 または var1 op cnst 指示子の効果は、記述位置によって以下の違いがあります。 Fortran 使用手引書ー Page 329 - loop 位置に記述された場合 対応する DO ループとその内側 DO ループを対象とします。 - total 位置に記述された場合 対応するプログラム単位内のすべての DO ループを対象とします。 “図 12.33 変数名 op 整定数指示子の使用例”の場合、最適化制御行が記述されていないと配列要 素の添字の値の大小関係が分からないため、配列 A の定義引用順序が逐次実行のときと変わる可 能性があり並列化されません。この場合、変数名 op 整定数指示子を指定することにより、配列 A の定義引用順序が逐次実行のときと変わらないと分かるので並列化することができます。 図 12.33 変数名 op 整定数指示子の使用例 REAL,DIMENSION(10000) :: A,B !OCL M .gt. 2000 p DO I = 1,2000 p A(I) = A(I+M) + B(I) p END DO END 12.2.3.2.5 ワイルドカード指定 以下の最適化指示子のオペランドには、変数名または手続名としてワイルドカード指定が可能で す。 DISJOINT INDEPENDENT NORECURRENCE NOVREC TEMP ワイルドカード指定は、ワイルドカードと呼ばれる文字と英数字の組合せです。ワイルドカード 指定を用いると、ワイルドカード指定によって表現された文字列に合致する変数名または手続名 を一括して指定するのと同じ効果があります。 ワイルドカードには、 “*”と“?”の 2 種類があり、それぞれ以下のような文字列に合致します。 *:任意の英数字から構成される、長さ 1 以上の文字列に合致する。 ?:任意の英数字 1 文字に合致する。 なお、一つのワイルドカード指定の中に、二つ以上のワイルドカードを含むことはできません。 例: ! OCL TEMP (W*) この例で、"W*" は、先頭の文字が W であり、長さが 2 以上の任意の変数名を表します。 例えば、WORK1、W2、WORK3 という変数名は、この指定の中に含まれます。 ! OCL DISJOINT (A?) この例で、"A?" は、先頭の文字が A であり、長さが 2 の任意の配列名を表します。 例えば、A1、A2、AA という配列名は、この指定の中に含まれます。ABC という配列名があっ たとしても、この配列名は長さが 2 ではないので、この指定の中には含まれません。 ! OCL INDEPENDENT (SUB?) この例で、"SUB?" は、先頭の 3 文字が SUB であり、長さが 4 の任意の手続名を表します。 例えば、SUB1、SUB2、SUB9 という配列名は、この指定の中に含まれます。 Fortran 使用手引書ー Page 330 12.2.3.3 自動並列化機能を使うときの留意事項 本システムの自動並列化機能を使用する場合の留意事項について説明します。 12.2.3.3.1 翻訳時オプション -Kparallel,instance=N 指定時の注意 翻訳時オプション -Kparallel,instance=N で、並列動作のスレッド数を指定する場合、実行時のス レッド数と同じ値でなければなりません。並列動作のスレッド数については、 “12.2.1.2.2 スレッ ド数”を参照してください。 -Kinstance に誤った値を指定した場合、以下の実行時メッセージを出力し、実行を打ち切ります。 jwe1040i-s This program cannot be executed, because the number of threads specified by -Kinstance=N option and the actual number of threads are not equal. 12.2.3.3.2 並列処理の入れ子での注意 ループスライスされた DO ループ内で手続を引用していて、引用先の手続中にループスライスさ れる DO ループを含む場合、結果的に並列実行部分が入れ子になります。このような場合、内側 の DO ループは、逐次に実行されます。このような DO ループを含む原始プログラムを、 -Kparallel,instance=N を指定して翻訳してはいけません。 “図 12.34 並列処理が入れ子になった場合”に、スライスされた DO ループが逐次に実行される 例を示します。このような DO ループを含む原始プログラムを -Kparallel,instance=N を指定して翻 訳すると、実行結果は保証されません。 図 12.34 並列処理が入れ子になった場合 ファイル:a.f !OCL INDEPENDENT DO I=1,100 J=I CALL SUB(J) END DO : END RECURSIVE SUBROUTINE SUB(N) : DO I=1,10000 A(I)=1/B(I)**N END DO : END このループは並列実行する このループは逐次実行する a.f の原始プログラムを以下のように翻訳した場合、実行結果は保証できません。 % frt -Kparallel,instance=4 a.f(誤った使い方) Fortran 使用手引書ー Page 331 このような誤りを防ぐために、ループスライスされる DO ループ内で引用している手続に、最適 化指示行 "!OCL SERIAL" を以下のように指定します。 !OCL SERIAL RECURSIVE SUBROUTINE SUB(N) : DO I=1,10000 A(I) = 1/B(I)**N END DO : END 12.2.3.3.3 翻訳時オプション -Kparallel,reduction 指定時の注意 翻訳時オプション -Kparallel,reduction を指定して翻訳したとき、並列実行の結果が、逐次実行の結 果と異なることがあります。これは、並列実行のときの演算順序が、逐次実行の演算順序と異な る場合があるためです。 “図 12.35 リダクションによる精度差”は、 “12.2.3.1.8 リダクションによるループスライス”の 説明で使用した例です。変数 SUM は、逐次実行では、配列要素 A(1) から A(10000) まで順次に加 算されます。並列実行では、配列要素 A(1) から A(5000) まで順次に加算した値を変数 SUM1 とし て、配列要素 A(5001) から A(10000) まで加算した値を SUM2 とします。そして、SUM1 と SUM2 を 加算した値を SUM とします。 つまり、逐次実行と並列実行では、配列 A の要素の値を累計する順番が違うので、演算結果に精 度差が生じることがあります。 図 12.35 リダクションによる精度差 SUM=0 DO I=1,10000 SUM=SUM+A(I) END DO SUM2=0 DO I=5001,10000 SUM2=SUM2+A(I) END DO SUM1=0 DO I=1,5000 SUM1=SUM1+A(I) END DO SUM=SUM+SUM1+SUM2 12.2.3.3.4 最適化制御行の使い方の注意 最適化指示子の DISJOINT、TEMP または INDEPENDENT の誤った使い方を“図 12.36 最適化制 御行の誤った使い方”に示します。 本システムは、最適化指示子の指示どおりに、誤ったループスライスを行う場合があります。 Fortran 使用手引書ー Page 332 図 12.36 最適化制御行の誤った使い方 下のプログラムは、配列 A に対して、誤って DISJOINT を指定しています。ループスライス を行うと、配列 A の定義引用順序が変わるため、誤った動作をすることがあります。 !OCL DISJOINT(A) DO I=2,10000 A(I)=A(I-1)+B(I) END DO 下のプログラムは、変数 T に対して、誤って TEMP を指定しています。DO ループの実行後、 変数 T の値は保証されないので、変数 LAST に期待した値が代入されないことがあります。 !OCL TEMP(T) DO I=1,1000 T=A(I)+B(I) C(I)=T+D(I) END DO LAST = T 下のプログラムは、サブルーチン SUB に対して、誤って INDEPENDENT を指定しています。 サブルーチン SUB の引用によって、配列 A の定義・引用の順序がかわるため、結果が正しく ない場合があります。 COMMON A(1000),B(1000) !OCL INDEPENDENT(SUB) DO I=2,1000 A(I)=B(I)+1.0 CALL SUB(I-1) END DO .... END RECURSIVE SUBROUTINE SUB(J) COMMON A(1000) A(J)=A(J)+1.0 END 12.2.3.3.5 並列処理中の入出力文および組込み手続 ループスライスされた DO ループ内で手続を引用していて、引用先の手続中に入出力文、組込み サブルーチンまたはループスライスの対象とならない組込み関数を含む場合、動作は保証されま せん。並列実行に伴うオーバヘッドのため、逐次処理した場合より実行性能が低下したり、入出 力文の実行結果が逐次処理の場合と変わるおそれがあります。 “図 12.37 並列処理中の入出力文”に、ループスライスされた DO ループ内で引用された手続で、 入出力文が実行される例を示します。 Fortran 使用手引書ー Page 333 図 12.37 並列処理中の入出力文 ファイル:a.f !OCL INDEPENDENT(SUB) DO I=1,10000 J=I CALL SUB(J) END DO : END RECURSIVE SUBROUTINE SUB(N) : PRINT *,N : END 12.3 OpenMP 仕様による並列化 ここでは、本システムで提供している OpenMP 仕様による並列化について説明します。 本システムは、ベース言語を Fortran とする OpenMP Application Program Interface Version 2.5 May 2005(本書では、OpenMP Fortran 仕様と呼びます)にもとづいて記述されたプログラムを翻訳す るコンパイラです。 OpenMP Fortran 仕様については、以下の URL を参照してください。 http://www.openmp.org 12.3.1 翻訳・実行の方法 ここでは、OpenMP Fortran で記述された原始プログラムの翻訳および実行の方法について説明し ます。 12.3.1.1 翻訳の方法 原始プログラムの翻訳および結合編集を行うには、翻訳時オプション -KOMP を指定します。 12.3.1.1.1 OpenMP Fortran プログラムを翻訳するための翻訳時オプション ここでは、OpenMP Fortran プログラムを翻訳するための翻訳時オプションについて説明します。 -Kauto -Kauto オプションは、SAVE 属性をもつ変数および初期値をもつ変数を除く局所変数を、automatic 変数として扱い、スタックに割り付けます。ただし、主プログラムの局所変数は、スタックに割 り付けません。スタック領域の大きさに関する注意事項は、 “9.14 スタック割付けの影響”を参 照してください。 本オプションは、-KOMP オプションの指定により、自動的に誘導されます。 -Knoauto -Knoauto オプションは、SAVE 属性をもつ変数および初期値をもつ変数を除く局所変数を、 automatic 変数にしません。 Fortran 使用手引書ー Page 334 本オプションを -KOMP オプションと同時に指定する場合は、-KOMP オプションの後に指定する 必要があります。本オプションは、-Knothreadsafe オプションと同時に指定すると、指定した手続 についてスタック領域の使用を小さくする効果があります。 本オプションが指定できる手続は、主プログラムまたは動的なパラレルリージョンの外で呼び出 される副プログラムでなければならず、また、以下のものを除く OpenMP 指示文を含んでいては なりません。 - プライベート変数の宣言を含まない PARALLEL 指示構文 - THREADPRIVATE 宣言指示文 指定できない手続に対して指定した場合は、プログラムが正しく実行されないことがあるので注 意してください。 本オプションは、-Knothreadsafe オプションと同時に指定しないと効果がありません。-KOMP オ プションから誘導される -Kthreadsafe オプションは、-Kauto オプションと同じように、局所変数を スタックに割り付ける効果をもつためです。 -KOMP -KOMP オプションは、OpenMP Fortran 仕様のディレクティブを有効にします。-KOMP オプショ ンが有効な場合、-Kthreadsafe、-Kauto、-AR および -D_OPENMP=200505 オプションも有効にしま す。ただし、主プログラムの局所変数は、-Kauto オプションが有効であってもスタックには割り 付けません。-Knoauto、-Knothreadsafe および -Ar オプションは、-KOMP オプションより後に指定 すれば有効になります。-Knoauto または -Knothreadsafe オプションを -KOMP オプションと同時に 指定する場合には、注意が必要です(本項の -Knoauto および -Knothreadsafe オプションを参照し てください)。 ファイル名の並びにオブジェクトプログラムの名前しか現れない場合(すなわち結合編集のみ行 う場合)でも、-KOMP オプションを指定して翻訳されたオブジェクトプログラムが含まれる場合 は、本オプションを指定する必要があります。 例: % frt a.f90 -KOMP -c % frt a.o -KOMP -KNOOMP -KNOOMP オプションが指定されたとき、OpenMP 仕様のディレクティブを注釈として、ソース プログラムを翻訳します。-KOMP および -KNOOMP オプションの指定を省略した場合、 -KNOOMP となります。 -Kpureomp -Kpureomp オプションは、OpenMP Fortran 仕様のディレクティブに忠実に従うことを指示します。 本オプションは、-KOMP オプションと同時に指定する必要があります。 -Knopureomp -Knopureomp オプションは、OpenMP Fortran 仕様のディレクティブを緩やかに解釈してオブジェ クトプログラムの効率化を図ることを指示します。本オプションを指定すると、処理系は以下の ようにディレクティブを扱います。 - PARALLEL DO ディレクティブについて、並列実行しない方が効率がよいと判断した場合、 逐次実行するオブジェクトプログラムを生成します。ただし、翻訳時オプション -g が同時に 指定されている場合には、本機能は無効になります。 - SINGLE ディレクティブ範囲について、排他処理と同期のオーバヘッドをなくすため、常に マスタスレッドで実行します。 本オプションは、-KOMP オプションと同時に指定する必要があります。-Kpureomp および -Knopureomp オプションの指定を省略した場合、-Knopureomp となります。 Fortran 使用手引書ー Page 335 -Kthreadprivate -Kthreadprivate オプションは、すべての名前付き共通ブロックを THREADPRIVATE とします。本 オプションは、-KOMP オプションと同時に指定する必要があります。 -Knothreadprivate -Knothreadprivate オプションは、THREADPRIVATE として指定された名前付き共通ブロック以外 は、通常の共通ブロックとします。本オプションは、-KOMP オプションと同時に指定する必要が あります。-Kthreadprivate および -Knothreadprivate オプションの指定を省略した場合、 -Knothreadprivate となります。 -Kthreadsafe -Kthreadsafe オプションが指定されたとき、スレッドセーフなオブジェクトプログラムを生成しま す。スタック領域の大きさに関する注意事項は、 “9.14 スタック割付けの影響”を参照してくだ さい。 本オプションは、-KOMP オプションの指定により、自動的に誘導されます。 -Knothreadsafe -Knothreadsafe オプションが指定されたとき、スレッドセーフでないオブジェクトプログラムを生 成します。 本オプションを -KOMP オプションと同時に指定する場合は、-KOMP オプションの後に指定する 必要があります。本オプションを指定すると、プログラムの実行から、スレッドセーフを 保証するための処理が省略されます。 本オプションが指定できる手続は、主プログラムまたは動的なパラレルリージョンの外で呼び出 される副プログラムでなければならず、また、以下のものを除く OpenMP 指示文を含んでいては なりません。 - プライベート変数の宣言を含まない PARALLEL 指示構文 - THREADPRIVATE 宣言指示文 指定できない手続に対して指定した場合は、プログラムが正しく実行されないことがあるので注 意してください。 12.3.1.1.2 OpenMP Fortran プログラムの最適化情報の表示 ここでは、翻訳時オプション -Qp が指定された場合の OpenMP Fortran プログラムの最適化情報の 表示について説明します。翻訳時オプション -Qp については“4.1.2 翻訳情報出力”を参照して ください。 翻訳時オプション -Qp が指定されたとき、OpenMP 仕様のディレクティブによって指示された実 行文について、最適化情報の表示は以下のようになります。 - 並列に実行される可能性がある文については、p が表示されます。冗長に実行される文につ いてはこの表示はされません。DO ディレクティブまたは SECTIONS ディレクティブに直接 囲まれた実行文がこれに該当します。WORKSHARE ディレクティブ内では、並列化された文 だけが p と表示されます。 - 同時に 1 スレッドだけで実行される文については、s が表示されます。MASTER ディレクティ ブ、SINGLE ディレクティブ、CRITICAL ディレクティブまたは ORDERED ディレクティブ に直接囲まれた実行文がこれに該当します。ATOMIC 指示文の直後の実行文は、その全体が 排他的に 1 スレッドで実行されるとき、s が表示されます。 - 一つの実行文の中で、並列に実行される可能性がある部分と、同時に 1 スレッドだけで実行 される部分が混在しているとき、m が表示されます。WORKSHARE ディレクティブ内の ATOMIC 指示文の直後の実行文などが、これに該当する場合があります。 Fortran 使用手引書ー Page 336 ネストした並列実行では、その実行文を囲む最も内側のパラレルリージョンに対する並列化情報 を表示します。そのパラレルリージョンがどのように呼ばれるか(並列実行中に呼ばれるか逐次 実行中に呼ばれるか)は表示に影響を与えません。 12.3.1.2 実行の方法 OpenMP Fortran プログラムを実行させる手続きは、逐次実行のときと同じです。 12.3.1.2.1 実行時の環境変数 THREAD_STACK_SIZE 1 ≦ THREAD_STACK_SIZE ≦ 2147483647 利用者は、環境変数 THREAD_STACK_SIZE の値として、スレッド毎のスタック領域の大きさを K バイト単位で指定することができます。詳細については、 “12.3.1.2.3 実行時の注意事項”を参 照してください。 FLIB_SPINWAIT 環境変数 FLIB_SPINWAIT で、逐次実行中の待機スレッドの処理を調節することができます。デ フォルトは unlimited です。 unlimited :スピン待ちを行います。 0 :サスペンド待ちを行います。 <n>s :n 秒間スピン待ちし、その後サスペンド待ちに移ります。 <n>[ms] :n ミリ秒間スピン待ちし、その後サスペンド待ちに移ります。 <n> は 0 以上の整数 スピン待ちとは、CPU 時間を消費する方法で待たせる方式です。逆に、サスペンド待ちは CPU 時 間を消費せずに待たせます。スピン待ちを行う方が並列処理のオーバヘッドが少ないため、経過 時間を重視する場合には、unlimited を選択してください。CPU 時間を重視する場合は、0 を選択 してください。 FLIB_FASTOMP 環境変数 FLIB_FASTOMP に TRUE を設定することにより、利用者は高速実行時ライブラリを使 用することができます。デフォルトでは高速実行時ライブラリは使用されません。高速実行時ラ イブラリは、以下のような特徴をもちます。 - ネストした並列化がないおよび、スレッドが CPU に一対一に対応付けられていることを 前提とすることにより、高速化を図っています。 - Parallelnavi 環境では、高速なハードウェアバリアを使用することができます。 ただし、高速実行時ライブラリを使用できるプログラムには、以下の制限があります。 - OMP_SET_NUM_THREADS サブルーチンまたは PARALLEL 指示文の NUM_THREADS 節で指定するスレッド数は、実行環境によって決まるスレッド数と一致していなければ なりません。 実行環境によって決まるスレッド数は、“12.3.1.2.3 実行時の注意事項” (Parallelnavi 環境の場合 には、“付録 E Parallelnavi” )を参照してください。 高速実行時ライブラリを使用するとき、OpenMP Fortran 環境変数とサービス手続による実行の制 御は、以下のように制限を受けます。 - 環境変数 OMP_NESTED と OMP_SET_NESTED サブルーチンによる設定にかかわらず、 ネストしたパラレルリージョンは常に逐次化されます。 - 環境変数 OMP_DYNAMIC と OMP_SET_DYNAMIC サブルーチンによる設定にかかわら ず、スレッド数は使用可能な CPU 数を超えることはできません。 Fortran 使用手引書ー Page 337 使用可能な CPU 数は、 “12.3.1.2.3 実行時の注意事項”(Parallelnavi 環境の場合には、 “付録 E Parallelnavi” )を参照してください。 12.3.1.2.2 OpenMP Fortran 仕様の環境変数 利用者は、OpenMP Fortran 仕様で規定された以下の環境変数を使用することが可能です。詳細に ついては、OpenMP Fortran 仕様を参照してください。 OMP_SCHEDULE スケジュールタイプが RUNTIME の DO ディレクティブおよび PARALLEL DO ディレクティブに 対して、実行すべきスケジュールタイプおよび chunk を指定します。 OMP_NUM_THREADS 実行中に使用するスレッドの数を指定します。 OMP_DYNAMIC 動的スレッド調整機能の有効または無効を指定します。 OMP_NESTED パラレルリージョンのネスト機能の有効または無効を指定します。 12.3.1.2.3 実行時の注意事項 本システムの OpenMP 仕様による並列化機能を使用する場合の注意事項を、以下に示します。 実行時の変数割付け 本システムの OpenMP 仕様による並列化機能を使用したプログラムは、メインプログラム以外の 手続内でローカルな変数(翻訳時オプション -Nnoautoobjstack が有効な場合の自動割付けデータ実 体は除く)およびプライベート変数をスタック領域に割り付けます。手続内でローカルな変数お よびプライベート変数に必要な領域が巨大な場合には、スタック領域を十分な大きさに拡張する 必要があります。 プロセスのスタック領域の制限値は、limit(1) コマンドで、設定が可能です。 スレッド毎のスタック領域は、プロセスのスタック領域と同じ大きさで確保されます。ただし、 プロセスのスタック領域の制限値が、使用可能な実装メモリと仮想メモリの大きさの小さい方を スレッド数で割った値より大きい場合、本システムがスレッド毎のスタック領域の大きさを次の ように、仮定して確保します。なお、仮想メモリの大きさとは、limit(1) コマンドの仮想記憶の最 大サイズとして表示される値です。 S = (M ⁄ T) ⁄ 5 S :スレッド毎のスタック領域の大きさ(byte) M :実装メモリと仮想メモリの小さい方の大きさ(byte) T :スレッド数 スレッド毎のスタック領域の大きさを、特定の大きさで確保したい場合には、環境変数 THREAD_STACK_SIZE を使用してください。 環境変数 THREAD_STACK_SIZE については、 “12.3.1.2.1 実行時の環境変数”を参照してくださ い。 CPU 数の上限値 以下の値を、CPU 数の上限値とします。 Fortran 使用手引書ー Page 338 - プロセッサセットが定義されている場合 ・ プロセッサセット内では、プロセッサセットの CPU 数 ・ プロセッサセット外では、システムの CPU 数 - プロセッサセットが定義されていない場合 ・ システムの CPU 数 スレッド数 並列実行のスレッド数は、高速実行時ライブラリを使用するとき OpenMP と自動並列化で共通と なり、そうでないときそれぞれ独立に決定されます。高速実行時ライブラリの使用は、環境変数 FLIB_FASTOMP の設定によって制御することができます(“12.3.1.2.1 実行時の環境変数”参照)。 - 高速実行時ライブラリを使用するとき(FLIB_FASTOMP が TRUE のとき) スレッド数は以下の優先順位で決定されます。 (1) 環境変数 OMP_NUM_THREADS の指定値(注) (2) 環境変数 PARALLEL の指定値 (3) プロセッサセットの CPU 数 (4) 1 (注)結合編集時にオプション -Kparallel が指定されているとき、環境変数 PARALLEL の指定 値があれば、その値と一致していなければなりません。一致していない場合には以下の メッセージが出力され、小さい方の値が採用されます。 jwe1042i-w The value specified in the environment variable PARALLEL and OMP_NUM_THREADS are different when the environment variable FLIB_FASTOMP is TRUE. The value num is used as the value specified in the environment variable. この優先順位で決まるスレッド数が CPU 数の上限値を超えるとき、スレッド数は CPU 数の 上限値となります。 PARALLEL 指示文の NUM_THREADS 節または OMP_SET_NUM_THREADS サービスルーチ ンによって指定する値は、ここで決まるスレッド数と一致していなければなりません。異な る値を指定した場合には、以下のメッセージが出力され、プログラムの実行が終了されます。 jwe1041i-s The number of thread cannot be changed when the environment variable FLIB_FASTOMP is TRUE. - 高速実行時ライブラリを使用しないとき(FLIB_FASTOMP が TRUE でないとき) OpenMP のスレッド数は、以下の優先順位で決定されます。自動並列化のスレッド数は、 “12.2 自動並列化”の記述に従います。 (1)PARALLEL 指示文の NUM_THREADS 節の指定値 (2)OMP_SET_NUM_THREADS サービスルーチンの指定値 (3)環境変数 OMP_NUM_THREADS の指定値 (4)環境変数 PARALLEL の指定値 (5)プロセッサセットの CPU 数 (6)1 動的スレッド調整機構が有効な場合は、上記の優先順位で決まったスレッド数と CPU 数の上限値 を比較して、小さい方をスレッド値として採用します。 Fortran 使用手引書ー Page 339 動的スレッド調整機構が無効な場合、1CPU 当たりのスレッド数が 1 を超える場合には、並列に実 行されることを意図したスレッドが時分割で実行されることになります。このような場合、スレッ ド間の同期処理のオーバヘッドが大きくなり、実行性能が低下することがあります。 システムによる負荷も考慮して、1CPU 当たりのスレッド数が 1 以下になるようにスレッド数を設 定することをお勧めします。 なお、Parallelnavi 環境の配下で、実行する場合のスレッド数については、“付録 E Parallelnavi” を参照してください。 打切り時間設定時の注意 limit(1) コマンド等により打切り時間を設定した場合、正常に動作しないことがあります。正常に 動作しない場合は、Fortran の例外ハンドリング処理を実行時オプション -Wl,-i により無効にして ください。または、実行時オプション -Wl,-t により打切り時間を設定してください。 サービスルーチン使用時の注意 - ALARM サービス関数 動作は保証されません。結合時に、-lpthread を指定し POSIX インターフェースを使用した場 合、ALARM サービス関数の第 2 引数に指定されたサブルーチンで並列機能と終了機能 (STOP 文、EXIT サービスサブルーチン等)を使用しなければ、動作が保証されます。 - KILL および SIGNAL サービス関数 デッドロックの危険性があります。逐次実行プログラムだけで使用してください。 - FORK サービス関数 メモリの使用量が増大し実行性能が低下する可能性があります。結合時に、-lpthread を指定 し POSIX インターフェースを使用した場合は、動作が保証されません。逐次実行プログラム だけでの使用をお勧めします。 - SYSTEM、SH および CHMOD サービス関数 メモリの使用量が 2 倍になり実行性能が低下する可能性があります。逐次実行プログラムだ けでの使用をお勧めします。 12.3.1.2.4 複数のスレッドからの出力情報 プログラムの実行時に同一プログラム内で複数のスレッドからエラーが検出された場合、診断 メッセージおよびトレースバックマップは、スレッド単位に出力されます。したがって、パラレ ルリージョン内では、スレッド数分の情報が出力されます。 12.3.2 実現依存の仕様 OpenMP Fortran 仕様において、処理系の実現に任されている仕様については、本システムでは以 下のように実現しています。各項目の詳細については、OpenMP Fortran 仕様を参照してください。 メモリモデル 4 バイトを超えるか 4 バイト境界を跨ぐ変数に対して、2 つのスレッドからの書き込みが同時に起 こるとき、明示的な排他制御が行われなければ、変数の値はどちらの値にもならず不定となるこ とがあります。 4 バイトを超えるか 4 バイト境界を跨ぐ変数に対して、2 つのスレッドから書き込みと読み出しが 同時に起こるとき、明示的な排他制御が行われなければ、読み出される変数の値は書き込み前の 値でも書き込み後の値でもなく不定となることがあります。 内部制御変数 以下の環境変数またはライブラリルーチンによって指定された値は、全スレッドで共有されます。 - OMP_NUM_THREADS または OMP_SET_NUM_THREADS() Fortran 使用手引書ー Page 340 - OMP_DYNAMIC または OMP_SET_DYNAMIC() - OMP_NESTED または OMP_SET_NESTED() - OMP_SCHEDULE パラレルリージョンのネスト機能 本システムの OpenMP 仕様による並列化機能では、ネスト並列化機能を実現しています。システ ムで使用できるスレッドの数やスタック領域などの資源が許す限り、ネストのレベルに上限はあ りません。ただし、環境変数 FLIB_FASTOMP に TRUE が設定されている場合には、ネスト並列 は抑止されます。 動的スレッド調整機能 本システムの OpenMP 仕様による並列化機能では、動的スレッド調整機能を実現しています。こ の機能の効果は、“12.3.1.2.3 実行時の注意事項”を参照してください。 デフォルトの状態では、動的スレッド調整機能は有効です。 スレッド数 スレッド数については、“12.3.1.2.3 実行時の注意事項”を参照してください。 SCHEDULE 節 本システムの OpenMP 仕様による並列化機能では、SCHEDULE 節が省略された場合、デフォルト は“SCHEDULE(STATIC)”となります。 環境変数 OMP_SCHEDULE 本システムの OpenMP 仕様による並列化機能では、スケジュールタイプが RUNTIME の DO ディ レクティブおよび PARALLEL DO ディレクティブに対して、環境変数 OMP_SCHEDULE が省略さ れた場合、デフォルトは“SCHEDULE(STATIC)”となります。 SECTIONS 構文 スレッドは、SECTIONS 領域に到達するか、その中の一つの SECTION 領域の実行を終了したと き、その順序で次の SECTION 構文と対応付けられます。 SINGLE 構文 翻訳時オプション -Knopureomp が指定された場合(デフォルト)、SINGLE 領域はマスタスレッド で実行されます。-Kpureomp が指定された場合、SINGLE 領域は最初に到達したスレッドで実行さ れます。 ATOMIC 構文 2 つの ATOMIC 領域は、更新する変数の型または型パラメタが異なっていれば、独立に(排他的 でなく)実行されます。型と型パラメタが一致しているとき、以下の場合にはアドレスが異なっ ていても排他的に実行される場合があります。 - 論理型、複素数型、1 バイト整数型、2 バイト整数型、または四倍精度(16 バイト)実数 型の変数の更新。 - 32 ビットモード(“付録 D 32 ビットモードと 64 ビットモードの違い”参照)で、倍精度 (8 バイト)整数型または倍精度(8 バイト)実数型の変数の更新。 - 配列要素の更新であり、添え字式が字面上一致していないとき。 - 対象の式が明示的または暗黙の型変換を伴うとき。 実行時ライブラリルーチンと環境変数 Fortran 使用手引書ー Page 341 OMP_SET_NUM_THREADS ルーチンの呼び出しは、引数が 0 以下の値のとき何の効果もありませ ん。環境変数 OMP_NUM_THREADS に 0 以下の値を設定すると、1 を設定した場合と同じ効果を もちます。これらの値として、システムがサポートするスレッド数を超える数値を設定してはな りません。 活動状態の PARALLEL 領域の中で、OMP_SET_NUM_THREADS、OMP_SET_DYNAMIC または OMP_SET_NESTED ルーチンを呼び出してはなりません。 活動状態の PARALLEL 領域の中で、OMP_GET_MAX_THREADS、OMP_GET_DYNAMIC および OMP_GET_NESTED ルーチンに結合するスレッドは、遭遇するスレッドです。 THREADPRIVATE 指示文 スレッドプライベート変数は、以下の条件が満たされる場合に限って、連続する PARALLEL 領域 を跨いでその値、割付け状態、および結合状態が維持されます。この条件は、動的スレッド調整 機能とネスト並列の設定には無関係です。 - 連続する PARALLEL 領域は、ネストの関係にない。 - 連続する PARALLEL 領域で、実行に使用されるスレッドの数は同じである。 これらの条件が満たされないとき、後の PARALLEL 領域の入口でのスレッドプライベート変数の 値、割付け状態、および結合状態は、原則として不定になります。ただし、割付け状態は、以下 の条件を満たす場合に限り、後の PARALLEL 領域の入口で割付けられていない状態になります。 - 後の PARALLEL 領域の直前で、割付けられていない状態である。 - それ以前に実行されたすべての PARALLEL 領域の出口において、すべてのスレッドで割付け られていない状態である。 OpenMP 実行時ライブラリルーチンの引用仕様宣言 本システムの OpenMP 仕様による並列化機能では、omp_lib.h という名前のインクルードファイル および omp_lib という名前のモジュールを提供しています。これらには総称名による引用仕様宣 言は含まれていません。 モジュール omp_lib および omp_lib.h を引用する場合には以下の注意が必要です。 - 翻訳時オプション -AU を指定した場合、モジュール名 omp_lib および各ライブラリルーチン 名は、小文字でなければなりません。 - 翻訳時オプション -CcdII8、-CcI4I8、-CcdLL8、-CcL4L8、-Ccd4d8 または -Cca4a8 を指定した 場合、ライブラリルーチンの引数および結果の対応する型が変換されます。実行時に対応す る実行時オプション -Lb、-Li を指定する必要があります。 モジュール omp_lib を引用する場合には以下の注意が必要です。 - 翻訳時オプション -Am を指定してください。 omp_lib.h で宣言されている名前付き定数が使用されない場合、診断メッセージ jwd2004i-i が出力 されますが、実行結果には影響しません。 12.3.3 OpenMP 仕様の明確化および制限事項 ここでは、OpenMP 仕様についての、本システムでの解釈および制限事項について説明します。 12.3.3.1 ASSIGN 文による文番号指定および割当て形 GO TO 文 ASSIGN 文は、それが現れるディレクティブブロックの範囲外の文番号を引用することはできま せん。また、パラレルリージョン内の文番号を、パラレルリージョンの範囲外の ASSIGN 文で引 用することはできません。 Fortran 使用手引書ー Page 342 割当て形 GO TO 文による、ディレクティブブロックの範囲内への飛込みまたは範囲外への飛出し はできません。 12.3.3.2 ATOMIC ディレクティブおよび REDUCTION 並び項目における追加の関数 および演算子 ATOMIC ディレクティブおよび REDUCTION 並び項目において、以下の組込み関数および演算子 を指定することが可能です。 組込み関数:AND、OR 演算子:.XOR.、.EOR. 12.3.3.3 FORALL 構文 FORALL 構文の範囲内に、OpenMP Fortran 仕様のディレクティブを記述することはできません。 12.3.3.4 THREADPRIVATE 使用時の注意事項 THREADPRIVATE ディレクティブを使用する場合、同じ共通ブロック名は、プログラム内のすべ てのプログラム単位および手続において、THREADPRIVATE の指定に関しては、同じ指定でなけ ればなりません。 THREADPRIVATE 指定された共通ブロックについては、大きさを拡張して使用することはできま せん。 12.3.3.5 インライン展開 OpenMP Fortran ディレクティブを含んでいる利用者定義の外部手続および内部手続および OpenMP Fortran ディレクティブ構造内で引用された利用者定義の外部手続および内部手続は、イ ンライン展開されません。 12.3.3.6 パラレルリージョンからの内部手続呼出し パラレルリージョン内から呼び出される内部手続の中で引用されている親手続の変数は、パラレ ルリージョン内でプライベート化されていても、SHARED であるとみなされます。 Fortran 使用手引書ー Page 343 例: : i=1 この "i" は SHARED !$OMP PARALLEL PRIVATE(i) i=2 print *,i "i" は、この範囲で PRIVATE call c_proc() !$OMP END PARALLEL contains subroutine c_proc( ) : print *,i "i" は、この範囲で SHARED : end subroutine : 12.3.3.7 文関数定義文 文関数定義文のスカラ式に現れる変数は、PRIVATE、FIRSTPRIVATE、LASTPRIVATE、 REDUCTION および THREADPRIVATE 属性を指定することはできません。 12.3.3.8 変数群要素 変数群要素として宣言された変数は、PRIVATE、FIRSTPRIVATE、LASTPRIVATE、REDUCTION および THREADPRIVATE 属性を指定することはできません。 12.3.4 プログラミングの注意事項 ここでは、OpenMP 仕様のプログラミングにおいての注意事項について説明します。 12.3.4.1 パラレルリージョンの実現 パラレルリージョンの静的範囲は、翻訳処理により、内部手続化されます。 生成された内部手続は、“_OMP_ 通し番号 _”という名前をもちます。 12.3.4.2 OpenMP Fortran プログラムの自動並列化 本システムの -KOMP オプションと -Kparallel オプションは、同時に指定可能です。 同時に指定した場合、自動並列化される DO ループは以下のように制限されます。 - OpenMP の PARALLEL 構文、SECTIONS 構文、SINGLE 構文、MASTER 構文または CRITICAL 構文の静的範囲内にある DO ループは、自動並列化の対象とはなりません。 - OpenMP のディレクティブを静的に内部に含む DO ループは、自動並列化の対象とはなりま せん。 - OpenMP の DO ディレクティブで並列化される DO ループがある場合、以下の DO ループは自 動並列化の対象とはなりません。 ・ OpenMP の DO ディレクティブで並列化される DO ループ自身 ・ OpenMP の DO ディレクティブで並列化される DO ループの内側にある DO ループ Fortran 使用手引書ー Page 344 12.3.5 他のマルチスレッドプログラムとの結合 OpenMP Fortran プログラム以外の、マルチスレッドプログラムのオブジェクトプログラムとの結 合について、制限事項を示します。 本システムの自動並列化プログラム 本システムで翻訳時オプション-Kparallelを指定し作成した自動並列化プログラムのオブジェクト プログラムについては、本システムで -KOMP オプションを指定し作成したオブジェクトプログ ラムと結合可能です。 他のマルチスレッドプログラム 本システムで作成した以外の、他のマルチスレッドプログラムのオブジェクトプログラムとは、 結合できません。 12.3.6 OpenMP Fortran プログラムのデバッグ 実行可能プログラムでエラーが発生したとき、異常終了したとき、または利用者が目的とした結 果を得られないときは、その原因を追求し、原始プログラムの修正を行う必要があります。 この章では、これらの原因を見い出すためのデバッグ機能について説明します。なお、ここでは OpenMP Fortran プログラムのデバッグについてのみ記述しています。“第 8 章 プログラムのデ バッグ”も併せてお読みください。 12.3.6.1 デバッグのための検査機能 デバッグのための検査機能についての制限事項を示します。 - パラレルリージョンの範囲内(動的な場合も含みます)では、翻訳時オプション -H により提 供されるデバッグのための検査機能は、無効になります。 12.3.6.2 fdb コマンドによるデバッグ fdb は、マルチスレッドプログラムに対応したシンボリック・デバッグができます。 この節では、マルチスレッド固有の機能の概要を説明します。詳細は、fdb コマンドの man マニュ アルを参照してください。 スレッドの識別 スレッドを識別するための表現方法は、t@ スレッド ID です。このスレッド ID は、アプリケー ションでシステムから返されて使用される識別子と同じものです。 制御スレッド 本システムでは、実行時に制御のためのスレッドを 1 つ生成します。このスレッドは、ユーザス レッドとして生成されます。fdb コマンドの show thread コマンドを使用した場合、制御スレッド は、SLEEP 状態のユーザスレッドとして表示されます。show omp コマンドを使用した場合、制御 スレッドは表示されません。 スレッド情報の表示 - show thread スレッドについての情報を表示します。 Fortran 使用手引書ー Page 345 例 1: fdb* show thread スレッド ID 現在位置 タイプ t@1 0x10ac4 USER t@2 状態 (sub_ + 0xc) 最終 LPW ID プライオリティ 第 7 行目 , ソースファイル名 : /tmp/test.f ACTIVE 1 0 0xff015c80 (__signotifywait + 0x4) SYSTEM t@3 ACTIVE 2 0 0xff0162b0 (_lwp_sema_wait + 0x8) SYSTEM t@4 ACTIVE 3 0 0xff09e638 (_reap_wait + 0x34) SYSTEM t@5 SLEEP <Not bound> 127 0xfef99a08 (_lwp_sema_wait + 0x8) in /usr/lib/libc.so.1 USER t@6 0x10ac4 USER SLEEP (sub_ + 0xc) 5 0 第 7 行目 , ソースファイル名 : /tmp/test.f ACTIVE 7 0 (注)この例の t@5 は、制御スレッドです。 - show omp OpenMP Fortran 仕様におけるスレッドチームの情報を表示します。 例 2: fdb* show omp チーム : 0(t@1) 1(t@5) スレッドの実行制御 - thread デバッグの対象とするスレッドを指定します。 - continue-t 最初のブレークポイントに出合うまで、現在スレッドのみの実行を継続します。 例 3: fdb* continue-t プログラム : a.out の実行を再開します。 1 [thread 1 on lwp 1] Breakpoint #2: sub2_() at line 11 in /tmp/test.f. 11 write(6,*)i スレッドのフレーム - traceback-t 現存するすべてのスレッドについて、スタック中のすべてのトレースを表示します。 Fortran 使用手引書ー Page 346 例 4: fdb* traceback-t スレッド ID: t@1 #0 0x00010ac4 (sub_ + 0xc) (I=1) 第 7 行目 , ソースファイル名 : /tmp/test.f #1 0x00010aa8 (MAIN__._OMP_1_ + 0x24) () 第 3 行目 , ソースファイル名 : /tmp/test.f #2 0xff3724c4 (jwe_ppar + 0xa0c) (0x10a84,0xffbefa48,0x221b4,0x0,0x22668,0x22640) #3 0x00010a64 (MAIN__ + 0x48) () 第 2 行目 , ソースファイル名 : /tmp/test.f #4 0x00010a04 (main + 0x2c) (0x1,0xffbefb2c,0xffbefb34,0x20c00,0x0,0x0) #5 0x000109c0 (_start + 0x5c) () スレッド ID: t@2 #0 0xff015c80 (__signotifywait + 0x4) (0xff0c68b8,0xff0c4f44,0x0,0x0,0x0,0x0) #1 0xff09f57c (_dynamiclwps + 0x1c) (0xff0bc4b4,0xff0bddcc,0x2,0x0,0xff032110,0x0) #2 0xff0a24cc (_thr_yield + 0x8c) (0x0,0x0,0x0,0x0,0x0,0x0) スレッド ID: t@3 #0 0xff0162b0 (_lwp_sema_wait + 0x8) (0xff0c0758,0xff0a6bbc,0x15938,0x0,0x0,0x0) #1 0xff0a6bbc (_tdb_agent + 0x44) (0x0,0x0,0xff0c04f0,0xff0c0b7c,0xff0c0758,0x0) #2 0xff0a24cc (_thr_yield + 0x8c) (0x0,0x0,0x0,0x0,0x0,0x0) 0x0 番地からデータを得ることができません。 スレッド ID: t@4 #0 0xfef99a08 (_lwp_sema_wait + 0x08) (0xfe909e78,0x0,0xff390310,0xff05a668,0xff3df650,0x3) #1 0xff04b288 (_park + 0x10c) (0xfe909dc0,0xfe909e78,0x0,0xff0789f4,0x0,0x0) #2 0xff04acc4 (_swtch + 0x128) (0x5,0xff06cae4,0xfe909e54,0xfe909e50,0xfe909e4c,0xfe909e48) #3 0xff05a670 (cond_timedwait_sig + 0x164) (0xff06e2b8,0xfe909c48,0xfe909c70,0xfe909c6c,0x0,0xfe909c68) #4 0xff05a93c (_sigtimedwait + 0x1f0) (0xff06da90,0x0,0x0,0xff06cae4,0xfe909dc0,0x0) #5 0xfef91658 (_posix_sigwait + 0x1c) (0x0,0xfe909d5c,0x0,0xff377e80,0x0,0x0) #6 0xff32ce08 (jwe_timer_PE + 0x68) (0xff377e80,0x0,0x1,0xff06e138,0x1,0xff06cae4) #7 0xff05bdb8 (_thread_start + 0x40) (0xff377e80,0x0,0x1,0xff06e138,0x1,0xff06cae4) スレッド ID: t@5 #0 0x00010ac4 (sub_ + 0xc) (I=1) 第 7 行目 , ソースファイル名 : /tmp/test.f #1 0x00010aa8 (MAIN__._OMP_1_ + 0x24) () 第 3 行目 , ソースファイル名 : /tmp/test.f #2 0xff3724c4 (jwe_ppar + 0xa0c) (0x10a84,0xffbefa48,0x221b4,0x0,0x22668,0x22640) #3 0x00010a64 (MAIN__ + 0x48) () 第 2 行目 , ソースファイル名 : /tmp/test.f #4 0x00010a04 (main + 0x2c) (0x1,0xffbefb2c,0xffbefb34,0x20c00,0x0,0x0) #5 0x000109c0 (_start + 0x5c) () スレッド ID: t@6 #0 0x00010ac4 (sub_ + 0xc) (I=1) 第 7 行目 , ソースファイル名 : /tmp/test.f #1 0x00010aa8 (MAIN__._OMP_1_ + 0x24) () 第 3 行目 , ソースファイル名 : /tmp/test.f Fortran 使用手引書ー Page 347 #2 0xff30bd08 (jwe_PE + 0x118) (0x221b4,0x0,0x1,0xff0bdad0,0x1,0xff0bc4b4) #3 0xff0ab7b0 (_thread_start + 0x40) (0x221b4,0x0,0x1,0xff0bdad0,0x1,0xff0bc4b4) スレッドのブレークポイント - break-t ブレークポイントを設定します。 - oncebreak-t 一時ブレークポイントを設定します。 12.4 I/O バッファ並列転送 I/O バッファ並列転送とは、Fortran プログラムの配列領域と入出力文で使用するバッファ領域の 間のデータ転送をスレッド並列により高速化する機能です。 12.4.1 翻訳・実行の方法 ここでは、I/O バッファ並列転送を行うための翻訳・実行の方法および条件について説明します。 12.4.1.1 翻訳の方法 I/Oバッファ並列転送を行うためには、翻訳時オプション-Kparallelまたは翻訳時オプション-KOMP を指定します。 翻訳時オプション -Kparallel は、自動並列化を行うためのオプションです。詳細については、 “12.2 自動並列化”を参照してください。 翻訳時オプション -KOMP は、OpenMP 仕様による並列化を行うためのオプションです。詳細につ いては、“12.3 OpenMP 仕様による並列化”を参照してください。 12.4.1.2 実行の方法 I/O バッファ並列転送を行うためには、以下の環境設定が必要です。 - 環境変数 FLIB_IOBUFCPY に MP を指定します。 - スレッド数を環境変数 PARALLEL、環境変数 OMP_NUM_THREADS などで指定します。 スレッド数の詳細については、“12.2.1.2.2 スレッド数”を参照してください。 12.4.1.3 I/O バッファ並列転送の条件 I/O バッファ並列転送が実行されるには、以下の条件が必要です。 - 対象となる入出力文は、書式なし入出力文 - 対象となる入出力文は、パラレルリージョン外および自動並列化された部分外に存在する - 環境変数 FLIB_IOBUFCPY_SIZE が指定されていない場合、データの転送量および入出力作 業域の値が、スレッド数 K バイト+ 30K バイト以上 - 環境変数 FLIB_IOBUFCPY_SIZE に size が指定されている場合、データの転送量および入出 力作業域の値が、sizeK バイト以上 入出力作業域のサイズは、順番探査入出力文の場合、実行時オプション -g または実行時の環境変 数 fuxxbf で指定してください。直接探査入出力文の場合、open 文の recl 指定子の値と実行時オプ ション -d で指定してください。 実行時オプション -g の詳細については、“3.3 実行時オプション”を参照してください。 Fortran 使用手引書ー Page 348 実行時の環境変数 fuxxbf および FLIB_IOBUFCPY_SIZE の詳細については、 “3.8 実行時の環境変 数”を参照してください。 12.4.1.4 翻訳・実行の例 例: % cat test.f character ch((30+4)*1024) ch='X' open(10,form="unformatted") write(10) ch close(10) end % frt -Kparallel test.f % setenv FLIB_IOBUFCPY MP % setenv PARALLEL 4 % a.out -Wl,-g34 環境変数 FLIB_IOBUFCPY に MP を指定して I/O バッファ並列転送機能を有効にします。環境変数 PARALLEL に 4 を指定して、スレッド数を 4 にします。実行時オプション -g34 を指定して、入出 力作業域を 34Kbyte(スレッド数 4 + 30Kbyte)にします。 12.4.2 I/O バッファ並列転送機能の注意事項 I/O バッファ並列転送が行われても入出力作業域が小さい場合または転送されるデータサイズが 小さい場合は、性能が劣化することがあります。 12.5 並列実行情報 ここでは、並列実行情報について説明します。並列実行情報では、プログラムの実行環境、プロ グラムが並列で実行されている割合などの情報を得ることができます。また、パラレルリージョ ン毎の実行時間から、並列効果が得られたかなどを知ることができます。 12.5.1 並列実行情報が出力する情報 出力される情報の説明を以下に示します。 Fortran 使用手引書ー Page 349 PARALLEL EXECUTION INFORMATION Number of CPU(s) 2 Number of thread(s) Automatic Parallelization 2 2 OpenMP Execution mode information FLIB_FASTOMP FALSE FLIB_SPINWAIT disable Tread stack size SPIN MODE Memory information Largepage 8388608 I/O buffer parallel transfer Information FLIB_IOBUFCPY disable Barrier Information Barrier kind Softbarrier 環境変数 FLIB_PARALLEL_INFO に 1 を指定した場合、以下の情報が出力されます。 - Number of CPU(s) 使用可能な CPU 数が出力されます。 - Number of thread(s) 自動並列および OpenMP で使用したスレッド数が出力されます。 - Execution mode information 環境変数 FLIB_FASTOMP(高速ライブラリ使用の有無)の設定、FLIB_SPINWAIT(待機ス レッドの処理が SPIN MODE であるか、SUSPEND MODE であるか)が出力されます。 - Memory Information ラージページ機能の使用、全スレッドで獲得したスレッドスタックの総量が出力されます。 - I/O buffer parallel transfer Information I/O バッファ並列転送機能の有効/無効を出力します。 - Barrier Information 使用されたバリア種別を出力します。 Fortran 使用手引書ー Page 350 環境変数 FLIB_PARALLEL_INFO に 2 を指定した場合、1 で出力される情報に加えて以下の情報 が出力されます。 - I/O buffer parallel transfer Information I/O バッファ並列転送が実行された回数が出力されます。 - Barrier number of times 自動並列および OpenMP のバリア同期回数が出力されます。 - The parallelization number of times 自動並列および OpenMP で並列化された回数が出力されます。 - The percentage of parallel region for master thread プログラムが並列で実行している割合として、 “マスタスレッドのパラレルリージョン実行時 間÷ real time”を出力します。 - The percentage of parallel region for all thread 逐次プログラムからの並列化率の目安として、 “全スレッドのパラレルリージョン実行時間の 合計÷(全スレッドのパラレルリージョン実行時間の合計 + マスタスレッドの逐次リージョ ン実行時間)”を出力します。 - Parallel region information of Automatic Parallelization 自動並列化されたパラレルリージョンの手続名、ライン行、実行時間およびパラレルリージョ ンのコスト分布一覧を表示します。 - Parallel region information of OpenMP OpenMP で並列化されたパラレルリージョンの手続名、ライン行、実行時間およびパラレル リージョンのコスト分布一覧を表示します。 (OpenMP のネストされた並列実行は含みませ ん) 。 12.6 スタック情報表示機能 環境変数 FLIB_USE_STACK_INFO を定義した場合、プログラム終了時、以下に示す形式でスタッ ク情報を表示します。 - 逐次実行した場合 --- Stack Information (Fortran) --Large page stack : Use | Not use Process stack size : xxxxx Byte Process used stack size : xxxxx Byte - N 並列実行した場合 --- Stack Information (Fortran) --Large page stack : Use | Not use Process stack size Process used stack size (1) (2) (3) (1) : xxxxx Byte (2) : xxxxx Byte (3) Thread stack size : xxxxx Byte (4) Thread 1 used stack size : xxxxx Byte (5) . . Thread N-1 used stack size : xxxxx Byte (1) ラージページスタックの使用の有無 ラージページスタックを使用した場合、Use を表示します。使用しなかった場合、 Not use を表示します。ラージページスタックについては、 “E.1 ラージページ機能”を 参照してください。 Fortran 使用手引書ー Page 351 (2) プロセススタックサイズ プロセススタックサイズを、Byte 単位で表示します。無制限の値が採用された場合は、 "(unlimited)" を表示します。無制限の値を採用される可能性があるのは、ラージページ でない通常のプロセススタックだけです。 (3) 使用されたプロセススタックサイズ 使用されたプロセススタックサイズの大まかな値を、Byte 単位で表示します。 (4) スレッドスタックサイズ スレッドスタックサイズを、Byte 単位で表示します。すべてのスレッドで同じ大きさに なります。 (5) 使用されたスレッドスタックサイズ 使用されたスレッドスタックサイズの大まかな値を、スレッド毎に Byte 単位で表示し ます。 例 1:逐次、ラージページスタック未使用、プロセススタッック unlimited で約 8KB(8192B) 使用した場合 --- Stack Information (Fortran) --Large page stack : Not use Process stack size : 2147483647 Byte (unlimited) Process used stack size : 8192 Byte 例 2:4 並列、ラージページスタック使用、プロセススタック 128MB(134217728B)で 約 16KB(16384B)使用、スレッドスタック 8MB(8388608B)で各スレッドで共に 約 8KB(8192B)使用した場合 --- Stack Information (Fortran) --Large page stack : Use Process stack size : 134217728 Byte Process used stack size : 16384 Byte Thread stack size : 8388608 Byte Thread 1 used stack size : 8192 Byte Thread 2 used stack size : 8192 Byte Thread 3 used stack size : 8192 Byte 備考 1. ラージページスタック未使用の場合の使用サイズは、ページ単位に切り上げます。 備考 2. 巨大なラージページスタックを使用した場合、 使用サイズの解析に時間がかかります。 備考 3. 使用したサイズは、およその目安であり正確な値になるとは限りません。 付録 A プログラムの制限 Fortran コンパイラを使用する場合、原始プログラムの大きさや複雑さには制限があります。これ には、一つの Fortran 文に関するものと、複数個の文の組合せによるものとがあります。以下に各 制限について説明します。 A.1 関数引用、部分配列、配列要素引用および部分列引用の入れ子の深さ 関数引用、部分配列、配列要素引用および部分列引用の組合せにおいて、その入れ子の深さは合 計 255 重までです。 ただし、255 重以下の入れ子であってもコンパイラの作業域の制限により処理できないことがあ ります。 例:関数引用および配列要素引用の入れ子の深さ INTEGER IA(10) EXTERNAL FUN,IFUN : X = FUN(IFUN(IA(1))) ! 入れ子の深さは 3 です A.2 DO 構文、CASE 構文、IF 構文の入れ子の深さ DO 構文、CASE 構文、IF 構文の組合せにおいて、その入れ子の深さは、50 重までです。 例:DO 構文および IF 構文の入れ子の深さ DO I=1,10 A(I) = A(I) + 1 ! 入れ子の深さは 1 です IF (I <= 5) THEN CALL S ! 入れ子の深さは 2 です DO J = 1,5 B(J) = A(J) ! 入れ子の深さは 3 です END DO CALL T ! 入れ子の深さは 2 です END IF END DO A.3 DO 形並びの入れ子の深さ 入出力文および DATA 文における DO 形並びの入れ子の深さは、合計 25 重までです。 例:DO 形並びの入れ子の深さ PRINT *, ((A(I,J),I=1,2),J=1,3) ! 入れ子の深さは 2 です A.4 INCLUDE 行の入れ子の深さ INCLUDE 行の入れ子の深さは、合わせて 16 重までです。 Fortran 使用手引書ー Page 353 例:INCLUDE 行の入れ子の深さ INCLUDE "COMMON" CALL JSUB (A,B,K) IF (K.NE.0) GO TO 10 : END SUBROUTINE JSUB(X,Y,J) INCLUDE "COMMON" : END ファイル COMMON COMMON/R/N,M REAL(8) Q,P この例の INCLUDE 行の入れ子の深さは、1 です。 A.5 配列宣言子の制限 コンパイラは、部分配列または配列要素引用時に配列の要素位置を求める計算を減らすため、配 列宣言子に対して一つの値 T を求めます。 配列宣言子には、二つの制限があります。 A.5.1 すべての配列宣言子の制限 次の式で表される T の絶対値が 2147483647 を超えてはいけません。 また、計算の途中においても絶対値が 2147483647 を超えてはいけません。 n T = l1 × s + ∑ { l i × ( ∏ dm – 1 × s ) } i=2 T l s n d i m=2 :配列宣言子に対して求める値 :各次元の寸法の下限 :配列要素の長さ :配列の次元数 :各次元の大きさを示す寸法 例:すべての配列宣言子の制限 PARAMETER (IL=10000,IU=10999) INTEGER(4) A(IL:IU,IL:IU,IL:IU) 配列 A においての T(配列宣言子に対して求める値)は、40040040000 となり、この配列宣言 子は記述できません。 A.5.2 大きさゼロの配列宣言子の制限 非定数宣言式の上下限をもつ大きさゼロの配列の配列宣言子において、次の式で表される T の絶 対値が 2147483647 を超えてはいけません。 また、計算の途中においても絶対値が 2147483647 を超えてはいけません。 n T = s× ∏ ( ui – li + 1 ) i=1 Fortran 使用手引書ー Page 354 T :配列宣言子に対して求める値 s :配列要素の長さ n :配列の次元数 u :各次元の寸法の上限 l :各次元の寸法の下限 例:大きさゼロの配列の配列宣言子の制限 CALL SUB(2*(10**9)) CONTAINS SUBROUTINE SUB(I) INTEGER A(I:-1) : END SUBROUTINE END 配列 A においての T(配列宣言子に対して求める値)は、-8000000000 となり、この配列宣言 子は記述できません。 A.6 部分配列の制限 部分配列の添字三つ組の 添字 1:添字 2:刻み幅 において、 (添字 2 -添字 1 +刻み幅)/刻み幅 の演算の途中でオーバフローが発生してはいけません。 A.7 分岐命令から分岐先命令への距離による影響 分岐命令において、分岐先アドレスの即値フィールドの大きさには制限があります。そのため、 分岐命令から分岐先命令への距離が一定以上離れている場合、アセンブラで以下のようなメッ セージが出力され、そのプログラムを翻訳することはできません。 /usr/ccs/bin/as: "/var/tmp/asmAAAa006jR.s", line 297816: error:word displacement will not fit in 19 bits /usr/ccs/bin/as: "/var/tmp/asmAAAa006jR.s", line 14798: error:word displacement will not fit in 19 bits この現象は、数千行以上の実行文を含むループに対して -H 系オプションと -Kthreadsafe オプショ ンを同時に指定して翻訳した場合や、巨大なループの中に配列式が多数含まれている場合に発生 する可能性が高くなります。 このような現象が起きた場合、ループを分割するなどプログラムを修正する、または -O0 オプショ ンを有効にすることにより回避することが可能です。-O0 オプションを有効な場合、最適化が行 われないので実行時間が長くなることがありますので注意が必要です。 付録 B 印刷制御用コマンド 利用者は、印刷制御用コマンド fot を使用することにより、Fortran プログラムの出力ファイルを ラインプリンタ規則に従ったファイルに変換することができます。 fot コマンドは、書式付き記録中の先頭の文字を、以下に示す行送りを決定する制御文字に変換し ます。 文字 印字前の送り 空白 0 1 + 1行 2行 次のページの最初の行まで 行送りなし 空白行は先頭の文字を空白として取り扱われます。制御文字として扱われた記録の先頭の空白文 字は削除されます。 先頭の文字が上記以外の場合は、記録の先頭に空白文字が付加された記録として取り扱われます。 この場合、fot コマンドの終了時に診断メッセージが出力されます。 B.1 fot コマンドの形式 以下に、fot コマンドの形式を示します。 コマンド名 fot オペランド [ □ file1 □ file2 ] □ :一個以上の空白が必要なことを意味します。 file1 :入力ファイル(省略時は標準入力ファイル) file2 :出力ファイル(省略時は標準出力ファイル) 以下に、例を示します。 例 1:オペランドのファイル名を省略(リダイレクション) % fot <infile >outfile 例 2:オペランドのファイル名を省略(パイプ) % command1 | fot | command2 例 3:オペランドにファイル名を指定 % fot infile outfile Fortran 使用手引書ー Page 356 B.2 fot コマンドの実行例 以下に、fot コマンドの実行例を示します。 % cat infile _aaaa 1bbbb cccc 0dddd _eeee +ff %fot <infile | lpr fot: invalid 1 line carriage control conventions in infile _:空白文字 印刷結果 aaaa bbbb cccc 1 ページ目 2 ページ目 dddd ffee B.3 fot コマンドの復帰値 以下に、fot コマンドが設定する復帰コードを示します。 復帰コード 0 意味 正常に終了しました。 1 fot コマンドでエラーが発生しました。 B.4 fot コマンドの出力情報 印刷制御用コマンド fot が出力する印刷情報として診断メッセージがあります。診断メッセージ は、fot コマンド行に指定されたファイル名の指定に誤りがある場合、入力ファイルの記録の先頭 の文字に誤りがある場合に標準エラー出力ファイルに出力されます。 fot コマンドが出力する診断メッセージの形式を以下に示します。 fot:メッセージ本文 付録 C 富士通ホスト系 FORTRAN コンパイラ との互換 富士通 FORTRAN77 EX V12 系の動作を保証したい場合には、翻訳時オプション -Xf6 または -Xf7 を指定する必要があります。 富士通 FORTRAN77 EX V12 系とは、以下の項目の動作が異なります。 - B 形編集記述子および Z 形編集記述子( “C.1 B 形編集記述子および Z 形編集記述子”参照) - 実引数に 2 バイトの整数型をもつ組込み関数の結果の型( “C.2 実引数に 2 バイトの整数型 をもつ組込み関数の結果の型”参照) - 新規追加の FORTRAN77 言語仕様組込み関数の解釈(“C.3 追加の FORTRAN77 言語仕様組 込み関数の解釈”参照) - DO パラメタの増分値変数を更新している DO ループの DO 変数の値(“C.4 DO パラメタの 増分値変数を更新している DO ループの DO 変数の値”参照) - ENDFILE 文後の入出力文の動作(“C.5 先行の入出力文が ENDFILE 文である場合の入出力 文の動作”参照) - EOF 検出後の入出力文の動作( “C.6 先行の入出力文が EOF 検出である場合の入出力文の動 作”参照) - READ 文後の ENDFILE 文の動作(“C.7 先行の入出力文が順番探査 READ 文である場合の 入出力文の動作”参照) - OPEN 文の STATUS 指定子とファイル名の関係(“C.8 OPEN 文の STATUS 指定子とファイ ル名の関係”参照) - 名前なしファイルの扱い(“C.9 名前なしファイルの扱い”参照) - 内部ファイルに対する並びによる出力文(“C.10 内部ファイルに対する並びによる出力文” 参照) - 8 バイトの整数型との演算結果の型( “C.11 8 バイトの整数型との演算結果の型”参照) - OPEN 文の BLANK 指定子、DELIM 指定子および PAD 指定子(“C.12 OPEN 文の BLANK 指定子、DELIM 指定子および PAD 指定子”参照) - OPEN 文の STATUS 指定子と ACTION 指定子(“C.13 OPEN 文の STATUS 指定子と ACTION 指定子”参照) - Q 形編集記述子(“C.14 Q 形編集記述子”参照) - ファイル INQUIRE 文(“C.15 ファイル INQUIRE 文”参照) Fortran 使用手引書ー Page 358 以下の項目については、富士通 FORTRAN77 EX V12 系とは、互換がありません。 - 指数部取出し、仮数部取出しの組込み関数(“C.16 組込み関数”参照) C.1 B 形編集記述子および Z 形編集記述子 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、FUJITSU FORTRAN77 文法書で定義さ れた動作を行います。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、数値編集としての動作を行 います。 例 1:-Xf6 または -Xf7 指定時の Z 形編集記述子の動作 PARAMETER (I=Z'0001ABCD') PRINT '(1H Z2)' , I ! □ CD が出力されます。 ! □は空白を表します。 例 2:標準での動作 PARAMETER (I=Z'0001ABCD') PRINT '(1H Z2)' , I ! □ ** が出力されます。 ! □は空白を表します。 C.2 実引数に 2 バイトの整数型をもつ組込み関数の結果の型 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実引数に 2 バイトの整数型をもつ組込 み関数 ABS、IABS、MOD、SIGN、ISIGN、DIM、IDIM、MAX、MAX0、MIN、MIN0 の結果の 型は、4 バイトの整数型になります。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、結果の型は実引数の型と同 じであり、2 バイトの整数型になります。 例 1:-Xf6 または -Xf7 指定時、2 バイトの整数型を実引数にもつ組込み関数 ABS の型 INTEGER(2) :: I2 = -1 CALL S(ABS(I2)) ! 手続 S の実引数の型は 4 バイトの整数型 例 2:標準での 2 バイトの整数型を実引数にもつ組込み関数 ABS の型 INTEGER(2) :: I2 = -1 CALL S(ABS(I2)) ! 手続 S の実引数の型は 2 バイトの整数型 C.3 追加の FORTRAN77 言語仕様組込み関数の解釈 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、組込み関数名 SIND、DSIND、QSIND、 COSD、DCOSD、QCOSD、TAND、DTAND、QTAND、COTAND、DCOTAND、QCOTAND、ASIND、 DASIND、QASIND、ACOSD、DACOSD、QACOSD、ATAND、DATAND、QATAND、ATAN2D、 DATAN2D、QATAN2D、SINQ、DSINQ、QSINQ、CSINQ、CDSINQ、CQSINQ、COSQ、DCOSQ、 QCOSQ、CCOSQ、CDCOSQ、CQCOSQ、TANQ、DTANQ、QTANQ、COTANQ、DCOTANQ、 QCOTANQ、ASINQ、DASINQ、QASINQ、ACOSQ、DACOSQ、QACOSQ、ATANQ、DATANQ、 QATANQ、ATAN2Q、DATAN2Q、QATAN2Q、AND、OR、XOR、LSHIFT、RSHIFT、LRSHFT お よび LOC は、ユーザ定義の関数として解釈されます。 標準 (翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、 組込み関数として解釈されます。 例 1:-Xf6 または -Xf7 指定時、LOC はユーザ定義の関数になります。 IP = LOC(A) 例 2:標準では LOC はアドレスを取り出す組込み関数になります。 IADDR = LOC(A) Fortran 使用手引書ー Page 359 C.4 DO パラメタの増分値変数を更新している DO ループの DO 変数の値 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、DO ループ内で増分値の変数を更新する と DO 変数に値が反映されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、DO ループ内で増分値の変数 を更新しても DO 変数には値が反映されません。 例 1:-Xf6 または -Xf7 指定時、DO 変数に値が反映されます。 J = 1 DO I=1,3,J J = 5 PRINT *, I ! 1,6,11 が出力されます。 END DO 例 2:標準では DO 変数に値が反映されません。 J = 1 DO I=1,3,J J = 5 PRINT *, I ! 1,2,3 が出力されます。 END DO C.5 先行の入出力文が ENDFILE 文である場合の入出力文の動作 入出力文の組合せの条件により、入出力文の動作が異なります。 入出力文の組合せについては、“7.8 入出力文の組合せ”および“7.9 ファイル位置付け文”を 参照してください。 - 現在の入出力文が順番探査 READ 文、順番探査 WRITE 文、PRINT 文の場合 翻訳時オプション -X の指定に従い、順番探査 READ 文、順番探査 WRITE 文、PRINT 文の動 作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、 実行時の診断メッセージ(jwe0111i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル終了記録の直 前に位置づけられ、READ 文、WRITE 文、PRINT 文が実行されます。 - 現在の入出力文が ENDFILE 文の場合 翻訳時オプション -X の指定に従い、ENDFILE 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、 実行時の診断メッセージ(jwe0111i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、無操作となります。 C.6 先行の入出力文が EOF 検出である場合の入出力文の動作 入出力文の組合せの条件により、入出力文の動作が異なります。 入出力文の組合せについては、“7.8 入出力文の組合せ”および“7.9 ファイル位置付け文”を 参照してください。 Fortran 使用手引書ー Page 360 - 現在の入出力文が順番探査 READ 文、順番探査 WRITE 文、PRINT 文の場合 翻訳時オプション -X の指定に従い、順番探査 READ 文、順番探査 WRITE 文、PRINT 文の動 作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実行時の診断メッセージ(jwe0115i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル終了記録の直 前に位置づけられ、READ 文、WRITE 文、PRINT 文が実行されます。 - 現在の入出力文が ENDFILE 文の場合 翻訳時オプション -X の指定に従い、ENDFILE 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実行時の診断メッセージ(jwe0115i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、無操作となります。 C.7 先行の入出力文が順番探査 READ 文である場合の入出力文の動作 入出力文の組合せの条件により、入出力文の動作が異なります。 入出力文の組合せについては、“7.8 入出力文の組合せ”および“7.9 ファイル位置付け文”を 参照してください。 - 現在の入出力文が ENDFILE 文の場合 翻訳時オプション -X の指定に従い、ENDFILE 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、ファイル終了記録は出力せず、ファ イル終了記録の直前に位置づけられます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、順番探査 READ 文が読 み込んだ次のレコードにファイル終了記録が書き出されます。 C.8 OPEN 文の STATUS 指定子とファイル名の関係 OPEN 文の STATUS 指定子とファイル名の関係において影響する項目を記述します。 - FILE 指定子を指定し、OPEN 文の STATUS 指定子に "SCRATCH" を指定した場合 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実行時の診断メッセージ(jwe0088i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、名前付きファイルとみ なされ、正常に実行されます。 ただし、CLOSE 文の STATUS 指定子に "KEEP" を指定しないと、ファイルは削除されます。 - 環境変数または OPEN 文の FILE 指定子で、ファイル名を指定せず、OPEN 文の STATUS 指 定子に "NEW"、"OLD" または "SHR" を指定した場合 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実行時の診断メッセージ(jwe0088i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して入出力が行われます。 Fortran 使用手引書ー Page 361 - 環境変数または OPEN 文の FILE 指定子にファイル名を指定せず、OPEN 文の STATUS 指定 子に "UNKNOWN" を指定するか、または OPEN 文の STATUS 指定子を省略した場合 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、名前なしファイルとして扱われます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して入出力が行われます。 - 環境変数でファイル名を指定し、OPEN 文の STATUS 指定子に "SCRATCH" を指定した場合 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実行時の診断メッセージ(jwe0088i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、名前付きファイルとし て扱われます。 ただし、CLOSE 文の STATUS 指定子に "KEEP" を指定しないと、ファイルは削除されます。 C.9 名前なしファイルの扱い 入出力文の組合せなどの条件により、名前なしファイルの扱いが異なります。 以下に、入出力文の実行について記述します。 なお、入出力文の組合せについては、“7.8 入出力文の組合せ”を参照してください。 - 環境変数でファイル名を指定せず、入出力文の組合せとして、先行の入出力文がなく、現在 の入出力文が順番探査 READ 文の場合 翻訳時オプション -X の指定に従い、順番探査 READ 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、実行時の診断メッセージ(jwe0028i-s) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して、入出力が行われます。 - 環境変数でファイル名を指定せず、入出力文の組合せとして、先行の入出力文がなく、現在 の入出力文が順番探査 WRITE 文の場合 翻訳時オプション -X の指定に従い、順番探査 WRITE 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、名前なしファイルに対して出力が 行われます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して、出力が行われます。 - 環境変数または OPEN 文の FILE 指定子にファイル名を指定せず、入出力文の組合せとして、 先行の入出力文がなく、現在の入出力文が OPEN 文または ENDFILE 文の場合 翻訳時オプション -X の指定に従い、OPEN 文または ENDFILE 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、名前なしファイルに対して OPEN 文または ENDFILE 文が実行されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して OPEN 文または ENDFILE 文が実行されます。 - 環境変数でファイル名を指定せず、入出力文の組合せとして、先行の入出力文がなく、現在 の入出力文が CLOSE 文または BACKSPACE 文の場合 Fortran 使用手引書ー Page 362 翻訳時オプション -X の指定に従い、CLOSE 文または BACKSPACE 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、無操作となります。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して CLOSE 文または BACKSPACE 文が実行されます。 - 入出力文の組合せとして、先行の入出力文が CLOSE 文であり、現在の入出力文が READ 文、 WRITE 文、PRINT 文、BACKSPACE 文、ENDFILE 文または REWIND 文の場合 翻訳時オプション -X の指定に従い、READ 文、WRITE 文、PRINT 文、BACKSPACE 文、 ENDFILE 文または REWIND 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、 実行時の診断メッセージ(jwe0111i-e) が出力されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルに対して入出力が行われます。 - 入出力文の組合せとして、先行の入出力文が CLOSE 文であり、現在の入出力文が FILE 指定 子が指定されていない OPEN 文の場合 翻訳時オプション -X の指定に従い、入出力文の実行が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、名前なしファイルが生成されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、ファイル名が fort.nn(nn は装置番号です)のファイルが生成されます。 C.10 内部ファイルに対する並びによる出力文 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、内部ファイルに対する並びによる出力 文は、各記録の最初のけたに空白が出力されません。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、内部ファイルに対する並び による出力文は、各記録の最初のけたに空白が出力されます。 例: CHARACTER(8) CH(2) INTEGER I1(4),I2,I3 I1(1) = 1; I1(2) = 2; I1(3) = 3; I1(4) = 4 I2 = 1000; I3 = 10 WRITE(CH,*) I1,I2,I3 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、CH の値は以下のようになります。 CH(1) :'1 2 3 4 ' CH(2) :'1000 10 ' 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、CH の値は以下のように なります。 CH(1) :' 1 2 3 4' CH(2) :' 1000 10' Fortran 使用手引書ー Page 363 C.11 8 バイトの整数型との演算結果の型 翻訳時オプション -Xf6 または -Xf7 を指定した場合には、結果の型は、以下のようになります。 - 8 バイトの整数型と実数型、8 バイトの整数型と複素数型の演算の結果の型は、それぞれ倍精 度実数型、倍精度複素数型になります。 - 組込み関数の実引数に 8 バイトの整数型と実数型を指定した場合、結果の型は、倍精度実数 型になります。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、結果の型は、以下のように なります。 - 8 バイトの整数型と実数型、8 バイトの整数型と複素数型の演算の結果の型は、それぞれ実数 型、複素数型になります。 - 組込み関数の実引数に 8 バイトの整数型と実数型を指定した場合、結果の型は、実数型にな ります。 例 1:-Xf6 または -Xf7 指定時の 8 バイトの整数型と実数型との演算結果の型 real :: a = 1. integer (kind=8) :: b = 2 call s(a+b) ! 手続 s の実引数の型は、倍精度実数型 例 2:-Xf6 または -Xf7 指定時の 8 バイトの整数型と複素数型との演算結果の型 complex :: a = (1.,1.) integer (kind=8) :: b = 2 call s(a+b) ! 手続 s の実引数の型は、倍精度複素数型 例 3:-Xf6 または -Xf7 指定時、8 バイトの整数型と実数型を引数にもつ組込み関数の結果の型 real :: a = 1. integer (kind=8) :: b = 2 call s(max(a,b)) ! 手続 s の実引数の型は、倍精度実数型 例 4:標準での 8 バイトの整数型と実数型との演算結果の型 real :: a = 1. integer (kind=8) :: b = 2 call s(a+b) ! 手続 s の実引数の型は、実数型 例 5:標準での 8 バイトの整数型と複素数型との演算結果の型 complex :: a = (1.,1.) integer (kind=8) :: b = 2 call s(a+b) ! 手続 s の実引数の型は、複素数型 例 6:標準での 8 バイトの整数型と実数型を引数にもつ組込み関数の結果の型 real :: a = 1. integer (kind=8) :: b = 2 call s(max(a,b)) ! 手続 s の実引数の型は、実数型 C.12 OPEN 文の BLANK 指定子、DELIM 指定子および PAD 指定子 装置に接続されるファイルが、その装置に接続されているファイルと同一であるような OPEN 文 を実行し、その OPEN 文で、BLANK 指定子、DELIM 指定子または PAD 指定子を省略した場合、 翻訳時オプション -X の指定により、各指定子の想定される値が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、各指定子の省略値が有効となります。つ まり、BLANK 指定子では "NULL"、DELIM 指定子では "NONE"、PAD 指定子では "YES" が各指 定子の値として想定されます。 Fortran 使用手引書ー Page 364 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、直前に実行された OPEN 文 の BLANK 指定子、DELIM 指定子および PAD 指定子の値が想定されます。 例: OPEN(10,FILE='FILE.DATA',BLANK='ZERO') : OPEN(10) ! (1) 翻訳時オプション -Xf6 または -Xf7 を指定した場合、 (1)の OPEN 文では、BLANK 指定子の 値は "NULL" と想定されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、BLANK 指定子の値は "ZERO" と想定されます。 C.13 OPEN 文の STATUS 指定子と ACTION 指定子 ACTION 指定子の値が "READ" であり、STATUS 指定子の値が "SCRATCH"、"NEW"、"REPLACE" の場合、翻訳時オプション -X の指定により、OPEN 文の動作が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定した場合は、実行時の診断メッセージ(jwe0089i-e)が 出力され、OPEN 文が無視されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない状態)では、正常にプログラムが実行さ れます。 C.14 Q 形編集記述子 翻訳時オプション -Xf6 または -Xf7 を指定した場合、けた移動数を設定します。標準の場合(翻 訳時オプション -Xf6 または -Xf7 を指定しない場合)、残余文字として扱われます。 C.15 ファイル INQUIRE 文 存在しないファイルまたは入出力文が実行されていないファイルに対して、ファイル INQUIRE 文 を使用して、NAME 指定子および NAMED 指定子について問い合わせた場合、指定子に代入され る値が異なります。 翻訳時オプション -Xf6 または -Xf7 を指定している場合、NAME 指定子には空白、NAMED 指定 子には偽の値が代入されます。 標準(翻訳時オプション -Xf6 または -Xf7 を指定しない場合)では、NAME 指定子には FILE 指定 子に指定した値、NAMED 指定子には真の値が代入されます。 C.16 組込み関数 以下の富士通仕様の組込み関数はサポートされていません。 IRE、IDE、IQE、AMT、DMT、QMT 付録 D 32 ビットモードと 64 ビットモードの 違い 翻訳時オプション -KV9 または -KV9FMADD が有効な場合、実行可能プログラムは 64 ビットモー ドになります。その際には、次の注意が必要です。 1. 翻訳時オプション -KV9 または -KV9FMADD は、Solaris 7 以降のシステムで翻訳および結合 編集する場合にだけ、有効にすることができます。 2. 作成された実行可能プログラムは、Solaris 7 以降のシステムだけで実行することができます。 3. 32 ビットモードと 64 ビットモードのオブジェクトを混在させた実行可能プログラムを作成 することはできません。 4. モジュールおよびモジュール引用においては同じモードで翻訳しなければなりません。 以下に 32 ビットモードと 64 ビットモードの言語仕様の違いを述べます。 D.1 LOC 組込み関数 64 ビットモードの場合、結果の型は、8 バイトの整数型になります。 D.2 CRAY 仕様 POINTER 文 以下の CRAY 仕様の POINTER 文の構文において、 pointer( ptr , var ) 64 ビットモードの場合、アドレス保持変数 ptr は、8 バイトの整数型になります。 D.3 サービスルーチン 32 ビットモードと 64 ビットモードでは、以下のサービスルーチンに違いがあります。 名前 影響 32 ビットモード 64 ビットモード MALLOC 結果の型 4 バイトの整数型 8 バイトの整数型 引数の型 4 バイトの整数型 8 バイトの整数型 FREE 引数の型 4 バイトの整数型 8 バイトの整数型 ERRSAV 第 2 引数 8 バイト領域の変数 16 バイト領域の変数 ERRSTR 第 2 引数 8 バイト領域の変数 16 バイト領域の変数 MALLOC および FREE を組込み手続とする -Nmallocfree オプションが用意されています。翻訳時 オプション -Nmallocfree については、“2.2 翻訳時オプション”を参照してください。 Fortran 使用手引書ー Page 366 D.4 組込み関数の結果値 64 ビットモードの場合、組込み関数 SHAPE、SIZE、UBOUND、LBOUND、COUNT、MAXLOC または MINLOC の結果値が 4 バイトの整数型を超えるならば、翻訳時オプション(-CcdII8、-CcI4I8、 -Ccd4d8 または -Cca4a8)を指定して結果の型を 8 バイトの整数型に変更しなければなりません。 D.5 組込み関数 VAL および %VAL の引数 64 ビットモードの場合、8 バイトの整数型または 8 バイトの論理型も加えて指定することができ ます。 D.6 VALUE 文および VALUE 属性 64 ビットモードの場合、8 バイトの整数型、8 バイトの論理型または倍精度実数型も加えて指定 することができます。 D.7 複素数型、倍精度複素数型および 4 倍精度複素数型の関数 64 ビットモードの場合、複素数型、倍精度複素数型および 4 倍精度複素数型の関数結果は、関数 値として返却されます。なお、32 ビットモードでは、複素数型、倍精度複素数型および 4 倍精度 複素数型の関数結果は第 1 引数に設定されます。C 言語と言語間結合する場合に注意が必要です。 付録 E Parallelnavi ここでは、Parallelnavi 環境における Fortran プログラムの翻訳および実行について説明します。 Parallelnavi 環境における違いについてだけ記述していますので、 “第 2 章 Fortran プログラムの 翻訳・結合”および“第 3 章 Fortran プログラムの実行”と併せてお読みください。 E.1 ラージページ機能 Parallelnavi 環境では、ラージページ機能を利用することができます。 ラージページ機能とは、ハードウェアがメモリを管理する単位である ' ページ ' を大きくし、実行 性能を向上させる機能です。 ラージページ機能の詳細については、 “Parallelnavi 使用手引書”を参照してください。 E.1.1 翻訳 ラージページ機能を利用するプログラムを作成するためには、翻訳時オプション -Klargepage を結 合編集時に指定する必要があります。 オブジェクトファイルだけを作成する場合には、-Klargepage オプションを指定する必要はありま せん。したがって、一般のライブラリ等も通常どおり利用することができます。 否定形のオプションとして -Knolargepage も用意されています。-Klargepage と -Knolargepage オプ ションが複数回指定された場合、最後に指定されたオプションが有効となります。なお、何も指 定されない場合は、ラージページ機能に対応したプログラムは作成されません。 -Klargepage には、ラージページ化レベルを指定することができます。 -Klargepage[=level] level が 1 の場合、データ域およびヒープ域に対してラージページ機能を適用します。 level が 2 の場合、データ域およびヒープ域に加えて、スタック域に対してもラージページ機 能を適用します。-Kparallel または -KOMP オプションと同時に指定した場合、スレッド毎の スタック領域に対してもラージページ機能を適用します。ラージページ化されたスタック域 は、通常のスタック域と異なり、ラージページ化されたヒープ域から実行開始時に一括して 獲得されます。 したがって、実行時に必要なラージページ領域の大きさは、データ域、ヒープ域、プロセスの スタック域の大きさに加え、 (スレッド毎のスタック域の大きさ)*(スレッド数- 1)の合計 となります。 なお、実行時のプロセスのスタック領域の制限値が、使用可能なラージページメモリと仮想メ モリの大きさの小さい方より大きい場合、本システムがスタック領域の大きさを次のように仮 定して確保します。なお、仮想メモリの大きさとは、ulimit(1) コマンドの vmemory で表示さ れる値です。 S = M⁄8 S :スタック領域の大きさ(byte) M:ラージページメモリと仮想メモリの小さい方の大きさ(byte) Fortran 使用手引書ー Page 368 スレッド毎のスタック領域は、プロセスのスタック領域と同じ大きさで確保されます。ただ し、プロセスのスタック領域の制限値が、使用可能なラージページメモリと仮想メモリの大 きさの小さい方をスレッド数で割った値より大きい場合、本システムがスレッド毎のスタッ ク領域の大きさを次のように、仮定して確保します。 S = (M ⁄ T) ⁄ 5 S :スレッド毎のスタック領域の大きさ(byte) M:ラージページメモリと仮想メモリの小さい方の大きさ(byte) T :スレッド数 スレッド毎のスタック領域の大きさを、特定の大きさで確保したい場合には、環境変数 THREAD_STACK_SIZE を使用してください。 level が指定されない場合は、1 が指定されたものと見なします。 例 : 翻訳時オプション -Klargepage の指定 % frt -c fmain.f % frt -c fsubs.f % frt -Klargepage fmain.o fsubs.o Parallelnavi ラージページ機能がインストールされていないシステムで、-Klargepage オプションが 翻訳結合時に指定された場合は、以下のエラーメッセージが出力されます。 fjlpld: fatal: Large page resources not found. No output written to a.out E.1.2 実行 ラージページ機能を利用するプログラムは、Parallelnavi 環境下でのみ実行することができます。 実行の方式は、ラージページ機能を利用しない従来のプログラムと変わりません。 例 : ラージページ機能を利用するプログラムの実行 % ./a.out Parallelnavi 環境以外でラージページ機能を利用するプログラムを実行した場合は、以下のエラー メッセージが出力されます。 例 1: 32 ビットモードで -Klargepage=1 を指定した場合 % a.out_32_lp1 a.out_32_lp1: Cannot find /usr/lib/lpgld.so.1 Killed 例 2: 32 ビットモードで -Klargepage=2 を指定した場合 % a.out_32_lp2 a.out_32_lp2: Cannot find /usr/lib/lpgld2.so.1 Killed 例 3: 64 ビットモードで -Klargepage=1 を指定した場合 % a.out_64_lp1 a.out_64_lp1: Cannot find /usr/lib/sparcv9/lpgld.so.1 Killed 例 4: 64 ビットモードで -Klargepage=2 を指定した場合 % a.out_64_lp2 a.out_64_lp2: Cannot find /usr/lib/sparcv9/lpgld2.so.1 Killed Fortran 使用手引書ー Page 369 翻訳時オプション -Klargepage=2 を指定したとき、実行開始時にスタック域が確保できない場合 は、以下のエラーメッセージが出力されます。 % a.out largepage run-time: stack segment allocation failed. Can't continue to run. このメッセージが出力された場合、ヒープ域を拡大するか、スタック域の大きさを縮小してくだ さい。 E.1.3 ラージページ機能を利用するプログラムの判定 ラージページ機能を利用するプログラムかどうかを判定するには、elfdump(1) コマンドを使いま す。elfdump(1) コマンドの出力に、lpgld という文字が含まれている場合は、ラージページ機能を 利用するプログラムです。 例 1: 32 ビットモードで -Klargepage=1 を指定した場合 % elfdump -i a.out_32_lp1 Interpreter Section: .interp /usr/lib/lpgld.so.1 例 2: 32 ビットモードで -Klargepage=2 を指定した場合 % elfdump -i a.out_32_lp2 Interpreter Section: .interp /usr/lib/lpgld2.so.1 例 3: 64 ビットモードで -Klargepage=1 を指定した場合 % elfdump -i a.out_64_lp1 Interpreter Section: .interp /usr/lib/sparcv9/lpgld.so.1 例 4: 64 ビットモードで -Klargepage=2 を指定した場合 % elfdump -i a.out_64_lp2 Interpreter Section: .interp /usr/lib/sparcv9/lpgld2.so.1 E.1.4 制約事項 ラージページ機能を利用するプログラムでは、以下の機能が制約されます。 - スタティックリンクオプション スタティックリンクオプション -dn は利用できません。 - -Klargepage=2 を指定して作成したプログラムの制限 FORK サービス関数は、使用できません。さらに、-Kparallel または -KOMP オプション を指定して作成されたスレッド並列プログラムでは、SH サービス関数、SYSTEM サー ビス関数および CHMOD サービス関数も使用できません。使用した場合は、エラー番号 ENOTSUP(48) で失敗します。 E.2 CPU 数の管理 Parallelnavi 環境では、プロセスが利用できる CPU 数が厳密に管理されます。下記の方法によっ て、CPU 数の上限値を指定することができますが、プログラム実行時のスレッド数の決定におい て、これらの設定が考慮されます。 Fortran 使用手引書ー Page 370 NQS を利用する場合 : - バッチキューの資源制限値(プロセスに割り当てる CPU 数の設定: per_process_processor_limit )や、qsub の -lp オプションの指定が考慮されます。これを NQS のプロセスに割り当てる CPU 数と呼びます。なお、バッチリクエストの実行開始 時には、環境変数 PARALLEL および OMP_NUM_THREADS に対して、NQS のプロセ スに割り当てる CPU 数が設定されます。 具体的には、自動並列化や OpenMP によって並列化されたプログラムのスレッド数は、次のよう に決定されます。 なお、NQS の詳細については、“Systemwalker/ParallelWORKS 使用手引書ネットワークキューイ ングシステム編”を参照してください。 E.2.1 自動並列化におけるスレッド数の決定 CPU 数の上限値 以下の値を CPU 数の上限値とします。 - NQS のプロセスに割り当てる CPU 数 スレッド数 並列に動作するスレッドの数は、まず以下の優先順位で決定されます。 (1)環境変数 PARALLEL の指定値(注) (2)環境変数 OMP_NUM_THREADS の指定値 (3)NQS のプロセスに割り当てる CPU 数 (注)結合編集時にオプション -KOMP が指定されている、かつ、環境変数 FLIB_FASTOMP に TRUE が設定されているとき、環境変数 OMP_NUM_THREADS の指定値があれば、 その値と一致していなければなりません。一致していない場合にはメッセージが出力さ れ、小さい方の値が採用されます。 上記の優先順位で決まったスレッド数と、CPU 数の上限値を比較して、小さい方を最終的なスレッ ド数として採用します。 E.2.2 OpenMP におけるスレッド数の決定 CPU 数の上限値 以下の値を、CPU 数の上限値とします。 - NQS のプロセスに割り当てる CPU 数 スレッド数 並列実行のスレッド数は、高速実行時ライブラリを使用するとき OpenMP と自動並列化で共通と なり、そうでないときそれぞれ独立に決定されます。高速実行時ライブラリの使用は、環境変数 FLIB_FASTOMP の設定によって制御することができます(“12.3 OpenMP 仕様による並列化”参 照) 。 - 高速実行時ライブラリを使用するとき(環境変数 FLIB_FASTOMP が TRUE のとき) スレッド数は以下の優先順位で決定されます。 (1)環境変数 OMP_NUM_THREADS の指定値(注) (2)環境変数 PARALLEL の指定値 (3)NQS のプロセスに割り当てる CPU 数 Fortran 使用手引書ー Page 371 (注)結合編集時にオプション -Kparallel が指定されているとき、環境変数 PARALLEL の指定 値があれば、その値と一致していなければなりません。一致していない場合にはメッ セージが出力され、小さい方の値が採用されます。 この優先順位で決まるスレッド数が CPU 数の上限値を超えるとき、スレッド数は CPU 数の 上限値となります。 PARALLEL 指示文の NUM_THREADS 節または OMP_SET_NUM_THREADS サービスルーチ ンによって指定する値は、ここで決まるスレッド数と一致していなければなりません。異な る値を指定した場合には、メッセージが出力され、プログラムの実行が終了されます。 - 高速実行時ライブラリを使用しないとき(環境変数 FLIB_FASTOMP が TRUE でないとき) OpenMP のスレッド数は、以下の優先順位で決定されます。自動並列化のスレッド数は、 “E.2.1 自動並列化向けスレッド数の決定”の記述に従います。 (1)PARALLEL 指示文の NUM_THREADS 節の指定値 (2)OMP_SET_NUM_THREADS サービスルーチンの指定値 (3)環境変数 OMP_NUM_THREADS の指定値 (4)環境変数 PARALLEL の指定値 (5)NQS のプロセスに割り当てる CPU 数 動的スレッド調整機構が有効な場合は、上記の優先順位で決まったスレッド数と CPU 数の上限値 を比較して、小さい方をスレッド値として採用します。 動的スレッド調整機構が無効な場合、1CPU 当たりのスレッド数が 1 を超える場合には、並列に実 行されることを意図したスレッドが時分割で実行されることになります。このような場合、スレッ ド間の同期処理のオーバヘッドが大きくなり、実行性能が低下することがあります。 システムによる負荷も考慮して、1CPU 当たりのスレッド数が 1 以下になるようにスレッド数を設 定することをお勧めします。 E.3 スレッド間ハードウェアバリア機能 Parallelnavi 環境では、ハードウェアバリア機構が実装されている場合、スレッド間ハードウェア バリア機能を利用することができます。スレッド間ハードウェアバリア機能とは、スレッド並列 処理における同期処理を高速にし、実行性能を向上させる機能です。 スレッド間ハードウェアバリア機能の詳細については、 “Parallelnavi 使用手引書”を参照してくだ さい。 E.3.1 翻訳 スレッド間ハードウェアバリア機能を利用するプログラムを作成するためには、翻訳時オプショ ン -Khardbarrier を結合編集時にも指定する必要があります。なお、オブジェクトファイル作成時 に、 -Khardbarrier オプションを指定しなくてもハードウェアバリアが実行可能なオブジェクトファ イルが作成されますが、ハードウェアバリアを意識した最適なオブジェクトにはならないため、 -Khardbarrier オプションを指定することを推奨します。 否定形のオプションとして -Knohardbarrier も用意されています。 -Khardbarrier と -Knohardbarrier オ プションが複数回指定された場合、最後に指定されたオプションが有効となります。なお、何も 指定されない場合や、-Khardbarrier オプションが指定されていても -Kparallel または -KOMP オプ ションが同時に指定されていない場合には、スレッド間ハードウェアバリア機能に対応したプロ グラムは作成されません。 Fortran 使用手引書ー Page 372 例 : 翻訳時オプション -Khardbarrier の指定 % frt -c fmain.f % frt -c fsubs.f % frt -Khardbarrier fmain.o fsubs.o Parallelnavi がインストールされていないシステムで、-Khardbarrier オプションが翻訳結 合時に指定された場合は、以下のエラーメッセージが出力されます。 ld: fatal: library -lpnbar: not found E.3.2 実行 スレッド間ハードウェアバリア機能を利用するプログラムは、Parallelnavi2.0 以上の環境下でのみ 実行することができます。実行の方式は、スレッド間ハードウェアバリア機能を利用しない従来 のプログラムと変わりません。ただし、スレッド間ハードウェアバリア機能を活用するためには、 NQS の Node 内バリア資源が割当てられている必要があります。 例 : スレッド間ハードウェアバリア機能を利用するプログラムの実行 % cat script #!/bin/sh ./a.out % qsub -qmulti -lb1 script Parallelnavi の NQS 環境以外でスレッド間ハードウェアバリア機能を利用するプログラムを実行し た場合や、NQS のハードウェアバリア資源が割当てられなかった場合には、自動的に同期処理を ソフトウェアバリア方式に切り替え、実行を続けます。 翻訳時オプション -KOMP を指定して翻訳したプログラムでスレッド間ハードウェアバリアを利 用する場合には、環境変数 FLIB_FASTOMP が TRUE に設定されていなければなりません。環境 変数 FLIB_FASTOMP の意味と使用上の注意については、“12.3 OpenMP 仕様による並列化”を 参照してください。 環境変数 FLIB_HARDBARRIER_MESSAGE が存在し、かつ、実行時オプション -Wl,-li の指定があ る場合、翻訳時オプション -Khardbarrier を指定したものの、何らかの理由によりスレッド間ハー ドウェアバリア機能が利用できない場合には、以下のメッセージが出力されます。実行時オプショ ンの説明については、 “3.3 実行時オプション”を参照してください。 jwe1043i-i "A thread hardware barrier couldn't be used." 環境変数 FLIB_NOHARDBARRIER が存在した場合、翻訳時オプションにかかわらず、スレッド 間ハードウェアバリア機能を使用しません。 E.3.3 スレッド間ハードウェアバリア機能を利用するプログラムの判定 スレッド間ハードウェアバリア機能を利用するプログラムかどうかを判定するには、ldd(1) コマン ドを使います。ldd(1) コマンドの出力に、libpnbar.so という文字が含まれている場合、スレッド間 ハードウェアバリア機能を利用するプログラムです。 E.3.4 制約事項 スレッド間ハードウェアバリア機能を利用するプログラムでは、以下の機能が制約されます。 - fork(2) 時の子プロセスでの利用 スレッド間ハードウェアバリア機能を利用しているプログラムが、fork システムコールを発 行した場合、生成されたプロセスにおいてはスレッド間ハードウェアバリア機能を利用する ことができません。 索引 Symbols !OCL 257 \ 編集記述子 134 -# 66 -### 66 $ 編集記述子 134, 153 &end 138 & 変数群名 138 Numerics 16 進定数 162 1 バイトの整数型 106, 126 1 バイトの論理型 106 2 バイトの整数型 106 2 バイトの論理型 106 4 倍精度実数型 108, 111, 121 4 倍精度複素数型 109, 111, 121 4 バイトの整数型 106 4 バイトの論理型 106 8 バイトの整数型 106, 363 8 バイトの論理型 106 A -A 28 -a 69 -A0 31 -A1 31 -A2 31 -AA 28, 110 ACCESS 指定子 145, 150 ACHAR 30 ACTION 指定子 142, 150, 364 -Ad 29, 111 -AE 28 -Ai 29 ALLOCATE 文 126 -Am 29, 281 -An 31 Fortran 使用手引書ー Page 374 -Ap 29 -Aq 29, 111 -AR 28 -Ar 28 ARRAY_PRIVATE 指示子 316 -AT 29 -AU 29 -Aw 30 -Ay 30 -Az 30 B BLANK 指定子 150, 363 BLOCKSIZE 指定子 144 B 形編集記述子 358 C -C 31, 73, 180 -c 24 CASE 構文 125, 352 -Cca4a8 35 -Ccd4d8 34 -CcdDR16 35 -CcdII8 31 -CcdLL8 32 -CcdRR8 33 -CcI4I8 32 -CcL4L8 32 -CcR4R8 33 -CcR8R16 36 CHANGEENTRY 文 286 -Cl 31, 112 CLOSE 文の指定子 145 CMPLX 127 COMMON 文 117 -Cpp 31 cpp コマンド 23 CPU_TIME 60 C 言語 30 C のプリプロセッサ 31 D -D 36 -d 24, 69 DEALLOCATE 文 126 DELIM 指定子 150, 161, 363 DIRECT 指定子 150 Fortran 使用手引書ー Page 375 DISJOINT 指定子 317 -dn 25 DO 形並び 352 DO 構文 352 DO の拡張範囲 125 DO 文 124 DO 変数 359 DO ループ 124, 125, 359 -dy 25 E -E 37 -e 69 -Ec 37, 121 -Ef 37 -Eg 37 -Ei 27, 37, 247 EQUIVALENCE 文 118 ERRSAV 200 ERRSET 201 ERRSTR 200 ERRTRA 202 -Es 37 -Eu 38, 246 EXTERNAL 文 127 E 形編集記述子 188 F -f 25 f90 19 f95 19 fdb コマンド 232 -fi 25 -Fixed 38 -fmsg_num 25 FORMATTED 指定子 150 FORM 指定子 150 fort.nn 361 FORTRAN66 言語仕様 65 FORTRAN66 プログラム 125 FORTRAN77 言語仕様 65 Fortran 95 言語仕様 65 Fortran 記録 133 Fortran 言語 23 Fortran 原始プログラム 68 Fortran コンパイラ 19 Fortran ドライバ 19 Fortran ライブラリ 19 Fortran 使用手引書ー Page 376 fot 355 -Free 38 frt 19 -fs 25 -fw 25 F 形編集記述子 188 G -G 38, 73 -g 25, 70 GO TO 文 124 Gw.dEe 形 187 Gw.d 形 187 H -H 38, 225 -Ha 38, 225 -He 38, 228 -Hs 39, 227 -Hu 39, 227, 229 -Hx 39, 229 I -I 39 -i 70 IACHAR 30 IBITS 30 IBM370 形式 180 IF 構文 352 IF 文 124 INCLUDE 行 352 INCLUDE ファイル 39 INDEPENDENT 指示子 318 INQUIRE 文の指定子 146 IOSTAT 指定子 152 ISHFTC 30 Iw.m 形編集 187 Iw 形編集 187 K -K 27, 41 -Kadr44 41 -Kadr64 41 -Karray_merge 42 -Karray_merge_common 42 -Karray_merge_local 42 -Karray_merge_local_size 42 Fortran 使用手引書ー Page 377 -Karraypad_const 42 -Karraypad_expr 42 -Karray_private 42 -Karray_subscript 43 -Karray_subscript_element 43 -Karray_subscript_elementlast 43 -Karray_subscript_rank 43 -Karray_transform 43 -Kauto 43, 333 -Kbcopy 43 -Kcommonpad 44, 256 -Kdalign 44, 117 -Keval 44 -Kfast 44 -Kfast_GP 44 -Kfast_GP2 45 -Kfast_VI 45 -KFMADD 46 -Kfrecipro 46 -Kfsimple 46 -Kfuse 46 -KGREG_SYSTEM 47 -Khardbarrier 47 -Kilfunc 47 -Kinstance 47, 330 -Klargepage 47, 367 -Klocalpad 48 -Kloop 48 -Kmfunc 48 -Kmregion_extension 49 -Knoalias 41 -Knoarray_private 43 -Knoauto 43, 333 -Knobcopy 44 -Knodalign 44 -Knoeval 44 -KNOFMADD 46 -Knofrecipro 46 -Knofsimple 46 -Knofuse 46 -Knohardbarrier 47 -Knoilfunc 47 -Knolargepage 47, 367 -Knoloop 48 -Knomfunc 48 -Knomregion_extension 49 -Knons 49 -Knoocl 49 -KNOOMP 49, 334 Fortran 使用手引書ー Page 378 -Knoparallel 51 -Knopreex 52 -Knoprefetch 53 -Knopureomp 55, 334 -Knoreduction 55 -Knostriping 55 -Knothreadprivate 56, 335 -Knothreadsafe 56, 335 -Knotiling 56 -Knounroll 56, 246 -KNOVIS 57 -Kns 49 -Kocl 49, 257 -KOMP 49, 334 -Koptions 50 -Kpagesize 50 -Kpagesize_heap 50 -Kpagesize_stack 50 -Kparallel 50 -Kparallel_iteration 51 -Kparallel_strong 51 -Kparallel_weak 51 -Kpg 51 -KPIC 52 -Kpic 52 -Kpmsg 52, 303 -Kpreex 52, 248 -Kprefetch 52 -Kprefetch_cache_level 53 -Kprefetch_infer 53 -Kprefetch_iteration 53 -Kprefetch_iteration_L2 54 -Kprefetch_line 54 -Kprefetch_line_L2 54 -Kprefetch_model 54 -Kprefetch_noinfer 53 -Kprefetch_nostrong 54 -Kprefetch_strong 54 -Kpreschedule_length 54 -Kpu 55 -Kpureomp 55, 334 -Kreduction 55 -KSPARC64_GP 58 -KSPARC64_GP2 58 -KSPARC64VI 58 -Kstriping 55 -Kthreadprivate 55, 335 -Kthreadsafe 56, 335 -Ktiling 56 Fortran 使用手引書ー Page 379 -KULTRA 58 -KULTRA1 58 -KULTRA2 58 -Kunroll 56 -KV8 57 -KV8PFMADD 57 -KV8PLUS 57 -KV9 57 -KV9FMADD 57 -KVIS1 56 -KVIS2 56 -Kvppocl 57 L -L 58 -l 26 -Lb 74 -le 71 -lelvl 70 -Li 74 -li 70 -Lr 74 -ls 71 -Lu 74 -lw 70 M -M 58, 74 -m 71 -ml 26, 286 -mldefault 26 N -N 58 -n 71 -Nallextput 58 -Nautoobjstack 59 -Ncalleralloc 59 -Ncompdisp 59 -Ncopyarg 59 -Nnocopyarg 60 -Nf90move 60, 123 -Nf95 60 -Nfreealloc 60 -Nmallocfree 61 -Nmaxserious 61 -Nnoallextput 58 Fortran 使用手引書ー Page 380 -Nnoautoobjstack 59 -Nnocalleralloc 59 -Nnocompdisp 59 -Nnof90move 60 -Nnof95 60 -Nnofreealloc 61 -Nnomallocfree 61 -Nnoobsfun 61 -Nnorecursive 62 -Nnosave 62 NOALIAS 指示子 319 NOARRAY_PRIVATE 指示子 317 -Nobsfun 61, 285 NORECURRENCE 指示子 320 -nostatic-flib 26 NOVREC 指示子 321 -Nrecursive 62 -NRnotrap 62 -NRtrap 62 -Nsave 62 NULL 60 O -O 25, 62 -o 26 -O0 27, 63 -O1 63 -O2 63 -O3 63 -O4 63 -O5 63 -Oi 74 OpenMP Fortran 仕様の環境変数 337 OpenMP 仕様による並列化 333 OPEN 文 145, 161 OPEN 文の指定子 139 P -P 63 -p 71 PAD 指定子 363 Parallelnavi 367 PARALLEL 指示子 322 PAUSE 文 125 POSITION 指定子 150 PUBLIC 属性 284 Fortran 使用手引書ー Page 381 Q -Q 64, 74, 81 -q 72, 149, 187 -Qa 64 -Qd 64 -Qi 64 -Qm 64 -Qo 64 -Qp 64, 335 -Qt 64 -Qx 64 Q 形編集記述子 364 R -r 72 -Re 75 READWRITE 指定子 150 READ 指定子 150 REAL 127 RECL 指定子 142, 145 -Rp 75 -Ry 75 S -S 64 SAVE 属性 120 SEQUENTIAL 指定子 150 SERIAL 指示子 321 -SSL2 65 -SSL2BLAMP 65 -static-flib 26 STATUS 指定子 141, 360, 364 STAT 指定子 126 STOP 文 125 T -T 76 -t 72 TEMP 指示子 327 U -U 65 -u 72 UNFORMATTED 指定子 150 USE 文 281 Fortran 使用手引書ー Page 382 V -V 65 -v 26 -v90o 26 -v95d 26 -v95e 26 -v95o 26 -v95s 27 VALUE 属性 285 W -W 65 -w 27 -Wl 69 WRITE 指定子 150 X -X 65 -x 27, 73 -x- 27 -x0 28 -X6 65, 116 -X7 65, 116 -X9 65, 116 -xdat_szK 27 -xdir=dir_nm 28 -Xf6 65, 116 -Xf7 66, 116 -xpgm_nm 27 -xstm_no 27 Z Z 形編集記述子 358 あ アセンブラ 65 アポストロフィ 161 暗黙の型 29 い 異常終了プログラムのデバッグ 230 一段高い型 111 入れ子の深さ 352 印刷制御用コマンド 355, 356 引用符 161 インライン展開 247, 254 Fortran 使用手引書ー Page 383 え エラー 194 エラー修正サブルーチン 202 エラー制御 194 エラーモニタ 194 エラーモニタの使用方法 202 エラーレベル 80 演算評価方法の変更 44, 63 お オブジェクトモジュールの大きさ 246 オプション 23 オプションの並び 23 オンラインマニュアル 19 か 外部ファイル 129 外部名の加工 286 拡張検査 229 重なりのある文字代入 60, 123 型宣言された組込み関数名 128 仮引数 251 仮引数と実引数の対応 226 環境変数 FLIB_FASTOMP 336 環境変数 FLIB_IOBUFCPY 78 環境変数 FLIB_IOBUFCPY_SIZE 78 環境変数 FLIB_PARALLEL_INFO 79 環境変数 FLIB_SPINWAIT 336 環境変数 FORT90C 66 環境変数 FORT90L 76 環境変数 fuxx 77 環境変数 fuxxbf 78 環境変数 IOINF 79 環境変数 OMP_DYNAMIC 337 環境変数 OMP_NESTED 337 環境変数 OMP_NUM_THREADS 304, 337, 338, 370 環境変数 OMP_SCHEDULE 337, 340 環境変数 PARALLEL 303 環境変数 THREAD_STACK_SIZE 304, 336 環境変数でのファイルの接続 132 関係演算 121 関係式 37 関数引用 352 関数の引用 123 関数の型の検査 226 Fortran 使用手引書ー Page 384 き 記憶域への割付け 28 境界調整 28 共通式の除去 251 共通ブロック 28, 117 許容値を認めていない関係式 121 く 組込み関数 127, 358 組込み関数名 128, 358 け 計算形 GO TO 文 124 計算誤差 112 形状適合の検査 228 形状引継ぎ配列の次元数の検査 227 言語間結合 285 言語仕様のレベル 65 検査機能 225 こ 構造型 110 高速に実行 44 固定形式 38 コマンド 23 コンパイラ 65 さ サービスルーチン 128 最適化 41 最適化制御行 257, 314 算術 IF 文 124 し シーク可能ファイル 185 事前の接続 130 実行コマンド名 68 実行時異常終了 225 実行時オプション 68 実行時の出力情報 103 実行文 124 実数型 111, 121, 363 実数型データ 106 自動並列化 301 自由形式 38 順番探査入出力文 153 Fortran 使用手引書ー Page 385 順編成ファイル 129 初期値 118, 119, 120 書式付き Fortran 記録 134 書式なし Fortran 記録 137 診断メッセージ 70, 80 す スタック割付けの影響 272 せ 整数型 121 精度拡張 29 精度拡張機能 111 精度縮小機能 112, 113 接続の解除 130 そ 装置番号とファイルの接続 131 添字式および部分列範囲の検査 227 た 正しい境界 117, 118 単精度実数型 107 単精度複素数型 109 端末に対する促進メッセージ 71 ち 直接探査入出力文 155 直接入出力文 156 直接編成ファイル 129 て 停留入出力文 168 データの正しい境界 110 データの変換 180 デバッグ 22, 38, 194 デバッグ機能 194 デバッグ情報 225 デバッグのための機能 225 と 動的な接続 130 特殊文字列 28 トレースバックマップ 30 Fortran 使用手引書ー Page 386 な 内部ファイル 129, 362 内部ファイル入出力文 168 名前なしファイル 361 並びによる Fortran 記録 138 並びによる入出力文 164 に 入出力作業域の大きさ 70 入出力処理 129 入出力装置の関係 150 入出力バッファ 187 入出力文の組合せ 172 入出力文の使用方法 150 入出力文の前後関係 170 入出力文の動作 359, 360 入出力作業域の大きさ 69 は 場合式 125 バージョン情報 65 倍精度実数型 107, 111, 121, 363 倍精度複素数型 109, 111, 121, 363 配列宣言子 353 配列要素引用 352 ひ 引数の大きさの検査 226 引数の型の検査 225 引数の個数の検査 225 引数の属性の検査 226 引数の妥当性の検査 225 ビッグエンディアンデータ 183 標準エラー出力 77 標準エラー出力ファイル 71 標準出力 77 標準出力ファイル 71 標準入力 77 標準入力ファイル 72 標準ファイル 185 ふ ファイル位置付け文 173 ファイル位置付け文との組合せ 173 ファイル終了記録 139 ファイルの接続 129 複素数型 109, 111, 121, 363 Fortran 使用手引書ー Page 387 複素数型データ 107 富士通ホスト系 65 復帰コード 67, 77, 356 浮動小数点アンダフロー 72 部分配列 352 部分配列の添字三つ組 354 部分列引用 352 不変式の移動 251 不変式の先行評価 52, 63, 248, 249, 250 プリプロセッサ 65 文関数 126 へ 並列機能 300 変数群 Fortran 記録 138 変数群記録 159 変数群出力文 161 変数群入出力文 156 変数群入力 159 変数群名 163 変数群要素並び 164 ほ ポインタ変数 120, 256 翻訳時オプション 24 ま 前処理指令 36, 65 み 未定義データの引用の検査 227 め 明示的引用仕様の検査 227 も 文字型 109 文字型データ 109 文字代入文 123 モジュール 29 モジュール引用 281 モジュールに対するオブジェクト 281 モジュールに対する翻訳中間情報 281 モジュール名 281 Fortran 使用手引書ー Page 388 ゆ 有効けた数 186 り リトルエンディアンデータ 76, 183 利用者が定義したオプション 68 リンカ 65 る ループアンローリング 246 ろ 論理型 122 わ ワイルドカード指定 329 割当て形 GO TO 文 124, 251 割込み事象 70 割付け配列の検査 228