No.9ベストアンサー
- 回答日時:
#5=#7=#8 です。
> Cのループは再起呼び出しより速度が速く
末尾再帰の話はとりあえず忘れていただくとすると、
Cに限らず、一般にプログラムはループで書けるならループで書いたほうが再帰呼び出しを使うより処理は速いですし、必要メモリ量も少なくてすみます。
> さらにFORTRANでは並列処理によって高速化が計られている
ループが高速化されるというより、ベクトル演算が高速化されるといった方が正確かもしれません。
同じループでも、微分方程式を解くときの反復演算のように、r0からr1を求めて、r1からr2を求めて、、、を繰り返すようなループは、ベクトルプロセッサを使ったところで並列化は不可能です。
ベクトルプロセッサの強みは、ベクトルの各要素の計算を一度にやってしまえる点にあります。
v = abs(v)
と書けば、vがベクトル長nのベクトルなら、n並列で絶対値の計算をしてくれるわけです。
これをC言語で、
for( i=0 ; i<n ; i++ ) v[i] = abs( v[i] );
と書いてしまうと、n回のabs関数の呼び出しを同時にやっていいのか、i=0から順番に呼び出さなければならないのかが(基本的には)わからないため、並列化できないのです。
No.7
- 回答日時:
#5です。
あれからいろいろ調べてみました。> 最近のFORTRANは知りませんが、元は再起呼出しができないため
FORTRAN90以降はできるようになっているようです。
ただ、再帰呼び出しは記述性を向上させているだけで、性能としては時間的にも空間的にもループで書くより不利なのでは?
Schemeのように末尾再帰が最適化されることを保証しているならともかく。
> この部分では関数呼出の手間だけ有利
関数呼び出しの手間だけでなく、多くの数学関数では、副作用が生じないことが保証できることも大きな利点だと思います。vをベクトルとして、FORTRANの
v = abs(v)
に相当する記述をCのループで書いた場合、並列化はまず無理だと思います。
なので、ベクトル演算と多くの数学関数を言語処理系として規定しているという点は、Cに対するかなりのアドバンテージといえるのではないかと思います。
(組み込み関数、と書きましたが一般の関数でも並列化してよいかどうかは、調べても該当する記述を見つけることができなかったのでわかりません。これができるとすれば、FORTRANはちょっとした並列構文を備えてることになり、Cと根本的に違う機能を持っていることになりますね)
少なくとも、FORTRANが並列処理、特にベクトルプロセッサ向けの最適化を意識した言語設計になっていることは間違いないようです。
また、科学記述計算に関する「記述能力」については圧倒的にFORTRANの方が上といってよいでしょう。
ご回答ありがとうございます。いろいろ調べていただき、お手数をかけました。御礼申し上げます。
科学計算の記述に関しては、FORTRANの方が優れているでしょうね。ベクトルプロセッサとして考えた場合、Cのループは再起呼び出しより速度が速く、さらにFORTRANでは並列処理によって高速化が計られていると理解してよろしいでしょうか。
No.6
- 回答日時:
#5の方の例はどっちかというと特殊な例だと思います。
ベクトル演算、並列演算の機能を持つハードウェア上で実行するばあい、
その機能に対応したFORTRANがあってCがないとか、
機能があっても配列演算文の点でFORTRAN有利とかの例はあるでしょうが、
言語そのものの性能の違いとはまた異なるように思います。
もしかすると、FORTRANの方が最適化がしやすく、
高性能なコンパイラがつくりやすいということはあるかも知れませんが。
あとは、「標準的な」Cだと関数呼出になる部分が
FORTRANだと組込み関数として言語の一部になっているので、
この部分では関数呼出の手間だけ有利かも知れません。
まあ、FORTRANも言語仕様がいくつもありますし、それによっても違うかもしれませんが。
最近のFORTRANは知りませんが、元は再起呼出しができないため、再起呼出ができることによって効率的に動く計算ならCが有利かも知れません。
もっとも、科学技術計算ではあんまりないかも知れませんが。
それに、再帰は非再帰なアルゴリズムでできる場合もありますしね。
ご回答ありがとうございます。確かに、FORTRANの方が最適化しやすかったりするかもしれませんね。言語の仕様にまでかかわってくる問題ですね。
No.5
- 回答日時:
私自身はFORTRANは使ったこともないのですが、、、
例えばベクトル演算を行う場合、Cでは普通ループを利用して書くしかないですが、FORTRANでは配列演算文というものを使って書くことができます。
これによって、コンパイラはベクトルの各要素の計算の並列処理が可能であることを容易に知ることができます。
このような差は、(地球シミュレータに代表される)ベクトルプロセッサを利用する際には大きいと思われます。
参考URL:http://www.komoto.org/fortran/
ご回答ありがとうございます。確かにかなり本格的な科学技術計算をやろうとすると、FORTRANの方が優れた機能を持っていそうですね。参考のURLも紹介していただき、ありがとうございました。
No.4
- 回答日時:
#3です。
(お礼も読んだ後)(1)記し忘れたことがあります。科学技術計算では、この方法(アルゴリズム)では、収束が遅い、こちらでは速いと言うのが良くあります。ですから遅いと証明されている方のアルゴリズムで組めば、Cでも遅くなりませんか。
(2)CもFortranもコンパイル方式です。
(3)コーディングの形の上では、四則演算などは、CもFortranも数学式と近い表現が許されていますね。
だから両コンパイラとかオプチマイザの違いに行き着くのでは。cコンパイラもかってDOS時代には10種類ぐらいの名前は聞いたことがある。
再度のご回答ありがとうございます。
収束が遅いアルゴリズムで組めばCでも遅くなる、というのは同感です。
結局行き着くところは、コンパイラやオプチマイザということで、結論としては、#1や#2の方の回答と着眼点は同じですね。
あと、気象や原子力といった大規模な科学技術計算を行っている方でも、同じ計算をCとFORTRAN両方で作ったということはないのではないかと思います。プログラムを組む目的からは、はずれていますから。
Windowsでは、こんな記事がありました。
http://www.geocities.jp/fujimaki691202/download/ …
No.3
- 回答日時:
議論の建て方がおかしくないでしょうか。
小生も生半可なものですが。
科学技術計算は解法のアルゴリズムの種類によって、答えがでるまでの時間が、左右されるとおもう。更に大きくはアルゴリズムが同じでも、例えば同じルンゲクッタ法でも、細部まで全世界の研究機関にあるFORTRANライブラリが同じとも思えないです。
またデータの特徴がある場合、それを利用したりすれば速くもなるでしょう。ですからFORTRANと一概に言えないとおもう。
増して,Cで組んだものではFORTRANと違いがあるでしょうし、世界的な頭脳が改良したFORTRANと、駆け出しのCプログラマとでは差があると思う。
ライブラリの中も機械語になったとき、リンケージライブラリの中の機械語ルーチンは、組まれた言語の来歴は問わないでしょう(組み合わされる)。FORTRANでも無だな繰り返し等は改良できる。
機械語の実行速度のほかに、入出力装置の速さや、内部メモリの多少によるスワップなどの影響も大きいでしょう。
FORTRANは必要に応じてアルゴリズムやプログラムの改良も出来る人たちが扱う分野のものであることをお忘れなく。
もっと将来気象や原子力やその他大規模システムでも経験されたら考えて見られたらどうでしょう。
実際にそう言う経験者も多数おられるはずで、答えて欲しいですが、OKWEBを見ておられず、答えて頂けない層の人達でしょう(現にOKWEBでは数理技術的質問には回答がほとんどつかない)から、実現は殆どないでしょう。
ご回答ありがとうございます。主にご回答は、アルゴリズムの最適化に関して、またマシンのリソースが実行時にどう働くか(例えばメモリでスラッシングがおこるかどうか)ということに関してまで注意を払われた議論だと思います。非常に実用的な議論だとは思いますが、ここでは、そういうものを理想化して、すべて最適化した上での議論を行いたいというのが、私の質問の建前です。
たとえば、もっと単純に、コンパイル言語とインタプリタ言語ではどちらが実行速度が速いかという問では、コンパイル言語の方が早いというのは当たり前のことで、では、そのコンパイル言語の中でも、科学技術計算では、どの言語が計算速度が速いのかという素朴な質問が本質問の意図です。
質問の意図はわかっていただけたでしょうか。
No.2
- 回答日時:
最新のgccで最適化レベル最大でコンパイルすれば
cの方が速いと思います。
基本的にはどっちも速いでしょうけど、確かめてみては?
http://gcc.gnu.org/fortran/
参考URL:http://gcc.gnu.org/fortran/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【お題】絵本のタイトル
【お題】 「ないた あかおに」「ねないこ だれだ」「はらぺこあおむし」みたいだけど、一体これどういう内容?と思った絵本のタイトルを教えて下さい
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
FORTRANと他の言語(c、c++、basic等)との違いについて
その他(プログラミング・Web制作)
-
プログラム言語FortranとCの違いについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
切り上げたい
-
Matlabでのニュートン法について
-
整数aを入力し、aの2乗、3乗...
-
先行評価と遅延評価
-
変化させるセルが変化しない
-
VBとVBAの違い
-
asp.net 計算式について
-
計算量の少ないn乗根の求め方
-
c言語 日付の計算
-
amazonの★評価の計算方法
-
バッチファイルでウインドウを...
-
VBAの再計算が反映されない件に...
-
40桁の
-
EXCELなどで「返す」という表現
-
フォームのテキストコントロー...
-
ReportViewerのテキストボック...
-
情報処理 ポインタ渡しによる...
-
Androidでのメトロノーム開発
-
傾いた四角形内の範囲の条件式
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
バッチファイルでウインドウを...
-
Visual C++でdebugとreleaseで...
-
モジュラス103の計算とは何でし...
-
ExcelのマクロVBA動作を軽くす...
-
VBAで関数をつくる
-
CとFORTRANの計算速度はどちら...
-
VBAでの勤務時間計算
-
PHPとJavaでSHA256の結果を同じ...
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
モジュロ
-
継承元と継承先での変数
-
VBでReplace
-
計算量の少ないn乗根の求め方
-
C++ でファイルを消す関数(??)
おすすめ情報