目次
これは何?
この本は PS3 + Linux + Cell SDK で行う Cell/B.E. (PS3に搭載されているCell) のSPEのプログラミングについて解説した技術系同人誌です. SPEプログラミングの入り口から結構面白くなってくるところ (のちょっと先) までを一通り紹介しています. 『SPEプログラミング面白いからさ,お前もちょっとやってみろよ. 最近PS3使ってないんだろ? ほら,これ見りゃ大体わかるからさ.』 的な感じで紹介できる本を目指したつもりなんですが,果たして・・・.
本の目次
まずは目次を見て中身の雰囲気を察してやってください.ちなみにB5判で表紙抜きで256ページです.量的にはちょっとしたインターフェース増刊みたいな感じ?
- 第1章 はじめに
- 1.1 この本は何?
- 1.2 この本を読み進めるには何が必要?
- 1.3 本書の流れ
- 1.4 本書での表記
- 第2章 Cell/B.E.とSPEのアーキテクチ
- 2.1 アーキテクチャとインプリメンテーション
- 2.2 Cell/B.E.の全体構成
- 2.3 PPE
- 2.4 SPE
- 2.5 アドレス空間とメモリモデル
- 2.6 実際のCell/B.E.
- 第3章 開発環境の準備
- 3.1 色々な開発環境の構成
- 3.2 開発環境の構築に必要となるもの
- 3.3 PS3へのFedora 9のインストール
- 3.4 PS3へのCell SDKのインストール
- 第4章 SPEを1個だけ使うプログラム
- 4.1 SPEのプログラムを呼び出す流れ
- 4.2 SPE のプログラムを呼び出すAPI
- 4.3 Hello World
- 第5章 SPEの演算機能
- 5.1 SPEのSIMD演算
- 5.2 バイトの並びとビットの番号
- 5.3 ベクタとスカラ
- 5.4 組み込み関数によるSPEの演算処理の利用
- 5.5 演算処理向け型総称組み込み関数
- 5.6 SPUのパイプライン
- 5.7 SPEの浮動小数点数
- 5.8 SIMD数学ライブラリ
- 第6章 SPEのプログラムの最適化
- 6.1 SPEのプログラムの最適化とは
- 6.2 C言語プログラマのためのアセンブリ言語超入門
- 6.3 SIMD化
- 6.4 分岐の最適化
- 6.5 ループの最適化
- 6.6 SPUのパイプラインのチューニング
- 6.7 データの参照の最適化
- 6.8 関数のインライン展開
- 6.9 デクリメンタで実行時間を測る
- 第7章 LinuxとSPE
- 7.1 spufs
- 7.2 libspe2
- 第8章 SPEを複数使うプログラム
- 7.1 複数コンテキストの同時実行
- 7.2 複数のSPEを同時に動かす例
- 第9章 チャネルとメッセージング機構
- 8.1 チャネル
- 8.2 メールボックス
- 8.3 シグナル
- 第10章 DMA
- 9.1 DMA転送
- 9.2 フェンスとバリア
- 9.3 リストDMA
- 9.4 アトミック更新
- 9.5 LS間のDMA転送
- 9.6 PPEからのDMAの利用
- 9.7 DMA転送の最適化
- 第11章 プログラムの並列化とデータ転送のチューニング
- 11.1 SPEプログラムの並列化
- 11.2 並列化後のプログラムのチューニング
- 第12章 プロブレムステート領域
- 12.1 プロブレムステート領域のレジスタのアドレス
- 12.2 DMA転送要求・完了確認
- 12.3 メールボックスの利用
- 12.4 シグナルの利用
- 12.5 SPEから他のSPEのMFCにDMA転送を要求する例
- 第13章 外部関数呼び出し
- 13.1 stop-and-signalと外部関数呼び出し
- 13.2 標準で提供されている外部関数呼び出し
- 13.3 独自の外部関数の追加
- 13.4 コールバック関数での引数の参照と戻り値の設定
- 13.5 コールバック関数の追加と呼び出しの具体例
- 13.6 __send_to_ppeの内部処理とstop-and-signal命令の生成
- 第14章 イベント
- 14.1 イベントの概要と管理
- 14.2 イベントの種類
- 14.3 イベントの検出と処理
なお, しら「」氏による趣味全開の表紙は非常に萌え萌えな感じですが, 中は「萌えるSPEプログラミング」というようなノリではまったくなく, どう見てもガチガチのてふてふです. くれぐれもお間違えのないよう,よろしくお願いします. 内容の雰囲気は,内容の紹介をご参照ください.
前作との違い
C76で 『SPEを256倍使うための本 -力の16倍編-』 および 『SPEを256倍使うための本 -技の16倍編-』 を購入された方は「前作と何が違うのか」と疑問に思われるかと思いますが, この本はこれらを1冊にまとめた上で, さらに大幅に加筆修正を行ったものになります. 新規に100ページ以上書き起こし, 既存の部分も内容を見直して大幅に手を入れました. 前作と比べてかなりのパワーアップをしています. 特に最適化の部分についてはほとんど別物となっているので, C76でお買い上げいただいた方にも存分にお楽しみ (ご活用?) いただけるかと思います.
増刷版について
C77よりも後に頒布しているのは, C77で頒布した初版第1刷ではなく, 増刷版 (初版第2刷以後のもの) となります. 増刷版は,内容的には第1刷のものからの変更はありませんが, 第1刷に多数見られた誤字脱字や図の間違いの修正などを行っています. また,同様に,第1刷に多数存在した読みにくい文章や意味を取り違えやすい文章, 日本語が破綻している文章などに関して,読点の追加削除や文章の分割, 言い回しの変更などを多数行って改善を図っています.
誰得?
こんな人にお勧め・・・かもしれない
- SPEでどんなことができるのかをざっくりと把握したい人
- PS3でプログラミングを体験してみたいけど, どこから手をつければいいのかよくわからなくて困っている人
- PS3にLinuxを入れてみたけど,その後特にすることもなく持て余している人
- Webなどを見てPS3 Linux上で簡単なプログラムを書いて動かしてみたけど, どうもモヤっとしたところが色々あってすっきりしない人
- ある程度SPEプログラミングができるけど, しばらく間が空くとすぐAPIや細かなルールを忘れてしまい, その都度長大なリファレンスを参照するのが面倒で仕方ない人
- SPEプログラミングが面白いから他の人にも始めるように勧めてみたけど, 参考資料として教えてあげたSCEIのページにあるPDFを見てドン引きされたことのある人
- 並列プログラミングの講義で, 学生が興味を持ってくれそうな適当な教材が見当たらなくて困っている人
- この時期になっても卒論のいいネタが見つからなくて困っている人
こんな期待には応えられないかも
目次を見ていただければ何が書いてあって何が書いてないのか大体想像がつくかとは思いますが, たとえば以下のような話を期待している人は読むとがっかりすると思うので, ご注意ください.
- SPEを活用して何かのアプリケーションを超高速化した, 汗と涙のドキュメンタリー的なもの
- SpursEngineとかPowerXCell 8iとかのSPEの話
- デバッガ,メモリコンシステンシ,オーバレイ,パフォーマンスモニタ, ハイパーバイザ関連などの中の人が詳しくない分野全般
- GCC以外のコンパイラの話
- libspe2以外の実行環境の話
- 最先端の開発環境の話 (Cell SDK 3.1ベースなのでちょっと古い)
- 統合開発環境の話
- コンパイラに自動でSIMD化とか分岐の最適化とかやってもらう話
- PS3 LinuxからRSXを叩いたりする話
- PS3に色々なLinuxディストリビューションをインストールしたりする話
- Linux以外のOSの話
- 商用ゲームの開発環境
- XBOX360と比べてどうこうみたいなゲーム機としての話
- どのドキュメントにも載っていないような秘密のCell/B.E.機能
- インラインアセンブラを使った人間コンパイラ的なもの
- celltripperの解説
- すべてを網羅したリファレンスマニュアルとしての機能
- P.S.すりーさんみたいな漫画
わからないことや試せないことは書かない主義です (`・ω・´) ・・・っていっぱいありすぎて全然ダメじゃん (´・ω・`)
あと,ちょっとだけ難易度高めかもしれません. 特にアーキテクチャ系の用語とかOS系の用語とかがポンポン出てきます. これを機に勉強してみるというのであればよいのですが, そういうところから手取り足取り・・・ということを期待されてしまうと, やはりがっかりしてしまうかもしれません.
・・・ってこうして並べてみるとダメなところだらけの本にしか見えませんね ・・・ (´・ω・`)・・・でもきっと面白いよ! (`・ω・´)
入手方法
内容の紹介
とりあえず第2章から第14章までの各章にどんな感じのことが書かれているのか紹介します. 適当に抜き出した章のページの画像もあわせて掲載しますので, 雰囲気を感じ取ってください. なお,繰り返しになりますが中身は全編通してこんな具合です. (ごく一部の人を除いて) ちっとも萌えない ガチガチのてふてふな本ので,くれぐれもご注意ください.
この本ではいきなりプログラムに入らずに, まず第2章でSPEを含めたCell/B.E.のアーキテクチャについて解説します. また,第3章ではSPEプログラムの開発環境の構築手順などを紹介します. いまさらネットに転がってることと同じことを書いても仕方ないので, ちょっとだけ玄人好みな入れ方になってます. 第3章は前作にはなかった新規の内容となっています.
第4章ではHello Worldの動かし方とかを紹介します. 単に「こう書けば動く」という入り口がゴールみたいなことはせず, SPEプログラムを動かすのに使うlibspe2のAPIについてもきっちり解説しています. あとソースコードには前作にはなかったコメントがちょこちょこ入ってます.
第5章ではSPEの演算機能を扱います. 前半では「SIMDとは何か」とか「ベクタとは何か」とかそんな話題を絡めつつ, 後半では演算系のintrinsicをまるごと全部解説したりしています. わかりにくいやつは図もついています.
第6章では最適化の話をします. 前半では逆アセンブル結果の読み方やSIMD化の方法などを紹介しています. SIMD化には具体例がついており, よくあるなんちゃってプログラムではなく, きちんと動くホンモノのプログラムをSIMD化するまでの流れを掲載しています. アセンブリ言語に関する部分は前作にはなかった新規の内容になります.
後半は分岐やループ,パイプラインの最適化などを紹介します. ここでも前半でSIMD化した具体例にどんどん最適化を適用していきます. その際,ソースコード (の一部) はもちろんのこと, 効果を確認するためのベンチマーク結果や, 何で速くなったのかを確認するための逆アセンブル結果なども掲載・解説します. なお,この章は前作で2つの章に分かれていたものを統合したような感じになっていますが, 中身は大部分が書き直されています.
第7章ではLinuxでSPEがどう使われているかという話に触れます. ここではspufsやlibspe2の紹介の他, SPE関連のシステムコールの解説などの誰得な話題についても扱っています. また,第8章では複数SPEを同時に利用する方法について紹介します. そして第9章はチャネルとSPEのメッセージング機構 (メールボックスとシグナル) について扱います. 基本的なスペックや使い方はもちろんのこと, PPE側でイベントの仕組みを利用してメールボックスに値が書かれるのを見張る方法といったマニアックなことについても紹介します. PPE側のイベントに関する話題は前作にはなかった内容になります.
第10章ではDMA転送の機能を紹介します. 前半では基本的なDMA転送方式の解説や性能評価, DMA転送を利用した排他制御なんかについても解説しています. 前半の内容は基本的に前作のままですが, 前作でわかりにくかったり解説が不十分だったりした部分は大幅に書き直しています.
また,章の後半ではLS間のDMA転送や,PPEからDMA転送を仕掛ける話, DMA転送のチューニングなどについて解説します. 前者2つは前作になかった新規な話題になります.
そして第11章では第6章であれこれ最適化したSPEプログラムの並列化を行います. また,その上で軽くデータ転送をチューニングすることも行います. 並列プログラムを書いたことがないという人も, これを見れば何となく雰囲気がつかめるかも? ここも前作にはなかった新規の内容になります.
最後の第12章から第14章までは割とオマケ感の強い章です. 第12章ではプロブレムステート領域というところにあるレジスタを叩きます. 主にSPEからよそのSPEにDMA転送要求を出すとか, そんな何の役に立つのかわからない話を紹介します. 第13章では外部関数呼び出しについて解説します. printfみたいに実はPPE側に実体があるような関数がどういう仕組みで動いていて, どうやったら自分で追加できるのかなんていう話が中心となります. そして最後の第14章ではSPEのイベント処理について紹介します. デクリメンタが1周したら割り込みを発生させるとか, おそらく相当マイナーな機能ですが, きちんと使うための仕組みが用意されていたりするのでそのあたりについて解説します. 第12章と第13章については新規に書き起こした章になります. ちなみに索引もついてます.
サポート情報
ソースコード
この本に掲載されているソースコード片のうち, Hack the Cell 2009,メルセンヌ・ツイスタおよび newlib 由来のソースコード片は, それぞれオリジナルのソースコードのライセンス (修正BSDライセンス) に従います. また,それ以外の筆者オリジナルのソースコード片についても修正BSD ライセンスに従うものとします.
- 第4章 SPEを1個だけ使うプログラム
- リスト4.1・4.2: hello.tar.bz2
- 第5章 SPEの演算機能
- リスト5.3: vector_array.tar.bz2
- リスト5.4: vector_array_ng.tar.bz2
- リスト5.5: vector_literal.tar.bz2
- リスト5.6: intrinsics.tar.bz2
- リスト5.8: add64.tar.bz2
- リスト5.9: sub64.tar.bz2
- リスト5.10: mul32.tar.bz2
- リスト5.11: cntb.tar.bz2
- リスト5.12: sel.tar.bz2
- リスト5.13: shuffle.tar.bz2
- リスト5.14: rl.tar.bz2
- リスト5.15: sl.tar.bz2
- リスト5.16: rlmask.tar.bz2
- リスト5.17: intrinsics_scalar.tar.bz2
- リスト5.18: denormal.tar.bz2
- リスト5.19: simdmath.tar.bz2
- 第6章 SPEのプログラムの最適化
- リスト6.1: htc_no_optimize.tar.bz2
- リスト6.2: htc_single_mt_update.tar.bz2
- リスト6.3〜6.10: htc_simd_update_only.tar.bz2
- リスト6.12: htc_single_mt_all.tar.bz2
- リスト6.13: htc_simd_all.tar.bz2
- リスト6.16: htc_branch_hint.tar.bz2
- リストにないけど表6.3に出てる「誤った分岐ヒントあり」の方: htc_branch_hint_wrong.tar.bz2
- リスト6.20: htc_branch_hint_triple.tar.bz2
- リスト6.23: htc_branch_remove.tar.bz2
- リスト6.25: htc_branch_natural.tar.bz2
- リスト6.27: htc_loop_split.tar.bz2
- リスト6.31: htc_loop_unroll.tar.bz2
- リスト6.32: htc_loop_unroll_rename.tar.bz2
- リスト6.33: htc_loop_unroll_doubleloop.tar.bz2
- リスト6.34: htc_software_pipeline.tar.bz2
- リスト6.38: htc_pipeline_odd1.tar.bz2
- リスト6.40: htc_pipeline_odd2.tar.bz2
- リスト6.43: htc_data_load_optimize.tar.bz2
- リスト6.49: decrementer.tar.bz2
- 第8章 SPEを複数使うプログラム
- リスト8.1・8.2: hello6.tar.bz2
- 第9章 チャネルとメッセージング機構
- リスト9.1〜9.4: mailbox.tar.bz2
- リスト9.5: channelcount.tar.bz2
- リスト9.7: ppe_event.tar.bz2
- リスト9.8・9.9: signal.tar.bz2
- リスト9.10: signal_or.tar.bz2
- 第10章 DMA転送
- リスト10.5: dma.tar.bz2
- リスト10.6: listdma.tar.bz2
- リスト10.7: listdma_stall.tar.bz2
- リスト10.8・10.9: atomic.tar.bz2
- リスト10.11・10.12: atomic_sem.tar.bz2
- リスト10.13〜10.15: atomic_mutex.tar.bz2
- リスト10.16: atomic_with_ppe.tar.bz2
- リスト10.17: ls_area_get.tar.bz2
- リスト10.18・10.19: dma_libspe2.tar.bz2
- リスト10.20: dma_nomfcstat.tar.bz2
- 第11章 プログラムの並列化とデータ転送のチューニング
- リスト11.1〜11.7: htc_parallel_basic.tar.bz2
- リスト11.9〜11.13: htc_parallel_tuned.tar.bz2
- 第12章 プロブレムステート領域
- リスト12.1: ps_area_get.tar.bz2
- リスト12.2〜12.6: ps_dma.tar.bz2
- 第13章 外部関数呼び出し
- リスト13.5・13.6: stop_and_signal.tar.bz2
- リスト13.7: send_to_ppe.tar.bz2
- 第14章 イベント
- リスト14.1〜14.3: event.tar.bz2
訂正表
- C77頒布版 (初版第1刷)
- p.11 2.4.1 「EAで領域領域を指定して」→「EAで転送領域を指定して」
- p.50 5.5.2 spu_genbxの説明 「引き算を行いった結果から」→「引き算を行った結果から」
- p.56 5.5.6 spu_cmpeqの説明 「たとえば,aのword0とbのword0が」→「たとえば,aとbがvec_uint4型で,aのword0とbのword0が」
- p.58 5.5.7 spu_gatherの説明 「dのword0のビット24にaのchar0のLSBの値が」→「dのword0のビット16にaのchar0のLSBの値が」
- p.61 5.5.8 spu_maskbの説明 「dのchar0の値の部分のみ」→「dのchar0およびchar15の値の部分のみ」
- p.64 5.5.9 spu_orxの説明 「4つのワードスロット (word0からword3まで) のORを取って結果のword0に格納する」→「4つのワードスロット (word0からword3まで) のORを取って結果をword0に格納する」
- p.69 5.5.9 spu_rlmaskqwbyte・spu_rlmaskqwbytebcの説明 「変数かリテラル (spu_rlqwbytebcは変数のみ) で指定します.」→「変数かリテラル (spu_rlmaskqwbytebcは変数のみ) で指定します.」
- p.69 5.5.9 spu_rlmaskqwbyte・spu_rlmaskqwbytebcの説明 「spu_rlmaskqwbytebcで0から127の任意のビット数に対応した論理右シフトを記述した場合」→「spu_rlmaskqwbytebcで0から128の任意のビット数に対応した論理右シフトを記述した場合」
- p.87 6.3.4 ベクタへのロード「詳しくしますが」→「紹介しますが」
- p.90 6.3.5 「この部分をSIMD化した例を6.9に示します.」→「この部分をSIMD化した例をリスト6.9に示します.」
- p.97 分岐ヒントを使う 「比較の条件の命令は分岐ヒントを与える前と」→「比較命令は分岐ヒントを与える前と」
- p.97 3項演算子への分岐ヒントの適用 「上から順番にレジスタk」→上から順番にk」
- p.97 3項演算子への分岐ヒントの適用 「そうでなくて (lが56以下)」→「そうでなくて (kが56以下)」
- p.98 「レジスタkが56と等しかったら分岐」→「kが56と等しかったら分岐」
- p.110 表6.8 「ループアンローリング後」の実行時間が微妙に間違っていた 「18,632,878」→「18,637,538」
- p.113 表6.9 上と同じで「変数のリネームなし」の実行時間が微妙に間違っていた 「18,632,878」→「18,637,538」
- p.113 表6.9 キャプションが間違っている「ループアンローリングによる性能の変化」→「変数のリネーミングによる性能の変化」
- p.118 6.6.1 「実行ファイルを静的に解析」→「実行コードを静的に解析」
- p.126 6.8.1 リスト6.45のキャプションが間違っている 「関数をインライン展開して欲しいことを伝える記述例」 →「関数のインライン展開を指示する記述例」
- p.126 6.8.2 リスト6.46のキャプションが間違っている 「関数をインライン展開して欲しいことを伝える記述例」 →「関数をインライン展開しないことを指示する記述例」
- p.139 リスト8.4 「float=htbp,belowskip=-3pt]」というLaTeXの記述の残骸が混入している
- p.151 spe_event_waitの説明 「実際に発生したイベント (9.4で示したイベント)」 → 「実際に発生したイベント (表9.4で示したイベント)」
- p.197 「rpはSPE1がSPE0にmtの更新が済んだことを通知するための」→「rpはSPE1がSPE0にmtのTempering処理が済んだことを通知するための」
- p.198 バリア同期の追加 「一方,SPE0は,この関数に差し掛かると,SPE1のバリア同期用の領域が」→「一方,SPE0は,この関数に差し掛かると,自身のバリア同期用の領域が」
- p.204 11.2.2 mtの転送のダブルバッファリング化「すなわち,mtの後半部分の更新をしている間に前半部分の転送を行って,後半部分の更新をしている間に前半部分の転送を行うように変更を加えることでダブルバッファリング化します.」 →「すなわち,mtの後半部分の更新をしている間に前半部分の転送を行って,前半部分の更新をしている間に後半部分の転送を行うように変更を加えることでダブルバッファリング化します.」
- p.225 図13.1 図の中の表記が間違っている 「EA空間」→「LS」
- p.238 14.3.2 「イベントチェック用の命令としてspu_bisled,spu_bisled_d,spu_bisled_eの3つの命令が」→「イベントチェック用の命令としてbisled,bisledd,bisledeの3つの命令が」
- p.241 14.3.4 「その時点でSLIHによって処理されずに状態で残っているイベント」→「その時点でSLIHによって処理されずに残っているイベント」
- p.243 あとがき 完売時刻が間違っている 「3時間ほど残して」→「2時間以上を残して」
- p.243 あとがき 新型PS3の発表の時期が間違っている (発売と記憶が混同していたorz) 「2009年9月」→「2009年8月下旬」
- 初版第2刷・第3刷
- p.60 表5.3 「mの値」の列の一番下の行が間違っている「224 (0xc0) 以上」 → 「224 (0xe0) 以上」
- p.61 図5.16 図の下側の矢印が重なってしまい,どのスロットにどのスロットの値が格納されているのか,各スロットの値を見比べないと判別できない状態になっている
なお,句点漏れなどの,明らかに脳内補完できるレベルのものは省略しています ・・・orz.
また,上記以外についても発見・報告あり次第随時掲載予定です (´・ω・`)
更新情報
- 2024.08.14 入手方法を更新
- 2012.02.04 入手方法を更新
- 2011.01.03 入手方法を更新
- 2010.12.19 入手方法を更新
- 2010.08.15 入手方法を更新
- 2010.08.07 入手方法を更新,訂正表更新,増刷版についての記載が間違っていたので修正
- 2010.06.08 入手方法を更新
- 2010.02.28 通販関連更新,増刷版について記載
- 2010.02.07 訂正表更新
- 2010.02.06 訂正表更新,通販関連更新
- 2010.01.28 訂正表更新
- 2010.01.22 訂正表更新
- 2010.01.17 訂正表更新
- 2010.01.11 訂正表更新
- 2010.01.10 訂正表更新
- 2010.01.08 訂正表更新
- 2010.01.07 訂正表更新
- 2010.01.06 訂正表更新
- 2010.01.05 訂正表更新,ロゴをカラーのものに差し替え
- 2010.01.04 訂正表更新,ソースコードアップロード
- 2010.01.02 入手方法をコミケ後バージョンに差し替え
- 2009.12.28 取り置きに関するお願いを追記
- 2009.12.28 通販の情報について補足
- 2009.12.27 通販の情報について掲載
- 2009.12.06 とりあえず設置
nosuke: <sasugaanijaのgmail.com> (ここでいう「の」は「@」みたいなものです)
Copyright© 2003-2024 nosuke All rights reserved.