目次
これは何?
PS3 + Linux + CellSDK で行う Cell/B.E. (PS3に搭載されているCell) のSPEのプログラミング入門的内容の同人誌です. プログラミングをする上で知っておくと役に立つかも知れない情報を, nosuke が独断と偏見に基づいてまとめています. PDFで公開されている公式のドキュメント類は各階層ごとに非常に詳しく書かれているわけですが, いかんせん縦方向に弱いので,その辺を下から上までつないでみました. 完全にユーザ視点で書いているため, 公式のドキュメント類に頻出する絵に描いた餅ではなく, 実際に今 PS3 に搭載された Cell/B.E. でできることを対象とした内容となっています.
本書は上下巻の2部構成で目次は以下のようになっています. まずは目次を見て内容を察してやってください.
力の16倍編 (上巻)
- 第1章 はじめに
- 1.1 Cell/B.E.とSPE
- 1.2 Cell/B.E.やSPEを搭載した機器
- 1.3 Cell/B.E.向け開発環境
- 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章 SPEを1個だけ使うプログラム
- 3.1 SPEのプログラムを呼び出す流れ
- 3.2 SPEのプログラムを動かす例
- 第4章 SPEの演算機能
- 4.1 バイトの並びとビットの番号
- 4.2 ベクタ
- 4.3 組み込み関数を用いたSIMD 演算
- 4.4 SPEの浮動小数点数
- 4.5 SIMD数学ライブラリ
- 第5章SPEのコード最適化その1
- 5.1 SPUのパイプラインのチューニング
- 第6章 libspe2とspufs
- 6.1 spufs
- 6.2 libspe2
技の16倍編 (下巻)
- 第7章 SPEを複数使うプログラム
- 7.1 複数コンテキストの同時実行
- 7.2 複数のSPEを同時に動かす例
- 第8章 チャネルとメッセージング機構
- 8.1 チャネル
- 8.2 メールボックス
- 8.3 シグナル
- 第9章 DMA
- 9.1 DMA転送の概要
- 9.2 フェンスとバリア
- 9.3 リストDMA
- 9.4 アトミック更新
- 9.5 DMAに関するその他の雑多な話題
- 第10章 SPEのコード最適化その2
- 10.1 分岐関連のチューニング
- 10.2 ループ関連のチューニング
- 10.3 DMA関連の最適化
- 10.4 デクリメンタで実行時間を測る
- 10.5 その他の最適化に関する話題
- 第11章 イベント
- 11.1 イベントの概要と管理
- 11.2 イベントの種類
- 11.3 イベントの検出と処理
各巻ともに本文70ページ程度の内容となっています. 無理矢理詰め込んでいるのでかなり窮屈な感じがするかもしれません. また,一見きれいに上下巻に分かれていますが, 相互依存が激しく片方だけだとかなり中途半端な内容となってしまいます. 興味がある方は「まずは上巻だけ入手して勉強して・・・」 なんて考えずに是非是非一気に両方揃えてしまうことをお勧めします. この機を逃すといつまた手に入るかわかりませんのでw (入手方法については後述)
なお,しら「」氏による趣味全開の表紙は萌え萌えですが, 中は「萌えるSPEプログラミング」というようなノリではなく ガチガチのてふてふです. お間違えのないよう,よろしくお願いします. 内容の雰囲気は,各巻の紹介をご参照ください.
誰得?
こんな人にお勧め・・・かもしれない
- SPEでどんなことができるのかをざっくりと把握したい人
- PS3にLinuxを入れてみたけど,その後特にすることもなく持て余している人
- Webなどを見てPS3 Linux上で簡単なプログラムを書いて動かしてみたけど, どうもモヤっとしたところが色々あってすっきりしない人
- ある程度SPEプログラミングができるけど, しばらく間が空くとすぐAPIや細かなルールを忘れてしまい, その都度長大なリファレンスを参照するのが面倒で仕方ない人
- 卒論のいいネタが見つからなくて困っている人
- 並列プログラミングの講義で, 学生が興味を持ってくれそうな適当な教材が見当たらなくて困っている人
こんな期待には応えられないかも
目次を見て頂ければ何が書いてあって何が書いてないのか大体想像がつくかとは思いますが, たとえば以下のような話を期待している人は読むとがっかりすると思うので, ご注意ください.
- SPEを活用して何かのアプリケーションを超高速化した, 汗と涙のドキュメンタリー的なもの
- メモリコンシステンシ関連
- デバッガ関連
- オーバレイ関連
- パフォーマンスモニタ関連
- ハイパーバイザ関連
- GCC以外のコンパイラの話
- コンパイラに最適化 (自動ベクトル化とかSPEのコードの自動生成とか) をやってもらう話
- PS3 Linuxのグラフィックまわりとか
- libspe2以外の実行環境の話
- Linux以外のOSの話
- 商用ゲームの開発環境
- XBOX360と比べてどうこうみたいなゲーム機としての話
- どのドキュメントにも載っていないような秘密のCell/B.E.機能
- SpursEngineの話とかPowerXCell 8iの話とか
- インラインアセンブラを使った人間コンパイラ的なもの
- celltripperの解説
- 最先端の開発環境の話題 (CellSDK 3.1ベースなのでちょっと古い)
- すべてを網羅したリファレンスマニュアルとしての機能
- P.S.すりーさんみたいな漫画
わからないことや試せないことは書かない主義です (`・ω・´)・・・ っていっぱいありすぎて全然ダメじゃん (´・ω・`)
あと,PS3 Linuxのインストールの仕方やCellSDKのインストールの仕方, 基本的なLinuxのコマンドの使い方などについては, どう考えてもページが足りないので掲載しておりません. 他の参考書をあたってください.
それから,もしかしたらちょっとだけ難易度高めかもしれません. 特にアーキテクチャ系の用語とかOS系の用語とかがポンポン出てきます. これを機に勉強してみるというのであればよいのですが, そういうところから手取り足取り・・・ということを期待されてしまうと, やはりがっかりしてしまうかもしれません.
・・・ってこうして並べてみるとダメなところだらけの本にしか見えませんね・・・.
入手方法
コミックマーケット76 (C76) で頒布し,各巻100部完売致しました. 申し訳ありませんが,現在のところ,増刷や通販などの予定はありません. 冬コミ (C77) でリファイン版を頒布することを検討中です.
各巻の紹介
力の16倍編
上巻である『力の16倍編』は, 主にSPE単体の演算を中心とした構成となっています. メインとなる話題はハードウェアで持っているSIMD演算の紹介となります.
また,その他,SPEの浮動小数点数演算における注意点や SIMD数学ライブラリの使い方,パイプラインのチューニング, libspe2やspufsの実装などについても簡単に触れています.
技の16倍編
下巻である『技の16倍編』は, 主にDMAを中心とした構成となっています. 単純なDMAによるデータの転送から, ストールつきのリストDMAや getllar/putllcとイベントを組み合わせたミューテックス, さらには低レイテンシな通信のためのアドレスの選び方の検証なんていう無駄にマニアックなことまで扱っています.
また,その他,ループや分岐の最適化やメールボックスによる待ち合わせ, SPE上での割り込みを用いたイベントのハンドリングといった話題も扱っています.
サポート情報
ソースコードとか
- 第3章 SPEを1個だけ使うプログラム
- hello.tar.gz: Hello Worldのソース
- 第4章 SPEの演算機能
- extract.tar.gz: 4.2 のリスト4.3 および 4.3.2 のリスト4.5
- add64.tar.gz: 4.3.3のリスト4.6
- sub64.tar.gz: 4.3.3のリスト4.7
- mul32.tar.gz: 4.3.4のリスト4.8
- simdmath.tar.gz: 4.5のリスト4.16
- 第6章 libspe2とspufs
- malloc_ea.tar.gz: 6.2で少しだけ触れているmalloc_eaの呼び出し例
- 第7章 SPEを複数使うプログラム
- hello6.tar.gz: 7.2のリスト7.1およびリスト7.2
- 第8章 チャネルとメッセージング機構
- mailbox.tar.gz: 8.2.3のリスト8.1,リスト8.2,リスト8.3,リスト8.4
- channelcount.tar.gz: 8.2.4のリスト8.5
- signal.tar.gz: 8.3.4のリスト8.6およびリスト8.7
- signal_or.tar.gz: 8.3.4のリスト8.8
- 第9章 DMA
- dma.tar.gz: 9.1.6のリスト9.2
- listdma.tar.gz: 9.3.4のリスト9.4
- listdma_stall.tar.gz: 9.3.5のリスト9.5
- atomic.tar.gz: 9.4.5のリスト9.6およびリスト9.7
- atomic_sem.tar.gz: 9.4.7のリスト9.9およびリスト9.10
- atomic_mutex.tar.gz: 9.4.8のリスト9.11,9.12,9.13
- atomic_with_ppe.tar.gz: 9.4.9のリスト9.14
- ls.tar.gz: 9.5.1のリスト9.15
- ps.tar.gz: 9.5.2のリスト9.16
- 第10章 SPEのコード最適化 その2
- dma_nomfcstat.tar.gz: 10.3.2のリスト10.16および10.3.4のリスト10.17
- 第11章 イベント
- event.tar.gz: 11.3.4のリスト11.1および11.2
訂正表
- p.2 1.3 Cell/B.E.向け開発環境 2行目
- 無償で提供されおり → 無償で提供されており
- p.30・31 spu_genb・spu_subx・spu_genbx
- LSBの逆数 → LSBのビット反転
- p31 リスト4.7
- retが余計 (あっても問題ないけど)
- p.37 spu_cmpgt
- フォーマットの表記が spu_gt になっている (正しくは spu_cmpgt)
- p.38 spu_cmpabseq, spu_cmpabsgt
- spu_cmpabseq であるべきところが spu_cmpbaseq になっている部分がある
- フォーマット表記の末尾の「;」が抜けている
- p.52 倍精度のベクタの要素を単精度に丸める
- spu_roundfとなっているが,正しくはspu_roundtf
- p.65 6.2 libspe2
- stop-and-signal とすべきところがなぜか1ヶ所 signal-and-stop になっている
- p.101 リスト9.4
- INTERVALが未定義だが,128などの16の倍数が入る
- dma_bufの宣言が抜けている
unsigned char dma_buf[BLOCK_SIZE * LIST_NUM] __attribute__((aligned(16))) = {0};
- 「__attribute__((aligned(8)))」とするとコンパイラから警告を受けるので 「__attribute__((aligned(16)))」とすべき
- eah,ealの宣言が抜けている
unsigned eal, eah;
- p.125 10.4 リスト10.7
- 「(float)TIMEBASE)」 の末尾の「)」が余計
- 最後のprintfでの単位が「usec」になっているが「sec」の間違い
- p.132 11.3.4 リスト11.1
- 「status & ~MFC_SIGNAL_NOTIFY_1_EVENT;」の「&」は「&=」の間違い
- 「status & ~MFC_SIGNAL_NOTIFY_2_EVENT;」の「&」は「&=」の間違い
- 奥付
- URLが間違っている _|‾|○ http://garakuta.honelinux.org/ → http://garakuta.homelinux.org/
この他についても,発見・報告あり次第,随時掲載予定です.
更新情報
- 2009.09.09 下巻のソースコードをアップロード,訂正表を更新
- 2009.08.25 訂正表を更新
- 2009.08.23 ソースコードと訂正表を更新
- 2009.08.22 入手方法更新,目次追加,概要説明をちょっと修正
- 2009.08.15 概要説明をちょっと修正
- 2009.08.14 取り置きに関して追記
- 2009.08.13 頒布価格とか更新
- 2009.08.09 日本語が変だったので軽く修正
- 2009.08.08 入手方法などについて加筆・修正
- 2009.08.07 とりあえず設置
nosuke: <sasugaanijaのgmail.com> (ここでいう「の」は「@」みたいなものです)
Copyright© 2003-2024 nosuke All rights reserved.