アンケート結果に対する回答 <並列Fortranシンポジウム(2015/8/18)>

第1回並列Fortranシンポジウム並列Fortranの現状と展望 ~Fortranは絶滅危惧種なのか?~ 」 (2015年8月15日開催)のアンケート結果の中で、Fortran規格に対するご意見・ご質問を多数頂きました。ここに掲載するのは、それらに対するHPFPCからの最初の回答です。おそらくこれだけでは納得できる答えになっていないと思います。追加のご質問や、HPFPCの活動に対するご意見など、すべてHPFPCの問合せ窓口までメールでお寄せください。

Fortranをどうしたらよいでしょうか。HPFPCでは、Webページの改善、イベントや講習会の開催といった活動を通して、皆さんと一緒に考えていきたいと思っています。

「12. Fortran 規格に対して要望があれば、ご自由にお書きください」に対して

Q1 「予約語がない」等の本質的でない部分をいい加減切り捨ててほしい

利用者にとっては予約語がない方が便利です。予約語がないということで、何か具体的に困っていらっしゃるのでしょうか。コンパイラを作る立場で言えば、確かにFortran パーサは非常に大変で、予約語がないことはその原因の一つだと思います。ただ全体からすると小さなことのようにも思います。

まず「本質的でない部分」とは何かを合意していく必要があるかと思います。それができれば、Fortran のコミュニティに提案できるような話に発展するかもしれません。

Q2 FFT でequivalence を使ったreal-complex の割り付けを使っているので、廃止後に代替機能があれば欲しい

EQUIVALENCE文はFortran2015で「廃止予定事項」と記述されているので、本当に廃止されるとしてもさらに先になります。現在の多くのベンダの実装レベルはFortran2003くらいまでで、次がCoarrayを含むFortran2008、その次がFortran2015です。

equivalenceを避けたいなら、要素別処理組込み関数realとaimagを使うのが正攻法だと思います。例えば複素数の配列 z に対してreal(z)またはaimag(z) と書けば、それぞれzの実部と虚部を配列として参照できます。またはFortran2008では、複素数コンストラクターを使って、それぞれ z%re, z%im と書くこともできます。

標準でない方法で、例えば複素数配列を引数で渡して倍の長さの実数配列として受け取る、といったことは実際には多くのコンパイラで可能だと思いますが、その問題点についてはコンパイラのドキュメントを確認するか、担当のSEさんにお問合せください。

Q3 Fortran の仕様の発展について。特に性能との関係を気にするご意見が多数

  • Fortran のメリットは文法が簡潔であり、実行速度が速いこと。これを生かした、シンプルな仕様というのもあって良いと思います。

  • あまり最新の言語トレンドを追う必要はないと思っています。

  • オブジェクト指向は必要.allocatable は、私的には不要。

  • ダイナミックにしか決まらない仕様は、大枠の部分なら良いのですが、核の部分に使わせる仕様は、性能求めるため、良くない。

  • モダンなスタイルを取入れても、性能がおちないように。

  • 性能に特化したサブセットを考える必要があると思います。

このあたり、もう一歩踏み込んだ議論をしていきたいところです。新しい仕様が入ることで、どんな問題が起こり得るのか。それは言語仕様や他の規約で解決すべきものなのか、教育や教科書・教材の問題なのか、コンパイラや開発支援環境の問題なのか。

Fortran 文法は、仕様が拡張されても旧書式を使い続ける限り性能が落ちないように注意深く設計されています(性能的上位互換)。例えば、配列の引数渡しのメカニズムにはF77 方式とF90 方式があります。前者は昔からの軽量なインタフェースを維持していて高速です。後者はFortran90 の形状引継ぎ配列に対応するためのリッチな情報が隠し引数として渡されます。コンパイラはこれらをユーザ記述から読み取って使い分けることで、高性能と高機能の両立を図っています。Fortran 文法は、基本的には、そのようなコンパイラの実装が可能になるように設計されています。

拡張が進んでも性能面の心配はないので、ユーザが使いたい範囲だけを使えばよい、という考えもあります。一方で、拡張のやり過ぎは無駄な混乱を招くし、コンパイラの実現を遅くする、という意見もあります。こういったところを議論できる人が日本にはまだ少ないのです。ぜひ皆さんの声を集めて、Fortran コミュニティに反映できればと思っています。

Q4 ファイル読書時に番号だけでなくファイル名(文字列)で直接アクセスできるようにしてほしい

具体的にお聞きしたいところです。事前接続を使うか、装置番号を関数呼出しにする方法などが考えられますが、目的には不十分でしょうか。

Q5 関数型言語があたりまえで、どこまでimpure にするか考えてください。triplet も分散に向かないので使いにくくしてください

前者について、Fortran95 では、並列呼出しを想定して手続が純粋(pure)であることを宣言できるようになりました。デフォルトはimpure です。これでご要望は満たせるでしょうか。もう少し具体的に議論したいところです。

後者について、triplet が使いやすいから簡単に使われてしまって、並列化できない性能の悪い書き方が流行るのでよくない、という意味でしょうか。分散に向かないというのは具体的にどういう意味なのかまず聞かせてください。

Q6 規格が他の言語と比較して中途半端なので、もっと使いやすくしてもらいたい。単純な継承にもselect type が必要だったり、循環参照ができないので、既存の知見が使いにくい等

他の多くの言語と比較して、宣言や構文の表現に記号をあまり使わず、アルファベット文字で書き下すことが多いのは確かです。これについては、表現だけの問題なので、Fortran の流儀として慣れていただくしかないかと思います。中途半端とか、使いにくいと感じられる部分については、もう少し詳しくお聞きしないと、何とも言えません。

Q7 型推定

Fortranには、変数の型を文脈から決める機能はありません。もしメリットが多いと考える人が多いなら、検討の価値はあると思います。

Fortranのデフォルトでは、型宣言を省略した変数は「暗黙の型宣言」のルールに従い、名前の1文字目がi,j,k,l,m,nのどれかなら基本整数型、その他なら基本実数型と決められます。IMPLICIT文によってこのルールは変更するか取り止めることができます。第3の方法として、例えば IMPLICIT AUTO と宣言すれば型推論が機能する、という文法は可能だと思います。

言語のトレンドを追い過ぎているという意見とぶつけて議論する必要がありそうです。

Q8 高速な科学技術計算に最適な言語でありつづけてほしい。ユーザの立場では、あまりコードのチューニングに時間をかけたくない。並列化についてもそうである。見通しの良いコードを書いたら、あまり努力せずに効率よく計算できるのが理想的です(贅沢ですが)。スパコンがより強力になり、やりたい計算が多くあるのに、コード開発に多くの時間が取られるのを改善したいところです。

HPFPCは、全く同じ想いで、その前身であるJAHPFを合わせると20年に渡って活動して参りました。科学技術計算の性能と生産性の両立は我々の根本的なスタンスです。

近年のFortranの急速な拡大傾向について、メリットが少なく実装ベンダを疲弊させるだけであれば、我々からコミュニティに声を上げていかなければなりません。一方で、有益な拡張については、誤解・偏見なく正しく理解し、そして指導・教育して広めていく必要があると思います。

Q9 大規模な圧縮したデータに対して便利なアクセス機能が欲しい。デコードアクセスとかランダムアクセス

これについては、仕様設計より先に技術検討が必要かと思います。

「5. Fortran の機能について現状に満足していますか?」に対して

Q10 parameter の右辺に組み込み関数が使えるとよい

PARAMETER 文や型宣言文の初期値設定に使える式は、初期値式と呼ばれます。多くの組込み関数は初期値式の中で使用できます。以下の組込み関数はFortran90 の初期値式として許されます。

  • 整数型・文字型の要素別処理組込み関数:abs, max, int, mod など多数

  • 変形組込み関数の一部:repeat, reshape, transfer など

  • 配列問合せ関数の一部:lbound, ubound, size, shape

  • 2 進数問合せ関数bit_size, 文字問合せ関数len, 種別問合せ関数kind

  • 数値問合せ関数:disits, epsilon, huge, maxexponent など

ただし、引数に書ける式には関数によって制限があります。大雑把に言えば、初期値式として許される式は、コンパイル時に精度誤差なく数値評価できるような式です。

Fortran2003では、許される式がさらに緩和されています。厳密にはJIS発行の文法書「プログラム言語Fortran JIS X 3001」などを参照してください。

Q11 サブルーチン内のサブルーチンがほしい

Fortran90 から,内部手続(internal procedure)が書けるようになりました。内部手続とは、サブルーチンまたは関数の中で定義されるサブルーチンまたは関数のことです。他にFortran90 には、モジュール、インタフェースブロックなどの有効域(scoping unit)を定義する機能が導入されています。

Q12 分散メモリ並列

Fortranの機能としては、Fortran2008 で初めて、分散メモリ環境でも並列化できるcoarray機能が使えるようになります。coarray属性をもつ変数を使って、計算ノードを跨ぐ通信を記述することができます。現在、ベンダではCrayとIntelと富士通がcoarray機能をサポートしています。フリーソフトでは、Rice大学のCAF2.0、Houston大学のUHCAF、OpenCoarraysライブラリ、理研と筑波大のOmni-XcalableMPのCAFなどが、Fortran2008のcoarray機能の一部または全部をサポートしています。

Q13 allocatable配列に対する配列演算。

Fortran90 の配列演算は、割付け配列であるか否かに関わらず同様に使用できます。ご質問の意図が違うでしょうか?

Q14 DO LOOPのスレッド並列を高効率化するために、指示行に粒度を記述。

スレッドの概念はFortran規格の中にはなく、OpenMPまたはそのコンパイラ固有の用語と思われます。この機能をFortranの仕様とするのは難しいです。

OpenMPでは、指示行の中や実行時オプションで粒度の指定が可能です。コンパイラ固有の自動最適化については、指示行や翻訳時オプションなどで粒度を指示できることもあるので、そのコンパイラのマニュアルを参照してください。