• ベストアンサー
  • 暇なときにでも

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

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

共感・応援の気持ちを伝えよう!

  • 回答数9
  • 閲覧数4056
  • ありがとう数12

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

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

#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から順番に呼び出さなければならないのかが(基本的には)わからないため、並列化できないのです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

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

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

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

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

  • 連立微分方程式 行列

    この問題がどうしても分からないので数学のできる方お願いします。 Q.次の連立微分方程式を解け   x'(t)= x(t) -y(t)+4z(t)   y'(t)=3x(t)+2y(t) -z(t)   z'(t)=2x(t) +y(t) -(t) この問題の前の問題で A=(1 -1 4) (3 2 -1) (2 1 -1)←行列 の固有値、固有ベクトル、Aの対角化、自然数nに対するA^n を求めたのですがここで使用するのでしょうか?

その他の回答 (8)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

参考URL:
http://www.komoto.org/fortran/

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

#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

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

議論の建て方がおかしくないでしょうか。 小生も生半可なものですが。 科学技術計算は解法のアルゴリズムの種類によって、答えがでるまでの時間が、左右されるとおもう。更に大きくはアルゴリズムが同じでも、例えば同じルンゲクッタ法でも、細部まで全世界の研究機関にある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/

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 連立微分方程式の解き方について質問です

    『1階線形微分方程式系 X'=2X-Y , Y'=5X-4Y  を考える。  (1)行列A=(2 &#65293;1)(5 &#65293;4)とするとき、    A=aI+B 、 trB=0    をみたす定数a 及び 行列Bを求めよ。ただし、Iは二次単位行列である。  (2)exp(tA)を計算せよ。  (3)微分方程式の解を求めよ。』 (1)はできたのですが、(2)がわかりません……。 どうすれば、eを行列で累乗できるのしょうか。 (1)(2)と(3)のつながりもわかりません……。 よろしくお願いします。

  • 微分方程式の解の存在

    微分方程式の解の存在について質問です. x_dot = A x という形の微分方程式で行列Aがxの関数(つまりA(x))で,さらに各xで行列方程式 B'A(x)+A(x)B+Q=0の解である(B,Qは定数行列)という拘束条件?があるときに微分方程式の解の存在と唯一性はどのようにいえばいいのでしょうか? ただ,A(x)はすべてのxについて固有値が負の行列であることとします. なにかアドバイスがあったらお願いいたします.

  • 行列対角化問題

    3×3行列 A={{2,0,-1},{-2,3,2},{1,0,0}} は、対角化できるかどうか判定しなさい。 また、対角化できた場合は、 を対角化する行列P を一つ求めて、P^(-1)AP を計算して対角化して下さい。 対角化できなかった場合、ジョルダン標準形Jにできる行列Pを一つ求めて、P^(-1)AP を計算してJを求めて下さい。

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

    行列の問題が解けません。計算間違いや思考の間違いがあればご指摘お願いします。 行列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です。 どなたか、よろしくお願いいたします。

  • 速度と微分方程式

    速度と微分方程式 1.最初、20m/sの早さで走っていた自動車が一定の加速度で速さを増し、4.0秒後には40m/sになった。 (1)加速度一定の条件を用いて、早さに関する微分方程式を書け。 (2)初期条件を書け。 (3) (1)の微分方程式を(2)の初期条件を元に解け。 (4)速さの時間に関する式を求めよ。 (5) (4)を基に微分方程式を書け。これを解いて、この間に進んだ距離を求めよ。 (1) a=dv/dt ∫dv=a∫dt v+c=at+c v=at+c (2) 初期条件 t=0のときv=20m/s (3) 初期条件より v=5t+20 (3)までの答えはこれでいいでしょうか? (4)と(5)がわからないのでどなたかよろしくお願いします。

  • 水浄化速度の計算

    タンクにたまった水の一定量を浄化する浄化時間を計算しています。 タンクに不純物Aが10ppb、水に溶け込んでいるとして、タンクから一定量(Q kg/hr)を取り出して、75%の効率で浄化すると、濃度が0になるまで、時間がどのぐらいかかるか、微分方程式を立てて、解きたいのですが、式が正しいか、使っている量の単位が合っているか自信がなく、質問させていただきました。 立てた式 dA/dt = -0.75*Q*A*t これを解くと、 A = A0*exp(-0.75*Q*t) ここで、Aは不純物濃度ppb、tは時間hr、Qは浄化流量kg/hrをいれて計算したところ、一瞬で浄化が終わってしまいます。 恥ずかしながら、立てた微分方程式が合っているか、単位はこれでよいのか教えていただけないでしょうか。

  • 【至急】線形微分方程式の基本行列の初期値問題

    線形微分方程式の基本行列の初期値問題についての質問です。下の画像の問題(一番上が微分方程式で真ん中が初期値)を解いて基本行列が求まった(画像一番下の行列)のですが、 まずこの基本行列はあってますか?それと初期値問題はどのようにして解けば良いのですか?

  • 一次反応速度の積分方程式について

    一次反応速度の微分方程式はだいたいわかったのですが、積分方程式についてがよくわかりません。 お願いします。

  • 3×3行列の対角化

    A={{-1,2,2},{2,-1,2},{2,2,-1}} を対角化する行列P を求めて、P^(-1)AP を計算して対角化して下さい。

  • 固有値,対角化を用いた微分方程式の解法について質問です。

    問題は以下のサイトにあります。 「1. 固有値,対角化を用いた微分方程式の解法」です。 http://fragrance.ninja-web.net/ 普通に解こうと思えば簡単に解けますが、対角化を利用して解けません。 解き方が間違っているのでしょうか? よろしくお願いします。