[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 10/07 02:37 / Filesize : 345 KB / Number-of Response : 920
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その4



1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)その3
pc11.2ch.net/test/read.cgi/tech/1196384126/

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/


●関連スレ
FORTRAN W
pc11.2ch.net/test/read.cgi/tech/1163319215/


545 名前:デフォルトの名無しさん [2009/08/21(金) 14:42:34 ]
export MKLROOT="/opt/intel/mkl/10.2.1.017"

if [ -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につけたしました。

546 名前:541 mailto:sage [2009/08/21(金) 14:48:44 ]
>>544
> >>541
> lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
> 自前というのはどういう意味ですか?

公式サイトからソースを拾って来て、自分で make すること。私はそれで lapack を入れてる。
特に何もしなければ lapack.a、blas.a というファイルが出来る。で、これをリンクすると。
lapack95 はやったことがない。



と、ここまで書いてぐぐってみた。

basewall.kuciv.kyoto-u.ac.jp/dokuwiki/doku.php?id=ifort

なんかどう?

547 名前:デフォルトの名無しさん [2009/08/21(金) 14:57:32 ]
>>546
ソースは元々あって、それを自分でmakeしました。
リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?

そのホームページも見てやってみたんですが・・・
もうちょっとやってみます!!

548 名前:541 mailto:sage [2009/08/21(金) 15:11:42 ]
>>547
> >>546
> ソースは元々あって、それを自分でmakeしました。
> リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?

そです。

それはそうと

echo $INCLUDE

の結果って、問題ないですか?設定さえチャンと出来ていれば、後はマニュアル通りにしたら
出来るはずなんですけどね。そのマニュアルってフリーで転がってんのかな。

エラーの中身見たら設定が出来てないようにも見えるけど…気のせいかな?


>>541
> これは明らかに可笑しくないか?

この部分、実は問題無いみたいですね。でもこれ、私にはとっても変態な仕様にしか見えない。
90 は余り使わないから、そう思うのかもしれない。そろそろ 90 もリハビリした方が良さそう。
再帰を書けるのは知っているけど書き方知らないし。


探せば他にも出て来ると思いますヨ。> 纏めページ

549 名前:デフォルトの名無しさん [2009/08/21(金) 15:30:57 ]
echo $INCLUDEの結果は /opt/intel/mkl/10.2.1.017/include
これで大丈夫ですか?

www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/SGIAltix/Doc/mkl10/doc/userguide.pdf
マニュアルこれです。4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。

550 名前:541 mailto:sage [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 で指定しているディレクトリになる。


(続く)

551 名前:541 mailto:sage [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 に読み替えればいいのでは?最初の . は必要ですヨ。


552 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 16:23:33 ]
www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html

この辺も何かの参考にはなるかも?

というか気になってたんですけど、身近に質問できる人は居ないんでしょうか?
学生だと思うんだけどなぁ(何となく)。

## 2ch で聞くなよ、とかいうことではありません。念のため。

553 名前:デフォルトの名無しさん [2009/08/21(金) 16:51:46 ]
>>550
-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
何がいけないのか・・・



554 名前:541 mailto:sage [2009/08/21(金) 19:18:08 ]
>>553
> >>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 をリンクするしろ、と指定しています。

555 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:38:19 ]
スレ違いで恐縮ですが、どのライブラリにどのサブルーチンや関数が入っているか調べる方法ってありますか?

556 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:45:12 ]
>>545
> /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時にディレクトリ構成や必要なライブラリが変わることがあるんでヤヤコシイわ。

557 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:52:17 ]
>>555
こんなんではダメですか?

% 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_

558 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:57:51 ]
>>557
ありがとうございます!

559 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 20:06:14 ]
>>556
勉強になります。ウチの Debian は1年ほど前に急に起動しなくなってから放置してますが。


>>558
それで問題なかったのなら何よりです。

560 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 20:28:18 ]
使わないライブラリってリンクしたらまずいですか?
サイズが大きくなって多少遅くなる?

561 名前:デフォルトの名無しさん [2009/08/21(金) 21:27:53 ]
>>554
丁寧に説明していただきありがとうございます。
やってみましたがなぜかエラーですwwwwwwwwwwwwww

>>556
環境変数の設定はできてるみたいです。ありがとうございます。


みなさんありがとうございました。もうちょいがんばってみようと思います。

562 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 22:38:05 ]
確認したいんだけど、せいぜい Hello, world. を表示する程度のソースは
無事にコンパイルできる?ここで転けてたら話にならない。


563 名前:デフォルトの名無しさん [2009/08/21(金) 23:22:39 ]
>>562
簡単なソースのコンパイルはできます。
mklとリンクしてコンパイルすると、.aと.soファイル内に、
定義されてないサブルーチンを使用しようとしていますとか警告出ます。。



564 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 23:53:13 ]
>>563

> mklとリンクしてコンパイルすると、.aと.soファイル内に、
> 定義されてないサブルーチンを使用しようとしていますとか警告出ます。。

これは簡単なソースをコンパイルするときに出るの?簡単なソース(Hello, World. 程度)と
ライブラリをリンクするときに出るのであれば設定が可笑しいと思う。それかコンパイル時
のコマンドの書き方か。両方の可能性もあるけど。

普通は、リンクするライブラリの中にある関数を使っていなくても、そんなことにはならな
い。例えば sin( 1.00D0 ) を計算して表示するだけのソースと FFT のライブラリをリンクし
ても文句は言われない。コンパイラはスルーすれば済むから。呼んでもないものをくっ付け
る必要は無い。

565 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 00:00:54 ]
MKLのUser’s Guideに環境別に必要なライブラリファイルと使い方の例が載ってるから
その通りにやればコンパイル/リンクできるはずだが。

566 名前:デフォルトの名無しさん [2009/08/22(土) 10:01:37 ]
>>564

/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
その通りにやってるつもりなんですが・・・

567 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 10:19:38 ]
>>566
コンパイル時のコマンドを晒して。

あとリンクの順番を間違えるとエラーになることがある。要するに
ライブラリ A と B をリンクするとき A が B にある関数を呼んでい
るなら、例えば A の中にある関数 funcA がその中で B の中にある
関数 funcB を呼んでいるとき

-lA -lB

という順番でリンクしないと転ける。

リンクするときは .a だけで良いはず。あとは勝手にやるはずなん
だけどライブラリに依るかもしれんので何も。


マニュアル通りにしていると言う割には勝手なことをしている気が
する。

568 名前:デフォルトの名無しさん [2009/08/22(土) 10:25:02 ]
>>567
ifort 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フォルダにいれていいんでしょうか?

569 名前:デフォルトの名無しさん [2009/08/22(土) 10:44:08 ]
>>567
ifort 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'

570 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 10:44:26 ]
>>568
> >>567
> ifort test.f90
(長いので中略)
> -Wl,--end-group -liomp5 -lpthread

このようにしなさいという説明は何処にあるのでしょう。


> が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?

ということはビルドしていないということでは?やり方はマニュアルに書いているはず。因みに無いという
根拠はなんですか?それと

find /opt/intel -name "libmkl_*.a"

の実行結果は?

www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html

にも書いていますが、LAPACK95 はラッパーのようなので、単体では動かないと思います。勝手に持って
来るったって何処から持って来るのだろう。そんなことしても意味ないと思うケド。あと

> -lmkl_lapack95 -lmkl_lapack -Wl,--start-group

これって BLAS はリンクしてないみたいだけど、しなくて良いの?

571 名前:デフォルトの名無しさん [2009/08/22(土) 10:52:24 ]
>>570
>このようにしなさいという説明は何処にあるのでしょう。
ユーザーズガイドのexampleにありました。

>find /opt/intel -name "libmkl_*.a"
lapack95.aはあります。.soはありません。逆にlapac.soはあって.aはありません。
lapack95のビルドはしました。が、.soはないです;

BLASリンクしてもダメでした;

572 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 11:12:20 ]
>>569
> これでコンパイルしようとすると以下のエラーが出ます;
>
> /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'

iomp5 って OpenMP 用のものみたいだから、並列でもしない限りイラネ。と思うけど、どうなんだろ?
ということで、外してやってみて。

取り敢えずオプション付けとけって感じにしか見えない。それぞれのオプションの意味を調べ直した方が
早い気がして来た。どっかに日本語版も落ちてたし。場所は忘れた。

573 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 11:29:08 ]
横からだけど、なんでも
OpenMPのオプションを付けるといくつかのオプションを呼び出すことになって
非OpenMPでも最適化にプラスに作用するので
弊害がなければ付けておくといいよ、と奨められたことがある。
なくても良さそうだけど・・。



574 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:51:38 ]
>>573
そんな話があるんですね。だったら最初から最適化しとけよ、と思わなくもないですが。



ずっと疑問なんですけど、元質問者ってそもそも何がしたいんだろう。

Fortran の勉強または単に Lapack を使う必要があるという程度なら、gfortran でも使っていれば良い。
Lapack なんてディストリビューションの公式ビルド(?)もあるだろうから、準備には手間取らない。
Debian なら Synaptic でも起動して検索すれば良いし、CentOS なら yum かな。

それでも基本的な知識が欠けているように見えるけど、考え過ぎかな。PATH の話を読んだときは噴き
ました。こちらが立ち入る話ではないんですが、何となく迷走しているように見えたので。

575 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:06:12 ]
>>573
それってopenmp以外のオプションを何も付けてない場合じゃないの?
-fastや-O3などの普通の最適化オプションを付けている状態でopenmpオプションを足しても意味ないような

576 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 08:01:41 ]
openmp つけると明示的に抑制しなければ auto やら (p)thread やらほかのも呼ぶはずけど、
どうだろうね。openmp 単独では最適化はデフォルトレベル以上はしないからどのみち -fast あたりと
いっしょに使う前提だろうけど。

577 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 08:04:41 ]
たぶん最適化されて速くなる、というよりは
アドレスがらみのエラーが防げそう、とか
古い習慣のsave属性を仮定しないで処理する、とかがメリットなのではなかろうか。

578 名前:デフォルトの名無しさん [2009/08/23(日) 09:35:37 ]
>>572
iomp5外したらlapackとか使わない簡単なソースはコンパイルできました!!!

が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。

>>574
今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
それぐらい自分で本見てプログラミングしろよって話なんですけど、
後々並列とかも使えるようにしたいのでmklを入れようとしたのです。

2週間ぐらい前に初めてvineインストールして、
環境変数とかも最近知ったので知識はまったくありませんorz

579 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:51:40 ]
>>578
「___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互換ではあるし)

580 名前:デフォルトの名無しさん [2009/08/23(日) 12:03:07 ]
>>579
あああぁぁぁああああFedoraいれてみます!!!!

みなさんありがとうございました!!!

581 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 12:14:51 ]
>>578

> が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。

エラー内容は分からんが設定が出来ていないか、コンパイル時の指定にミスがあるかのどちら
かだろう。


> >>574
> 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
> それぐらい自分で本見てプログラミングしろよって話なんですけど、
> 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。

だったら gfortran でいい。並列も出来る。MPI が使えることは確認済み。OpenMP は知らん。
使ってる PC に複数の CPU があるのなら並列で動かす努力に意味もあるが、マトモに Fortran
のコードを書けないうちから並列をやり始めても先に進めないまま時間が過ぎるだけのような
気がする。

知識も無いのに無理して intel を使う必要は無い。

ということで、自分でソース書けばよろし。あと Lapack のルーチンは処理内容に対して命名
規則があるので、それは自分で調べること。


しかし逆行列を求める程度のことで並列するヤツは居ないと思うが、そうでもない?>識者

582 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 14:25:29 ]
>>581
スパコンのLinpack競争を知らんのかw

583 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:17:54 ]
>>582
知りません。

並列については無知なので、だいぶイイカゲンなことを言っているとは思い
ます。でも3×3行列程度で並列というのはそれ自体がナンセンスな気はしま
す。3 が 10 でも 100 でも同様かと。100000 程度になれば意味はあるのか
もしれませんが。元質問者がどの程度の規模のことをしたいのかによって選
択肢も変わって来るでしょう。

そもそも Lapack って並列を意識して書かれてないと思いますが、そんなこ
とはないとか?


私は並列はやったことが無いですし、この先もやらないと思います。以前に
gfortran で MPI が動くことを確認したときも、リンクの仕方は私が調べて
から、「リンクの仕方は知らないけど、実行の仕方は知っている」コーハイ
君に簡単なプログラムで実行確認をしてもらっただけです。そのコーハイ君
はマトモなソースを書けな(ry

対象データを N 分割して、N 個の CPU に振り分け、個々の CPU で計算した
後に、それを1箇所にかき集めるというイメージしか無いです。間違ってる
かもしれませんが。



584 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 16:47:13 ]
難しい話じゃなくて、サイズがでかけりゃ並列化するでしょ普通
問題は行列の性質。密行列なのか疎なのか、とか

585 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:24:37 ]
>>583
逆行列計算にこそ並列化の最適化が進んでいる。
MKLなんか使えばCPU数に比例した効果が得られる。密行列だが。
そういう意味で、質問者は一応理にかなっている。

逆行列計算は、普通線形方程式を解く形で求めるが、線型方程式はアメリカの分散型の
スパコンに非常に向いていて、自分に有利なようにLINPACKという線形方程式用のパッケージで
スパコンベンチマークが行われている。
当然、その部分へのアルゴリズム研究や最適化がもっとも進んでいる。

ちなみに、おおよそLAPACK=LINPACK+EISPACK。LINPACKは線形演算、EISPACKは固有値演算
ライブラリで、1970〜80年代の米英国家プロジェクトの産物。原型はFORTRAN66で書かれていて
NETLIB辺りに行けば今も拾えるはず。LAPACKは、それをFORTRAN77で統合したもの。
詳細は忘れたので間違ってるかもしれん(笑)LAPACKの前書きあたりを詳しく読んでくれ給へ。

これらの基底にBLASという基本サブルーチン集があって、この部分を書き換えることで
ハードウェアのアーキテクチャーの違いをうまく吸収して何十年も生き残っている。

586 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:29:09 ]
なるほどそういう背景だったのか

587 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:16:07 ]
GotoBLAS って、そのBLASを後藤さんが最適化したものなの?

588 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:46:54 ]
LAPACKって疎行列も対応してるの?
密より疎のほうが一般的だよな

589 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 19:24:46 ]
>>587
そのはず。
昔はベンダーがよくBLASだけアセンブラで最適化したのを配っていた。
ベクトル機時代はBLAS2あたりの行列*ベクトルが、今はBLAS3あたりの
行列*行列の最適化が肝らしい。

>>588
元々は密行列のみ。scaLapackとか、疎もじわじわやっている。
疎行列はベクトル機に向いていたので80年代以降すごく流行った。
数値計算のアルゴリズムも、ハードウェア・アーキテクチャに合わせて流行が変わる。

最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。

アメリカ人が必死になって分散メモリー・スパコン用のアルゴリズム開発をしている。
固有値問題も教科書的にはO(N^3)だが、並列機で密行列のO(N^2)のアルゴリズムが
見つかったとかいう話。詳しくは知らん(笑

590 名前:589 mailto:sage [2009/08/23(日) 19:35:34 ]
なぐり書いたがscaLapackは疎じゃなかったな。
上記は、話半分嘘半分で読んでおいてくれ(笑)

591 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 09:54:36 ]
>>589

> 最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。

これってどんなメリットがあるの?
単純にメモリー消費の事考えると、無駄多すぎて話にならんし。

構造格子のFDMを例に取ると、隣接点が6だから、
マトリクスのサイズが100万だと、メモリー効率が16万倍くらい違う。
(本当はポインタやらあるけど、単純化すると)
それを帳消しにするだけのメリットというのがわからんのだけど。

592 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:19:00 ]
>>591
スピードつーものは考えんのか?
スパースったって色々あるだろが、お前の帯行列だけがスパースなのかよ。
つーか帯行列は帯行列で別のカテゴリになってるだろ。

あんた相当頭が固くて視野が狭いから、お刺身の上にタンポポを載せるような仕事のほうが向いてると思うよ。

593 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:37:06 ]
正しいことを言っているのに書き方一つで尊敬されなくなる好例

最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う



594 名前:591 mailto:sage [2009/08/25(火) 11:27:29 ]
> たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがある

の根拠は、

> 最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
> ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う

とういう話があるということか。なるほど。
ただ、これってかなり特殊なマトリクスに限定した話の気がするな。

物理シミュレーションの世界で出てくるスパース行列だと、
離散点の値を使って平衡方程式解くときには、微小領域近傍の値だけを使うので、
一行あたりの非ゼロ項の個数はせいぜい数十〜数百のオーダーになるのが普通。
大規模なスパース行列だと10倍どころじゃなく超スカスカになるんで、
上記の根拠をもとにスパースを密行列で置き換えるのは難しいと思う。

と書くと、また頭が固いとか視野が狭いとか言われてしまうかw
>>592
プライド傷つけてごめんねw

595 名前:デフォルトの名無しさん [2009/08/26(水) 18:45:09 ]
大学の研究室でfortranを使い始めたんですけど、
プログラム1で出力した座標データを
プログラム2でもう一度読み込みたいのです。

データの受け渡しの際に、x,y,z のように一行に三つの数字が並んでしまっている状態なのですが、
1.プログラム1において出力する座標データの桁数をそろえて座標データファイルを作り、
2.プログラム2において座標データファイル内のx,y,zの3つの数字をそれぞれ関数に読み込みたい
と思っているのですがプログラム1のwrite文とread文をどのように書いてよいかが分からず困っています。

どなたか教えていただけますでしょか?

596 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 02:07:26 ]
read(unit=11,fmt='(3(x,f10.5))') x,y,z
write(unit=11,fmt='(3(x,f10.5))') x,y,z
とか、かな。fmt= はなくてもいい。
複数の連続する空白はひとつの区切りとみなされるから
読み込む側では書式指定は必要でないから
write(unit=11,fmt=*) x,y,z でも可。数字の11の部分は適当に自分で決める。

597 名前:デフォルトの名無しさん [2009/08/27(木) 15:16:39 ]
>>596さんありがとうございます!
さっそく試してみます。

598 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 17:08:14 ]
>>594
まぁそうだわな

> たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがある

は、せいぜい10^3以下のちっこいマトリクスにしか当てはまらんと思う

応用の人達にとってマトリクスソルバの開発・実装に時間なんて割きたくないし
数値計算の研究者には大いに頑張ってもらいたいね

599 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 18:37:26 ]
Lapack スレとかあったらどんな具合に荒れるんだろうなどと考えてしまった。

600 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 18:55:35 ]
荒れてるうちに入らんだろこんなの

601 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:38:15 ]
CLAPACKのスレならシミュレーション板にあるw

602 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 16:16:28 ]
fortran 90/95にはCのqsortのような汎用ソート関数は無いのでしょうか?
Cのqsortはvoidポインタやら関数ポインタやら使ってるからfortranではやはり無理なのでしょうか?

603 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 16:26:19 ]
>>602
slashdot.jp/~t-nissie/journal/450101

こんなんとか



604 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 21:29:22 ]
subroutineを呼び出すときに、


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文を作って変数を共有してますが、何か気持ち悪いので考えられる原因を教えて頂けますか?

605 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 01:08:16 ]
>>604
エラーメッセージを素直に解釈すると、サブルーチンの宣言で引数が1個しかないので
齟齬が生じていると言っている。

SUBROUTINE DISTの宣言の数行を貼ってもらえれば、なにか分かるかも。

606 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 16:21:33 ]
>>605
うーん。でも下の例では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...の部分は呼び出し元にはありません。

607 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 01:47:05 ]
>>606
わからんw

中間MODファイルが更新されてないとか、ありえなさげな事しか思いつかない。
まぁDIST2222とかありえ無そうな名前に変えて見てようすを見てみるとか。




608 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 08:38:02 ]
>>607
MODファイルの事は思ったな〜。念のため別なディレクトリでテストするとか・・・かな。あとは
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
みたいに結果に影響しない行を一つ二つ添えてみるとか。う〜ん。

609 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 10:31:39 ]
>>607
>>608
ホンットすみません。DIST2222にしたら通りました。んで、OS再起動して元の名前にしても通りました。
なんかの理由で「中間MODファイルが更新されてない」になってたっぽいです。
プログラム上の問題じゃなかったですね…申し訳ない。

610 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:09:44 ]
初心者ですみませんが質問させてください。

LINUXで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,

それぞれ指定されたファイルを見てもよくわからなかったので、
どうしたらコンパイルできるようになるか、ご教授おねがいいたします。


611 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:24:41 ]
>>610
ただLINUXと表現するのではなくて、
ディストリビューションとバージョンをさらすといいかもしれない。


612 名前:610 mailto:sage [2009/09/18(金) 13:27:34 ]
ubuntu 9.04 です。お願いします。

613 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:41:00 ]
>>610
「intelコンパイラが想定しているc++の標準ライブラリより新しいものが入ってる」
に一票
どっかから, libstdc++.so.5を拾ってくるしかないと思われる

# これ以上は聞かないで, 犬のことはくわしく知らないw




614 名前:デフォルトの名無しさん [2009/09/18(金) 13:55:39 ]
>>610
ttp://beken.cc.miyakonojo-nct.ac.jp/wp2/?p=1208 によると
> 私の環境で前もってインストールしておくべきだったものは、以下のパッケージです。
> どちらも[システム]>[システム管理]>[Synaptic パッケージ・マネージャ]でインストールしました。
>
> * g++
> * libstdc++5
>
> libstdc++6は既にインストールされていましたが、libstdc++5はインストールされていませんでした。
> またlibstdc++5をインストールしなくてもifort自体はインストールできちゃいますが、
> プログラムのコンパイルの時に必要になります。インストールしておきましょう。

615 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 14:01:50 ]
ubuntuとかfedoraとかは新しいのを積極的に取り入れるタイプだから、
こういう数値計算に使うときは少し古めのにするか、もう少し安定志向な
ディストリにするのが良いと思う。豆知識な。

616 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 00:31:12 ]
ifort 11.1、error #5082: 構文エラー やっと直った。

617 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 00:21:58 ]
黒カエラーwwww



618 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 02:36:35 ]
処理系:gfortran v4.2
したいこと:モジュールに関数オブジェクトを保持させたい。
例えば、モジュールに変数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
というものを書くことが出来ます。

同じように、モジュールに関数を保持させることは可能でしょうか?


619 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 02:43:36 ]
オイラー法のプログラムを書こうと思っているのですが、関数渡しで
subroutine 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)
というのを呼び出すだけ、みたいなのにしたいのです。

620 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 19:24:10 ]
>>618
integer, private, SAVE :: a

にすればおk?
save無くても大概大丈夫だと思うが。


621 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 19:50:23 ]
>>620
値じゃなくて、できれば関数保持する方法が。
>>618は何したいのかわかりやすくする為の例だったんですけど、
我ながら読むと分かりにくい。

似たような感じで、関数を保持させたいんです。

622 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:21:48 ]
>>621
PROCEDURE 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

623 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:59:45 ]
横からですいませんが、PROCEDUREって何ですか?
90以降の機能ですかね?



624 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 23:51:06 ]
>>623
Fortran2003 の機能です。

副プログラムのインターフェースを、一括化できたりします。
インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。
type っぽいかんじで。


625 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 00:28:40 ]
>>624
なるほど。ありがとうございます!

626 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 05:28:41 ]
>>622
ありがとうございます。
でも、gfortranの4.2じゃできないっぽいですね。
v4.3以降でサポートなので、v4.3入れてやってみます!

627 名前:デフォルトの名無しさん [2009/09/27(日) 07:50:23 ]
お礼はいりませんよ。

628 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 07:04:01 ]
program orei
implicit none
do while (.true.)
 write(*,*) '627 ありがとう'
end do
end program orei

629 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:46:13 ]
Fortranの名著的な入門書ってありますか?


630 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:56:00 ]
森口繁一のFORTRAN入門?

631 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 18:18:32 ]
それって77じゃない?
あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど

632 名前:デフォルトの名無しさん [2009/10/03(土) 18:18:59 ]
浦昭二編のFORTRAN77入門改訂版だろう
やっぱ

プログラミングの入門者には迷著かもしれないが

633 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:00:12 ]
>>631
そうは言うがな、大佐。
F90以降は入門書どころか日本語の書籍自体少ないし・・・



634 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:35:16 ]
倍精度の説明をキッチリやってる本ってあったっけ?見た
記憶無いんだが。

90 といえば bit の別冊であったけど、あれも絶版だよね。
単行本にしたらいいのに。あとソフトバンクからも90の本
は大昔に出てたそうだな。どっちも持ってないけど。

635 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 02:12:27 ]
>>634
Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい?
入門書とはいえない気もするが。


636 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 19:45:15 ]
C++は数年使ってるんだが大学で初めてFortran使わされることになった
templateとかクラスがなくて心細いよ

637 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:23:56 ]
まだFortranを使わせる所もあるんだ。
物理系?

638 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:38:02 ]
うん物理

639 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 21:56:45 ]
分野にもよるけど地球物理系もFortranがバリバリ現役
しかもFortran77
過去の資産有りすぎ
Fortranのサブルーチンは変数が参照渡しだから
他の言語に移植するときめんどい

640 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 23:59:49 ]
77はダイレクトに変数とかに触っている気がして気持ちいい。
90/95とかだと膜ごしに触っているような感触と言うか。
でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。
2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで
微妙な感じがする。


641 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:07:32 ]
>>640
>INTENTとかをガチガチ

計算用の言語としては、この辺で十分な気がする。
十分具体的で十分美しい。かつ十分便利。

もう95位で仕様凍結してくんないかな・・・


642 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 02:24:23 ]
>>641
> もう95位で仕様凍結してくんないかな・・・

同意。色々と弄られるとついて行けなくなりそう。個人的には
Fortran90 で十分と思ってしまうのだが、これは少数派かも。

643 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 08:27:30 ]
intent の in out で変数値書き換えチェック
interface 文で呼び出す側で心つもりも教え
pure 属性をつけてインラインしやすくしてあげる
だけど固定書式をつらぬくのが漢!

うそだけど。
固定書式に目が慣れてるといまさら自由書式にしにくいのよね。
右側7文字が空いてないとそわそわしてしまう。



644 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 10:09:52 ]
左側?

645 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 16:19:47 ]
ひとつのモジュールのなかにオーバーロード?用のinterfaceと実装をまとめて記述したいんですがどう書いたらいいんでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<345KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef