質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

1回答

510閲覧

古いFORTRANのソースコードにみられる、サブルーチン内の一時変数を引数で代用するテクニック(?)について

carocaro

総合スコア1

リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2022/05/19 07:33

質問の趣旨

明らかに計算結果の一時保存のためにしか用いられない引数には何か意図があるのか?

質問の背景

行列計算をする数値計算プログラムでは、行列に対応する巨大な配列を取り扱うことがよくあります。
例えば、いくつかの行列を受け取って所定の手続きに従って計算し、得られた行列を返すサブルーチンを考えます。
以下では、2次元配列は正方行列を示し、サブルーチンmatMultiplyは第一引数と第二引数の正方行列の積を計算して出力を第三引数に返す手続きです。
一つの例として以下のようなexample1を示します。実際に存在するコードはこちらです。

FORTRAN

1subroutine example1(A,B,C,D,TMP,SCR) 2 double precision, dimension(:,:), intent(in) :: A, B, C 3 integer, intent(in) :: Nsize 4 double precision, dimension(:,:), intent(out) :: D 5 double precision, dimension(:,:), intent(inout) :: TMP, SCR 6 7 call matMultiply(A, B, tmp) 8 call matMultiply(B, C, scr) 9 call matMultiply(tmp, scr, D) 10 return 11end

一方、同様の動作をする(と思われる)サブルーチンexample2を示します。私はexample1をexample2へ書き直したいと思っています。

FORTRAN

1subroutine example2(A,B,C,D,Nsize) 2 double precision, dimension(:,:), intent(in) :: A, B, C 3 integer, intent(in) :: Nsize 4 double precision, dimension(:,:), intent(out) :: D 5 6 double precision, dimension(Nsize,Nsize) :: tmp, scr 7 8 call matMultiply(A, B, tmp) 9 call matMultiply(B, C, scr) 10 call matMultiply(tmp, scr, D) 11 return 12end

質問

example1とexample2には何か動作で得られる結果に違いはありますか?
結果に違いがない場合、example1のように各メリットはありますか?
メモリ確保の時間を節約するためのテクニックなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Fortran の記憶領域について
が参考になると思います

サブルーチンの局所変数はスタック領域に確保される場合が多いですが、変数(配列)のサイズが大きいとスタック領域が不足してstack overflowになりやすくなります

コンパイラによってはサイズの大きな局所変数をヒープ領域に確保できるものもありますが、ヒープ領域は確保に負荷がかかります(遅い)

投稿2022/05/20 23:38

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/05/20 23:50

上記が実際に問題になるのかは、処理系(PCハードやコンパイラ)や配列サイズに依存するので、質問者さんがコードを実行する条件では書き換えても問題無い可能性はあります > 古いFORTRANのソースコードにみられる 汎用的に使われるライブラリのコードなら、処理系によらずエラーになったり遅くなったりしにくくなるようにコードが書かれてるのだと思います
carocaro

2022/05/28 08:01

ご回答ありがとうございました。 やはりそのような事情なのですね。 実際に引数で与える配列は、サブルーチンの呼び出し以前では何らかの(意味のある)値を入れることがあったので可読性の観点から排除したいと考えていました。 ですが、扱う配列のサイズを考慮すると今のままのほうがよさそうです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問