Manpages

名 前

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

fdspu_create(2) が 返 し た 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

ENOMEM

Memory Flow Controller (MFC) DMA に よ り 発 生 し た ペ ー ジ フ ォ ー ル ト を 処 理 す る の に 必 要 な メ モ リ ー が な か っ た 。

ENOSYS

機 能 が 動 作 中 の シ ス テ ム で 提 供 さ れ て い な い 。 理 由 は 、 ハ ー ド ウ ェ ア で 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>
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>

#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(void)
{
int context, fd, spu_status;
uint32_t instruction, npc;

context = spu_create("/spu/example−context", 0, 0755);
if (context == −1)
handle_error("spu_create");

/* write a 'stop 0x1234' instruction to the SPU's
* local store memory
*/
instruction = 0x00001234;

fd = open("/spu/example−context/mem", O_RDWR);
if (fd == −1)
handle_error("open");
write(fd, &instruction, sizeof(instruction));

/* set npc to the starting instruction address of the
* SPU program. Since we wrote the instruction at the
* start of the mem file, the entry point will be 0x0
*/
npc = 0;

spu_status = spu_run(context, &npc, NULL);
if (spu_status == −1)
handle_error("open");

/* we should see a status code of 0x1234002:
* 0x00000002 (spu was stopped due to stop−and−signal)
* | 0x12340000 (the stop−and−signal code)
*/
printf("SPU Status: 0x%08x\n", spu_status);

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/ に 書 か れ て い る 。