4.1 PPEとSPEの通信機能
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
第3章でも解説したとおり、SPEは、PPEや他のSPEとデータを受け渡しする際にはMFCと呼ばれるユニットを利用します。第3.3節では、MFCが提供する機構の1つとして、DMA転送によるデータの受け渡しについて解説しました。
ここでは、SPEが外界 (PPEや他のSPEなど) と通信するための代表的な機構として、MFCが提供する「メールボックス」と「シグナル通知レジスタ」と呼ばれる機構と、SPEの「ストップ・アンド・シグナル命令」について解説します。
4.1.1 メールボックス
メールボックスは、PPEとSPE間で通信するための機構の1つです。DMA転送では、メインメモリとLSとの間で最大16Kバイトのデータを受け渡しできました。一方、メールボックスでは、より小さな32ビットデータを受け渡します。
メールボックスは、ステータス、パラメータなどの小さなデータ転送に適しています。PPEとSPEとの間で双方向のデータの受け渡しが可能です。メールボックスは、FIFOキュー構造になっており、図 4.1に示すように受け渡しの方向と振る舞いによって3種類のキューを提供しています。
* FIFO … FIFOとは、First In First Outの略で、キュー (データを蓄積する一列のバッファ) に対して最初に書き込まれたデータを最初に読み出すというデータアクセス方式です。
(1) SPU インバウンド・メールボックス (SPU Inbound Mailbox)
PPEからSPEへデータを渡すためのキューです。最大4個までのデータを蓄積できます。もし、SPEプログラムがキューからデータを読み出そうとして、キューが1つもデータを保持していない場合はPPEプログラムがキューにデータを書き込むまで待ち続けます。
(2) SPU アウトバウンド・メールボックス (SPU Outbound Mailbox)
SPEからPPEへデータを渡すためのキューです。最大1個までのデータを蓄積できます。もし、SPUアウトバウンド・メールボックスがすでに1個のデータを保持している場合には、SPEプログラムはPPEプログラム側でキューからデータを読み出すまでデータの書き込みを待ち続けます。
(3) SPU アウトバウンド割り込みメールボックス (SPU Outbound Interrupt Mailbox)
SPUアウトバウンド・メールボックスと同じ、SPEからPPEへデータを渡すためのキューです。ただし、SPUアウトバウンド割り込みメールボックスでは、SPEプログラムがキューにデータを書き込むと、PPEに対して割り込みイベントが発生しデータの読み出しタイミングを通知することができます。
これらのメールボックスは、SPEプログラムおよびPPEプログラムからアクセスすることができます。SPEプログラムがメールボックスにアクセスする場合は、チャネル・インタフェースを利用します。PPEプログラムがメールボックスにアクセスする場合は、libspe2が提供するメールボックス用APIを利用します。詳細については、以下のドキュメントの各項目を参照してください。
(1) SPEプログラムからの利用方法
「Cell Broadband Engine Programming Handbook」の第19.6節「Mailboxes」を参照してください。
(2) PPEプログラムからの利用方法
「SPE Runtime Management Library Version 2.1」の第7章の「SPE mailbox functions」の項を参照してください。
4.1.2 シグナル通知レジスタ
SPU シグナル通知レジスタ (以下、SNR) は、PPEからSPEへ、もしくはSPE間で制御メッセージやイベントをシグナルとして通知するために利用されます。SNRは、32ビットのレジスタで、各SPEに対して2つずつ備わっています。
シグナルを送信する側のPPEやSPEは、シグナルを受信する側のSNRに対して32ビット長のデータをシグナル値として書き込みます。シグナルを受信するSPEは、SNRからシグナル値を読み出します。SNR内のシグナル値を読み出すと、SNRの全てのビットは0にリセットされます。もし、SNRにシグナルが到着していない時に、SPEプログラムがSNRからシグナル値を読み出そうとした場合、SPEプログラムはシグナルを受信するまで待ち続けます。
シグナルとして送信される32ビットデータの各ビットは、SPEプログラム側が自由に意味を持たせることができます。各ビットに対して固有の意味を持たせることで、SPEに対して処理の完了やステータスの変更通知などがおこなえます。SNRには、シグナルを受信するモードとして、「上書きモード」と「論理ORモード」の2種類の動作モードがあります。2つのSNRそれぞれ個別に動作モードを設定できます。上書きモードは1対1のシグナル通知に、論理ORモードは多対1のシグナル通知に適しています。
図 4.2に、SNRの2つの動作モードの違いを示します。
SNRへのシグナル送信方法は、PPEプログラムとSPEプログラムで異なります。PPEプログラムがSNRへシグナルを送信する場合は、libpse2のシグナル送信用APIを利用します。SPEプログラムがSNRへシグナルを送信する場合は、シグナル送信専用のDMA転送コマンド (SNDSIG) を用いて、実効アドレス上にマッピングされた送信先SNRの実効アドレスへシグナルを送信します。SNRの実効アドレスを取得するためには、libspe2が提供するダイレクトSPEアクセス用APIを利用します。また、シグナルを受信したSPEプログラムは、チャネル・インタフェースを利用してSNRに到着したシグナル値を読み出します。詳細については、以下のドキュメントの各項目を参照してください。
(1) PPEプログラムからのシグナル送信方法
「SPE Runtime Management Library Version 2.1」の第7章「SPE MFC problem state facilities」の「SPE SPU signal notification functions」の項を参照してください。
(2) SPEプログラムからのシグナル送信方法
「Cell Broadband Engine Programming Handbook」の第19.7節「Signal Notification」を参照してください。
(3) SPEプログラムによるシグナル受信方法
「Cell Broadband Engine Programming Handbook」の第19.7節「Signal Notification」を参照してください。
(4) SNRの実効アドレスの取得方法
「SPE Runtime Management Library Version 2.1」の第8章「Direct SPE access for applications」を参照してください。
4.1.3 ストップ・アンド・シグナル命令
ストップ・アンド・シグナル命令は、実行中のSPEプログラムを一時停止もしくは終了し、PPEプログラム側に実行スレッドを戻す場合に利用されます。SPEがストップ・アンド・シグナル命令を実行すると、SPEプログラムの処理は停止され、PPEへストップ・アンド・シグナル命令トラップと呼ばれる割り込みが通知されます。割り込み通知を受けたPPEは、割り込みに応じた処理を実行することができます。
このストップ・アンド・シグナル命令は、プログラマ自身が意識しないところで、さまざまな処理を実現するために利用されています。主なケースとしては、SPEプログラムのmain()関数からの復帰や、exit()関数の実装に利用されています。ストップ・アンド・シグナル命令を利用しているものとしては、以下のような機能があります。
(1) SPEプログラムにおけるexit()関数
(2) SPEプログラムからのPPEライブラリコール (C99、POSIX.1) の呼び出し (printf()関数など)
(3) SPEプログラム・デバッガ (spu-gdbなど) のブレイクポイント
上述の3つのユースケースはシステム側が提供する仕組みの代表例です。これら以外にも、プログラマ自身がストップ・アンド・シグナル命令を利用し、PPEプログラムへ処理を移すこともできます。詳細については、「SPE Runtime Management Library Version 2.1」の第6章「SPE Event handling」および「C/C++ Language Extensions for Cell Broadband Engine Architecture」を参照してください。
ストップ・アンド・シグナル命令を利用することにより、PPEの割り込み通知時にSPEプログラムは14ビットのシグナル・タイプをPPEプログラムへ渡すことができます。Linuxにおけるシグナル・タイプ区分は、以下のように定義されます。
(1) 最上位ビットが0の値 (0x0000~0x1fff) は、アプリケーション用途で利用可能な範囲です。
(2) 最上位ビットが1の値 (0x2000~0x3fff) は、システム用途で利用可能な範囲です。
0x0000を除く0x0001~0x1fffの範囲を利用して、ユーザはPPEプログラムと連携した独自の処理をプログラムすることができます。表 4.2に、Linux上で予約済みのシグナル・タイプ一覧を示します。
| シグナル・タイプ | 説明 |
|---|---|
| 0x0000 | データが命令として実行された |
| 0x2000~0x20ff | Linuxにおけるmain()関数もしくはexit()関数からの返値 0x2000: EXIT_SUCCESS |
| 0x2100~0x21ff | LinuxにおけるPPEコールバックハンドラ 0x2100: ISO/IEC C Standard 9899:1999 (C99) |
| 0x3ffe | スタックオーバフロー検知 |
| 0x3fff | デバッガ用ブレイクポイント |
4.1.4 参考文献
MFCについては、この他にもさまざまな機構を供えています。MFCが提供する機能についてさらに学習したい方は、「Cell Broadband Engine Architecture」の第7章「MFC Commands」および「C/C++ Language Extensions for Cell Broadband Engine Architecture」の第4章「Programming Support for MFC Input and Output」を参照してください。
また、libspe2では、これらのMFC機能をPPEプログラムから利用することができます。libspe2でのMFC機構の使用方法については、「SPE Runtime Management Library Version 2.1」の第7章「SPE MFC problem state facilities」を参照してください。
ストップ・アンド・シグナル命令については、「C/C++ Language Extensions for Cell Broadband Engine Architecture」の第2.11節「Control Intrinsics」および「Cell Broadband Engine Programming Handbook」の第9.8節「SPU and MFC Interrupts Routed to the PPE」を参照してください。


