くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0545デフォルトの名無しさん
2009/08/21(金) 14:42:34if [ -z "${INCLUDE}" ]
then
export INCLUDE="${MKLROOT}/include"
else
export INCLUDE="${MKLROOT}/include:$INCLUDE"
fi
・
・
・
/opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
実行しても設定されないようなので上の文を.bash_profileにつけたしました。
0546541
2009/08/21(金) 14:48:44> >>541
> lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
> 自前というのはどういう意味ですか?
公式サイトからソースを拾って来て、自分で make すること。私はそれで lapack を入れてる。
特に何もしなければ lapack.a、blas.a というファイルが出来る。で、これをリンクすると。
lapack95 はやったことがない。
と、ここまで書いてぐぐってみた。
http://basewall.kuciv.kyoto-u.ac.jp/dokuwiki/doku.php?id=ifort
なんかどう?
0547デフォルトの名無しさん
2009/08/21(金) 14:57:32ソースは元々あって、それを自分でmakeしました。
リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?
そのホームページも見てやってみたんですが・・・
もうちょっとやってみます!!
0548541
2009/08/21(金) 15:11:42> >>546
> ソースは元々あって、それを自分でmakeしました。
> リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?
そです。
それはそうと
echo $INCLUDE
の結果って、問題ないですか?設定さえチャンと出来ていれば、後はマニュアル通りにしたら
出来るはずなんですけどね。そのマニュアルってフリーで転がってんのかな。
エラーの中身見たら設定が出来てないようにも見えるけど…気のせいかな?
>>541
> これは明らかに可笑しくないか?
この部分、実は問題無いみたいですね。でもこれ、私にはとっても変態な仕様にしか見えない。
90 は余り使わないから、そう思うのかもしれない。そろそろ 90 もリハビリした方が良さそう。
再帰を書けるのは知っているけど書き方知らないし。
探せば他にも出て来ると思いますヨ。> 纏めページ
0549デフォルトの名無しさん
2009/08/21(金) 15:30:57これで大丈夫ですか?
http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/SGIAltix/Doc/mkl10/doc/userguide.pdf
マニュアルこれです。4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。
0550541
2009/08/21(金) 16:03:10>>549
> echo $INCLUDEの結果は /opt/intel/mkl/10.2.1.017/include
> これで大丈夫ですか?
それが正しいかどうかは、mklvars32.sh が無いのでなんとも。晒さなくていいですよ。
やると問題になりそうですし。
あと、気になったんですが、コンパイル時のコマンドの書式はどこから拾って来たのですか?
私が先に挙げたリンク先のサンプルでは
$ ifort /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90
-L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t/
-I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t
-lmkl_lapack95 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread
$ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d
となっています。$ はプロンプトです。ここでは見易さのために改行して引用していますが、実際は改行無し。
バージョンのことはキニシナイ。
-lmkl_lapack95 ということは、libmkl_lapack95.a というファイルが何処かに在る。
多くの場合は -L で指定しているディレクトリになる。
(続く)
0551541
2009/08/21(金) 16:06:20>>549
> 4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
> 実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。
そんなこと書いてないみたいですが?
In the above commands, mklvars<arch> stands for each of mklvars32, mklvarsem64t
or mklvars64.
だから
. <absolute_path_to_installed_MKL>/tools/environment/mklvars<arch>.sh
の mklvars<arch>.sh は mklvars32.sh か mklvarsem64t.sh に読み替えればいいのでは?最初の . は必要ですヨ。
0552デフォルトの名無しさん
2009/08/21(金) 16:23:33この辺も何かの参考にはなるかも?
というか気になってたんですけど、身近に質問できる人は居ないんでしょうか?
学生だと思うんだけどなぁ(何となく)。
## 2ch で聞くなよ、とかいうことではありません。念のため。
0553デフォルトの名無しさん
2009/08/21(金) 16:51:46-Lで指定しているディレクトリにパスを通してる(echo $PATHで表示される)ので、
-Lと-lの後のフォルダの指定は省いてるんですがダメですか?
コンパイルのコマンドは挙げていただいたサイトのをちょっといじって書きました。
ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
>>551
最初の.が抜けてました。ありがとうございます。
>>552
linuxいじってる奴もfortran使いもいないんですwwwwwwwwwwwwww
やっぱりエラーなりますorz
何がいけないのか・・・
0554541
2009/08/21(金) 19:18:08> >>550
> -Lで指定しているディレクトリにパスを通してる(echo $PATHで表示される)ので、
> -Lと-lの後のフォルダの指定は省いてるんですがダメですか?
ダメです。環境変数 PATH は ls や gcc、make などのコマンドが在るディレクトリを登録するものです。
なので、ここに何を書いていようとライブラリは無関係。普通はね。
> >>552
> linuxいじってる奴もfortran使いもいないんですwwwwwwwwwwwwww
>
> やっぱりエラーなりますorz
> 何がいけないのか・・・
-L などを抜いたことが原因でしょうね。それだけが原因ではない気もしますが。コンパイラによって違います
が、-v または -V というオプションを付けてコンパイルすると、ライブラリなどの検索ディレクトリを表示し
ます。コンパイルもしますが、そういうものを画面に表示します。まぁ見てみると良いと思います。
で、デフォルトで登録されていない所に在るライブラリなどはコンパイル時に自分で指定しないとリンクして
くれません。しなかった場合は、そんなもの無いということでコンパイルに失敗します。例えば私の環境だと
/opt/lib に liblapack.a と libblas.a が在ります。標準的には /opt/lib なんて登録されませんし、登録する方法
も知りません。lapack のサブルーチンを使っているソースをコンパイルするときは
$ gfortran sample.F90 -L/opt/lib -llapack -lblas
とします。こうすることで、/opt/lib に在る liblapack.a と libblas.a をリンクするしろ、と指定しています。
0555デフォルトの名無しさん
2009/08/21(金) 19:38:190556デフォルトの名無しさん
2009/08/21(金) 19:45:12> /opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
> 環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
> 実行しても設定されないようなので上の文を.bash_profileにつけたしました。
shellがbashなら .bash_profile に
source /opt/intel/fc/<IFCのバージョン>/bin/ifortvars.sh
source /opt/intel/mkl/<MKLのバージョン>/tools/environment/mklvars32.sh
を追加しとけ。
MKLは(IFCも)バージョンUP時にディレクトリ構成や必要なライブラリが変わることがあるんでヤヤコシイわ。
0557デフォルトの名無しさん
2009/08/21(金) 19:52:17こんなんではダメですか?
% nm liblapack.a | head -20
liblapack.a(sgbbrd.o):
U _lsame_
00000000 T _sgbbrd_
U _slargv_
U _slartg_
U _slartv_
U _slaset_
U _srot_
U _xerbla_
U dyld_stub_binding_helper
liblapack.a(sgbcon.o):
U _isamax_
U _lsame_
U _saxpy_
U _sdot_
00000000 T _sgbcon_
U _slacon_
U _slamch_
0558デフォルトの名無しさん
2009/08/21(金) 19:57:51ありがとうございます!
0559デフォルトの名無しさん
2009/08/21(金) 20:06:14勉強になります。ウチの Debian は1年ほど前に急に起動しなくなってから放置してますが。
>>558
それで問題なかったのなら何よりです。
0560デフォルトの名無しさん
2009/08/21(金) 20:28:18サイズが大きくなって多少遅くなる?
0561デフォルトの名無しさん
2009/08/21(金) 21:27:53丁寧に説明していただきありがとうございます。
やってみましたがなぜかエラーですwwwwwwwwwwwwww
>>556
環境変数の設定はできてるみたいです。ありがとうございます。
みなさんありがとうございました。もうちょいがんばってみようと思います。
0562デフォルトの名無しさん
2009/08/21(金) 22:38:05無事にコンパイルできる?ここで転けてたら話にならない。
0563デフォルトの名無しさん
2009/08/21(金) 23:22:39簡単なソースのコンパイルはできます。
mklとリンクしてコンパイルすると、.aと.soファイル内に、
定義されてないサブルーチンを使用しようとしていますとか警告出ます。。
0564デフォルトの名無しさん
2009/08/21(金) 23:53:13> mklとリンクしてコンパイルすると、.aと.soファイル内に、
> 定義されてないサブルーチンを使用しようとしていますとか警告出ます。。
これは簡単なソースをコンパイルするときに出るの?簡単なソース(Hello, World. 程度)と
ライブラリをリンクするときに出るのであれば設定が可笑しいと思う。それかコンパイル時
のコマンドの書き方か。両方の可能性もあるけど。
普通は、リンクするライブラリの中にある関数を使っていなくても、そんなことにはならな
い。例えば sin( 1.00D0 ) を計算して表示するだけのソースと FFT のライブラリをリンクし
ても文句は言われない。コンパイラはスルーすれば済むから。呼んでもないものをくっ付け
る必要は無い。
0565デフォルトの名無しさん
2009/08/22(土) 00:00:54その通りにやればコンパイル/リンクできるはずだが。
0566デフォルトの名無しさん
2009/08/22(土) 10:01:37/opt/intel/Compiler/11.1/046/mkl/lib/32//libmkl_lapack.so: undefined reference to `mkl_serv_load_fun'
/opt/intel/Compiler/11.1/046/mkl/lib/32//libmkl_lapack.so: undefined reference to `mkl_serv_load_dll'
/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
このエラーが出ます。
リンクするときって.aと.soは混ぜない方がいいんでしょうか?
>>565
その通りにやってるつもりなんですが・・・
0567デフォルトの名無しさん
2009/08/22(土) 10:19:38コンパイル時のコマンドを晒して。
あとリンクの順番を間違えるとエラーになることがある。要するに
ライブラリ A と B をリンクするとき A が B にある関数を呼んでい
るなら、例えば A の中にある関数 funcA がその中で B の中にある
関数 funcB を呼んでいるとき
-lA -lB
という順番でリンクしないと転ける。
リンクするときは .a だけで良いはず。あとは勝手にやるはずなん
だけどライブラリに依るかもしれんので何も。
マニュアル通りにしていると言う割には勝手なことをしている気が
する。
0568デフォルトの名無しさん
2009/08/22(土) 10:25:02ifort test.f90
-L/opt/intel/Compiler/11.1/046/mkl/lib/32/
-I/opt/intel/Compiler/11.1/046/mkl/include/ -I/opt/intel/Compiler/11.1/046/mkl/include/32/
-lmkl_lapack95 -lmkl_lapack -Wl,--start-group
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel_thread.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.a
-Wl,--end-group -liomp5 -lpthread
ちなみに簡単なソースでリンク無しだとコンパイルできます。
lapac95は.aなんですけどlapackは.soです。
ググってみたら全部.aでやる必要があるみたいです。
が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?
0569デフォルトの名無しさん
2009/08/22(土) 10:44:08ifort test.f90
-L/opt/intel/Compiler/11.1/046/mkl/lib/32/
-I/opt/intel/Compiler/11.1/046/mkl/include/
-I/opt/intel/Compiler/11.1/046/mkl/include/32/
-lmkl_lapack95
-Wl,--start-group
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel_thread.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.a -Wl,--end-group
-liomp5 -lpthread
-libmkl_lapackいらないみたいです。
これでコンパイルしようとすると以下のエラーが出ます;
/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
0570デフォルトの名無しさん
2009/08/22(土) 10:44:26> >>567
> ifort test.f90
(長いので中略)
> -Wl,--end-group -liomp5 -lpthread
このようにしなさいという説明は何処にあるのでしょう。
> が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?
ということはビルドしていないということでは?やり方はマニュアルに書いているはず。因みに無いという
根拠はなんですか?それと
find /opt/intel -name "libmkl_*.a"
の実行結果は?
http://www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html
にも書いていますが、LAPACK95 はラッパーのようなので、単体では動かないと思います。勝手に持って
来るったって何処から持って来るのだろう。そんなことしても意味ないと思うケド。あと
> -lmkl_lapack95 -lmkl_lapack -Wl,--start-group
これって BLAS はリンクしてないみたいだけど、しなくて良いの?
0571デフォルトの名無しさん
2009/08/22(土) 10:52:24>このようにしなさいという説明は何処にあるのでしょう。
ユーザーズガイドのexampleにありました。
>find /opt/intel -name "libmkl_*.a"
lapack95.aはあります。.soはありません。逆にlapac.soはあって.aはありません。
lapack95のビルドはしました。が、.soはないです;
BLASリンクしてもダメでした;
0572デフォルトの名無しさん
2009/08/22(土) 11:12:20> これでコンパイルしようとすると以下のエラーが出ます;
>
> /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
iomp5 って OpenMP 用のものみたいだから、並列でもしない限りイラネ。と思うけど、どうなんだろ?
ということで、外してやってみて。
取り敢えずオプション付けとけって感じにしか見えない。それぞれのオプションの意味を調べ直した方が
早い気がして来た。どっかに日本語版も落ちてたし。場所は忘れた。
0573デフォルトの名無しさん
2009/08/22(土) 11:29:08OpenMPのオプションを付けるといくつかのオプションを呼び出すことになって
非OpenMPでも最適化にプラスに作用するので
弊害がなければ付けておくといいよ、と奨められたことがある。
なくても良さそうだけど・・。
0574デフォルトの名無しさん
2009/08/22(土) 15:51:38そんな話があるんですね。だったら最初から最適化しとけよ、と思わなくもないですが。
ずっと疑問なんですけど、元質問者ってそもそも何がしたいんだろう。
Fortran の勉強または単に Lapack を使う必要があるという程度なら、gfortran でも使っていれば良い。
Lapack なんてディストリビューションの公式ビルド(?)もあるだろうから、準備には手間取らない。
Debian なら Synaptic でも起動して検索すれば良いし、CentOS なら yum かな。
それでも基本的な知識が欠けているように見えるけど、考え過ぎかな。PATH の話を読んだときは噴き
ました。こちらが立ち入る話ではないんですが、何となく迷走しているように見えたので。
0575デフォルトの名無しさん
2009/08/22(土) 19:06:12それってopenmp以外のオプションを何も付けてない場合じゃないの?
-fastや-O3などの普通の最適化オプションを付けている状態でopenmpオプションを足しても意味ないような
0576デフォルトの名無しさん
2009/08/23(日) 08:01:41どうだろうね。openmp 単独では最適化はデフォルトレベル以上はしないからどのみち -fast あたりと
いっしょに使う前提だろうけど。
0577デフォルトの名無しさん
2009/08/23(日) 08:04:41アドレスがらみのエラーが防げそう、とか
古い習慣のsave属性を仮定しないで処理する、とかがメリットなのではなかろうか。
0578デフォルトの名無しさん
2009/08/23(日) 09:35:37iomp5外したらlapackとか使わない簡単なソースはコンパイルできました!!!
が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。
>>574
今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
それぐらい自分で本見てプログラミングしろよって話なんですけど、
後々並列とかも使えるようにしたいのでmklを入れようとしたのです。
2週間ぐらい前に初めてvineインストールして、
環境変数とかも最近知ったので知識はまったくありませんorz
0579デフォルトの名無しさん
2009/08/23(日) 11:51:40「___tls_get_addr」でgoogle先生に聞いてみたらVine Linuxだとglibcが古いのでエラーになるらしい
ttp://biokids.org/?CCP4%2FAdvanced%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB
CentOS5では>>569のライブラリ指定で問題なくコンパイル/リンク出来ているので
Vineの使っているglibcの問題じゃないかな?
つーか、なんでVine?
特にVineを使う必要がなければIntelで動作確認してるディストリで試してみたら?
#CentOS使っててこんな事言うのも何だが(まあ一応RHEL互換ではあるし)
0580デフォルトの名無しさん
2009/08/23(日) 12:03:07あああぁぁぁああああFedoraいれてみます!!!!
みなさんありがとうございました!!!
0581デフォルトの名無しさん
2009/08/23(日) 12:14:51> が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。
エラー内容は分からんが設定が出来ていないか、コンパイル時の指定にミスがあるかのどちら
かだろう。
> >>574
> 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
> それぐらい自分で本見てプログラミングしろよって話なんですけど、
> 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。
だったら gfortran でいい。並列も出来る。MPI が使えることは確認済み。OpenMP は知らん。
使ってる PC に複数の CPU があるのなら並列で動かす努力に意味もあるが、マトモに Fortran
のコードを書けないうちから並列をやり始めても先に進めないまま時間が過ぎるだけのような
気がする。
知識も無いのに無理して intel を使う必要は無い。
ということで、自分でソース書けばよろし。あと Lapack のルーチンは処理内容に対して命名
規則があるので、それは自分で調べること。
しかし逆行列を求める程度のことで並列するヤツは居ないと思うが、そうでもない?>識者
0582デフォルトの名無しさん
2009/08/23(日) 14:25:29スパコンのLinpack競争を知らんのかw
0583デフォルトの名無しさん
2009/08/23(日) 15:17:54知りません。
並列については無知なので、だいぶイイカゲンなことを言っているとは思い
ます。でも3×3行列程度で並列というのはそれ自体がナンセンスな気はしま
す。3 が 10 でも 100 でも同様かと。100000 程度になれば意味はあるのか
もしれませんが。元質問者がどの程度の規模のことをしたいのかによって選
択肢も変わって来るでしょう。
そもそも Lapack って並列を意識して書かれてないと思いますが、そんなこ
とはないとか?
私は並列はやったことが無いですし、この先もやらないと思います。以前に
gfortran で MPI が動くことを確認したときも、リンクの仕方は私が調べて
から、「リンクの仕方は知らないけど、実行の仕方は知っている」コーハイ
君に簡単なプログラムで実行確認をしてもらっただけです。そのコーハイ君
はマトモなソースを書けな(ry
対象データを N 分割して、N 個の CPU に振り分け、個々の CPU で計算した
後に、それを1箇所にかき集めるというイメージしか無いです。間違ってる
かもしれませんが。
0584デフォルトの名無しさん
2009/08/23(日) 16:47:13問題は行列の性質。密行列なのか疎なのか、とか
0585デフォルトの名無しさん
2009/08/23(日) 17:24:37逆行列計算にこそ並列化の最適化が進んでいる。
MKLなんか使えばCPU数に比例した効果が得られる。密行列だが。
そういう意味で、質問者は一応理にかなっている。
逆行列計算は、普通線形方程式を解く形で求めるが、線型方程式はアメリカの分散型の
スパコンに非常に向いていて、自分に有利なようにLINPACKという線形方程式用のパッケージで
スパコンベンチマークが行われている。
当然、その部分へのアルゴリズム研究や最適化がもっとも進んでいる。
ちなみに、おおよそLAPACK=LINPACK+EISPACK。LINPACKは線形演算、EISPACKは固有値演算
ライブラリで、1970〜80年代の米英国家プロジェクトの産物。原型はFORTRAN66で書かれていて
NETLIB辺りに行けば今も拾えるはず。LAPACKは、それをFORTRAN77で統合したもの。
詳細は忘れたので間違ってるかもしれん(笑)LAPACKの前書きあたりを詳しく読んでくれ給へ。
これらの基底にBLASという基本サブルーチン集があって、この部分を書き換えることで
ハードウェアのアーキテクチャーの違いをうまく吸収して何十年も生き残っている。
0586デフォルトの名無しさん
2009/08/23(日) 17:29:090587デフォルトの名無しさん
2009/08/23(日) 18:16:070588デフォルトの名無しさん
2009/08/23(日) 18:46:54密より疎のほうが一般的だよな
0589デフォルトの名無しさん
2009/08/23(日) 19:24:46そのはず。
昔はベンダーがよくBLASだけアセンブラで最適化したのを配っていた。
ベクトル機時代はBLAS2あたりの行列*ベクトルが、今はBLAS3あたりの
行列*行列の最適化が肝らしい。
>>588
元々は密行列のみ。scaLapackとか、疎もじわじわやっている。
疎行列はベクトル機に向いていたので80年代以降すごく流行った。
数値計算のアルゴリズムも、ハードウェア・アーキテクチャに合わせて流行が変わる。
最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。
アメリカ人が必死になって分散メモリー・スパコン用のアルゴリズム開発をしている。
固有値問題も教科書的にはO(N^3)だが、並列機で密行列のO(N^2)のアルゴリズムが
見つかったとかいう話。詳しくは知らん(笑
0590589
2009/08/23(日) 19:35:34上記は、話半分嘘半分で読んでおいてくれ(笑)
0591デフォルトの名無しさん
2009/08/24(月) 09:54:36> 最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。
これってどんなメリットがあるの?
単純にメモリー消費の事考えると、無駄多すぎて話にならんし。
構造格子のFDMを例に取ると、隣接点が6だから、
マトリクスのサイズが100万だと、メモリー効率が16万倍くらい違う。
(本当はポインタやらあるけど、単純化すると)
それを帳消しにするだけのメリットというのがわからんのだけど。
0592デフォルトの名無しさん
2009/08/24(月) 22:19:00スピードつーものは考えんのか?
スパースったって色々あるだろが、お前の帯行列だけがスパースなのかよ。
つーか帯行列は帯行列で別のカテゴリになってるだろ。
あんた相当頭が固くて視野が狭いから、お刺身の上にタンポポを載せるような仕事のほうが向いてると思うよ。
0593デフォルトの名無しさん
2009/08/24(月) 22:37:06最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う
0594591
2009/08/25(火) 11:27:29> 密に展開して密行列のライブラリを呼んだほうが有利なことがある
の根拠は、
> 最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
> ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う
とういう話があるということか。なるほど。
ただ、これってかなり特殊なマトリクスに限定した話の気がするな。
物理シミュレーションの世界で出てくるスパース行列だと、
離散点の値を使って平衡方程式解くときには、微小領域近傍の値だけを使うので、
一行あたりの非ゼロ項の個数はせいぜい数十〜数百のオーダーになるのが普通。
大規模なスパース行列だと10倍どころじゃなく超スカスカになるんで、
上記の根拠をもとにスパースを密行列で置き換えるのは難しいと思う。
と書くと、また頭が固いとか視野が狭いとか言われてしまうかw
>>592
プライド傷つけてごめんねw
0595デフォルトの名無しさん
2009/08/26(水) 18:45:09プログラム1で出力した座標データを
プログラム2でもう一度読み込みたいのです。
データの受け渡しの際に、x,y,z のように一行に三つの数字が並んでしまっている状態なのですが、
1.プログラム1において出力する座標データの桁数をそろえて座標データファイルを作り、
2.プログラム2において座標データファイル内のx,y,zの3つの数字をそれぞれ関数に読み込みたい
と思っているのですがプログラム1のwrite文とread文をどのように書いてよいかが分からず困っています。
どなたか教えていただけますでしょか?
0596デフォルトの名無しさん
2009/08/27(木) 02:07:26write(unit=11,fmt='(3(x,f10.5))') x,y,z
とか、かな。fmt= はなくてもいい。
複数の連続する空白はひとつの区切りとみなされるから
読み込む側では書式指定は必要でないから
write(unit=11,fmt=*) x,y,z でも可。数字の11の部分は適当に自分で決める。
0597デフォルトの名無しさん
2009/08/27(木) 15:16:39さっそく試してみます。
0598デフォルトの名無しさん
2009/08/27(木) 17:08:14まぁそうだわな
> たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがある
は、せいぜい10^3以下のちっこいマトリクスにしか当てはまらんと思う
応用の人達にとってマトリクスソルバの開発・実装に時間なんて割きたくないし
数値計算の研究者には大いに頑張ってもらいたいね
0599デフォルトの名無しさん
2009/08/27(木) 18:37:260600デフォルトの名無しさん
2009/08/27(木) 18:55:350601デフォルトの名無しさん
2009/08/27(木) 22:38:150602名無しさん@そうだ選挙に行こう
2009/08/30(日) 16:16:28Cのqsortはvoidポインタやら関数ポインタやら使ってるからfortranではやはり無理なのでしょうか?
0603名無しさん@そうだ選挙に行こう
2009/08/30(日) 16:26:19http://slashdot.jp/~t-nissie/journal/450101
こんなんとか
0604デフォルトの名無しさん
2009/09/12(土) 21:29:22・
・
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
CALL DIST(N)
END IF
・
・
・
SUBROUTINE DIST(N)
・
・
だと普通に呼び出せるんですが、
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
CALL DIST(N,M)
END IF
・
・
SUBROUTINE DIST(N,M)
とすると「実引数の数は仮引数の数より多く出来ません」(callの行にエラー)と怒られます。
N,Mはそれぞれ暗黙の型宣言による整数で、念のためちゃんと宣言してみても同じエラーが出てコンパイルできません。
整数型2個で同じなはずだと思うんですが…
ちなみに呼び出す側も別のサブルーチンの一部で、どちらも多くのmoduleをuse文で使ってますが関係ないですよね?
今のところ仕方ないんで別にmodule文を作って変数を共有してますが、何か気持ち悪いので考えられる原因を教えて頂けますか?
0605デフォルトの名無しさん
2009/09/13(日) 01:08:16エラーメッセージを素直に解釈すると、サブルーチンの宣言で引数が1個しかないので
齟齬が生じていると言っている。
SUBROUTINE DISTの宣言の数行を貼ってもらえれば、なにか分かるかも。
0606デフォルトの名無しさん
2009/09/14(月) 16:21:33うーん。でも下の例ではN,Mの二つを取ってるんですが。
>>SUBROUTINE DISTの宣言の数行
というのはこのサブルーチンの中の変数とかの宣言部ということですか?
SUBROUTINE DIST(N,M)
use cell
use sample
use comp
use gas
DOUBLE PRECISION VEL(3),T,TROT,DBOLTZ
use文は単に変数の定義を行っているmodule文に対するもので、
呼び出し元でも同様にuse文で参照してます。
DOUBLE PRECISION...の部分は呼び出し元にはありません。
0607デフォルトの名無しさん
2009/09/15(火) 01:47:05わからんw
中間MODファイルが更新されてないとか、ありえなさげな事しか思いつかない。
まぁDIST2222とかありえ無そうな名前に変えて見てようすを見てみるとか。
0608デフォルトの名無しさん
2009/09/15(火) 08:38:02MODファイルの事は思ったな〜。念のため別なディレクトリでテストするとか・・・かな。あとは
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
CALL DIST(N,M)
END IF
を、
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) CALL DIST(N,M)
だけにするとか、
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
Iminashi=1
1374 continue
CALL DIST(N,M)
END IF
みたいに結果に影響しない行を一つ二つ添えてみるとか。う〜ん。
0609デフォルトの名無しさん
2009/09/16(水) 10:31:39>>608
ホンットすみません。DIST2222にしたら通りました。んで、OS再起動して元の名前にしても通りました。
なんかの理由で「中間MODファイルが更新されてない」になってたっぽいです。
プログラム上の問題じゃなかったですね…申し訳ない。
0610デフォルトの名無しさん
2009/09/18(金) 13:09:44LINUXでintelのコンパイラ11をインストールしたのですが、
ifort 実行ファイル
で命令すると、次のようなエラーが出てしまいます。
error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
ifort: error #10273: Fatal error in /opt/intel/bin/ia32/fortcom,
それぞれ指定されたファイルを見てもよくわからなかったので、
どうしたらコンパイルできるようになるか、ご教授おねがいいたします。
0611デフォルトの名無しさん
2009/09/18(金) 13:24:41ただLINUXと表現するのではなくて、
ディストリビューションとバージョンをさらすといいかもしれない。
0612610
2009/09/18(金) 13:27:340613デフォルトの名無しさん
2009/09/18(金) 13:41:00「intelコンパイラが想定しているc++の標準ライブラリより新しいものが入ってる」
に一票
どっかから, libstdc++.so.5を拾ってくるしかないと思われる
# これ以上は聞かないで, 犬のことはくわしく知らないw
0614デフォルトの名無しさん
2009/09/18(金) 13:55:39ttp://beken.cc.miyakonojo-nct.ac.jp/wp2/?p=1208 によると
> 私の環境で前もってインストールしておくべきだったものは、以下のパッケージです。
> どちらも[システム]>[システム管理]>[Synaptic パッケージ・マネージャ]でインストールしました。
>
> * g++
> * libstdc++5
>
> libstdc++6は既にインストールされていましたが、libstdc++5はインストールされていませんでした。
> またlibstdc++5をインストールしなくてもifort自体はインストールできちゃいますが、
> プログラムのコンパイルの時に必要になります。インストールしておきましょう。
0615デフォルトの名無しさん
2009/09/18(金) 14:01:50こういう数値計算に使うときは少し古めのにするか、もう少し安定志向な
ディストリにするのが良いと思う。豆知識な。
0616デフォルトの名無しさん
2009/09/24(木) 00:31:120617デフォルトの名無しさん
2009/09/25(金) 00:21:580618デフォルトの名無しさん
2009/09/26(土) 02:36:35したいこと:モジュールに関数オブジェクトを保持させたい。
例えば、モジュールに変数3をセットし後に取得するプログラム
module Test
implicit none
integer,private::a
contains
subroutine set(x)
integer,intent(in)::x
a = x
end subroutine
integer function get()
integer::get
get = a
end function
end module
program main
use Test
implicit none
call set(3)
print *,get()
end program
というものを書くことが出来ます。
同じように、モジュールに関数を保持させることは可能でしょうか?
0619デフォルトの名無しさん
2009/09/26(土) 02:43:36subroutine proceed(f,x,y,step)
interface
double precision function f(x)
double precision::x
end function
end interface
...
end subroutine
と引用仕様記述を書くのではなく、例えばtarget_functionという変数名
に保持してしまって、後は
target_function(x)
というのを呼び出すだけ、みたいなのにしたいのです。
0620デフォルトの名無しさん
2009/09/26(土) 19:24:10integer, private, SAVE :: a
にすればおk?
save無くても大概大丈夫だと思うが。
0621デフォルトの名無しさん
2009/09/26(土) 19:50:23値じゃなくて、できれば関数保持する方法が。
>>618は何したいのかわかりやすくする為の例だったんですけど、
我ながら読むと分かりにくい。
似たような感じで、関数を保持させたいんです。
0622デフォルトの名無しさん
2009/09/26(土) 22:21:48PROCEDURE POINTER で駄目かな?
インターフェースは要るが。
MODULE m_unko
IMPLICIT NONE
INTERFACE
REAL FUNCTION f1(x)
REAL, INTENT(IN) :: x
END FUNCTION f1
END INTERFACE
PROCEDURE(f1), POINTER :: unko
REAL, PARAMETER :: pi = 4.0 * ATAN(1.0)
END MODULE m_unko
!
PROGRAM omeko
USE m_unko
IMPLICIT NONE
unko => SIN
PRINT *, unko(pi)
unko => COS
PRINT *, unko(pi)
STOP
END PROGRAM omeko
0623デフォルトの名無しさん
2009/09/26(土) 22:59:4590以降の機能ですかね?
0624デフォルトの名無しさん
2009/09/26(土) 23:51:06Fortran2003 の機能です。
副プログラムのインターフェースを、一括化できたりします。
インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。
type っぽいかんじで。
0625デフォルトの名無しさん
2009/09/27(日) 00:28:40なるほど。ありがとうございます!
0626デフォルトの名無しさん
2009/09/27(日) 05:28:41ありがとうございます。
でも、gfortranの4.2じゃできないっぽいですね。
v4.3以降でサポートなので、v4.3入れてやってみます!
0627デフォルトの名無しさん
2009/09/27(日) 07:50:230628デフォルトの名無しさん
2009/09/28(月) 07:04:01implicit none
do while (.true.)
write(*,*) '627 ありがとう'
end do
end program orei
0629デフォルトの名無しさん
2009/10/03(土) 17:46:130630デフォルトの名無しさん
2009/10/03(土) 17:56:000631デフォルトの名無しさん
2009/10/03(土) 18:18:32あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど
0632デフォルトの名無しさん
2009/10/03(土) 18:18:59やっぱ
プログラミングの入門者には迷著かもしれないが
0633デフォルトの名無しさん
2009/10/03(土) 19:00:12そうは言うがな、大佐。
F90以降は入門書どころか日本語の書籍自体少ないし・・・
0634デフォルトの名無しさん
2009/10/03(土) 19:35:16記憶無いんだが。
90 といえば bit の別冊であったけど、あれも絶版だよね。
単行本にしたらいいのに。あとソフトバンクからも90の本
は大昔に出てたそうだな。どっちも持ってないけど。
0635デフォルトの名無しさん
2009/10/04(日) 02:12:27Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい?
入門書とはいえない気もするが。
0636デフォルトの名無しさん
2009/10/04(日) 19:45:15templateとかクラスがなくて心細いよ
0637デフォルトの名無しさん
2009/10/04(日) 20:23:56物理系?
0638デフォルトの名無しさん
2009/10/04(日) 20:38:020639デフォルトの名無しさん
2009/10/04(日) 21:56:45しかもFortran77
過去の資産有りすぎ
Fortranのサブルーチンは変数が参照渡しだから
他の言語に移植するときめんどい
0640デフォルトの名無しさん
2009/10/04(日) 23:59:4990/95とかだと膜ごしに触っているような感触と言うか。
でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。
2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで
微妙な感じがする。
0641デフォルトの名無しさん
2009/10/05(月) 00:07:32>INTENTとかをガチガチ
計算用の言語としては、この辺で十分な気がする。
十分具体的で十分美しい。かつ十分便利。
もう95位で仕様凍結してくんないかな・・・
0642デフォルトの名無しさん
2009/10/05(月) 02:24:23> もう95位で仕様凍結してくんないかな・・・
同意。色々と弄られるとついて行けなくなりそう。個人的には
Fortran90 で十分と思ってしまうのだが、これは少数派かも。
0643デフォルトの名無しさん
2009/10/05(月) 08:27:30interface 文で呼び出す側で心つもりも教え
pure 属性をつけてインラインしやすくしてあげる
だけど固定書式をつらぬくのが漢!
うそだけど。
固定書式に目が慣れてるといまさら自由書式にしにくいのよね。
右側7文字が空いてないとそわそわしてしまう。
0644デフォルトの名無しさん
2009/10/06(火) 10:09:52■ このスレッドは過去ログ倉庫に格納されています