spufs(7) SPU ファイルシステム

説明

SPU ファイルシステムは、Cell Broadband Engine アーキテクチャを実装した PowerPC マシンにおいて、Synergistic Processor Unit (SPU) にアクセスする ために使用される。

このファイルシステムでは、POSIX 共有メモリやメッセージキューに 似た名前空間が提供される。 ファイルシステムに書き込み許可を持つユーザは spu_create(2) を使って spufs のルートディレクトリに SPU コンテキストを作成できる。

各 SPU コンテキストは、あらかじめ定義されたファイル群を含む ディレクトリとして表現される。 これらのファイルを使って、論理 SPU の状態を操作できる。 ユーザはこれらのファイルのアクセス許可を変更することはできるが、 ファイルの追加・削除を行うことはできない。

マウントオプション

uid=<uid>
マウントポイントを所有するユーザを設定する。 デフォルトは 0 (root) である。
gid=<gid>
マウントポイントを所有するグループを設定する。 デフォルトは 0 (root) である。

ファイル

spufs のファイルは、ほとんどの場合 read(2) や write(2) といった通常のシステムコールに対する標準的な振る舞いを示すが、 多くの場合通常のファイルシステムでサポートされている操作の一部分だけが サポートされている。以下のリストでは、サポートされている操作と それぞれのマニュアルページに書かれている標準的な振る舞いとの違いに ついて説明する。

read(2) 操作に対応している全てのファイルは readv(2) にも対応している。また、 write(2) 操作に対応している全てのファイルは writev(2) にも対応している。

全てのファイルは、 access(2) と stat(2) 系の操作に対応しているが、 stat(2) では、呼び出した際に返される stat 構造体のフィールドのうち信頼できる情報が入っているのは st_mode, st_nlink, st_uid, st_gid だけである。

全てのファイルは chmod(2)/fchmod(2) と chown(2)/fchown(2) の操作に対応しているが、 そのファイルが対応している操作と矛盾するアクセス許可を 付与することはできない (例えば、 wbox ファイルに対する読み出しアクセスなど)。

現時点でのファイルは以下の通りである。

/mem
SPU のローカルストレージの内容。 このファイルは通常の共有メモリファイルと同様にアクセスでき、 SPU のアドレス空間にはコードとデータの両方を格納できる。 オープンされた mem ファイルに可能な操作は以下である。
read(2), pread(2), write(2), pwrite(2), lseek(2)
これらは通常通り動作するが、 ファイル末尾を越えての lseek(2), write(2), pwrite(2) に対応していない点だけが異なる。 ファイルサイズは SPU のローカルストレージのサイズであり、 通常は 256 キロバイトである。
mmap(2)
mem をプロセスのアドレス空間にマッピングすると、 プロセスのアドレス空間の一部として SPU のローカル・ストレージにアクセスできるようになる。
/mbox
SPU から CPU への通信用の一つ目のメールボックス。 このファイルは読み出し専用で、読み出しは 32ビット単位で行う。 このファイルは非停止 (non-blocking) モードでのみ使用でき、 poll(2) であってもこのファイルで停止 (block) することはない。 オープンされた mbox ファイルに可能な操作は以下である。
read(2)
count が 4 より小さい場合、 read(2) は -1 を返し、 errnoEINVAL に設定する。 メールボックスにデータがない場合、-1 が返り、 errnoEAGAIN に設定される。データの読み出しに成功した場合、 4 バイトがデータバッファに格納され、返り値として 4 が返される。
/ibox
SPU から CPU への通信用の二つ目のメールボックスである。 このファイルは一つ目のメールボックスファイルと似ているが、 停止 (blocking) I/O モードでの読み出しが可能である。したがって、 poll(2) や同様のシステムコールを使って、このファイルを監視することができる。 オープンされた ibox ファイルに可能な操作は以下である。
read(2)
count が 4 より小さい場合、 read(2) は -1 を返し、 errnoEINVAL に設定する。 メールボックスにデータがない場合、ファイルディスクリプタが O_NONBLOCK でオープンされていれば、返り値は -1 となり、 errnoEAGAIN に設定される。

メールボックスにデータがない場合で、ファイルディスクリプタが O_NONBLOCK なしでオープンされていれば、 SPU が自分の割り込みメールボックスチャネル (interrupt mailbox channel) に書き込みを行うまで read(2) は停止 (block) する。 データの読み出しに成功した場合、 4 バイトがデータバッファに格納され、返り値として 4 が返される。

poll(2)
ibox ファイルに対する poll(2) は、読み出しデータが利用可能になる度に (POLLIN | POLLRDNORM) を返す。
/wbox
CPU から SPU への通信用のメールボックス。 このファイルは書き込み専用で、書き込みは 32ビット単位で行う。 メールボックスが一杯の場合、 write(2) は停止 (block) し、 poll(2) を使ってメールボックスに再度空きができるまで待つことができる。 オープンされた wbox ファイルに可能な操作は以下である。
write(2)
count が 4 より小さい場合、 write(2) は -1 を返し、 errnoEINVAL に設定する。 メールボックスに空き領域がない場合、ファイルディスクリプタが O_NONBLOCK でオープンされていれば、返り値は -1 となり、 errnoEAGAIN に設定される。

メールボックスに空き領域がない場合で、ファイルディスクリプタが O_NONBLOCK なしでオープンされていれば、 SPU が自分の PPE メールボックスチャネルから読み出しを行うまで write(2) は停止 (block) する。 データの書き込みに成功した場合、返り値として 4 が返される。

poll(2)
wbox ファイルに対する poll(2) は、書き込み用の空間が利用可能になる度に (POLLOUT | POLLWRNORM) を返す。
/mbox_stat, /ibox_stat, /wbox_stat
これらのファイルは読み出し専用で、 各メールボックスの現在のキュー長を保持する。 具体的には、停止 (blocking) せずに、 mboxibox から何ワードを読み出すことができ、 wbox に何ワードを書き込むことができるか、ということである。 これらのファイルは 4 バイト単位でのみ読み出しが可能で、 ビッグ・エンディアンの整数値を返す。 オープンされた *box_stat ファイルに可能な操作は以下である。
read(2)
count が 4 より小さい場合、 read(2) は -1 を返し、 errnoEINVAL に設定する。 それ以外の場合、データバッファに 4 バイトの値が書き込まれる。 この値は、各メールボックスにおいて停止せずに、または EAGAIN エラーなしで、読み出し可能なエレメント数 (mbox_statibox_stat の場合)、書き込み可能なエレメント数 (wbox_stat の場合) である。
/npc, /decr, /decr_status, /spu_tag_mask, /event_mask, /srr0
これらのファイルは SPU の内部レジスタを公開するものである。 値は、各レジスタの数値を含むアスキー文字列で表現される。 これらのファイルはデバッグ用として読み出し/書き込みの両モードで利用できるが、 プログラムの通常の操作はこれらのファイルに依存すべきではない。 なぜなら、これらのファイルのうち npc 以外へのアクセスでは SPU コンテキストの保存が必須であり、 SPU コンテキストの保存は非常に効率が悪いからである。
これらのファイルの内容は以下の通り。
npc
次のプログラムカウンタ
decr
SPU Decrementer
decr_status
Decrementer の状態
spu_tag_mask
SPU の DMA 用の MFA タグマスク
event_mask
SPU の割り込みのイベントマスク
srr0
割り込みリターンアドレスレジスタ
これらのファイルに対して可能な操作は以下である。
read(2)
read(2) に渡された count がレジスタ値と改行 (newline) 文字 1 個を格納するのに必要な長さより短い場合、 同じファイルディスクリプタを続けて read することで、文字列全体を読み出すこと ができる。この際、実行中の SPU タスクによりレジスタ値の変更の影響は受けない。 文字列全体が読み出されると、それ以降の read 操作では 0 バイトが返され、 新しい値を読み出すには新しいファイルディスクリプタをオープンする必要がある。
write(2)
このファイルへの write(2) 操作はレジスタ値を文字列で指定された値に設定する。 文字列の解釈は先頭から開始され、数字以外の文字が初めて登場するか、 バッファの末尾に達するまで行われる。 同じファイルディスクリプタへ続けて write を行うと、 後の write により前の設定が上書きされる。
/fpcr
このファイルにより Floating Point Status and Control Register に アクセスできる。このファイルは大きさ 4 バイトである。 fpcr ファイルに可能な操作は以下である。
read(2)
count が 4 より小さい場合、 read(2) は -1 を返し、 errnoEINVAL に設定する。 それ以外の場合、データバッファに 4 バイトの値が書き込まれる。 書き込まれる値は fpcr レジスタの現在の値である。
write(2)
count が 4 より小さい場合、 write(2) は -1 を返し、 errnoEINVAL に設定する。 それ以外の場合、 4 バイトの値がデータバッファからコピーされ、 fpcr レジスタの値が更新される。
/signal1, /signal2
これらのファイルにより SPU の二つのシグナル通知チャネル (signal notification channel) に アクセスできる。 これらは 32 ビット単位の読み書きができる。 これらのファイルの一つに書き込みを行うと、その SPU の割り込みが 発生するトリガーとなる。 シグナルファイルへ書き込まれた値は、チャネル経由で SPU で読み出したり、 このファイル経由でホストのユーザ空間で読み出したりできる。 SPU が値を読み出した後では、値は 0 にリセットされる。 オープンされた signal1signal2 ファイルに可能な操作は以下である。
read(2)
count が 4 より小さい場合、 read(2) は -1 を返し、 errnoEINVAL に設定する。 それ以外の場合、データバッファに 4 バイトの値が書き込まれる。 書き込まれる値は、指定されたシグナル通知レジスタの現在の値である。
write(2)
count が 4 より小さい場合、 write(2) は -1 を返し、 errnoEINVAL に設定する。 それ以外の場合、 4 バイトの値がデータバッファからコピーされ、 指定されたシグナル通知レジスタの値が更新される。 シグナル通知レジスタの更新には、レジスタ値を入力データで置き換えるモードと 以前の値と入力データのビット単位の OR をとった値に更新するモードがある。 どちらのモードになるかは、それぞれ signal1_type, signal2_type ファイルの内容によって決まる。
/signal1_type, /signal2_type
これらのファイルは、シグナル通知ファイル signal1signal2 の動作を変更する。 これらのファイルは数値を表すアスキー文字列を保持し、 読み出すと "1" か "0" のどちらかが得られる。 モード 0 (上書きモード) では、ハードウェアはシグナルチャネルの内容を シグナルチャネルに書き込まれたデータで置き換える。 モード 1 (論理 OR モード) では、ハードウェアはシグナルチャネルに 書き込まれたビットを積算していく。 オープンされた signal1_typesignal2_type ファイルに可能な操作は以下である。
read(2)
read(2) に渡された count がレジスタの数値と改行 (newline) 文字 1 個を格納するのに必要な長さより 短い場合、同じファイルディスクリプタを続けて read することで、 文字列全体を読み出すことができる。 文字列全体が読み出されると、それ以降の read 操作では 0 バイトが返され、 新しい値を読み出すには新しいファイルディスクリプタをオープンする必要がある。
write(2)
このファイルへの write(2) 操作はレジスタ値を文字列で指定された値に設定する。 文字列の解釈は先頭から開始され、数字以外の文字が初めて登場するか、 バッファの末尾に達するまで行われる。 同じファイルディスクリプタへ続けて write を行うと、 後の write により前の設定が上書きされる。

/etc/fstab entry
none  /spu   spufs  gid=spu        0       0