SPEを256倍使い倒すための本 完結編

目次

これは何?

この本は 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刷に多数存在した読みにくい文章や意味を取り違えやすい文章, 日本語が破綻している文章などに関して,読点の追加削除や文章の分割, 言い回しの変更などを多数行って改善を図っています.

誰得?

こんな人にお勧め・・・かもしれない

こんな期待には応えられないかも

目次を見ていただければ何が書いてあって何が書いてないのか大体想像がつくかとは思いますが, たとえば以下のような話を期待している人は読むとがっかりすると思うので, ご注意ください.

わからないことや試せないことは書かない主義です (`・ω・´) ・・・っていっぱいありすぎて全然ダメじゃん (´・ω・`)

あと,ちょっとだけ難易度高めかもしれません. 特にアーキテクチャ系の用語とかOS系の用語とかがポンポン出てきます. これを機に勉強してみるというのであればよいのですが, そういうところから手取り足取り・・・ということを期待されてしまうと, やはりがっかりしてしまうかもしれません.

・・・ってこうして並べてみるとダメなところだらけの本にしか見えませんね ・・・ (´・ω・`)・・・でもきっと面白いよ! (`・ω・´)

入手方法

こちらの頒布情報をご参照ください。

内容の紹介

とりあえず第2章から第14章までの各章にどんな感じのことが書かれているのか紹介します. 適当に抜き出した章のページの画像もあわせて掲載しますので, 雰囲気を感じ取ってください. なお,繰り返しになりますが中身は全編通してこんな具合です. (ごく一部の人を除いて) ちっとも萌えない ガチガチのてふてふな本ので,くれぐれもご注意ください.

この本ではいきなりプログラムに入らずに, まず第2章でSPEを含めたCell/B.E.のアーキテクチャについて解説します. また,第3章ではSPEプログラムの開発環境の構築手順などを紹介します. いまさらネットに転がってることと同じことを書いても仕方ないので, ちょっとだけ玄人好みな入れ方になってます. 第3章は前作にはなかった新規の内容となっています.

表紙 アーキテクチャ解説 開発環境のセットアップ

第4章ではHello Worldの動かし方とかを紹介します. 単に「こう書けば動く」という入り口がゴールみたいなことはせず, SPEプログラムを動かすのに使うlibspe2のAPIについてもきっちり解説しています. あとソースコードには前作にはなかったコメントがちょこちょこ入ってます.

かなりのAPI解説つき ソースコードはコメント入ってます

第5章ではSPEの演算機能を扱います. 前半では「SIMDとは何か」とか「ベクタとは何か」とかそんな話題を絡めつつ, 後半では演算系のintrinsicをまるごと全部解説したりしています. わかりにくいやつは図もついています.

エンディアンの話など プリファードスロットの図とか 演算系のintrinsicは全部解説 (わかりにくいやつは図入り)

第6章では最適化の話をします. 前半では逆アセンブル結果の読み方やSIMD化の方法などを紹介しています. SIMD化には具体例がついており, よくあるなんちゃってプログラムではなく, きちんと動くホンモノのプログラムをSIMD化するまでの流れを掲載しています. アセンブリ言語に関する部分は前作にはなかった新規の内容になります.

アセンブリ言語超入門 SIMD化してみる話

後半は分岐やループ,パイプラインの最適化などを紹介します. ここでも前半でSIMD化した具体例にどんどん最適化を適用していきます. その際,ソースコード (の一部) はもちろんのこと, 効果を確認するためのベンチマーク結果や, 何で速くなったのかを確認するための逆アセンブル結果なども掲載・解説します. なお,この章は前作で2つの章に分かれていたものを統合したような感じになっていますが, 中身は大部分が書き直されています.

分岐最適化 最適化の効果は数字で確認だ もちろん逆アセンブルもあるよ こんなソースだけのページもたまにはある

第7章ではLinuxでSPEがどう使われているかという話に触れます. ここではspufsやlibspe2の紹介の他, SPE関連のシステムコールの解説などの誰得な話題についても扱っています. また,第8章では複数SPEを同時に利用する方法について紹介します. そして第9章はチャネルとSPEのメッセージング機構 (メールボックスとシグナル) について扱います. 基本的なスペックや使い方はもちろんのこと, PPE側でイベントの仕組みを利用してメールボックスに値が書かれるのを見張る方法といったマニアックなことについても紹介します. PPE側のイベントに関する話題は前作にはなかった内容になります.

システムコール解説してみたり 複数SPE同時実行 libspe2のイベント処理の仕組み

第10章ではDMA転送の機能を紹介します. 前半では基本的なDMA転送方式の解説や性能評価, DMA転送を利用した排他制御なんかについても解説しています. 前半の内容は基本的に前作のままですが, 前作でわかりにくかったり解説が不十分だったりした部分は大幅に書き直しています.

DMA転送の基本的な使い方から 性能測定結果とか セマフォの作り方なんかも

また,章の後半ではLS間のDMA転送や,PPEからDMA転送を仕掛ける話, DMA転送のチューニングなどについて解説します. 前者2つは前作になかった新規な話題になります.

LS間の転送 PPEからDMA ダブルバッファリング化の話とか

そして第11章では第6章であれこれ最適化したSPEプログラムの並列化を行います. また,その上で軽くデータ転送をチューニングすることも行います. 並列プログラムを書いたことがないという人も, これを見れば何となく雰囲気がつかめるかも? ここも前作にはなかった新規の内容になります.

並列化のよくある記述方法とかを紹介したり 並列化したところのソース 処理のシーケンスとかリングバッファとか

最後の第12章から第14章までは割とオマケ感の強い章です. 第12章ではプロブレムステート領域というところにあるレジスタを叩きます. 主にSPEからよそのSPEにDMA転送要求を出すとか, そんな何の役に立つのかわからない話を紹介します. 第13章では外部関数呼び出しについて解説します. printfみたいに実はPPE側に実体があるような関数がどういう仕組みで動いていて, どうやったら自分で追加できるのかなんていう話が中心となります. そして最後の第14章ではSPEのイベント処理について紹介します. デクリメンタが1周したら割り込みを発生させるとか, おそらく相当マイナーな機能ですが, きちんと使うための仕組みが用意されていたりするのでそのあたりについて解説します. 第12章と第13章については新規に書き起こした章になります. ちなみに索引もついてます.

プロブレムステートのレジスタの使い方とか 外部関数呼び出しの仕組み 索引もついているよ!

サポート情報

ソースコード

この本に掲載されているソースコード片のうち, Hack the Cell 2009,メルセンヌ・ツイスタおよび newlib 由来のソースコード片は, それぞれオリジナルのソースコードのライセンス (修正BSDライセンス) に従います. また,それ以外の筆者オリジナルのソースコード片についても修正BSD ライセンスに従うものとします.

訂正表

なお,句点漏れなどの,明らかに脳内補完できるレベルのものは省略しています ・・・orz.

また,上記以外についても発見・報告あり次第随時掲載予定です (´・ω・`)

更新情報



nosuke: <sasugaanijaのgmail.com> (ここでいう「の」は「@」みたいなものです)

Copyright© 2003-2012 nosuke All rights reserved.