- ベストアンサー
CとFORTRANの計算速度はどちらが速いですか?
マシンスペックは同じとして、OSはUNIXであった場合、科学技術計算(微分方程式を解いたり、行列を対角化したり。。。)の計算速度はどちらが速いですか? 普通、科学計算というとFORTRANを使っていますが、これはライブラリの遺産が多いからだと思いますが、実際のところFORTRANとCではどちらが計算速度が速いのでしょうか。
- みんなの回答 (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から順番に呼び出さなければならないのかが(基本的には)わからないため、並列化できないのです。
その他の回答 (8)
- hpsk
- ベストアンサー率40% (48/119)
#7です。細かいですが重大なミスがあったので、訂正します。 > ベクトル演算と多くの数学関数を言語処理系として規定している 「言語処理系として」ではなく「言語仕様として」です。
お礼
訂正ありがとうございます。
- hpsk
- ベストアンサー率40% (48/119)
#5です。あれからいろいろ調べてみました。 > 最近のFORTRANは知りませんが、元は再起呼出しができないため FORTRAN90以降はできるようになっているようです。 ただ、再帰呼び出しは記述性を向上させているだけで、性能としては時間的にも空間的にもループで書くより不利なのでは? Schemeのように末尾再帰が最適化されることを保証しているならともかく。 > この部分では関数呼出の手間だけ有利 関数呼び出しの手間だけでなく、多くの数学関数では、副作用が生じないことが保証できることも大きな利点だと思います。vをベクトルとして、FORTRANの v = abs(v) に相当する記述をCのループで書いた場合、並列化はまず無理だと思います。 なので、ベクトル演算と多くの数学関数を言語処理系として規定しているという点は、Cに対するかなりのアドバンテージといえるのではないかと思います。 (組み込み関数、と書きましたが一般の関数でも並列化してよいかどうかは、調べても該当する記述を見つけることができなかったのでわかりません。これができるとすれば、FORTRANはちょっとした並列構文を備えてることになり、Cと根本的に違う機能を持っていることになりますね) 少なくとも、FORTRANが並列処理、特にベクトルプロセッサ向けの最適化を意識した言語設計になっていることは間違いないようです。 また、科学記述計算に関する「記述能力」については圧倒的にFORTRANの方が上といってよいでしょう。
お礼
ご回答ありがとうございます。いろいろ調べていただき、お手数をかけました。御礼申し上げます。 科学計算の記述に関しては、FORTRANの方が優れているでしょうね。ベクトルプロセッサとして考えた場合、Cのループは再起呼び出しより速度が速く、さらにFORTRANでは並列処理によって高速化が計られていると理解してよろしいでしょうか。
- terra5
- ベストアンサー率34% (574/1662)
#5の方の例はどっちかというと特殊な例だと思います。 ベクトル演算、並列演算の機能を持つハードウェア上で実行するばあい、 その機能に対応したFORTRANがあってCがないとか、 機能があっても配列演算文の点でFORTRAN有利とかの例はあるでしょうが、 言語そのものの性能の違いとはまた異なるように思います。 もしかすると、FORTRANの方が最適化がしやすく、 高性能なコンパイラがつくりやすいということはあるかも知れませんが。 あとは、「標準的な」Cだと関数呼出になる部分が FORTRANだと組込み関数として言語の一部になっているので、 この部分では関数呼出の手間だけ有利かも知れません。 まあ、FORTRANも言語仕様がいくつもありますし、それによっても違うかもしれませんが。 最近のFORTRANは知りませんが、元は再起呼出しができないため、再起呼出ができることによって効率的に動く計算ならCが有利かも知れません。 もっとも、科学技術計算ではあんまりないかも知れませんが。 それに、再帰は非再帰なアルゴリズムでできる場合もありますしね。
お礼
ご回答ありがとうございます。確かに、FORTRANの方が最適化しやすかったりするかもしれませんね。言語の仕様にまでかかわってくる問題ですね。
- hpsk
- ベストアンサー率40% (48/119)
私自身はFORTRANは使ったこともないのですが、、、 例えばベクトル演算を行う場合、Cでは普通ループを利用して書くしかないですが、FORTRANでは配列演算文というものを使って書くことができます。 これによって、コンパイラはベクトルの各要素の計算の並列処理が可能であることを容易に知ることができます。 このような差は、(地球シミュレータに代表される)ベクトルプロセッサを利用する際には大きいと思われます。
お礼
ご回答ありがとうございます。確かにかなり本格的な科学技術計算をやろうとすると、FORTRANの方が優れた機能を持っていそうですね。参考のURLも紹介していただき、ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。(お礼も読んだ後) (1)記し忘れたことがあります。科学技術計算では、この方法(アルゴリズム)では、収束が遅い、こちらでは速いと言うのが良くあります。ですから遅いと証明されている方のアルゴリズムで組めば、Cでも遅くなりませんか。 (2)CもFortranもコンパイル方式です。 (3)コーディングの形の上では、四則演算などは、CもFortranも数学式と近い表現が許されていますね。 だから両コンパイラとかオプチマイザの違いに行き着くのでは。cコンパイラもかってDOS時代には10種類ぐらいの名前は聞いたことがある。
お礼
再度のご回答ありがとうございます。 収束が遅いアルゴリズムで組めばCでも遅くなる、というのは同感です。 結局行き着くところは、コンパイラやオプチマイザということで、結論としては、#1や#2の方の回答と着眼点は同じですね。 あと、気象や原子力といった大規模な科学技術計算を行っている方でも、同じ計算をCとFORTRAN両方で作ったということはないのではないかと思います。プログラムを組む目的からは、はずれていますから。 Windowsでは、こんな記事がありました。 http://www.geocities.jp/fujimaki691202/download/Comparison/index.htm
- imogasi
- ベストアンサー率27% (4737/17069)
議論の建て方がおかしくないでしょうか。 小生も生半可なものですが。 科学技術計算は解法のアルゴリズムの種類によって、答えがでるまでの時間が、左右されるとおもう。更に大きくはアルゴリズムが同じでも、例えば同じルンゲクッタ法でも、細部まで全世界の研究機関にあるFORTRANライブラリが同じとも思えないです。 またデータの特徴がある場合、それを利用したりすれば速くもなるでしょう。ですからFORTRANと一概に言えないとおもう。 増して,Cで組んだものではFORTRANと違いがあるでしょうし、世界的な頭脳が改良したFORTRANと、駆け出しのCプログラマとでは差があると思う。 ライブラリの中も機械語になったとき、リンケージライブラリの中の機械語ルーチンは、組まれた言語の来歴は問わないでしょう(組み合わされる)。FORTRANでも無だな繰り返し等は改良できる。 機械語の実行速度のほかに、入出力装置の速さや、内部メモリの多少によるスワップなどの影響も大きいでしょう。 FORTRANは必要に応じてアルゴリズムやプログラムの改良も出来る人たちが扱う分野のものであることをお忘れなく。 もっと将来気象や原子力やその他大規模システムでも経験されたら考えて見られたらどうでしょう。 実際にそう言う経験者も多数おられるはずで、答えて欲しいですが、OKWEBを見ておられず、答えて頂けない層の人達でしょう(現にOKWEBでは数理技術的質問には回答がほとんどつかない)から、実現は殆どないでしょう。
お礼
ご回答ありがとうございます。主にご回答は、アルゴリズムの最適化に関して、またマシンのリソースが実行時にどう働くか(例えばメモリでスラッシングがおこるかどうか)ということに関してまで注意を払われた議論だと思います。非常に実用的な議論だとは思いますが、ここでは、そういうものを理想化して、すべて最適化した上での議論を行いたいというのが、私の質問の建前です。 たとえば、もっと単純に、コンパイル言語とインタプリタ言語ではどちらが実行速度が速いかという問では、コンパイル言語の方が早いというのは当たり前のことで、では、そのコンパイル言語の中でも、科学技術計算では、どの言語が計算速度が速いのかという素朴な質問が本質問の意図です。 質問の意図はわかっていただけたでしょうか。
- sha-girl
- ベストアンサー率52% (430/816)
最新のgccで最適化レベル最大でコンパイルすれば cの方が速いと思います。 基本的にはどっちも速いでしょうけど、確かめてみては? http://gcc.gnu.org/fortran/
- 参考URL:
- http://gcc.gnu.org/fortran/
お礼
ご回答ありがとうございます。参考URLも役に立ちそうです。
- Tsukasa0215
- ベストアンサー率22% (280/1257)
両方共最終的には機械語になるのですから、同じPCで動作させた時の速度の違いはほとんど無い。 理由:コンパイラーの性能によるから。
お礼
早速のご回答ありがとうございます。言語の違いよりも、コンパイラの性能ですね。
お礼
なるほど。ベクトルプロセッサのことがよくわかりました。FORTRANの強みですね。ご回答ありがとうございました。