intel compiler for Linux
■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin
01/11/29 17:53ID:5k7yf0aiintel 社の Web ページ
URL:<http://developer.intel.com/software/products/eval/>
の、"Non-Commercial Unsupported Software(非商用、サポート無し)" から、
RedHat系Linux 6.2 または 7.1 に対応した IA-32 や IA-64向きの
最適化C++,Fortran9x用のコンパイラ(version 5.0.1) が無料で
ダウンロードできるようになっています。
(詳しいライセンス条件は、ダウンロード時に表示される文書を
参照してください。)
intel 自身が作ってますので、インテル系のCPUの資源を活用できる
実行ファイルが生成されるます。(AMD の Athlon も Pentium III と
みなしてコンパイルオプションを選べばMMX機能などを使うことが可能です。)
以下は、「無料永続版」を入手した後で、それを実際に使えるようにする
ための設定方法の記述です。
C++ と fortran9x を両方ともインストールする例を書いていますが、
どちらかだけしか必要ない場合は、片方を省略することができます。
例は RedHat6.2 系統向けになっていますが、7.x 向けの場合でも大体同様です。
(Web ページからダウンロードしてくるファイルが違うだけです。)
ダウンロードする際に入力したメールアドレスにインストール時に必要となる
ライセンスキー情報が送られてきます。
0360login:Penguin
02/11/16 11:46ID:p4ZGg3L2行列計算で両者の速度体感の差を経験された方がおありでしたら、教えて下さい。
また、Linux版とWindows版(Win2kで使用予定)の速度体感に大きな差はみられる
でしょうか?
スレ違いですが、プログラム技術@2ch掲示板に行っても「そんなスレありません」
でしたので。
0361login:Penguin
02/11/16 15:41ID:5m6xZ1gP試用版あるから使ってみれ
0362Galois
02/11/16 22:55ID:O0ALkNUjシミュレーションをしています。
P4, linux redhat7.1で,
(1)ifc -O3 -tpp7 -xW xxxxxx.f90
(2)ifc -O3 -tpp7 xxxxxx.f90
(3)ifc -O3 -tpp6 xxxxxx.f90
で生成したプログラムの実行結果ですが,(1)は他の2つと異なります。
どちらが正しいか,(1)が間違っているとすればどうしたらよいか
どなたか教えてください。いくつかのプログラムで試しましたが
全て以上述べた結果になります。特にあるプログラムではその違いがあまりに大きく
(1)が不具合を起こしているような気もしますが,原因が不明です。
0363login:Penguin
02/11/17 00:25ID:wvVtn5jgifc -O0 xxxxxx.f90
として出てきた答えがまず正しい。g77とも比べてみれば?
最適化のため、計算の順番を入れ替わったりして、答えが変わる
ということがあり得ます。
0364login:Penguin
02/11/17 01:45ID:roKdiGN4HTを有効に使える気がする。ひとつのスレッドを、メモリーのアクセス
パターンに沿って先行させてページロードをさせたりメモリーをキャッシュから
取り込む作業に割り当てる。すると、もうひとつのスレッドが演算に必要な
データが丁度メモリ内にあるいはキャッシュ内に用意が済んでいるという、
据え膳状態になるようにできるだろう。
0365crazy_u
02/11/17 02:09ID:q3FHpQqg最適化レベルを最高にすると計算が壊れることがあります.(コンパイラのバグ)
まず、>>363の指摘を行ってみることです.
その上で,計算が壊れているサブルーチンをみつけて
1.そのサブルーチンだけ最適化レベルを下げる.
2.コンパイラが正しく読解可能なように明快なプログラムにする.
3.コンパイラが正しく読解可能なようにサブルーチンを更に分割する.(1つのファイルになっている場合は-ipオプションはつけない.)
のいずれかを試行してみるとよいと思います.'2', '3'は試行錯誤的になりますが全体のパフォーマンスを落としたくなければ努力してください.
計算の壊れたいくつかのプログラムで共通に使用しているサブルーチンや同様なロジックの部分から調べるのが近道でしょう.
(私も何度か計算が壊れる目にあってます.)
0366crazy_u
02/11/17 03:00ID:q3FHpQqgそれと,一度はデバッグのオプションをつけて潜在的なプログラムのバグを潰しておくことをお勧めします.
0367Galois
02/11/17 08:29ID:6pVouLNZ早速,いろいろと試しながらやっていきたいと思います。
0368login:Penguin
02/11/17 08:55ID:7kzAUYhk-mpつけてみれば?
0369Galois
02/11/17 09:58ID:D45BaIqk-O0 と -O3 でも(-x**無しで)結果が異なります。
-tpp6と-tpp7の違いはありません。
(別のプログラムの出力したバイナリ-ファイルを使っているので
,g77で試すのはすぐには難しい状況です)
プログラムに問題があるようです。
一般的になにかヒントがあれば教えてください。
-mpをつけても何も変わりませんでした。
0370login:Penguin
02/11/17 13:32ID:wvVtn5jg一般的なことは、365にも書いてありますが、シミュレーションに際して
問題になり得るのは、丸めとか桁落ちです。アルゴリズムが良くないと、
丸めの影響が積み上がって大きな誤差になることがあります。また、これ
はコンパイラや最適化に依存します。特に単精度では顕著です。
あとは、変数の初期化ですかね。多くのコンパイラでは最適化レベルを
上げるとスピードアップのため変数の初期化を省略します。当然、プロ
グラム中で明示的に初期化しておかなくてはいけないところで、忘れて
いてもコンパイラ(とオプション)によってはちゃんと動いてしまう
ということもあり得ます。
0371crazy_u
02/11/17 15:31ID:q3FHpQqg>>370の指摘が原因であった場合は -doubletemps や -save -zero や,現在,単精度なら-r8として倍精度にあげてみることを応急処置として試してみたらどうでしょうか.
変数の初期化が原因なら-O0の場合も結果は信頼できないでしょう.(ifcはデフォルトでは初期化しない)
あくまでも応急処置なので,早めにソースコードを修正(場合によってはアルゴリズムの変更)をするのがベターです.
蛇足ですが,あとは地道に要所要所で中間結果をダンプしてどこで計算がずれているか探すしかないでしょう.
0372Galois
02/11/17 18:48ID:6pVouLNZLahey Fortran lf90で
(1)lf90 xxxxxx.f90 -win -o0 -dbl
(2)lf90 xxxxxx.f90 -win -dbl
で実行したら結果が一致しました。
(単精度では結果がやはり異なっていました。かすかな光が見えてきた気分です。)
(2)はdefaltの最適化で-o1です。明日にifc6で試してみたいと思います。
lf90の-o0と-o1で(-dblなし)結果が一致したsubroutineでも
ifc6の-O3と-O0では不一致だったからどうなる不安ですが。
0373Galois
02/11/17 19:04ID:6pVouLNZ372に書きましたが,lf90で(windows版です)倍精度で一致しました。
一般に,倍精度で一致した場合,プログラム修正なしで単精度で最適化して
実行しても危険ないんでしょうか?Monte Carlo simulationなので誤差が
蓄積するようなものでもないと思うんですが。
あと,単精度で不一致の場合,プログラムを書き換えることで
単精度で一致するようになるものなんでしょうか?
倍精度で実行すればよいというものでもないのでしょうか?
0374login:Penguin
02/11/17 19:13ID:Z/w9oPOCとか
if x .eq. 1.0
とか
if x.ge.y
とか使っていませんか。
0375Galois
02/11/17 19:20ID:6pVouLNZdo x = 0.0, 10.0, 1.0
は(遊び以外で)一度も使ったことはありません。
if x .eq. 1.0などは使っていません。
(lf90コンパイラでwarningがでます。)
if(x.gt.1.0)なら使っています。
0376363,370
02/11/17 19:53ID:wvVtn5jg乱数をRAND_MAXとかで割った答えを丸めるか、切り捨てる
かで違いが出てきてもおかしくないと考えます。
最適化レベルを上げると、処理が「丸め」から「切り捨て」
に変わってる可能性があります。
強制的に丸め(四捨五入)を行わせる、-fp_portを試して
みたらどうでしょう。
一般に、単精度計算の際には、この最後の桁の問題について
気をつけないといけません。
0377363,370,376
02/11/17 20:12ID:wvVtn5jg乱数の最小桁の取り扱いが問題になっている可能性があります。
0378crazy_u
02/11/17 20:17ID:q3FHpQqgまたは,オーダーのかなり違うもの同士に対して加減算をしているとか?
もし,倍精度に(オプションで対応するのでなく)書き換えるなら,if(x.gt.1.0) では 1.0は単精度のままなので,if(x.gt.1d0) にしないと微妙なところで結果が変わることがあります.
0379login:Penguin
02/11/17 20:50ID:6pVouLNZlf90の-apオプションで-o0と-o1(and -o2)で同じになりました。
(-apオプションはhttp://www.lahey.com/docs/userwinexp_revc.pdf
にありますが)
乱数は
IRA = IAND(48828125*IRA,MODU)
X= IRA/REAL(MODU)
(ただし,MODU=2**30-1+2**30,IRAは初めに初期値を設定)
で作っています。
おなじ乱数を使っている全く別のプログラムではlf90の-o0と-o1で
同じ結果となりますから,乱数の精度ではないような気もします。
しかし,浮動小数点の精度の問題が原因かもしれないと思えてきました。
>>378
情報落ちとか桁落ちの問題はないのではと思っていますが,
いっそう気をつけたいと思います。
0380Galois
02/11/17 21:19ID:6pVouLNZlogin:Pengguinさんになっています。
(何か私が間違えたかもしれません。お詫びいたします)
0381363,370,376,377
02/11/18 00:35ID:QriAUUOrこの辺は処理系やコンパイラによって違いがあるとは思いますが、ifcやg77では
倍精度なんではないでしょうか。結局、これまでに分かっていることから、
1.倍精度で行った計算の結果をそのまま使うか、単精度のメモリ内容を
再度ロードするかの違い
2.倍精度で行った計算の結果を単精度に型変換するときのやりかたの違い
のいずれか、または両方が原因であると考えられます。
解決としては、全体または部分的にでも倍精度変数にするというのがいいのでは?
私は、いろいろ注意するのが面倒だったりするので、常に倍精度でプログラムしてます。
0382Galois
02/11/18 08:22ID:WBr0ddgK(1)ifc -O0 -r8 -tpp7 xxxxxx.f90
(2)ifc -O3 -r8 -tpp7 xxxxxx.f90
(3)ifc -O3 -r8 -tpp7 -xW xxxxxx.f90
はすべて一致しました。
プログラムの致命的なエラーでないこともわかり,
解決策も見えてきました。
とりあえず報告です。
0383crazy_u
02/11/18 10:17ID:1JE+mn0o良かったですね.
将来のメンテナンス性からも>>381の提案のように全て倍精度化するほうがベターだと思います.
(計算時間やメモリー容量がシビアな状況なら何とか単精度対応を考える.)
時間に余裕があって,精神的苦痛に耐えられるなら,丸め誤差に弱い部分がどこなのかを調べておくと良いでしょう.
いつか,その知見が役立ちます.
0384login:Penguin
02/11/18 12:18ID:McP4WlkF単精度は負荷以外の何物でもないような気がする。
0385363
02/11/18 13:38ID:NKF8mUk6一般に、
1. 型変換の負荷が加わる。
2. メモリ転送量が半分になる。
3. メモリ消費量が半分になる。
メモリ帯域がボトルネックになっているプログラム
では速くなることもあります。
以上、参考までに。
0386crazy_u
02/11/18 14:57ID:1JE+mn0o単精度は単精度です.自分で試してみましたか?スペックを読んでみましたか?
少なくとも,単精度でSSEと倍精度でSSE2ではほぼ計算時間は倍違います.
自分で簡単なコードを書いて試してみると良いです.(-doubletempsのオプションは無しです.)
0387crazy_u
02/11/18 16:32ID:1JE+mn0o>>386では大変失礼しました.
「x87 FPUデータレジスタ」と「x87 FPU データ型」の記述を確認をしたところ大変な勘違いをしていました.
その後キャッシュに入りきる大きさの問題で追試したところ,単精度の方が遅いです.
キャッシュに全然入りきらない問題では,CPU⇔メモリーの転送量が効いて,単精度の方が速いです.
せっかくご教授くださったのに>>386で失礼なことを書いて申し訳ありません.
0388login:Penguin
02/11/18 17:17ID:XfxcnBEE0389Galois
02/11/18 20:05ID:WBr0ddgKプログラムにIMPLICIT REAL*8 (A-H,O-Z)をいれて
実行してみたところ,ifc -O3 とifc -O0ではやはり結果が違います。
プログラムを倍精度化した場合と,単精度プログラムを-r8で倍精度化
した場合で動作が違うのでしょうか。
あと,>>378で指摘された「xとyが nearly equal の時に z=x-y
を計算してzを使う処理」についてですが,Monte Carl法では,
正にこのようなこと(zが負かそうでないかというような判断ですが)
を頻繁に行っています。このようなところから,誤差の問題で
結果が少しづつ変わってくるものと思われます。
いろいろな指摘ありがたいです。
0390363
02/11/19 00:16ID:hgj0uiuuIMPLICT REAL*8(A-H,O-Z)とやった後、
REAL A
とやってない?
私は、IMPLICIT NONEとした後に、使う変数をすべて
REAL*8で定義してます。
0391login:Penguin
02/11/19 01:40ID:Mxyeoxo1xとyがほぼ等しいときに減算を行ってはいけないのは、桁落ちが
起こって有効数字が著しく減ってしまうからです。そのような正
負だけを知りたい時は問題ありません。
# 基本的な数値計算の本を読みませう
モンテカルロ法で重要なのは乱数の生成だと思いますが、どんな
乱数生成を使っていますか? 標準関数のrandでは、科学技術計算に
耐えられるような質の良い乱数を生成することは不可能です。
乱数生成については色々と論文もありますから漁ってみて下さい
0392crazy_u
02/11/19 08:48ID:T1RR6mElhttp://www.netlib.org/
(Netlib is a collection of mathematical software, papers, and databases)
0393login:Penguin
02/11/19 20:57ID:0D55ayYYttp://www.math.keio.ac.jp/matumoto/mt.html
0394login:Penguin
02/11/19 22:10ID:Hxr/Pgqa0395login:Penguin
02/11/20 19:40ID:5lsr0uBYz=x-yの正負に基づいて,exp(-z)と乱数aを比較し,その結果におおじて次の処理
を行うという処理では誤差がでるでしょうか。乱数は>>379のものを使っています。
今までそれを使って特におかしいと感じたことはありませんが,結果の乱数依存性
ということも,前から気になっていたことのひとつです。
www.math.keio.ac.jp/matumoto/mt.htmlの乱数を使わしてもらって,
この依存性を調べて見ようと思ってはいますが,目先のことに追われて
ばかりで…。
0396login:Penguin
02/11/21 16:47ID:3MfEdJo4正式版が出たようです.
いつもバージョンの数字が大きく変わりますが,
何が変わったのか私には不明...
# ログインIDもパスワードも忘れると,一度登録メールアドレスでは,
# 再登録は不可能?
0397login:Penguin
02/11/22 00:45ID:fdqnnMUD0398login:Penguin
02/11/22 01:14ID:tIlE0Exbを勉強し始めたんですが、いきなりはまってしまいました。
以下のプログラムの出力が 0 1 1 になるのですが、何故でしょうか?
0 1 0 となると思って書きました。
program optional_arg
write(*,*) func(), func(1), func()
contains
integer function func(arg)
integer,intent(in),optional :: arg
integer :: ret=0
if(present(arg)) then
ret=arg
end if
func=ret
end function func
end program optional_arg
0399login:Penguin
02/11/22 01:28ID:2D9K7JEYあるテレビ番組で徳川埋蔵金発掘という番組があってその中でショベルカー
でいくら探しても金が出てこなかったが 野中 土井 亀井 中川 の4人組
の身元を洗ったところ大量の金が見つかりました
裁判所で4人はこの金は金正日さんから接待されたときにもらった金ですと自白しました。
この情報をスクープしたのは週刊金曜日『ちくし哲也をはじめとする金正日の工作機関雑誌』
金の使い方っていろいろあるね。 お金に関する雑誌ができました。
http://book.2ch.net/test/read.cgi/zassi/1036797442/l50
0400login:Penguin
02/11/22 04:23ID:IL4pBXCP0401login:Penguin
02/11/22 11:54ID:SQq29KVZifcと打つと、
/usr/lib/crt1.o: In function `_start':
/usr/lib/crt1.o(.text+0x18): undefined reference to `main'
となり、コンパイルできないのだけど
ifcbin
だとコンパイルできます。なんでかな〜〜〜〜〜
0402login:Penguin
02/11/22 12:10ID:ih1pm1LSなんでcrt1でてくんの?
見に行くライブラリ間違ってない?
0403login:Penguin
02/11/24 00:39ID:+s3T28rliccの方ですが、私の環境でも出ますね。
もっとも引数無しでを実行したときに表示されるだけなので、実用上支障はありませんが。
環境は redhat8.0 + glibc-2.2.93-5。
この環境だとVer6がうまく動かなかったので7.0の登場は嬉しい限りです。
0404login:Penguin
02/11/24 01:53ID:AQbo0hiecontains ではない関数にしてみたらどうなりますか?
あるいは、integer::ret=0 をやめて
integer::ret
ret=0
と毎回retに0を入れてみるとどうですか?
0405crazy_u
02/11/24 04:04ID:9k5WSccyinteger::ret=0はinteger,save::ret=0と同じコードになります.(-Sオプションでアセンブリをだしてみると分かる.)
初期値設定はあくまでそのプロセスの初期値なので、値を変更すると(save変数になっているので),その後の呼び出し時には変更された値になります.(DATA文でも同じ)
Fortranの言語仕様なのか,業界標準かは分かりませんが,たいていのコンパイラはそうだと思います.(富士通も同じ)
0406login:Penguin
02/11/24 12:07ID:6nxAFq7pそりは、引数ナシだとリンカモードになってしまい、ランタイムライブラリだけから
a.outを生成しようとする、おバカなドライバ(icc)の仕様です。
gccみたいにシンプルに"No input files"と文句をいって欲しかったです。
0407login:Penguin
02/11/24 20:05ID:b+2ujWQY6.0だとちゃんと、下のようにでるよ。
ifc: Command line error: no files specified; for help type "ifc -help"
0409login:Penguin
02/11/27 03:03ID:HhmqaFh8REAL A
DATA A/0/
と分けて描く変りに、一部の拡張仕様Fortranでは
REAL A/0/
などと書けていたけど、それが
REAL::A=0
とFortran90で書くようになったというだけのことなんだね。
0410login:Penguin
02/11/27 03:03ID:HhmqaFh8(この本と同じ内容のWebへのリンクは、www.media.kyoto-u.ac.jp/htomita )
の102頁には、「宣言文やDATA文による初期値の設定は、コンパイルの際に
メモリ領域を予約するついでに行われるため、最初の実行のときにしか有効
ではない。。。」(頁102より)
とかかれている。ただし、これは、そういう実装もありというだけのこと
かもしれない。つまり、毎回初期値を設定し直すようなコードを吐いても
規格違反ではないのではないか(規格書は高いから持っていない。)
頁102には、「このようにSAVE指定がなくても、前回に呼ばれたときの
値が保持されたままの場合がある(一般には何が保持されているかは
不定である)。。。」となっている。
#
Fortran77の時代に、サブルーチンなどの内部のローカル変数や
引数の値は、サブルーチンを抜けたら消滅し、不定になるはずだった。
そうしないと最適化が困難になるし、記憶の容量も減らせない。
だがそれ以前のFortran66の時代の多くのコードが動かなくなるので、
SAVE文を書けば比較的簡単に、66時代と同様のことが実現できる
ようにして、純粋ならば SAVE指定から外れたローカルな変数は全部、
副プログラムを抜けたら存在が消滅するのであった。
個人的には、SAVE文以外に、NOSAVE文(とでもよぶもの)を
ついでに導入すべきであったと思う。NOSAVE指定した変数や記憶域は、
積極的に次回以降に値が残らないことを強調するものだ。
(77の規格ではそもそも値が残らないのがデフォルトなので、
NOSAVE文みたいなものは導入されなかったが、現実の商用コンパイラは、
このあたりがあやふやだったり混乱していたりした。)
コンパイラによっては、値が残留しない77の規格を厳密に実現できる
ものがあるが、そうでないのが標準のものや、コンパイラオプションで
実現できたりしたなどである。
0411crazy_u
02/11/27 13:10ID:M6T+ESirhttp://www.xlsoft.com/jp/products/vtune/perftool.htm
で「Intel C++ Compiler 7.0 for Linux」の項目に
「Linux 版インテル(R) C++ コンパイラ 7.0 では、GNU C/C++ との互換性の強化、C++ ABI との適合性、幅広 gcc 拡張子のサポート、およびごくわずかな修正を行なうだけで Linux カーネルをビルドすることができます。」
と説明がありました.「ごくわずかな修正」を調べてみます.分かったら報告します.
0412login:Penguin
02/11/28 01:16ID:Aj/Ka3kqたらすごいな。インラインASMの部分などは、無理だろうから、デバイス
ドライバーなどは、全面書き直しするしかなかろうと思うけど。
がんばってOSカーネル丸ごとチャレンジして欲しい。
クロックがあがったように体感速度が上がれば素晴らしい。
SSE命令などを使ってデーターのバッファー転送を高速化したり、
サウンドドライバーが音質が向上したり、
XーWindowsが飛ぶように速く動くようになればめでたい。
0413login:Penguin
02/11/28 01:40ID:zRfKz+Msどこを縦読みすればいいのでつか
0414login:Penguin
02/11/28 17:06ID:TwGoRG+aemacs で遂に挫折。
0415login:Penguin
02/11/28 17:18ID:rzTXVehEどこか変化した?
0416login:Penguin
02/11/29 00:00ID:CcQhIMOA0417login:Penguin
02/11/30 05:16ID:LPoU/MM7関数・サブルーチンは使えないのかな。
0418login:Penguin
02/12/01 07:17ID:Smn19ga0ピボッティングもスケーリングもやってない
単純な LU 分解のコードを試してみたけど、
icc -xW -tpp7 と gcc -O2 (2.95.3)で実行速度が変わらない。
で、 -S してみたらどうも PREFETCH を使ってないみたい。
まだ、 ccc ほど賢くはないのかな。
だとしたら Xeon*2 買うより AthlonMP*2 買ってた方が
HARDWARE PREFETCH の恩恵にぞくせてよかったかも。
0419login:Penguin
02/12/01 09:11ID:6cxWcw03Pentium4コアのC1 stepping以降はhardware prefetchのバグ(errata P46)が
直っているはずですぞ。Xeonも同じです。
0420crazy_u
02/12/01 18:53ID:Q5N6niNlマニュアルを見ると,-O3にしないとprefetchはかからないようですよ.
"Intel C++ Compiler User's Guide"の
[Optimizations]/[Optimaization Levels]/[Setting Optimizatin Levels]
の"IA-32 and Itanium Compilers"に書いてある.
0421crazy_u
02/12/01 19:18ID:Q5N6niNl性能を向上しようと思ったら,コンパイルオプションもそれなり設定してコンパイル時のメッセージとかも見て,
最適化制御行を入れたり,コンパイラが理解できる(最適化しやすい)ようにコードを書き換えたりしないと性能はあがらないよ。
0422login:Penguin
02/12/03 09:57ID:EIrgZrpNdtimeの計測では同じ数字なのだが、うれしいがわけわからん。
0423login:Penguin
02/12/03 10:35ID:5aayB2ksそれとも P4, Xeon*2 (高いんで手が出ないかも)にすべきなのでしょうか?
過去スレ読んだつもりですが、イマイチはっきりしないので。
0424login:Penguin
02/12/03 10:45ID:X1BM48vgintelが敵に塩を送るようなことはしないと思われ
0425login:Penguin
02/12/03 11:17ID:5aayB2ksあと、intel 用に optimize したら意外と athlon でも行ける、という
こともありうるかな、と思って。(意図的に intel 専用のコードを使って
壊すとかしなければ。)
0426login:Penguin
02/12/03 11:29ID:g4+eV5lNお手軽にコンパイルできるのかと思ったけど、そういうことではないのね。
dependency fileのフォーマット違いを適当に変換してcompileしてみたけど、
include fileがらみで止まったので、とりあえず放置中。
0427login:Penguin
02/12/03 13:32ID:MBmEQllb>>419
Intel から XEON の PDF 落としてきたら、
確かに L2 cache 周りにバグがあったみたいですね。
>>420
CPU のタイプ指定したからと言って、
それようの最適化してくれる訳じゃないのね。
で、試したけど -O3 付けても prefetch してくれないみたい。
うーん、 prefetch は必要ないと判断されちゃってるのかなぁ。
とりあえずマニュアルちゃんと読んでみます。
>>421
本気で使うプログラム組むのは結構大変そうですね。
ま、実際の実験に使うときはひよって、
MKL や atlas あたりの既成のライブラリで
間に合うところはそっちに投げちゃうつもりなんだけどね。
っていうか自分が素人考えでコーディングしても勝てそうにないし (^^;
とりあえず、 PREFETCH や SSE2 の性能を見たいだけなんで、
今は PREFETCH してるときとそうでないときの差が観測できれば満足です。
athlon(palomino)+gcc や alpha(21164)+ccc では
pentiumIII+gcc とクロック比の2倍近い差が観測できたので、
配列なめるような計算だと
メモリの遅さをごまかす PREFETCH が効くとおもうんだけどなぁ。
長文失礼。
0428crazy_u
02/12/03 23:43ID:biU06C3s参考までに,>>351で紹介した本を参考にして書いたコード(vector計算機用に書いたものをP4用に変更したもの)
の結果を紹介しますので,ぜひ,自分でチューニングしてみしょう.
10000×10000の対称密行列の下三角部分を1次元配列で持って,三角分解する問題です.
(倍精度.ピボッティング無し.)
m×mのブロックを同時分解するプログラムをtimeコマンドで計測すると、
m=1; 603.699u 0.728s 10:05.38 99.8% 0+0k 0+0io 605pf+0w
m=2: 284.677u 0.734s 4:45.86 99.8% 0+0k 0+0io 606pf+0w
m=3: 206.556u 0.726s 3:27.60 99.8% 0+0k 0+0io 607pf+0w
m=4: 180.873u 0.736s 3:01.90 99.8% 0+0k 0+0io 609pf+0w
m=5: 233.402u 0.722s 3:54.48 99.8% 0+0k 0+0io 610pf+0w
m=6: 298.871u 0.744s 5:00.08 99.8% 0+0k 0+0io 617pf+0w
となりました.m=1とm=4では3倍の性能差です.m=5,6では1つのループに夫々25個,36個の式をいれるとvectorizeがかからないので、
2つのループに分けていることで性能が悪くなっていると考えられます.(CPUリソースが足りてない?)
コンパイルオプションは>>326です.動作環境は
P4 2.53GHz, M/B:ASUS P4T533-C, memory: PC800-40 ECC 512MB×4, HDD: 80GB(7200rpm)×2 (software RAID1)
memoryが、PC1066ならあと10〜20%性能が上がると思います.
0429login:Penguin
02/12/04 05:11ID:nRFkxlL9GFLOPS換算だと、どういう性能値になるのかな?
0430crazy_u
02/12/04 20:16ID:LtG05CzF<演算回数>
ijk型の分解(LDLT分解)をしているので、作業用の配列RDを使用してアルゴリズムを書くと、
icon=0
for i=1,n
for j=1,i-1
for k=1,j-1
Aij=Aij-Aik*Ajk ; 加算1, 乗算1
next k
next j
for k=1,i-1
Aii=Aii-Aik*Aik*RDk ; 加算1, 乗算2
next k
if(|Aii|<tolerance) then
icon=i
goto end
end if
RDi=1/Aii
for k=1,i-1
Aik=Aik*RDk
next k
next i
end
最後のループはその前のループと一つにできるので演算回数にはカウントしないことにすると、
n=10000で,演算回数=n(n+1)(2n+1)/6-n=333.383325 GFLOP
0431crazy_u
02/12/04 20:16ID:LtG05CzF<GFLOPS>
(user使用CPU時間+sysytem使用CPU時間)で割ると,
m=1: 333.383325/604.427=0.552 GFLOPS
m=2; 333.383325/285.411=1.170 GFLOPS
m=3; 333.383325/207.282=1.611 GFLOPS
m=4; 333.383325/181.609=1.838 GFLOPS
m=5; 333.383325/234.124=1.426 GFLOPS
m=6; 333.383325/299.615=1.114 GFLOPS
m=1はもとの旧態依然のコード(vectorizeはされている)です.多くのレジスタは遊んでいるのでしょう.
vectorizeによる性能向上はあきらめて手でloop unrollingをしていけばもう少し性能は上がるかもしれません.
P4は,倍精度浮動小数点命令を 2 clocksで2命令こなせるので,P4 2.53GHzだと理論性能値は2.53GFLOPSであり,
m=4では理論性能値の72.6%である.
性能値の計算方法が違ってたら御指摘ください.
この例では性能が向上していますが,vector計算機や通常のスーパースカラー計算機では性能が出る方法がP4では全くダメだ
ったりして試行錯誤の繰返しです.
0432login:Penguin
02/12/04 23:39ID:pg0evXMeインテル、Hyper-Threading対応コンパイラを発表
http://www.watch.impress.co.jp/pc/docs/2002/1204/intel.htm
0433login:Penguin
02/12/05 06:46ID:/JxgZHh9user+sys を演算にかかった時間とするというのは、
たとえばスワップなどの待ちが発生していない場合には、まあ妥当だと
思うが、現実の計算させている側からみると、user+sys よりも
現実にかかったWallClock(実時間)の方が意味を持つ。
メモリーサイズを越えた計算を行う場合には、user+sys の時間と
くらべて実際の時間はうんと長くなることはよくある。
0434login:Penguin
02/12/06 16:21ID:tdSYXBjWCVSから持ってきた Emacs 21.3.50.1 を icc -tpp6 -xK -ip -nolib_inline -O3 でコンパイルしてみました。
1. src/regex.h の最後の方に、__restrict を gcc のバージョンを見てほげってる部分があるのでそこをつぶす
2. temacs のリンクがうまくいくように、icc -v の出力を見ながら src/Makefile をいじる
・STARTFILES の最後に crtxi.o を追加
・LIBS から -lgcc を削除し、-limf, -lcxa, -lunwind を適切に追加
・LIBS の crtn.o の直前に crtxn.o を追加
ぐらいでうまくできました。
gcc に比べて速くなったか…は分かりませんねぇ…。どうやって比べればいいのかな?
0435login:Penguin
02/12/07 15:07ID:Ui0kbuxO21.2で試してみたけど上手くいかなかった。残念。
temacsは出来たけど、ldd temacsすると
/usr/bin/ldd: ./temacs: No such file or directoryと言われる。
リンクにミスってるのかな。もうちょい調べてみます。
0436435
02/12/07 15:20ID:Ui0kbuxO0437login:Penguin
02/12/07 15:40ID:Ui0kbuxOとりあえずMule-UCS込みでemacsをdumpするほうを頑張ろう……
0438login:Penguin
02/12/07 21:10ID:fP7YPqYNM-x hanoiで時間計ってみてら?
0439login:Penguin
02/12/07 23:19ID:Ui0kbuxOおお、なるほど。
elpでみると、一割弱ぐらいicc版のほうが速いかなといえなくもない感じですが、
実行の度にバラつきが大きいので、きちんと統計とらないとなんとも。
……という程度の違いぐらいでしたw
0440login:Penguin
02/12/08 16:02ID:t1EMsFPnお試し版ライセンスでダウンロード&インストールしてみました。
で、とりあえずHello worldからー、と思ってコンパイルしてみると、
# icc -O t.c
icc: error: Fatal error in /opt/intel/compiler70/ia32/bin/mcpcom, terminated by
segmentation violation
compilation aborted for t.c (code 1)
とエラーが…。-Oオプションを取っ払っても同様にエラーが出ました。
どのような原因が考えられますでしょうか?
0441login:Penguin
02/12/08 21:35ID:u1M6xTCCどんな Hello world 書いたのかまずは晒せ
044230
02/12/10 15:16ID:Ws55tYEeadress errorというものが出るようになりました。これはなにが
原因なんでしょうか?
0443login:Penguin
02/12/10 19:50ID:p6pBFSA9Usually caused by a wrong value being used as an address
(check the associativity of all pointers).
って書いてあるよ。
いきなり落ちるんだったらAllocatableな変数をallocateしないで
渡しちゃったとかって感じだろうけど、
しばらくして落ちるのはなんだろうね。
pointerを使ってるんだったら、そこを集中的に見てみるといいんじゃないかな。
0444login:Penguin
02/12/10 20:29ID:WQilySMD出るといいな。そんな感じのメールが今日僕のところに来ました。
044530
02/12/11 00:57ID:KREW2anIなるほど。pointerは使っていないので、原因はよくわかりませんね・・。
2週間くらい落ちずに計算してほしいので、6.0に戻すことにします。
ありがとうございました。
0446login:Penguin
02/12/11 03:23ID:ngo2KBLZ0447440
02/12/12 14:02ID:fC7hqe+lすみません。どうも、2.2系列のkernelで実行していたのが原因のようです。
2.4系列のマシンで試したところ、ちゃんと動きました。
0448おむこさん志望 ◆QtGqCwfDSA
02/12/12 19:18ID:Gd+VRRoblisp のベンチマークなら竹内関数が有名。
(define (tak x y z)
(if (>= y x) z
(tak ( tak (- x 1) y z)
( tak (- y 1) z x)
( tak (- z 1) x y))))
で、(tak 30 20 0) とでもやってみて。
ただ、一般ユーザから見れば算術演算よりもむしろ Garbage Collector の性能のほうが
気になる。現に (setq garbage-collection-messages t) eval ると GC しまくってるし。
GC のベンチマークはどうやればいいかな?ごみセルをものすごい勢いで生成する
プログラムなら何でもいいと思うけど。
0449おむこさん志望 ◆QtGqCwfDSA
02/12/12 19:21ID:Gd+VRRobemacs lisp 版は
(defun tak (x y z)
(if (>= y x) z
(tak ( tak (- x 1) y z)
( tak (- y 1) z x)
( tak (- z 1) x y))))
ってところかな。
0450login:Penguin
02/12/13 08:15ID:zhmsFywd不勉強なもんで、竹内関数の「た」の字も知りませんでちた。
それはさておき、Pen3/800MHz 上の Linux の emacs21.2 で、
とりあえず (tak 15 10 0) を elp で見てみました。
gcc2.96 -O2 で Elapsed Time が約 3045、
icc7 -O3 -mp1 -prec_div -fp_port -tpp6 -xiMK では約 2878 でした。
400MHz 以下の PC で emacs に微妙に重さを感じるような環境だと、
あるいは体感で違いが出るかもしれないなーという感じかも。
0451login:Penguin
02/12/19 17:03ID:5E3T5r1wバージョン7って6の時のやつ使えますか?
0452login:Penguin
02/12/19 17:08ID:C7axpMDs自分で試せることあるなら先にやってから愚痴言えばいいじゃん。
0453login:Penguin
02/12/20 12:29ID:GkB+B9PYCPUが過熱しているのでは?浮動小数点計算回路は、相当に熱を出すので、
浮動小数点計算をフルに稼動させると、そうではない場合にくらべて
かなり冷却をまじめにしなければいけなくなります。
CPUの温度が上がると、回路の動作可能速度が落ちてしまい、
回路がクロックについていけなくなるのです。
0454login:Penguin
02/12/20 13:32ID:/crymO6Z% tar xvf ./l_cc_pu_7.0.075.tar
(抜粋)
intel-icc7-7.0-75.i386.rpm
intel-iidb7-7.0-150.i386.rpm
intel-isubh7-7.0-75.i386.rpm
0455login:Penguin
02/12/20 13:35ID:/crymO6ZQ148399,Q162516 Profmerge causes SIGSEGV under critical system load
Q148801 Seg fault with virtual base, template class
Q144382 internal error: select_overloaded_copy_constructor: NULL constr
Q134428 incompatibility with regard to large file support
Q155513 compiler generates incorrect function name if function body changes
Q155001, Q163438 Multiple symbols created for local statics in cloned routines
Q153937 Internal error loop: source_file_for_seq: bad seq number on vla dim expr
Q149096, Q153942 constant used in generated andpd instruction is not 16-byte aligned
Q131763, Q162474 Problem with the code generated for delete[]
Q141709, Q160439 new substitute header file was added
Q100490 __declspec(align(n,off)): some (base,offset) pairs produce incorrect results
Q162533 dyn file corruption
Q158469,Q160670 Problem in PGO function naming scheme
Q144379 -vla cannot have static storage duration
Q122044 Compilation hangs when test case is compiled with optimization on
Q122047 Compiler hangs when optimization is on
Q96189 Is arithmetic operation on void pointers allowed?
Q151784 -xW vectorization gets wrong results
Q156239 inner loop was not vectorized
Q153389 Dwarf2 Lexical block boundaries incorrect, overlap other functions
0456login:Penguin
02/12/20 13:36ID:/crymO6Z書き忘れた。l_cc_p_7.0.065 からの icc の修正点です。
0457login:Penguin
02/12/24 16:18ID:JyDxMYz1「We're sorry, each user may only obtain one non-commercial license for each version
of an Intel software development product. ・・・」
と,ノンコマーシャルバージョンは,一人一つのバージョンしかダウンロードできない.
みんなどうやってアップグレードしてるの?
メアドたくさん手に入れて,それで再度登録?
0458_
02/12/24 16:20ID:ouu1I4jchttp://freeweb2.kakiko.com/dengeki/indexc.htm
0459login:Penguin
02/12/24 16:22ID:4v+Gtyjb取れない、って書いてあるけど??
0460crazy_u
02/12/24 21:05ID:OYox6oQQhttps://premier.intel.com
へいって,既に取得しているユーザIDとパスワードでログインして,"Download"か"What's New"へいけばOK.
既に取得しているライセンスは新しいバージョンでも継続して使えます.
■ このスレッドは過去ログ倉庫に格納されています