Intel アーキテクチャ
自分で作ったプラグインを「どの程度のもの?」と評価なんぞを。
まぁ、凹みますわ。
そもそも、アセンブラをやる羽目になろうとは。
その筋の人は聞いた事のある『ムーアの法則』
「CPU の集積率は2年で倍」という例のヤツ。
「地味にアセンブラで書く時代は終わるだろう」と思ってたのに。
ところが、まだまだ需要はあるわけですね。
そんな私はこのプラグインを作るまで
x86 の命令コード(Instruction)すら良く知らなかったわけで
Intel社の技術資料 から幾つか落としてきて斜め読みしたり。
私自身 RISC アセンブラ経験があり、ヘネパタを一通り読んだ事があるので
前知識があると言えばあるのですが、
それにしても x86 は複雑過ぎ。
CISC を引きずっている CPU というのは、こうも複雑なのかと。
アセンブラ・チューニングというのは幾つか段階があるんですね。
『第1段階』Sequence をアセンブラ命令セットでとにかく実装する。
これには、
・どういうレジスタがあって
・どういう命令セットがあって
・どう組み合わせれば良いか
という知識が必要になります。
C 言語で普通に組んだ場合にコンパイラが吐かない命令を書けるところに
メリットがあります。
『第2段階』最適命令の選択。
ある処理を実装する場合、方法は幾つもあるんですね。
・同様の結果をもたらす異なる命令セット
(x86 の例であげると、decとsubや、cmpとtest、movとlea)
これを判断するには命令セットのクロック数などの知識が必要。
『第3段階』高速化テクニック
・2つ以上の実装方法アイデア
(分岐ミスペナルティ、分岐予測とか、ループアンロールとか)
が有る事を理解した上で、どちらの方が優れているか。
これらは、高速化テクニックそのものを知っているかどうか。
その効果がどの程度現れるかを知っているかどうか。
『第4段階』パイプライン
これはパイプラインがどの様に実行されるかイメージできる事が必要
なんですね。
EX ステージが幾つとか、フォワーディングがどうのとか。
この知識があると、命令コードと命令コードの間にストールサイクルが
見えてきます。
ストールが無くなるように命令を置き換えてやれば良いわけです。
『第5段階』メモリリード、ライト
実メモリ上のデータがどうやってレジスタまで持ってこられるか。
まぁキャッシュですね。
これが 1-way や 2-way ぐらいなら、まだ着いて行けるんです。
4-way とか L2 とか、もう訳がわかりません。
ライトについては、ライトバッファの個数、ライトバック、ライトスルーなどです。
『第6段階』投機実行
スーパースカラなどパイプライン入り口の事です。
「Uパイプ, Vパイプってなんだよ」と思っていたらPentium3以前の話らしい。
(注;私の理解そのものもあやしいですが)
Intel の場合は CPU ファミリごとにこの辺が入れ替えられているようで、
uOP(マイクロオペレーション)がどうの、と言ってたら、もう古いらしい。
『第7段階』キャッシュ
キャッシュの最適化、というのは直接的に見えない分、分かりにくいです。
段階はまだまだ先があるかもしれません。
x86 の場合はアーキテクチャが複雑で、幾ら掘り出しても、
まだ新しいアーキテクチャが埋まっている。
そんな感じ。
「アーキテクチャを全部理解するなんて到底無理。」と半ばあきらめムードに
なってしまうんですね。
アーキテクチャの奥が深いのです。
登っても登っても頂上が見えてこない山の様です。
私がやったチューニングと言えば、せいぜい『第3段階』
この地味なチューニング、自動車のチューニングに喩えると
エンジンのシリンダの中を滑らかにして、というのに近いものがあります。
つまり、努力の割にたいして速くならない、でも確実に効果はある。
昔はちょっとでも速くなると嬉しくて「もっともっと」と思ってたものですが、
今は「もうこの辺でいいや」と、そんな気分になってしまいます。
で、何を凹んでたかと言うと、
組んだルーチンをテストしてたんですね。
ルーチンごとにどのぐらい効果が出たかを。
出力サイズをちょっとずつ大きくしていくと、
ある段階でいきなり処理時間が(サイズ変更前の)倍ぐらいの遅さに。
しかも、そんな時に限って
苦労して組んだアセンブラルーチンより C 言語の方が数段速かったりして。orz
これは、おそらくキャッシュですね。
キャッシュリプレースの応酬が起っているのだと推測されます。
ある意味、コリジョンが発生していると言ってもいい。
「なんだ結局はキャッシュなのかよ」
チューニングしたのに思ったように結果が出なくて凹んでたわけです。
そんな今日、SSE に非テンポラルストアと言う物が有る事を見つけました。
これかなぁ。
でもやっぱりアラインメントを合わせてやらないとダメなんだろうか。
(それは非常に手間だ)
まぁ、凹みますわ。
そもそも、アセンブラをやる羽目になろうとは。
その筋の人は聞いた事のある『ムーアの法則』
「CPU の集積率は2年で倍」という例のヤツ。
「地味にアセンブラで書く時代は終わるだろう」と思ってたのに。
ところが、まだまだ需要はあるわけですね。
そんな私はこのプラグインを作るまで
x86 の命令コード(Instruction)すら良く知らなかったわけで
Intel社の技術資料 から幾つか落としてきて斜め読みしたり。
私自身 RISC アセンブラ経験があり、ヘネパタを一通り読んだ事があるので
前知識があると言えばあるのですが、
それにしても x86 は複雑過ぎ。
CISC を引きずっている CPU というのは、こうも複雑なのかと。
アセンブラ・チューニングというのは幾つか段階があるんですね。
『第1段階』Sequence をアセンブラ命令セットでとにかく実装する。
これには、
・どういうレジスタがあって
・どういう命令セットがあって
・どう組み合わせれば良いか
という知識が必要になります。
C 言語で普通に組んだ場合にコンパイラが吐かない命令を書けるところに
メリットがあります。
『第2段階』最適命令の選択。
ある処理を実装する場合、方法は幾つもあるんですね。
・同様の結果をもたらす異なる命令セット
(x86 の例であげると、decとsubや、cmpとtest、movとlea)
これを判断するには命令セットのクロック数などの知識が必要。
『第3段階』高速化テクニック
・2つ以上の実装方法アイデア
(分岐ミスペナルティ、分岐予測とか、ループアンロールとか)
が有る事を理解した上で、どちらの方が優れているか。
これらは、高速化テクニックそのものを知っているかどうか。
その効果がどの程度現れるかを知っているかどうか。
『第4段階』パイプライン
これはパイプラインがどの様に実行されるかイメージできる事が必要
なんですね。
EX ステージが幾つとか、フォワーディングがどうのとか。
この知識があると、命令コードと命令コードの間にストールサイクルが
見えてきます。
ストールが無くなるように命令を置き換えてやれば良いわけです。
『第5段階』メモリリード、ライト
実メモリ上のデータがどうやってレジスタまで持ってこられるか。
まぁキャッシュですね。
これが 1-way や 2-way ぐらいなら、まだ着いて行けるんです。
4-way とか L2 とか、もう訳がわかりません。
ライトについては、ライトバッファの個数、ライトバック、ライトスルーなどです。
『第6段階』投機実行
スーパースカラなどパイプライン入り口の事です。
「Uパイプ, Vパイプってなんだよ」と思っていたらPentium3以前の話らしい。
(注;私の理解そのものもあやしいですが)
Intel の場合は CPU ファミリごとにこの辺が入れ替えられているようで、
uOP(マイクロオペレーション)がどうの、と言ってたら、もう古いらしい。
『第7段階』キャッシュ
キャッシュの最適化、というのは直接的に見えない分、分かりにくいです。
段階はまだまだ先があるかもしれません。
x86 の場合はアーキテクチャが複雑で、幾ら掘り出しても、
まだ新しいアーキテクチャが埋まっている。
そんな感じ。
「アーキテクチャを全部理解するなんて到底無理。」と半ばあきらめムードに
なってしまうんですね。
アーキテクチャの奥が深いのです。
登っても登っても頂上が見えてこない山の様です。
私がやったチューニングと言えば、せいぜい『第3段階』
この地味なチューニング、自動車のチューニングに喩えると
エンジンのシリンダの中を滑らかにして、というのに近いものがあります。
つまり、努力の割にたいして速くならない、でも確実に効果はある。
昔はちょっとでも速くなると嬉しくて「もっともっと」と思ってたものですが、
今は「もうこの辺でいいや」と、そんな気分になってしまいます。
で、何を凹んでたかと言うと、
組んだルーチンをテストしてたんですね。
ルーチンごとにどのぐらい効果が出たかを。
出力サイズをちょっとずつ大きくしていくと、
ある段階でいきなり処理時間が(サイズ変更前の)倍ぐらいの遅さに。
しかも、そんな時に限って
苦労して組んだアセンブラルーチンより C 言語の方が数段速かったりして。orz
これは、おそらくキャッシュですね。
キャッシュリプレースの応酬が起っているのだと推測されます。
ある意味、コリジョンが発生していると言ってもいい。
「なんだ結局はキャッシュなのかよ」
チューニングしたのに思ったように結果が出なくて凹んでたわけです。
そんな今日、SSE に非テンポラルストアと言う物が有る事を見つけました。
これかなぁ。
でもやっぱりアラインメントを合わせてやらないとダメなんだろうか。
(それは非常に手間だ)
| 固定リンク
| コメント (0)
| トラックバック (0)