トップページ⇒linux
985コメント403KB

intel compiler for Linux

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin01/11/29 17:53ID:5k7yf0ai

intel 社の 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:Penguin02/11/16 11:46ID:p4ZGg3L2
行列計算でVC++6を使ってましたが、Intel C++(Windows版)の購入を検討してます。
行列計算で両者の速度体感の差を経験された方がおありでしたら、教えて下さい。
また、Linux版とWindows版(Win2kで使用予定)の速度体感に大きな差はみられる
でしょうか?
スレ違いですが、プログラム技術@2ch掲示板に行っても「そんなスレありません」
でしたので。


0361login:Penguin02/11/16 15:41ID:5m6xZ1gP
>>360
試用版あるから使ってみれ
0362Galois02/11/16 22:55ID:O0ALkNUj
ifc6のFortranにお世話になっています。
シミュレーションをしています。
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:Penguin02/11/17 00:25ID:wvVtn5jg
>>362
ifc -O0 xxxxxx.f90
として出てきた答えがまず正しい。g77とも比べてみれば?
最適化のため、計算の順番を入れ替わったりして、答えが変わる
ということがあり得ます。
0364login:Penguin02/11/17 01:45ID:roKdiGN4
メモリアクセスのパターンが完全にわかっている行列演算の多くにおいては、
HTを有効に使える気がする。ひとつのスレッドを、メモリーのアクセス
パターンに沿って先行させてページロードをさせたりメモリーをキャッシュから
取り込む作業に割り当てる。すると、もうひとつのスレッドが演算に必要な
データが丁度メモリ内にあるいはキャッシュ内に用意が済んでいるという、
据え膳状態になるようにできるだろう。
0365crazy_u02/11/17 02:09ID:q3FHpQqg
>>362
最適化レベルを最高にすると計算が壊れることがあります.(コンパイラのバグ)
まず、>>363の指摘を行ってみることです.
その上で,計算が壊れているサブルーチンをみつけて
1.そのサブルーチンだけ最適化レベルを下げる.
2.コンパイラが正しく読解可能なように明快なプログラムにする.
3.コンパイラが正しく読解可能なようにサブルーチンを更に分割する.(1つのファイルになっている場合は-ipオプションはつけない.)
のいずれかを試行してみるとよいと思います.'2', '3'は試行錯誤的になりますが全体のパフォーマンスを落としたくなければ努力してください.
計算の壊れたいくつかのプログラムで共通に使用しているサブルーチンや同様なロジックの部分から調べるのが近道でしょう.
(私も何度か計算が壊れる目にあってます.)
0366crazy_u02/11/17 03:00ID:q3FHpQqg
>>362
それと,一度はデバッグのオプションをつけて潜在的なプログラムのバグを潰しておくことをお勧めします.
0367Galois02/11/17 08:29ID:6pVouLNZ
>>362の問題に対するいくつかの答えをいただき,ありがとうございます。
早速,いろいろと試しながらやっていきたいと思います。
0368login:Penguin02/11/17 08:55ID:7kzAUYhk
>>367
-mpつけてみれば?
0369Galois02/11/17 09:58ID:D45BaIqk
>>367
-O0 と -O3 でも(-x**無しで)結果が異なります。
-tpp6と-tpp7の違いはありません。
(別のプログラムの出力したバイナリ-ファイルを使っているので
,g77で試すのはすぐには難しい状況です)
プログラムに問題があるようです。
一般的になにかヒントがあれば教えてください。
-mpをつけても何も変わりませんでした。
0370login:Penguin02/11/17 13:32ID:wvVtn5jg
>>369
一般的なことは、365にも書いてありますが、シミュレーションに際して
問題になり得るのは、丸めとか桁落ちです。アルゴリズムが良くないと、
丸めの影響が積み上がって大きな誤差になることがあります。また、これ
はコンパイラや最適化に依存します。特に単精度では顕著です。

あとは、変数の初期化ですかね。多くのコンパイラでは最適化レベルを
上げるとスピードアップのため変数の初期化を省略します。当然、プロ
グラム中で明示的に初期化しておかなくてはいけないところで、忘れて
いてもコンパイラ(とオプション)によってはちゃんと動いてしまう
ということもあり得ます。

0371crazy_u02/11/17 15:31ID:q3FHpQqg
>>369
>>370の指摘が原因であった場合は -doubletemps や -save -zero や,現在,単精度なら-r8として倍精度にあげてみることを応急処置として試してみたらどうでしょうか.
変数の初期化が原因なら-O0の場合も結果は信頼できないでしょう.(ifcはデフォルトでは初期化しない)
あくまでも応急処置なので,早めにソースコードを修正(場合によってはアルゴリズムの変更)をするのがベターです.
蛇足ですが,あとは地道に要所要所で中間結果をダンプしてどこで計算がずれているか探すしかないでしょう.
0372Galois02/11/17 18:48ID:6pVouLNZ
>>370,>>371
Lahey 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では不一致だったからどうなる不安ですが。
0373Galois02/11/17 19:04ID:6pVouLNZ
>>371
372に書きましたが,lf90で(windows版です)倍精度で一致しました。
一般に,倍精度で一致した場合,プログラム修正なしで単精度で最適化して
実行しても危険ないんでしょうか?Monte Carlo simulationなので誤差が
蓄積するようなものでもないと思うんですが。
あと,単精度で不一致の場合,プログラムを書き換えることで
単精度で一致するようになるものなんでしょうか?
倍精度で実行すればよいというものでもないのでしょうか?
0374login:Penguin02/11/17 19:13ID:Z/w9oPOC
do x = 0.0, 10.0, 1.0
とか
if x .eq. 1.0
とか
if x.ge.y
とか使っていませんか。
0375Galois02/11/17 19:20ID:6pVouLNZ
>>374
do 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,37602/11/17 20:12ID:wvVtn5jg
FORTRANではrandは実数型ですね。いずれにしても、浮動小数点化した
乱数の最小桁の取り扱いが問題になっている可能性があります。
0378crazy_u02/11/17 20:17ID:q3FHpQqg
xとyが nearly equal の時に z=x-y を計算してzを使う処理を行っていたりしませんか?
または,オーダーのかなり違うもの同士に対して加減算をしているとか?

もし,倍精度に(オプションで対応するのでなく)書き換えるなら,if(x.gt.1.0) では 1.0は単精度のままなので,if(x.gt.1d0) にしないと微妙なところで結果が変わることがあります.
0379login:Penguin02/11/17 20:50ID:6pVouLNZ
>>376,377
lf90の-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
情報落ちとか桁落ちの問題はないのではと思っていますが,
いっそう気をつけたいと思います。
0380Galois02/11/17 21:19ID:6pVouLNZ
379はGaloisが送信したんですが。
login:Pengguinさんになっています。
(何か私が間違えたかもしれません。お詫びいたします)
0381363,370,376,37702/11/18 00:35ID:QriAUUOr
変数に単精度を使っていても、内部の計算はたいてい、倍精度で行われます。
この辺は処理系やコンパイラによって違いがあるとは思いますが、ifcやg77では
倍精度なんではないでしょうか。結局、これまでに分かっていることから、
1.倍精度で行った計算の結果をそのまま使うか、単精度のメモリ内容を
  再度ロードするかの違い
2.倍精度で行った計算の結果を単精度に型変換するときのやりかたの違い
のいずれか、または両方が原因であると考えられます。

解決としては、全体または部分的にでも倍精度変数にするというのがいいのでは?
私は、いろいろ注意するのが面倒だったりするので、常に倍精度でプログラムしてます。
0382Galois02/11/18 08:22ID:WBr0ddgK
ifc6, redhat linux 7.1, P4で
(1)ifc -O0 -r8 -tpp7 xxxxxx.f90
(2)ifc -O3 -r8 -tpp7 xxxxxx.f90
(3)ifc -O3 -r8 -tpp7 -xW xxxxxx.f90
はすべて一致しました。
プログラムの致命的なエラーでないこともわかり,
解決策も見えてきました。
とりあえず報告です。
0383crazy_u02/11/18 10:17ID:1JE+mn0o
>>382
良かったですね.
将来のメンテナンス性からも>>381の提案のように全て倍精度化するほうがベターだと思います.
(計算時間やメモリー容量がシビアな状況なら何とか単精度対応を考える.)
時間に余裕があって,精神的苦痛に耐えられるなら,丸め誤差に弱い部分がどこなのかを調べておくと良いでしょう.
いつか,その知見が役立ちます.
0384login:Penguin02/11/18 12:18ID:McP4WlkF
イソテルのCPUは、倍精度で計算しちゃうんだから。
単精度は負荷以外の何物でもないような気がする。

038536302/11/18 13:38ID:NKF8mUk6
計算が倍精度で行われるとして、単精度の変数を使うと、
一般に、
1. 型変換の負荷が加わる。
2. メモリ転送量が半分になる。
3. メモリ消費量が半分になる。

メモリ帯域がボトルネックになっているプログラム
では速くなることもあります。
以上、参考までに。
0386crazy_u02/11/18 14:57ID:1JE+mn0o
>>384, 385
単精度は単精度です.自分で試してみましたか?スペックを読んでみましたか?
少なくとも,単精度でSSEと倍精度でSSE2ではほぼ計算時間は倍違います.
自分で簡単なコードを書いて試してみると良いです.(-doubletempsのオプションは無しです.)
0387crazy_u02/11/18 16:32ID:1JE+mn0o
>>384,385
>>386では大変失礼しました.
「x87 FPUデータレジスタ」と「x87 FPU データ型」の記述を確認をしたところ大変な勘違いをしていました.
その後キャッシュに入りきる大きさの問題で追試したところ,単精度の方が遅いです.
キャッシュに全然入りきらない問題では,CPU⇔メモリーの転送量が効いて,単精度の方が速いです.
せっかくご教授くださったのに>>386で失礼なことを書いて申し訳ありません.
0388login:Penguin02/11/18 17:17ID:XfxcnBEE

0389Galois02/11/18 20:05ID:WBr0ddgK
>>381, >>383
プログラムにIMPLICIT REAL*8 (A-H,O-Z)をいれて
実行してみたところ,ifc -O3 とifc -O0ではやはり結果が違います。
プログラムを倍精度化した場合と,単精度プログラムを-r8で倍精度化
した場合で動作が違うのでしょうか。
あと,>>378で指摘された「xとyが nearly equal の時に z=x-y
を計算してzを使う処理」についてですが,Monte Carl法では,
正にこのようなこと(zが負かそうでないかというような判断ですが)
を頻繁に行っています。このようなところから,誤差の問題で
結果が少しづつ変わってくるものと思われます。
いろいろな指摘ありがたいです。

039036302/11/19 00:16ID:hgj0uiuu
FORTRANは最近全然使いませんが、
IMPLICT REAL*8(A-H,O-Z)とやった後、
REAL A
とやってない?
私は、IMPLICIT NONEとした後に、使う変数をすべて
REAL*8で定義してます。
0391login:Penguin02/11/19 01:40ID:Mxyeoxo1
>>389
xとyがほぼ等しいときに減算を行ってはいけないのは、桁落ちが
起こって有効数字が著しく減ってしまうからです。そのような正
負だけを知りたい時は問題ありません。
# 基本的な数値計算の本を読みませう

モンテカルロ法で重要なのは乱数の生成だと思いますが、どんな
乱数生成を使っていますか? 標準関数のrandでは、科学技術計算に
耐えられるような質の良い乱数を生成することは不可能です。
乱数生成については色々と論文もありますから漁ってみて下さい
0392crazy_u02/11/19 08:48ID:T1RR6mEl
既に知っているかも知れませんが,ここで,サーチしてみたらどうでしょう.
http://www.netlib.org/
(Netlib is a collection of mathematical software, papers, and databases)
0393login:Penguin02/11/19 20:57ID:0D55ayYY
>>391
ttp://www.math.keio.ac.jp/matumoto/mt.html
0394login:Penguin02/11/19 22:10ID:Hxr/Pgqa
インテルコンパイラ8.0はやくでないかなぁ。
0395login:Penguin02/11/20 19:40ID:5lsr0uBY
>>391, 392,393
z=x-yの正負に基づいて,exp(-z)と乱数aを比較し,その結果におおじて次の処理
を行うという処理では誤差がでるでしょうか。乱数は>>379のものを使っています。
今までそれを使って特におかしいと感じたことはありませんが,結果の乱数依存性
ということも,前から気になっていたことのひとつです。
www.math.keio.ac.jp/matumoto/mt.htmlの乱数を使わしてもらって,
この依存性を調べて見ようと思ってはいますが,目先のことに追われて
ばかりで…。
0396login:Penguin02/11/21 16:47ID:3MfEdJo4
Intel Fortran 7.0 for Linux
正式版が出たようです.
いつもバージョンの数字が大きく変わりますが,
何が変わったのか私には不明...

# ログインIDもパスワードも忘れると,一度登録メールアドレスでは,
# 再登録は不可能?
0397login:Penguin02/11/22 00:45ID:fdqnnMUD
インテルコンパイラ8.0betaはやくでないかなぁ。
0398login:Penguin02/11/22 01:14ID:tIlE0Exb
Intel Fortran 7.0 for Linux で Fortran90
を勉強し始めたんですが、いきなりはまってしまいました。
以下のプログラムの出力が 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:Penguin02/11/22 01:28ID:2D9K7JEY
(金)に関するちょっといい話

あるテレビ番組で徳川埋蔵金発掘という番組があってその中でショベルカー
でいくら探しても金が出てこなかったが 野中 土井 亀井 中川 の4人組
の身元を洗ったところ大量の金が見つかりました
裁判所で4人はこの金は金正日さんから接待されたときにもらった金ですと自白しました。
この情報をスクープしたのは週刊金曜日『ちくし哲也をはじめとする金正日の工作機関雑誌』
金の使い方っていろいろあるね。 お金に関する雑誌ができました。
http://book.2ch.net/test/read.cgi/zassi/1036797442/l50


0400login:Penguin02/11/22 04:23ID:IL4pBXCP
7.0入手ついでに400getさせていただきます。
0401login:Penguin02/11/22 11:54ID:SQq29KVZ
7.0をインストールしました。

ifcと打つと、
/usr/lib/crt1.o: In function `_start':
/usr/lib/crt1.o(.text+0x18): undefined reference to `main'
となり、コンパイルできないのだけど

ifcbin
だとコンパイルできます。なんでかな〜〜〜〜〜
0402login:Penguin02/11/22 12:10ID:ih1pm1LS
>>401
なんでcrt1でてくんの?
見に行くライブラリ間違ってない?
0403login:Penguin02/11/24 00:39ID:+s3T28rl
>>401
iccの方ですが、私の環境でも出ますね。
もっとも引数無しでを実行したときに表示されるだけなので、実用上支障はありませんが。
環境は redhat8.0 + glibc-2.2.93-5。
この環境だとVer6がうまく動かなかったので7.0の登場は嬉しい限りです。
0404login:Penguin02/11/24 01:53ID:AQbo0hie
>>398
contains ではない関数にしてみたらどうなりますか?
あるいは、integer::ret=0 をやめて
integer::ret
ret=0
と毎回retに0を入れてみるとどうですか?
0405crazy_u02/11/24 04:04ID:9k5WSccy
>>398
integer::ret=0はinteger,save::ret=0と同じコードになります.(-Sオプションでアセンブリをだしてみると分かる.)
初期値設定はあくまでそのプロセスの初期値なので、値を変更すると(save変数になっているので),その後の呼び出し時には変更された値になります.(DATA文でも同じ)
Fortranの言語仕様なのか,業界標準かは分かりませんが,たいていのコンパイラはそうだと思います.(富士通も同じ)
0406login:Penguin02/11/24 12:07ID:6nxAFq7p
>>403
そりは、引数ナシだとリンカモードになってしまい、ランタイムライブラリだけから
a.outを生成しようとする、おバカなドライバ(icc)の仕様です。
gccみたいにシンプルに"No input files"と文句をいって欲しかったです。
0407login:Penguin02/11/24 20:05ID:b+2ujWQY
>>406
6.0だとちゃんと、下のようにでるよ。
ifc: Command line error: no files specified; for help type "ifc -help"
040839802/11/25 23:33ID:011nOYQa
>>404,405
呼び出すごとに初期値が設定される訳じゃないんですね。
ありがとうございました。
0409login:Penguin02/11/27 03:03ID:HhmqaFh8
なるほど、どうやら昔のFortranでData文をつかって
REAL A
DATA A/0/
と分けて描く変りに、一部の拡張仕様Fortranでは
REAL A/0/
などと書けていたけど、それが
REAL::A=0
とFortran90で書くようになったというだけのことなんだね。

0410login:Penguin02/11/27 03:03ID:HhmqaFh8
培風館「Fortran90プログラミング」冨田博之、2200円、ISBN4-563-01409-5
(この本と同じ内容の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_u02/11/27 13:10ID:M6T+ESir
Xlsoft Corporationの案内で
http://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:Penguin02/11/28 01:16ID:Aj/Ka3kq
カーネルとモジュールとライブラリがビルドできて、相互に取り混ぜてつかえ
たらすごいな。インラインASMの部分などは、無理だろうから、デバイス
ドライバーなどは、全面書き直しするしかなかろうと思うけど。
 がんばってOSカーネル丸ごとチャレンジして欲しい。
クロックがあがったように体感速度が上がれば素晴らしい。
SSE命令などを使ってデーターのバッファー転送を高速化したり、
サウンドドライバーが音質が向上したり、
XーWindowsが飛ぶように速く動くようになればめでたい。
0413login:Penguin02/11/28 01:40ID:zRfKz+Ms
>>412
どこを縦読みすればいいのでつか
0414login:Penguin02/11/28 17:06ID:TwGoRG+a
bind samba openssl openssh apache2 と icc7 でコンパイルに成功したけど、
emacs で遂に挫折。
0415login:Penguin02/11/28 17:18ID:rzTXVehE
>>414
どこか変化した?
0416login:Penguin02/11/29 00:00ID:CcQhIMOA
カーネル最適化してもなぁ...
0417login:Penguin02/11/30 05:16ID:LPoU/MM7
-vms オプション付けても、VAX FORTRAN 拡張の
関数・サブルーチンは使えないのかな。
0418login:Penguin02/12/01 07:17ID:Smn19ga0
icc で PREFETCH ってどうやったら効くのかな?

ピボッティングもスケーリングもやってない
単純な LU 分解のコードを試してみたけど、
icc -xW -tpp7 と gcc -O2 (2.95.3)で実行速度が変わらない。
で、 -S してみたらどうも PREFETCH を使ってないみたい。

まだ、 ccc ほど賢くはないのかな。
だとしたら Xeon*2 買うより AthlonMP*2 買ってた方が
HARDWARE PREFETCH の恩恵にぞくせてよかったかも。
0419login:Penguin02/12/01 09:11ID:6cxWcw03
>418
Pentium4コアのC1 stepping以降はhardware prefetchのバグ(errata P46)が
直っているはずですぞ。Xeonも同じです。
0420crazy_u02/12/01 18:53ID:Q5N6niNl
>>418
マニュアルを見ると,-O3にしないとprefetchはかからないようですよ.
"Intel C++ Compiler User's Guide"の
[Optimizations]/[Optimaization Levels]/[Setting Optimizatin Levels]
の"IA-32 and Itanium Compilers"に書いてある.
0421crazy_u02/12/01 19:18ID:Q5N6niNl
>>418
性能を向上しようと思ったら,コンパイルオプションもそれなり設定してコンパイル時のメッセージとかも見て,
最適化制御行を入れたり,コンパイラが理解できる(最適化しやすい)ようにコードを書き換えたりしないと性能はあがらないよ。
0422login:Penguin02/12/03 09:57ID:EIrgZrpN
P4-2.26でifc7を使い、自分のコードだがvector化するだけで実時間が1/4になった。
dtimeの計測では同じ数字なのだが、うれしいがわけわからん。
0423login:Penguin02/12/03 10:35ID:5aayB2ks
数値計算用に dual athlon 買う予定なんで興味あるのですが、athlon でもかなり効果ありますか?
それとも P4, Xeon*2 (高いんで手が出ないかも)にすべきなのでしょうか?
過去スレ読んだつもりですが、イマイチはっきりしないので。
0424login:Penguin02/12/03 10:45ID:X1BM48vg
>>423
intelが敵に塩を送るようなことはしないと思われ
0425login:Penguin02/12/03 11:17ID:5aayB2ks
>>424 と、常識的には思ったんだが、使えるみたいだし。
あと、intel 用に optimize したら意外と athlon でも行ける、という
こともありうるかな、と思って。(意図的に intel 専用のコードを使って
壊すとかしなければ。)
0426login:Penguin02/12/03 11:29ID:g4+eV5lN
kernel 2.5.45付近でintel compiler用patchって文字があったんで、
お手軽にコンパイルできるのかと思ったけど、そういうことではないのね。
dependency fileのフォーマット違いを適当に変換してcompileしてみたけど、
include fileがらみで止まったので、とりあえず放置中。
0427login:Penguin02/12/03 13:32ID:MBmEQllb
レス tnx.

>>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_u02/12/03 23:43ID:biU06C3s
>>427
参考までに,>>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:Penguin02/12/04 05:11ID:nRFkxlL9
>>428
GFLOPS換算だと、どういう性能値になるのかな?
0430crazy_u02/12/04 20:16ID:LtG05CzF
>>429
<演算回数>
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_u02/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:Penguin02/12/04 23:39ID:pg0evXMe
祝、Hyper-Threading対応age

インテル、Hyper-Threading対応コンパイラを発表
http://www.watch.impress.co.jp/pc/docs/2002/1204/intel.htm
0433login:Penguin02/12/05 06:46ID:/JxgZHh9
マルチジョブ環境ではない、シングルジョブの環境では、
user+sys を演算にかかった時間とするというのは、
たとえばスワップなどの待ちが発生していない場合には、まあ妥当だと
思うが、現実の計算させている側からみると、user+sys よりも
現実にかかったWallClock(実時間)の方が意味を持つ。
メモリーサイズを越えた計算を行う場合には、user+sys の時間と
くらべて実際の時間はうんと長くなることはよくある。
0434login:Penguin02/12/06 16:21ID:tdSYXBjW
>>414
CVSから持ってきた 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:Penguin02/12/07 15:07ID:Ui0kbuxO
>>434
21.2で試してみたけど上手くいかなかった。残念。
temacsは出来たけど、ldd temacsすると
/usr/bin/ldd: ./temacs: No such file or directoryと言われる。
リンクにミスってるのかな。もうちょい調べてみます。
043643502/12/07 15:20ID:Ui0kbuxO
/lib/ld-linux.so.2がリンクされてなかったのが原因でちた。
0437login:Penguin02/12/07 15:40ID:Ui0kbuxO
とはいえ、確かに速くなったのかサッパリわからんですねえ(w。
とりあえずMule-UCS込みでemacsをdumpするほうを頑張ろう……
0438login:Penguin02/12/07 21:10ID:fP7YPqYN
>>437
M-x hanoiで時間計ってみてら?
0439login:Penguin02/12/07 23:19ID:Ui0kbuxO
>>438
おお、なるほど。
elpでみると、一割弱ぐらいicc版のほうが速いかなといえなくもない感じですが、
実行の度にバラつきが大きいので、きちんと統計とらないとなんとも。
……という程度の違いぐらいでしたw
0440login:Penguin02/12/08 16:02ID:t1EMsFPn
遅ればせながら私もiccを試そうと思い立ち、さっそくICC7.0の30日間
お試し版ライセンスでダウンロード&インストールしてみました。

で、とりあえず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:Penguin02/12/08 21:35ID:u1M6xTCC
>>440
どんな Hello world 書いたのかまずは晒せ
04423002/12/10 15:16ID:Ws55tYEe
linux版ifc6.0=>7.0に乗り換えたのですが、長時間計算させていると
adress errorというものが出るようになりました。これはなにが
原因なんでしょうか?
0443login:Penguin02/12/10 19:50ID:p6pBFSA9
User's Guideには
Usually caused by a wrong value being used as an address
(check the associativity of all pointers).
って書いてあるよ。

いきなり落ちるんだったらAllocatableな変数をallocateしないで
渡しちゃったとかって感じだろうけど、
しばらくして落ちるのはなんだろうね。
pointerを使ってるんだったら、そこを集中的に見てみるといいんじゃないかな。
0444login:Penguin02/12/10 20:29ID:WQilySMD
どーも intel の人が FreeBSD にも興味を示し始めてるらしい。
出るといいな。そんな感じのメールが今日僕のところに来ました。
04453002/12/11 00:57ID:KREW2anI
>443

なるほど。pointerは使っていないので、原因はよくわかりませんね・・。
2週間くらい落ちずに計算してほしいので、6.0に戻すことにします。
ありがとうございました。
0446login:Penguin02/12/11 03:23ID:ngo2KBLZ
ソースうpしる!!
044744002/12/12 14:02ID:fC7hqe+l
>>441
すみません。どうも、2.2系列のkernelで実行していたのが原因のようです。
2.4系列のマシンで試したところ、ちゃんと動きました。
0448おむこさん志望 ◆QtGqCwfDSA 02/12/12 19:18ID:Gd+VRRob
>>439
lisp のベンチマークなら竹内関数が有名。
(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+VRRob
>>448 は Scheme 用だたーよ
emacs 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:Penguin02/12/13 08:15ID:zhmsFywd
>>448
不勉強なもんで、竹内関数の「た」の字も知りませんでちた。

それはさておき、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:Penguin02/12/19 17:03ID:5E3T5r1w
ライセンス送られてこねーよ
バージョン7って6の時のやつ使えますか?
0452login:Penguin02/12/19 17:08ID:C7axpMDs
>>451
自分で試せることあるなら先にやってから愚痴言えばいいじゃん。
0453login:Penguin02/12/20 12:29ID:GkB+B9PY
>>442
CPUが過熱しているのでは?浮動小数点計算回路は、相当に熱を出すので、
浮動小数点計算をフルに稼動させると、そうではない場合にくらべて
かなり冷却をまじめにしなければいけなくなります。
CPUの温度が上がると、回路の動作可能速度が落ちてしまい、
回路がクロックについていけなくなるのです。
0454login:Penguin02/12/20 13:32ID:/crymO6Z
[ie]cc 7.0 新しいのが出てるっすね。
% 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:Penguin02/12/20 13:35ID:/crymO6Z
>>454
Q148399,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:Penguin02/12/20 13:36ID:/crymO6Z
>>455
書き忘れた。l_cc_p_7.0.065 からの icc の修正点です。
0457login:Penguin02/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:ouu1I4jc






       http://freeweb2.kakiko.com/dengeki/indexc.htm




0459login:Penguin02/12/24 16:22ID:4v+Gtyjb
>>457 ?? 一人、一つのバージョンにに関して 1 つのライセンスしか
取れない、って書いてあるけど??
0460crazy_u02/12/24 21:05ID:OYox6oQQ
>>457
https://premier.intel.com
へいって,既に取得しているユーザIDとパスワードでログインして,"Download"か"What's New"へいけばOK.
既に取得しているライセンスは新しいバージョンでも継続して使えます.
■ このスレッドは過去ログ倉庫に格納されています