• ベストアンサー

CとFORTRANの計算速度はどちらが速いですか?

マシンスペックは同じとして、OSはUNIXであった場合、科学技術計算(微分方程式を解いたり、行列を対角化したり。。。)の計算速度はどちらが速いですか? 普通、科学計算というとFORTRANを使っていますが、これはライブラリの遺産が多いからだと思いますが、実際のところFORTRANとCではどちらが計算速度が速いのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • hpsk
  • ベストアンサー率40% (48/119)
回答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から順番に呼び出さなければならないのかが(基本的には)わからないため、並列化できないのです。

chukanshi
質問者

お礼

なるほど。ベクトルプロセッサのことがよくわかりました。FORTRANの強みですね。ご回答ありがとうございました。

その他の回答 (8)

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.8

#7です。細かいですが重大なミスがあったので、訂正します。 > ベクトル演算と多くの数学関数を言語処理系として規定している 「言語処理系として」ではなく「言語仕様として」です。

chukanshi
質問者

お礼

訂正ありがとうございます。

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.7

#5です。あれからいろいろ調べてみました。 > 最近のFORTRANは知りませんが、元は再起呼出しができないため FORTRAN90以降はできるようになっているようです。 ただ、再帰呼び出しは記述性を向上させているだけで、性能としては時間的にも空間的にもループで書くより不利なのでは? Schemeのように末尾再帰が最適化されることを保証しているならともかく。 > この部分では関数呼出の手間だけ有利 関数呼び出しの手間だけでなく、多くの数学関数では、副作用が生じないことが保証できることも大きな利点だと思います。vをベクトルとして、FORTRANの v = abs(v) に相当する記述をCのループで書いた場合、並列化はまず無理だと思います。 なので、ベクトル演算と多くの数学関数を言語処理系として規定しているという点は、Cに対するかなりのアドバンテージといえるのではないかと思います。 (組み込み関数、と書きましたが一般の関数でも並列化してよいかどうかは、調べても該当する記述を見つけることができなかったのでわかりません。これができるとすれば、FORTRANはちょっとした並列構文を備えてることになり、Cと根本的に違う機能を持っていることになりますね) 少なくとも、FORTRANが並列処理、特にベクトルプロセッサ向けの最適化を意識した言語設計になっていることは間違いないようです。 また、科学記述計算に関する「記述能力」については圧倒的にFORTRANの方が上といってよいでしょう。

chukanshi
質問者

お礼

ご回答ありがとうございます。いろいろ調べていただき、お手数をかけました。御礼申し上げます。 科学計算の記述に関しては、FORTRANの方が優れているでしょうね。ベクトルプロセッサとして考えた場合、Cのループは再起呼び出しより速度が速く、さらにFORTRANでは並列処理によって高速化が計られていると理解してよろしいでしょうか。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.6

#5の方の例はどっちかというと特殊な例だと思います。 ベクトル演算、並列演算の機能を持つハードウェア上で実行するばあい、 その機能に対応したFORTRANがあってCがないとか、 機能があっても配列演算文の点でFORTRAN有利とかの例はあるでしょうが、 言語そのものの性能の違いとはまた異なるように思います。 もしかすると、FORTRANの方が最適化がしやすく、 高性能なコンパイラがつくりやすいということはあるかも知れませんが。 あとは、「標準的な」Cだと関数呼出になる部分が FORTRANだと組込み関数として言語の一部になっているので、 この部分では関数呼出の手間だけ有利かも知れません。 まあ、FORTRANも言語仕様がいくつもありますし、それによっても違うかもしれませんが。 最近のFORTRANは知りませんが、元は再起呼出しができないため、再起呼出ができることによって効率的に動く計算ならCが有利かも知れません。 もっとも、科学技術計算ではあんまりないかも知れませんが。 それに、再帰は非再帰なアルゴリズムでできる場合もありますしね。

chukanshi
質問者

お礼

ご回答ありがとうございます。確かに、FORTRANの方が最適化しやすかったりするかもしれませんね。言語の仕様にまでかかわってくる問題ですね。

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.5

私自身はFORTRANは使ったこともないのですが、、、 例えばベクトル演算を行う場合、Cでは普通ループを利用して書くしかないですが、FORTRANでは配列演算文というものを使って書くことができます。 これによって、コンパイラはベクトルの各要素の計算の並列処理が可能であることを容易に知ることができます。 このような差は、(地球シミュレータに代表される)ベクトルプロセッサを利用する際には大きいと思われます。

参考URL:
http://www.komoto.org/fortran/
chukanshi
質問者

お礼

ご回答ありがとうございます。確かにかなり本格的な科学技術計算をやろうとすると、FORTRANの方が優れた機能を持っていそうですね。参考のURLも紹介していただき、ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#3です。(お礼も読んだ後) (1)記し忘れたことがあります。科学技術計算では、この方法(アルゴリズム)では、収束が遅い、こちらでは速いと言うのが良くあります。ですから遅いと証明されている方のアルゴリズムで組めば、Cでも遅くなりませんか。 (2)CもFortranもコンパイル方式です。 (3)コーディングの形の上では、四則演算などは、CもFortranも数学式と近い表現が許されていますね。 だから両コンパイラとかオプチマイザの違いに行き着くのでは。cコンパイラもかってDOS時代には10種類ぐらいの名前は聞いたことがある。

chukanshi
質問者

お礼

再度のご回答ありがとうございます。 収束が遅いアルゴリズムで組めばCでも遅くなる、というのは同感です。 結局行き着くところは、コンパイラやオプチマイザということで、結論としては、#1や#2の方の回答と着眼点は同じですね。 あと、気象や原子力といった大規模な科学技術計算を行っている方でも、同じ計算をCとFORTRAN両方で作ったということはないのではないかと思います。プログラムを組む目的からは、はずれていますから。 Windowsでは、こんな記事がありました。 http://www.geocities.jp/fujimaki691202/download/Comparison/index.htm

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

議論の建て方がおかしくないでしょうか。 小生も生半可なものですが。 科学技術計算は解法のアルゴリズムの種類によって、答えがでるまでの時間が、左右されるとおもう。更に大きくはアルゴリズムが同じでも、例えば同じルンゲクッタ法でも、細部まで全世界の研究機関にあるFORTRANライブラリが同じとも思えないです。 またデータの特徴がある場合、それを利用したりすれば速くもなるでしょう。ですからFORTRANと一概に言えないとおもう。 増して,Cで組んだものではFORTRANと違いがあるでしょうし、世界的な頭脳が改良したFORTRANと、駆け出しのCプログラマとでは差があると思う。 ライブラリの中も機械語になったとき、リンケージライブラリの中の機械語ルーチンは、組まれた言語の来歴は問わないでしょう(組み合わされる)。FORTRANでも無だな繰り返し等は改良できる。 機械語の実行速度のほかに、入出力装置の速さや、内部メモリの多少によるスワップなどの影響も大きいでしょう。 FORTRANは必要に応じてアルゴリズムやプログラムの改良も出来る人たちが扱う分野のものであることをお忘れなく。 もっと将来気象や原子力やその他大規模システムでも経験されたら考えて見られたらどうでしょう。 実際にそう言う経験者も多数おられるはずで、答えて欲しいですが、OKWEBを見ておられず、答えて頂けない層の人達でしょう(現にOKWEBでは数理技術的質問には回答がほとんどつかない)から、実現は殆どないでしょう。

chukanshi
質問者

お礼

ご回答ありがとうございます。主にご回答は、アルゴリズムの最適化に関して、またマシンのリソースが実行時にどう働くか(例えばメモリでスラッシングがおこるかどうか)ということに関してまで注意を払われた議論だと思います。非常に実用的な議論だとは思いますが、ここでは、そういうものを理想化して、すべて最適化した上での議論を行いたいというのが、私の質問の建前です。 たとえば、もっと単純に、コンパイル言語とインタプリタ言語ではどちらが実行速度が速いかという問では、コンパイル言語の方が早いというのは当たり前のことで、では、そのコンパイル言語の中でも、科学技術計算では、どの言語が計算速度が速いのかという素朴な質問が本質問の意図です。 質問の意図はわかっていただけたでしょうか。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

最新のgccで最適化レベル最大でコンパイルすれば cの方が速いと思います。 基本的にはどっちも速いでしょうけど、確かめてみては? http://gcc.gnu.org/fortran/

参考URL:
http://gcc.gnu.org/fortran/
chukanshi
質問者

お礼

ご回答ありがとうございます。参考URLも役に立ちそうです。

回答No.1

両方共最終的には機械語になるのですから、同じPCで動作させた時の速度の違いはほとんど無い。 理由:コンパイラーの性能によるから。

chukanshi
質問者

お礼

早速のご回答ありがとうございます。言語の違いよりも、コンパイラの性能ですね。

関連するQ&A

  • Unix上のCで

    有名なよく使われている科学計算用ライブラリは何でしょうか? 科学計算用ライブラリとは 連立一次方程式 行列演算(固有値、逆行列) n次多項式の根 数値積分 などです

  • 行列計算の速度

    行列計算の速度 今、スパース行列計算のプログラミングをしているのですが、Cで作成していて、計算速度について考慮しています。同じような計算をmatlabでさせてみたら、matlabでの行列計算は圧倒的に速かったので、matlabを使う事を考えてます。行列計算を得意とするmatlabなのですが、matlabはCを使っているので、Cでのプログラミングをあきらめるべきなのか考えています。 Cもmatlabも良い点、悪い点はあると思いますが、何か参考になるアドバイスがあればいいなと思って、投稿させてもらいました。お願いします。

  • 行列の微分方程式を解いていて、計算を進めたのですが、

    行列の微分方程式を解いていて、計算を進めたのですが、 exp(Bt) の計算ができずに困っています。 Bは三行三列の行列で 2 0   0 0 0  -√(2) 0 √(2) 0 というところまでは求められたのですが・・・ よろしくお願いします。

  • 数学の参考書を探しています。

    いま、理工系の学部に進学し勉強をしているのですが… それで…なぜか今の数学の先生は指示する参考書(教科書)がなく…教科書なしで授業を進め…チンプンカンプンです。 そこで、参考書を自分で買おうと思うのですが…このシラバスからいくとどういう参考書がお勧めですか??お願いします。 連立線型微分方程式とは 行列の指数関数 行列の対角化 対角化による連立線型微分方程式の解法 射影 行列のスペクトル分解 スペクトル分解による連立線型微分方程式の解法 多変数関数の微分可能性 全微分と偏微分 多変数関数の微分計算 陰関数 多変数関数の極値

  • fortran77教えてください

    fortran77の問題で次のプログラムの作成の仕方を教えてください 整数A,B,Cを読み込み、それを係数とする2次方程式Ax^2+Bx+C=0の解を計算して表示するプログラムを サブルーチン副プログラムを用いて作成せよ(複素数型を使うこと) メインプログラムでは整数A,B,Cの入力および解の出力および解の出力を行い解の計算はサブルーチン副プログラムで行うこと なお'keisan.txt'という名前のデータファイルに結果を出力するように 計算時は以下の3つの方程式を用いること x^2+3x+5=0 X^2+6x+4=0 x^2+x+1=0

  • 行列の計算 数C程度

    おそらく、非常に初歩的な問題だと思うのですが、どうしてもうまくとけません。以下の問題を教えてください。 行列A=[1 -2] 行列P=[1 q] 行列QAP=[α 0]      [1  4]     [r s]        [0 β] ※QはPの逆行列 すなわち、  Q=[ s -r]                        [-q s] このとき、 「上記のQAPとなるように行列Pのq,r,sを求めよ。」またそれに対するα,βの値を求めよ。ただし、α>β , s-qr」 QAPを計算し、対角行列であるから、(1,2)成分と(2,1)成分が0になることを利用して、連立方程式で解こうと思ったのですが、 r=-1,-1/2 は求まるのですが、 q,sが求めることができません。 どなたかq,r,sの求め方を教えてください。

  • 数値計算の速度を上げたい

    こんにちは。 今,パソコンを使って数値計算をさせているのですが,どうも遅くて困っています。プログラムを書き換えたりマシンに物理的な装置をつけたりする以外に,システムをいじることで計算速度を上げることはできないでしょうか?ちなみに,パソコンのスペックは,「Pentium 4 CPU 3.80GHz, 3.25GB RAM」だそうです。パソコンのことはまったく詳しくないので,よろしくお願いします。

  • フリーの数値計算ライブラリ

    皆さん,こんにちは。 世の中には,MKL,IMSL 等,数値計算ライブラリがいろいろあるようです。でも,有料なので個人で使うにはちょっと敷居が高いです。そこで,フリーの数値計算ライブラリを探しています。 線形代数ライブラリとしては,MTL/ITL を見つけました。その他,特殊関数,非線形方程式等まで含めたものは,まだ見つけられていません。liboctave は Windows で使うのは面倒臭そうなので,却下したいです。また,言語は C++ が希望ですが,Fortran 以外なら何でも構いません。Excel でも,XNumber や MATRIX なんていうのがあるみたいですね。 ちなみに,僕自身はこのようなライブラリを使ったことがないのですが,今後はこういったものをどんどん利用して作業を楽にしたいと思っています。 皆さんが使われている,お勧めの数値計算ライブラリを教えて下さい。よろしくお願いします。

  • 行列の問題が解けません。計算間違いや思考の間違いがあればご指摘お願いし

    行列の問題が解けません。計算間違いや思考の間違いがあればご指摘お願いします。 行列A [-3 -1 -5] [1  1  1] [3  1  5] を対角化するための行列を求めようとしようとしています。 Aに関しては、Ax=txとおき、tを対角行列、xを固有ベクトルとすると、 (tE-A)x=0と変形できるため、x≠0であるためには、 |tE-A|=0が条件になります。 これを解くと、t=0,1,2が得られます。 3次正方行列において、3つの異なる固有値が得られたため、 行列Aは対角化可能です。(前提1 この前提が間違っている?) P^-1・A・P=B (前提2:Bは対角行列、P,P^-1は正方行列) となるようなPの条件は、 (tE-A)=0を満たす行列の組み合わせ、すなわち、固有値0の時のa(1,1,-1),固有値1の時のb(1,1,-1), 固有値2の時のc(1,0,-1)(※a,b,cは任意の数)の組み合わせです。 ところが、これらの組み合わせでできる、例えば 行列C: -1 1 1 1 1 0 1 -1 -1 は正方行列ではなく(rankC=2)、C≠Pです。 そのため、行列Aを対角化することができません。 前提1,前提2のどちらかが間違っているのでしょうか。 それとも、計算をどこか間違えているのでしょうか。 求めたいのは、行列Aを対角化する行列Pです。 どなたか、よろしくお願いいたします。

  • 連立一次方程式を解く

    A[N×N] × X[N] = B[N]の式が与えられ、 X[N]について解く方法が知りたいです。 しかも、かなり大規模な計算です。 ここでの回答が困難であれば、ホームページや書籍を紹介して欲しいです。 ちなみに英語は分かりません。 連立一次方程式を簡単に解く方法にガウスの消去法がありますが、処理速度、メモリの扱いから言って、現実的ではないですよね。 バンドマトリクスも考えられますが、一応考えている行列は疎行列で対角線付近に非零が多いと思いますが、基本的に任意の行列になると思うので、バンドマトリクスが効果的とも思えません。 で、非ゼロだけを集めメモリ消費をおさえる、スカイライン法というのを知りましたが、どう言うアルゴリズムで、コーディングして良いのかも分かりません。 もしくは、既に数値解析用のライブラリがどこかで開発され、無料で公開されており、スカイライン法や他の解法も使用できるものは無いでしょうか。その時はルーチンの使用方法を教えてくれるとありがたいです。 私のプログラム環境はLinuxでgccかg++を使用しています。 または、SunOSでしょうか? 近々、2Ghz、1GMBになる予定。力技も可能? また、ネットワークを利用して並列処理をする技術は持ち合わせていませんし、環境もありません。 希望は上記式のNが数万以上の連立一次方程式を解きたいと思っています。億行くかな? 色々探しても数値解析となるとFORTRANに関するものが多いのはなぜ?CやC++では行われないのかな?

専門家に質問してみよう