名 前
spu_run − SPU コ ン テ キ ス ト を 実 行 す る
書 式
#include <sys/spu.h>
int spu_run(int fd, unsigned int *npc, unsigned int *event); 注 : こ の シ ス テ ム コ ー ル に は glibc の ラ ッ パ ー 関 数 は 存 在 し な い 。 「 注 意 」 の 節 を 参 照 。
説 明
spu_run() シ ス テ ム コ ー ル は 、 Cell Broadband Engine ア ー キ テ ク チ ャ ー を 実 装 し た PowerPC マ シ ン で Synergistic Processor Units (SPU) に ア ク セ ス す る た め に 使 用 さ れ る 。 fd 引 き 数 は 、 spu_create(2) が 返 す フ ァ イ ル デ ィ ス ク リ プ タ ー で 、 特 定 の SPU コ ン テ キ ス ト を 参 照 す る 。 そ の コ ン テ キ ス ト が 物 理 SPU に 割 り 当 て ら れ る と 、 npc で 渡 さ れ た 命 令 ポ イ ン タ ー (instruction pointer) か ら 実 行 が 開 始 さ れ る 。
SPU コ ー ド の 実 行 は 同 期 的 (synchronously) に 行 わ れ る 、 つ ま り SPU が 実 行 中 は spu_run() は 停 止 (block) す る 。 SPU コ ー ド の 実 行 を メ イ ン CPU や 他 の SPU と 並 行 し て 行 う 必 要 が あ る 場 合 は 、 最 初 に 、 そ の SPU コ ー ド を 実 行 す る 新 し い ス レ ッ ド を 、 (例 え ば pthread_create(3) な ど を 使 っ て ) 生 成 し な け れ ば な ら な い 。
spu_run() が 返 る と き に は 、 SPU の プ ロ グ ラ ム カ ウ ン タ ー の 現 在 値 が npc に 書 き 込 ま れ る 。 こ れ に よ り 、 連 続 す る spu_run() の 呼 び 出 し で 同 じ npc ポ イ ン タ ー を 使 う こ と が で き る 。
event
引 き 数 に は 、
拡 張 ス テ ー タ
ス コ ー ド 用 の
バ ッ フ ァ ー を
指 定 す る 。
SPU_CREATE_EVENTS_ENABLED フ ラ グ
付 き で SPU コ ン テ
キ ス ト が 作 成
さ れ る と 、
spu_run() が 返 る 前
に Linux カ ー ネ ル に
よ り こ の バ ッ
フ ァ ー に 拡 張
ス テ ー タ ス コ
ー ド が 格 納 さ
れ る 。 ス テ ー
タ ス コ ー ド に
は 以 下 の 定 数
が 一 つ 以 上 入
る 。
SPE_EVENT_DMA_ALIGNMENT
DMA (direct memory access) の ア ラ イ メ ン ト エ ラ ー が 発 生 し た 。
SPE_EVENT_INVALID_DMA
無 効 な MFC (Memory Flow Controller) DMA
コ マ ン ド を 行
お う と し た 。
SPE_EVENT_SPE_DATA_STORAGE
DMA ス ト レ ー ジ エ ラ ー が 発 生 し た 。
SPE_EVENT_SPE_ERROR 不 正 な 命 令 が 実 行 さ れ た 。
NULL は event 引 き 数 と し て 有 効 な 値 で あ る 。 こ の 場 合 、 イ ベ ン ト は 呼 び 出 し 元 の プ ロ セ ス に 報 告 さ れ な い 。
返 り 値
成 功 す る と 、 spu_run() は spu_status レ ジ ス タ ー の 値 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno を 下 記 の エ ラ ー コ ー ド の い ず れ か に 設 定 す る 。
spu_status レ ジ ス タ ー の 値 は 、 ス テ ー タ ス コ ー ド と SPU の stop−and−signal 命 令 が 返 す 14 ビ ッ ト の コ ー ド の ビ ッ ト マ ス ク で 構 成 さ れ る 。 後 者 の 14 ビ ッ ト の コ ー ド は オ プ シ ョ ン で あ る 。 ス テ ー タ ス コ ー ド の ビ ッ ト マ ス ク は 下 記 の 通 り で あ る 。
0x02 |
SPU が stop−and−signal 命 令 で 停 止 し た 。 |
|||
0x04 |
SPU が halt (停 止 ) 命 令 で 止 ま っ た 。 |
|||
0x08 |
SPU は チ ャ ン ネ ル の ウ ェ イ ト 中 で あ る 。 |
|||
0x10 |
SPU は シ ン グ ル ス テ ッ プ モ ー ド で あ っ た 。 |
|||
0x20 |
SPU が 不 正 な 命 令 を 実 行 し よ う と し た 。 |
|||
0x40 |
SPU が 不 正 な チ ャ ン ネ ル に ア ク セ ス し よ う と し た 。 |
0x3fff0000 こ の 値 の マ ス ク を 適 用 し て 得 ら れ た ビ ッ ト 値 に は 、 stop−and−signal 命 令 か ら 返 さ れ た コ ー ド が 入 っ て い る 。 こ れ ら の ビ ッ ト は 0x02 ビ ッ ト が セ ッ ト さ れ て い る 場 合 に の み 有 効 で あ る 。
spu_run() が エ ラ ー を 返 さ な か っ た 場 合 、 下 位 8 ビ ッ ト の う ち 1 つ 以 上 は 常 に セ ッ ト さ れ る 。
エ ラ ー
EBADF |
fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 | ||
EFAULT |
npc が 有 効 な ポ イ ン タ ー で な い 。 ま た は event が NULL 以 外 で 、 し か も 無 効 な ポ イ ン タ ー で あ る 。 | ||
EINTR |
spu_run() の 実 行 中 に シ グ ナ ル が 発 生 し た 。 signal(7) 参 照 。 必 要 で あ れ ば 、 npc の 値 は 新 し い プ ロ グ ラ ム カ ウ ン タ ー の 値 に 更 新 さ れ る 。 | ||
EINVAL |
fd が spu_create(2) が 返 し た 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 | ||
ENOMEM |
Memory Flow Controller (MFC) DMA に よ り 発 生 し た ペ ー ジ フ ォ ー ル ト を 処 理 す る の に 必 要 な メ モ リ ー が な か っ た 。 機 能 が 動 作 中 の シ ス テ ム で 提 供 さ れ て い な い 。 理 由 は 、 ハ ー ド ウ ェ ア で SPU が 提 供 さ れ て い な い か 、 spufs モ ジ ュ ー ル が ロ ー ド さ れ て い な い か 、 の ど ち ら か で あ る 。 バ ー ジ ョ ンspu_run() シ ス テ ム コ ー ル は カ ー ネ ル 2.6.16 で Linux に 追 加 さ れ た 。 準 拠こ の シ ス テ ム コ ー ル は Linux 固 有 で あ り 、 PowerPC ア ー キ テ ク チ ャ ー で の み 実 装 さ れ て い る 。 こ の シ ス テ ム コ ー ル を 使 っ た プ ロ グ ラ ム は 移 植 性 が な い 。 注 意glibc は こ の シ ス テ ム コ ー ル に 対 す る ラ ッ パ ー 関 数 を 提 供 し て い な い 。 syscall(2) を 使 う こ と 。 た だ し 、 spu_run() は よ り 抽 象 度 の 高 い SPU へ の イ ン タ ー フ ェ ー ス を 実 装 す る ラ イ ブ ラ リ か ら 利 用 さ れ る こ と を 意 図 し た も の で あ り 、 通 常 の ア プ リ ケ ー シ ョ ン か ら 使 用 は 意 図 さ れ て い な い 。 推 奨 の ラ イ ブ ラ リ に つ い て は http://www.bsc.es/projects/deepcomputing/linuxoncell/">http://www.bsc.es/projects/deepcomputing/linuxoncell/ を 参 照 の こ と 。 例以 下 は 、 簡 単 な 1 命 令 の SPU プ ロ グ ラ ム を spu_run() シ ス テ ム コ ー ル を 使 っ て 実 行 さ せ る 例 で あ る 。 #include
<stdlib.h> #define
handle_error(msg) \ int main(void)
context =
spu_create("/spu/example−context", 0, 0755);
/* write a
'stop 0x1234' instruction to the SPU's fd =
open("/spu/example−context/mem", O_RDWR);
/* set npc to
the starting instruction address of the spu_status =
spu_run(context, &npc, NULL); /* we should
see a status code of 0x1234002: exit(EXIT_SUCCESS); } 関 連 項 目close(2), spu_create(2), capabilities(7), spufs(7) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |