Cell SPUのスカラ演算、整数演算、分岐


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

比較対象がないと速いか遅いかを論じるのは意味なし。
なので結論は出さず。


最初に参考リンク
目次



SPUの整数演算は遅いか?

整数演算の性能は次の通り
  • 128bit x1 論理演算
  • 32bit x4 四則演算、論理演算
  • 16bit x4 積和演算
  • 16bit x8 四則演算、論理演算
  • 8bit x16 特殊演算
が毎サイクル実行可能、レイテンシは2、または4サイクル。

ちなみに浮動少数演算の性能は次の通り
  • float x4 積和演算 が毎サイクル実行可能、レイテンシが6サイクル
  • double x2 積和 が7サイクルで実行可能、レイテンシが13サイクル


SPUの分岐は遅いか?

パイプラインが26段と深いため、分岐予測が外れた場合のペナルティは17~18サイクルと大きい。
ハードウエアで動的分岐予測機構を持たないが、ソフトウェア的に分岐ヒント命令と条件選択命令を持つ。
分岐ヒントの予測が正しければ分岐のペナルティは0。
また2値のいずれかの選択だけの分岐であるなら、投機的に2値をどちらも計算した上で条件選択命令を使うことで
分岐自体をなくすことが可能。


SPUのスカラ演算は遅いか?

SIMD演算器しかないのでスカラ演算でもそこで行う。
なので計算の速さはスカラでもベクタでも同じ。
ただしスカラの場合は、上記フィックスターズの記事にあるとおりLSからのロード、LSへのストアで
無駄が発生することが多い。
とは言っても128bitレジスタが128本あるので可能な限りオンレジスタで演算させるのがSPU流なので、
LSへのアクセスも必要最小限にとどまると思われる。

ロード

  1. # アライメントがとれていないbyteをロードする
  2. # $ra : アドレス
  3. # $rb : 結果をいれる
  4.  
  5. # $raの下位4bitは無視されるため自動的に16バイトアラインでロードされる
  6. lqd $rb, 0($ra)
  7.  
  8. # $raの下位4bitを使って$rtをバイト単位でローテートすることでMSBに移動させる
  9. rotqby $rb, $rb, $ra
  10.  
  11. # プリファードスロットへさらにローテート
  12. rotqbyi $rb, $rb, -3
  13.  
byte、halfwordの場合だけ12.のローテートが必要。
アライメントがとれていれば6.の1命令だけでいい。

ストア

  1. # byteをストアする
  2. # $ra : アドレス
  3. # $rb : バイトデータ
  4. # $rc, rd, re : テンポラリ
  5.  
  6. # まずストア位置のデータをロードする
  7. lqd $rc, 0($ra)
  8.  
  9. # バイト挿入マスクの生成
  10. cbd $rd, 0($ra)
  11.  
  12. # シャッフル
  13. # rbのプリファードスロットとrcのプリファードスロット以外とを合成する
  14. shufb $re, $rb, $rc, $rd
  15.  
  16. # ストアする
  17. stqd $re, 0($ra)
  18.  
ストアはアライメントがとれてる/とれていないにかかわらず基本的に上記の手順が必要。
クアッドワードならもちろん1命令で可能。

32bitの乗算がないってほんと?

まじで32bitの整数乗算をするインストラクションはない。
16bitの乗算命令(出力は32bit)を組み合わせて実現する。
一般的に5つのインストラクションが必要。


  1. int32_t mul_s32x2_to_s32(int32_t a, int32_t b)
  2. {
  3. return a * b;
  4. }
  5.  

次のようにコンパイルされる

  1. # $3 : a
  2. # $4 : b
  3.  
  4. # aの上位ハーフワードとbの下位ハーフワードを乗算
  5. mpyh $6,$3,$4
  6.  
  7. # bの上位ハーフワードとaの下位ハーフワードを乗算
  8. mpyh $5,$4,$3
  9.  
  10. # aの下位ハーフワードとbの下位ハーフワードを符号無しで乗算
  11. mpyu $3,$3,$4
  12.  
  13. # 以上をすべて足し合わせる
  14. # 32bitに収まることが前提なので上位ハーフワード同士の乗算は行わない
  15. a $2,$6,$5
  16. a $3,$2,$3
  17.  
  18. # リターン
  19. bi $0
  20.  

LSはL1並に速いか?

load/store のレイテンシは6サイクル


ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。