Cell Broadband Engineの性能を自然に引き出すための考え方と実行環境（株）ソニー・コンピュータエンタテイメント
井上敬介

目次


Cell Broadband Engineの概要
仕様は一般公開されている
Cellの特徴 Cellの最適化ポイント

SPU Runtime System
SPURSの概要
SPURSタスク（並列実行モデル）
 SPURSジョブ（並列実行モデル）
 SPURSカーネル（インテグレーション）

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Cell Broadband Engineの概要

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

http://cell.scei.co.jp/

仕様は一般公開されている
 Cell Broadband Engineの特徴
 Cell Broadband Engineの最適化ポイント
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Cell Broadband Engineの概要

日本語ドキュメントやソフトウェア

仕様は一般公開されている
Cell Broadband Engineの特徴
 Cell Broadband Engineの最適化ポイント

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

Cell Broadband Engineのブロック図

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

バンド幅とレイテンシ

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPE

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

SPU

256KB

256KB

256KB

256KB

256KB

256KB

256KB

256KB

256KB

256KB

256KB

256KB256KB

256KB

256KB

256KB

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

MFC
DMAC
MMU

EIB
MMU
L2$
MFC

L1$

200cycle

MIC

MMU
L2$
MFC

BEI

PPU

PPE

XDR

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

SB RSX

2007/2/23

EIB

L1$
PPU

PPE

500cycle

MIC

25.6GB/s

BEI

20GB/sXDR

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

15GB/sSB RSX

2007/2/23

Cell Broadband Engineの並列処理的側面


ヘテロジニアスなチップマルチプロセッサ

SPEの概要

SPU - Synergistic Processing Unit

SPE視点ならシンメトリック

シンプルな構造の普通のプロセッサ

キャッシュコヒーレンシ

PPEのキャッシュ
 SPEのアトミックキャッシュ（同期用）
 SPEのDMA
SPE

SPU

128本の128ビットレジスタファイル ほとんどSIMD命令
 256KBローカルストレージ（LS）


SPE

SPE

シンプルで静的な振る舞い
動作の予測が容易

SPE

SPE

SPE

SPE

SPE

256KB

L1キャッシュ相当のスピード 固定レイテンシ
 コードとデータで共用


SPE



MFC
DMAC

MFC - Memory Flow Controller

MMU

DMAコントローラ
 Memory Management Unit

PPE

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPEの並列処理的側面
Cellの性能を存分に生かすには？

SPUとMFCは別プロセッシングユニット?
メッセージパッシング
SPU⇔MFCはチャネルインタフェースを通して通信

当然SPEを効率よく使い切る

あらゆるレベルで並列処理
Processing Element
 XDR⇔LS転送と計算
 LS⇔レジスタ転送と計算
 Dual Issue
 SIMD

ここが勝負

リクエスト→ステータスリード（ブロッキング、ノンブロッキング）

LS⇔MFCは別パス
 お互いに独立動作

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

SPE
SPU
256KB
チャネルSPE

SPE

SPE

SPE

SPE

SPE

MFC
DMAC
MMU
PPE

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPESPE

Cell Broadband Engineの概要

アムダールの法則

仕様は一般公開されている
 Cell Broadband Engineの特徴 Cell Broadband Engineの最適化ポイント



改良部分の全体に対する割合 : P
 改良部分の性能向上率 : S1
 全体の性能向上率は 1-P + P
S
改良部分(P=0.3)
オリジナルプログラム

100Mcycles
10倍速

改良プログラム

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

全体の計算サイクル数1.37倍高速
73Mcycles

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

Cell上での最適化の基本スタンス

High Level Optimization (Algorithmic)

CellはSPUを使用しなければ「遅いPowerPCプロセッサ」
PPUは初期化、SPU起動、システム制御等「のみ」を行うのが理想
 SPUはいわゆるコプロセッサではない（EEのVUとは異なる）
 PPUは1個しかないが、SPUは複数使える（台数効果）

Cellに向いたアルゴリズム／リファレンスコードの選択 命令数削減メモリバンド幅低減

Cell上での最適化では、あらゆる手段を講じてSPUを活用すべき

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

演算量／データ転送量が少ないアルゴリズムの適用
効果的なSIMDアルゴリズムの適用
Local Storageの活用（LS内データ再利用）
効果的なDMAのためのデータ構造

複数SPUでの台数効果
負荷分散
同期オーバヘッド削減
 SPU間のデータ転送量削減


Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Low Level Optimization (Implementation)しかし、ゲームは様々な処理の集合体サイクル数削減
DMAレーテンシ隠蔽（DMAと演算のオーバラップ）

分岐ペナルティ削減
Dependency Stall削減
 Dual Issue Rate向上

MathSound

Menus

File I/O

ScriptingAIMemory

OSParticles

Peripherals

CameraFont

NetworkAnimTrackPhysics

TimerLight上位システム

Graphics

どうやってSPUに乗せて動かす？
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPURSとは？

目次
Cell Broadband Engineの概要

SPURS = SPU Runtime System
 SPU自身によるSPUの仕事切替機構


仕様は一般公開されている
 Cellの特徴
 Cellの最適化ポイント

SPU Runtime System

仕事 仕事 仕事SPURSの概要
 SPURSタスク（並列実行モデル）
 SPURSジョブ（並列実行モデル）
 SPURSカーネル（インテグレーション）

仕事仕事



Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

仕事仕事 仕事
仕事 仕事
メインメモリ

2007/2/23

仕事仕事

仕事SPURSSPURS

SPURSSPURS

SPURS

SPU

SPU

SPU

SPU

SPU

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

なぜSPU中心の自律的なモデルか？

なぜSPURSが必要か？
SPUの利用効率
SPU上の固定割当て
SPU0
SPU1
SPU2
SPU3
SPU4

Cellに自然なモデルを提供し、Cellの性能を自然に引き出す
 PPUから逐一指示を出していたのでは

密結合でないコプロセッサは通信コストで負ける

2007/2/23

なぜSPURSが必要か？
他のベンダのEngineとの統合

SPU0
SPU1
SPU2
SPU3
SPU4

Physics

Physics
Physics

AI
Physics Audio
AI
AI
Graphics
Physics
Graphics
Physics
Graphics
Physics

共有メモリ
SPURS同期ライブラリ

ベンダ間ではSPUを効率よく切り替えられない

仕事仕事仕事Queue
EventFlag

Guard

SPURS

SPURSを利用した共有Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPURS

SPURS実行管理

他のベンダのエンジンとの垣根のない統合

ユーザレベル：0.1〜10usオーダの世界

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

OSレベル：10〜100usオーダの世界

PPU

Game OS(kernel)
2007/2/23

ハンドラ
SPURS

ジョブチェインAI
Physics Audio
AI
AI
Graphics
Physics
Graphics
Physics
Graphics
Physics

細粒度のSPU共有

スレッド
PPU

仕事
SPURS タスクセット

SPU0
SPU1
SPU2
SPU3
SPU4

切り替え・通信コスト・
PPU負荷
Æ待ち状態が多い

スレッド
PPU
スレッド
PPU

Audio
Graphics
Graphics
Physics
Physics

Audio
Graphics
Graphics

SPURSの概観
SPUのグループ

AIAI

50~100usec + PPUAI

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

カスタムなSPU切換え機構
SPU0
SPU1
SPU2
SPU3
SPU4

SPUの遊んでいる区間が大きい

SPURSで切換え判断基準がSPU向きの処理かどうかではアムダールの法則により効果薄Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

Graphics

SPU0
SPU1
SPU2
SPU3
SPU4

SPUへ関数オフロードしがち

Audio
Physics
Physics

仮想SPUで切換え

SPUから使いづらいデータ構造になりがち SPUをコプロセッサとして使いがち

AI2つの並列プログラミングモデル

ロックフリー実装

OSのmutexはSPUの自律実行を止める


SPUは特権モードが無い
SPUのOS呼出しはリモートPPUコール

SPURSタスク：処理の分割と依存関係に基づく実行

同期PPUコールはSPUを止める
PPUコールはPPUも止める

処理分割

Task

ユーザレベル排他（mutex）は難しい


データと処理PPUがロックを取ったままどこかに行ってしまうと、SPUは待ちぼうけになる
2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

SPURSタスクとSPURSジョブのどちらを使うか分割

タスクセットPPUスレッド

繋げる

Task

PPUスレッドSPURSジョブ：データの分割と逐次並列実行

PPUスレッドのスケジュールはSPU側と無関係
PPUスレッドはプリエンプションされるTask Task
Task
Task
Task
Task

Job Job
JobJobJob Job
Job
Job
Job
Job
Job
Job

ジョブチェイン並べる

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPU Runtime System
SPURSの概要
 SPURSタスク（並列実行モデル）
SPURSタスク•コンベンショナルなマルチSPU・マルチタスクモデル•コンベンショナルなプログラミングスタイル•ロックフリー実装の軽量同期ライブラリ群

タスクセット
タスクの状態遷移
 タスクの選択と実行
 タスク切り替えのシーケンス

自分で制御したい人向け

自動で制御してもらいたい人向け
SPURSジョブ•データ指向のマルチSPU・並列データ処理モデル•入力データを処理して出力データを生成するプログラミングスタイル•入力DMA、実行、出力DMAの自動オーバーラップ（パイプライン実行）

SPURSジョブ（並列実行モデル）
 SPURSカーネル（インテグレーション）

50k〜100kサイクルの処理に最適
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPURSタスク実行モデルの概観

タスクセットコンベンショナルなマルチSPU・マルチタスクモデル
 コンベンショナルなプログラミングスタイル
 ロックフリー実装の軽量同期ライブラリ群
SPURSタスク：処理の分割と依存関係に基づく実行

処理分割

Task Task
Task
Task
Task
Task
Task



タスク操作や同期ライブラリを使用した事により依存関係で結合されたタスク群
ready

Task

CreatePPUスレッド

Semaphore

Taskready
Task
Task

タスクセットTask

Task

PPUスレッド

ready

Task

Barrier

Task

繋げる
EventFlag

Task

Queue

EventFlag

PPUスレッド

PPUスレッド

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

タスクの状態遷移図

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

タスクの選択と実行
タスクセットを複数SPUで共有
 各SPUで独立してタスクを選択して実行running

wait signal(blocked)(dispatch)exit

waiting


yield

ready
w/o context

send signal
readyw/context



ロックフリー実装でアトミックにタスクを選択
FIFOでないが公平なスケジューリング
常駐部

常駐部

常駐部

常駐部

tasktask

複数SPU

create task
nonexistenttask

task

task

ready tasks
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

タスクセット2007/2/23

タスクのLSコンテキストサイズは任意

タスク切り替えのシーケンスとコスト
0. タスクがWaitSignal(), Yield(), Exit()を呼び出す

DMA Activity

1. レジスタ保存・タスクが行ったDMAの完了待ち
2. スケジューリング: 呼び出しタスクの状態変更
Exit

呼び出しタスクの実行継続

Wait: signalなし
Yield: 他のタスクあり

タスクの切り替え

3. 呼び出しタスクのコンテクスト保存

32 usec

WaitSignal: 0.25, Yield: 0.5 usec

Wait: Signalあり
Yield: 他のタスクなし

128 Bアトミック更新
タスク切り替えを伴うスケジューリング
コストのほぼ90%

128 Bアトミック更新

5. 次実行タスクのコンテクスト復帰

245 KB: DMA Get

6. レジスタ復帰
7. タスクモジュールからの復帰

2007/2/23

タスクコンテキストの生成・復帰
初実行時

Partial context
kernelNo context
kernel.text, .rodata.text, .rodata.text, .rodata.data.data.data

.bss

.bss

.bss

heap

heap

heap

stack

stack

stack

245 KB: DMA Put

4. スケジューリング:
次実行タスクの選出・状態変更

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

Full context
kernel2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

タスクコンテキストの保存
復帰時

全保存

部分保存

コンテキストサイズ
はユーザが決める

タスク情報の取得
ELF Headerの取得
ELFセグメントをDMA getContextエリアをDMA get
Local Storage

SPU ELF

Context Area

kernelro (.text, .rodata)

DMAro (.text, .rodata)rw (.data)

DMA

rw (.data).bss

Local Storage

Context Area

Context Area

kernelro (.text, .rodata)rw (.data)

DMA

DMA

heap

DMA

.bss
heap
stack

stack

.bssのzero clear

Registerの保存

DMA

Registerの復帰
タスクの実行

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPURSタスク実行モデルのまとめ

タスクコンテキストの部分復帰
タスク情報の取得

ノンプリエンプティブ、マルチSPUマルチタスク
 固定メモリレイアウト


ELF Headerの取得
roセグメントをDMA get
ContextエリアをDMA get
Local Storage

SPU ELFro (.text, .rodata)

Context Area

kernelDMAro (.text, .rodata)rw (.data)

DMA.bssheap
DMAstack

PPUスレッドもSPURSタスクと協調動作可能
同期操作のPPUスレッドがプリエンプトされてもSPU側に影響なし

軽い動作の同期・通信ライブラリ
Registerの復帰

ユーザメモリエリアはLSの95%以上

ロックフリーデザイン

PPUスレッドをブロックする以外にシステムコールは呼ばない

タスクの実行
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPU Runtime System2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

SPURSジョブ実行モデルの概観

SPURSの概要
 SPURSタスク（並列実行モデル）
 SPURSジョブ（並列実行モデル）



データ指向のマルチSPU・並列データ処理モデル

入力データを処理して出力データを生成するプログラミングス
タイル 入力DMA、実行、出力DMAの自動オーバーラップ（パイプライン実行）
 ロックフリー実装の同期ライブラリ群


ジョブチェイン
コマンド処理 ジョブのパイプライン実行


SPURSジョブ：データの分割と逐次並列実行

SPURSカーネル（インテグレーション）

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

データと処理分割

Job Job
JobJobJob Job
Job
Job
Job
Job
Job
Job

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

ジョブチェイン並べる

2007/2/23

ジョブチェイン

ジョブチェインの動作
タスク
PPUスレッド

GUARD

コマンドリスト

Job
Definition

コマンドリスト
Job
SYNC
Job List

CALL

Job
Definition

各SPU上のジョブモジュールの機能

コマンド処理は排他的に行う①

コマンド処理①( in-orderになるように排他的に行う)
Job
Definition
RETNEXT

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

②Job
Definition
Job
BinaryEND

コマンド処理時の動作

ジョブをパイプライン実行

②SPU

SPU

SPU

パイプライン実行は各SPUが独立して行う
2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

[ libspurs概要14章 ]パイプラインの各ステージの処理

パイプラインに空きが出来るまで実行

Job 1

パイプラインを空にし、ワークロードスイッチ

優先ワークロードの確認

Job 2
Job 3
Job 4

F

I
F

E O
I

EO

F

I

E O

F

I

メモリの確保に失敗した場合、パイプラインストール発生

E O

コマンドリストをロック【Fetch】
JobDescriptorの
DMA開始

1. コマンドをＤＭＡで取得(同時取得コマンド数＜maxGrab)
2. コマンドの実行• パイプラインへジョブを投入• ジョブチェインの状態変更【Input】
FetchのDMA待ち
メモリ確保
Input DMA開始【Execute】
Input DMA待ち
ジョブの実行

入力データ・バイナリのDMA Get

コマンドリストをアンロック「パイプライン内のジョブの実行」へ

ジョブチェインの状態変更
パイプラインへジョブ投入(複数SPU上で並列に実行する)

Input

2007/2/23



コマンド処理のコストはコマンドに依存する
最短で２７５０サイクル(0.85 μsec)

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

JobDescriptorのDMA Get

ステージの間に他のジョブの処理を行う

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

【Output】
Output Dma待ち
メモリ解放

ジョブの実行
出力データのDMA Put
2007/2/23

SPURSジョブ実行モデルのまとめ

１ステージの実行時間
Job 1
Job 2Job 3
Job 4

FI

E O

FI
F

ジョブチェインを複数SPUで実行
 ジョブはSPU上で4ステージパイプライン実行


E OI

EOFI

E O



ジョブとDMAも並列実行

柔軟なメモリ管理（mallocは未使用）
ジョブはほぼ全メモリの使用も可能

バイナリやroデータをキャッシュ可能

1ステージの実行時間＝前ステージのDMA待ち時間＋ジョブの実行時間＋オペレーションコスト Å 1900cycle (0.6 μsec)
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.


2007/2/23

SPU Runtime System

パイプラインストールが発生

優先ジョブコマンド（Urgent Job）
ジョブチェイン、ジョブリストは再利用可能
2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

SPURSカーネルの概観

SPURSの概要
 SPURSタスク（並列実行モデル）
 SPURSジョブ（並列実行モデル）
 SPURSカーネル（インテグレーション）


各LS常駐のSPURSカーネルがワークロードを1つ選んで実行
SPUスレッドグループ
Physics
Physics

Physics
Physics

Graphics
Graphics

Audio
Audio

Graphics
Graphics

SPURS
SPURS kernel
kernelSPURS
SPURS kernel
kernelSPURS
SPURS kernel
kernelSPURS
SPURS kernel
kernelSPURS
SPURS kernel
kernelA.I.
A.I.
タスクセット
タスクセットPhysics
Physics
タスクセット
タスクセットAudio
Graphics
Graphics
Audio
ジョブチェインジョブチェインジョブチェイン ジョブチェイン•ワークロードはSPURSカーネルのスケジュール単位（最大16）•ワークロードをインテグレートしてアプリケーションを組み上げる
Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPURSの全体像

スケジューリングの特徴

Execution models
task
task module
modulejobjob modulemodule

低コストで効率よくSPUを譲り合う
誰かがSPUを要求（ReadyCount）
優先ワークロードの確認（cellSpursModulePoll）
 SPUを譲る（cellSpursModuleExit）


優先度ベースインテグレータがSPUの割振りをしやすい

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

SPURSのまとめ
SPURSは2レイヤ構成

2KBのワークロードスケジュール層
実行モデル（ポリシーモジュール）層

効率の良い実行
協調的なSPUの共有
 インテグレータに嬉しい見通しの良い動作

No virtualization
Non-preemptive
 Static behavior of scheduling

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

AudioAudiojob
job chainchain

Graphics
Graphics
job
job chainchain

Control
ControltasksettasksetWorkloads

コンテキスト破棄

SPU毎に設定Physics
Physics
tasksettaskset2007/2/23

kerneltm

kernel
tm

task

task

kerneljm

kerneltm
jm

kerneljm

kernelmoduletask

Copyright © 2007 Sony Computer Entertainment Inc. All Rights Reserved.

2007/2/23

Virtual SPU group

A.I.
A.I.
tasksettasksetShared memory

Non-preemptive