08/10/05 23:45:58 jHPZNbsT
>>141
それはどうも。
ただ、MACヲタの間違いは俺は認めていない。
APIとして提供されるFiberは関数を順番に呼び出すだけの昔ながらのスケジューラ以外のなんでもない。
Larrabeeがやるのは、JITコンパイル時のソフトウェア・パイプライニング。
Larrabeeの場合1つのスレッドで最大の64 Strandを扱うわけではない
64 strandを扱う場合は同じコアで動く4つのスレッドでレイテンシを埋める。
均等に振れば、たとえばレイテンシ:スループット8:1のSIMD命令ならどのスレッドも8:4となり、
もうひとつくらいのファイバーとインターリーブするだけでレイテンシが埋められる。
図を描くか。
→クロックサイクル
スレッド1 ■■■■■■■■ファイバー1[0-15]
スレッド2 ■■■■■■■■ファイバー1[16-31]
スレッド3 ■■■■■■■■ファイバー1[32-47]
スレッド4 ■■■■■■■■ファイバー1[48-63]
スレッド1 ■■■■■■■■ファイバー2[0-15]
スレッド2 ■■■■■■■■ファイバー2[16-31]
スレッド3 ■■■■■■■■ファイバー2[32-47]
スレッド4 ■■■■■■■■ファイバ-2[48-63]
・・・・・・・・・・・・
これを各スレッドからみると単に2つのフローを交互に実行するだけに見える。
各スレッドが使うレジスタ数も均等に消費するので経済的。
で、FiberあたりのStrand数が少ないと、命令のレイテンシに応じて、
インターリーブするファイバーのほうを増やさないといけない。
x64アーキテクチャは各レジスタが4ビット、つまり16本しかないないのでできるだけ節約したい。
64 Strandがベストということになるね。