![スラド スラド](https://srad.jp/static/topics/srad_64.png)
ttの日記: そんな、俺が優秀ってことになってしまうじゃないか 5
日記 by
tt
http://www.ne.jp/asahi/comp/tarusan/main66.htm
なかなかおもしろい。元々ベクトルコンピューター使いだったので懐かしくもある。が
例えばPC用コンパイラではコンパイラの吐き出す最適化コードの方が人手で改良したコードより優秀なことはもはや常識で、今時アセンブラでコードをいじる人は滅多にいない。手を加えるプログラマのスキルがよほど高くなければ、多くの場合人手によるチューニングは逆効果となってしまうのである。
とりあえずそんなことはない、と言いたい。
どうでしょう (スコア:2, 参考になる)
商用コンパイラ(の評価版)よりも性能が上がりました。
でも、トリッキーな最適化はそれほど多くなかったです。
単位行列の掛け算はただの足し算に帰着できるなど、
数学的に省略できる計算がかなりありました。
コンパイラもプログラムの流れを読むことができれば、
かなり改善されるのではと思いました。
HPC分野に関しては無知なので全然分かりませんが…。
う~ん (スコア:1)
なかなかチューンアップするのは難しいですよん。
やっぱり、自分で手を入れたほうがいいって言える人は
結構優秀なのだと思います。
私もBASICとアセンブラ(当時の石はZ80)から入ったので、
コードをカリカリにチューンするのは嫌いじゃないんですけどね。
Re:う~ん (スコア:1)
内部がRISCエンジンで作られたハードx86エミュレータですよね。
だから、中で具体的にどう処理されるのかはわからないし、制御も難しい。
結局、パイプラインをフルに稼働させ、最大限の能力を引き出すコードを書く前に、
命令デコーダのクセを掴んでどうやるか…とかそういうレベルになるわけで。
# 4ー1配列とか聞いたけど、詳しくは知らない。
実際にはEAX、EBX、ECX、EDXとかのレジスタがあるわけではなく、
内部の何十本とある、RISCエンジンの内部レジスタのうち、
どれかに格納されているのでしょうし、外部からはメモリ上にあるはずのデータが
キャッシュに載ってるのか、レジスタリネーミングで内部レジスタに
格納されているのか、本当のところはわからない。
任意の割り込みでどれほどCPUのキャッシュが荒れているのかだって不明。
MMXとか、SSEとかを使って特定の状況でパフォーマンス改善っていうのなら、
対応した特定のコードを入れて高速化できるんだろうけど、
普通のコードをアセンブラで組んだ場合、下手をすると
アウトオブオーダでぜんぜん違う順番の実行をしてたりすることもある。
CPUにおまかせできるっていう点では便利なんだろうけど、
結局命令デコーダの特性やら、実行ユニットの数や処理能力によって
内部の処理は大きく変化するので、「なんだかな~」と感じます。
Pentium4なんかだと、倍速ALUがあるから、凝ったシフト演算を
かけるより、単純な加減算を繰り返したほうが速かったりしますし、
トレースキャッシュというものを積んでますが、あれは確か、
変換済みのRISCコードをキャッシングしてしまう技術ですよね。
どのくらいのコードならうまくキャッシュに収まるのか判断がつきにくい。
キャッシュ容量によってはループを展開したほうが速い場合と、
分割してもっと小さいループにしたほうがいい場合ってのがあるはずですが、
困ったことにこの容量はCPUのタイプだけでなく、グレードによっても違う。
もちろん、パイプラインの段数によっても命令の流し込み方は変えたほうがいいわけで、
そういったこまかい特性をいちいち考えてコードを組むぐらいなら、
いっそ優秀なコンパイラにおまかせして…となるんですよねぇ。
数年前までは手書ASMの方が早いと言い切れましたが、 (スコア:1)
Re:数年前までは手書ASMの方が早いと言い切れましたが (スコア:0)