spu_create - 新しい SPU
コンテキストを生成する
#include <sys/types.h>
#include <sys/spu.h>
int spu_create(const char *pathname, int flags, mode_t mode,
int neighbor_fd);
注:
このシステムコールには
glibc
のラッパー関数は存在しない。「注意」の節を参照。
spu_create()
システムコールは、Cell
Broadband Engine
アーキテクチャーを実装した
PowerPC
マシンにおいて、Synergistic
Processor Unit (SPU)
にアクセスするために使用される。
このシステムコールは、
SPU
に対する新しい論理コンテキストを
pathname に生成し、
そのコンテキストに関連付けられたファイルディスクリプターを返す。
pathname は SPU
ファイルシステム (
spufs)
のマウントポイント内の存在しないディレクトリを指していなければならない。
spu_create() が成功すると、
pathname
にディレクトリが生成され、
そのディレクトリに
spufs(7)
で説明されているファイル群が配置される。
コンテキストを作成した際、返されたファイルディスクリプターは、
spu_run(2) に渡すか、
*at
系のシステムコール (
openat(2) など) の
dirfd
引数として使用するか、
クローズするか、しかできない。
他の操作は定義されていない。
そのコンテキストへの最後の参照がなくなった際に、
論理 SPU
コンテキストは破棄される
(そのコンテキストの
pathname
ディレクトリに作成されたファイルもすべて破棄される)。
通常は
spu_create()
が返したファイルディスクリプターがクローズされた際に発生する。
mode 引数
(からプロセスの
umask(2)
でセットされたビットを除いたもの)
により、
spufs
に作られる新しいディレクトリで使用されるアクセス許可が決まる。
利用できる
mode
値の完全なリストについては
stat(2) を参照。
The
neighbor_fd is used only when the
SPU_CREATE_AFFINITY_SPU flag
is specified; see below.
flags 引数には 0
か以下の定数の組み合わせ
(ビット単位の論理和)
を指定できる。
- SPU_CREATE_EVENTS_ENABLED
- DMA
エラーを通知するのにシグナルを使うのではなく、
spu_run(2) の event
引数を使用する。
- SPU_CREATE_GANG
- コンテキストの代わりに
SPU gang を作成する。 (gang
は、機能的に互いに関係していて、スケジューリングパラメーター
(優先度とポリシー)
を共有する SPU
コンテキストのグループである。
将来、
グループ全体が一つの単位としてスイッチイン/スイッチアウトされる
gang
スケジューリングが実装されるかもしれない。)
-
pathname
引数で指定された場所に新しいディレクトリが作成される。
この gang を使って他の SPU
コンテキストを保持することができる。
それには、それ以降の
spu_create() に gang
ディレクトリ内のパス名を渡す。
- SPU_CREATE_NOSCHED
- SPU
スケジューラーの影響を受けないコンテキストを作成する。
一度実行されると、
呼び出したプロセスが破棄されるまでこのコンテキストがスケジューリングで追い出されることはない。
- このコンテキストは
SPU
から削除されることはないので、
SPU_CREATE_NOSCHED
コンテキストではいくつかの機能は無効にされる。
spufs
のこのコンテキストのディレクトリでは一部のファイルだけができる。
また、 SPU_CREATE_NOSCHED
コンテキストはクラッシュした際にコアファイルをダンプできない。
-
SPU_CREATE_NOSCHED
コンテキストを作成するには
CAP_SYS_NICE
ケーパビリティが必要である。
- SPU_CREATE_ISOLATE
- 隔離された SPU
コンテキストを作成する。
隔離されたコンテキストはいくつかの
PPE (PowerPC Processing Element)
命令から保護される。
SPU ローカルストアや NPC
レジスターへのアクセスなどである。
-
SPU_CREATE_ISOLATE
コンテキストを作成するには
SPU_CREATE_NOSCHED
フラグも指定する必要がある。
-
SPU_CREATE_AFFINITY_SPU (Linux 2.6.23
以降)
- 別の SPU
コンテキストと affinity
(親和性)
を持ったコンテキストを作成する。
この affinity 情報は SPU
スケジューリングアルゴリズムで使用される。
このフラグを使う際には、
他の SPU
コンテキストを指すファイルディスクリプターを
neighbor_fd
引数を渡す必要がある。
-
SPU_CREATE_AFFINITY_MEM (Linux 2.6.23
以降)
- システムメモリーと
affinity (親和性)
を持ったコンテキストを作成する。
この affinity 情報は SPU
スケジューリングアルゴリズムで使用される。
成功すると、
spu_create()
は新しいファイルディスクリプターを返す。
エラーの場合、-1
を返し、
errno
に以下のリストに記載のエラーコードのいずれかを設定する。
- EACCES
- 現在のユーザーが
spufs(7)
のマウントポイントへの書き込み許可を持って
いない。
- EEXIST
- 指定されたパス名で
SPU
コンテキストがすでに生成されている。
- EFAULT
-
pathname
が呼び出し元のプロセスのアドレス空間で有効な文字列ポインターではない。
- EINVAL
-
pathname が SPUFS
マウントポイント内のディレクトリではない。
または、無効なフラグが指定された。
- ELOOP
-
pathname
を解決するまでに辿ったシンボリックリンクが多過ぎた。
- EMFILE
- The per-process limit on the number of open file
descriptors has been reached.
- ENAMETOOLONG
-
pathname
が長過ぎる。
- ENFILE
- The system-wide limit on the total number of open files has
been reached.
- ENODEV
- 隔離されたコンテキストが要求されたが、
ハードウェアが SPU
アイソレーションをサポートしていない。
- ENOENT
-
pathname
の一部が解決できなかった。
- ENOMEM
- カーネルが必要なリソースの全てを割り当てることができなかった。
- ENOSPC
- 新しいコンテキストを生成するのに十分な
SPU
リソースがなかった、
または SPU
コンテキスト数がそのユーザーの特定の上限に達していた。
- ENOSYS
- 機能が動作中のシステムで提供されていない。理由は、
ハードウェアで SPU
が提供されていないか、
spufs
モジュールがロードされていないか、のどちらかである。
- ENOTDIR
-
pathname
の一部がディレクトリではない。
- EPERM
-
SPU_CREATE_NOSCHED
フラグが指定されたが、ユーザーが
CAP_SYS_NICE
ケーパビリティを持っていない。
pathname は
spufs
のマウントポイントの配下の場所を指して
いなければならない。
慣例では
/spu
にマウントされる。
spu_create()
システムコールはカーネル
2.6.16 で Linux に追加された。
このシステムコールは
Linux 固有であり、 PowerPC
アーキテクチャーでのみ実装されている。
このシステムコールを使ったプログラムは移植性がない。
glibc
はこのシステムコールに対するラッパー関数を提供していない。
syscall(2)
を使うこと。ただし、
spu_create() は
より抽象度の高い SPU
へのインターフェースを実装するライブラリから
利用されることを意図したものであり、通常のアプリケーションから
使用は意図されていない。推奨のライブラリについては
http://www.bsc.es/projects/deepcomputing/linuxoncell/
を参照のこと。
Prior to the addition of the
SPU_CREATE_AFFINITY_SPU flag in Linux
2.6.23, the
spu_create() system call took only three arguments (i.e.,
there was no
neighbor_fd argument).
spu_create()
の利用例については
spu_run(2) を参照。
close(2),
spu_run(2),
capabilities(7),
spufs(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。