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

「Cell SPUのスカラ演算、整数演算、分岐」の編集履歴(バックアップ)一覧に戻る

Cell SPUのスカラ演算、整数演算、分岐 - (2008/11/16 (日) 13:49:32) の編集履歴(バックアップ)


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


最初に参考リンク


SPUの整数演算は遅いか?

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

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


SPUの分岐は遅いか?

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


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

上記フィックスターズの記事にあるとおりLSからのロード、LSへのストアで無駄が発生することが多い。
ただし128bitレジスタが128本あるので可能な限りオンレジスタで演算させるのがSPU流なので、
そんなにコストが発生するわけではないと思われる。

ロード

  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.  
  14.  
byte、halfwordの場合だけ12.のローテートが必要

ストア

  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($rb)
  18.  

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



ツールボックス

下から選んでください:

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