spu_run

名称

spu_run - 执行一个 spu 上下文

概要

#include <sys/spu.h>

int spu_run(int fd, unsigned int *npc, unsigned int *event);

描述

spu_run 系统调用用于实现 Cell Broadband Engine 架构的 PowerPC 机器,以访问协同处理器单元(SPU)。它使用从 spu_cre- ate(2) 返回的 fd 来寻址特定的 SPU 上下文。当上下文被调度到物理 SPU 时,它会在 npc 中传递的指令指针处开始执行。

SPU 代码的执行是同步发生的,这意味着当 SPU 仍在运行时,spu_run 不会返回。如果需要在主 CPU 或其他 SPU 上与其他代码并行执行 SPU 代码,则需要先创建一个新的执行线程,例如使用 pthread_create(3) 调用。

当 spu_run 返回时,SPU 指令指针的当前值会写回 npc,因此您可以再次调用 spu_run 而无需更新指针。

event 可以是 NULL 指针,也可以指向一个扩展状态码,该状态码在 spu_run 返回时被填充。它可以是以下常量之一

SPE_EVENT_DMA_ALIGNMENT

DMA 对齐错误

SPE_EVENT_SPE_DATA_SEGMENT

DMA 分段错误

SPE_EVENT_SPE_DATA_STORAGE

DMA 存储错误

如果将 NULL 作为 event 参数传递,这些错误将导致信号传递给调用进程。

返回值

spu_run 返回 spu_status 寄存器的值,如果发生错误,则返回 -1 并将 errno 设置为下面列出的错误代码之一。spu_status 寄存器值包含状态码的位掩码,还可以选择包含 SPU 上 stop-and-signal 指令返回的 14 位代码。状态码的位掩码如下:

0x02

SPU 被 stop-and-signal 停止。

0x04

SPU 被 halt 停止。

0x08

SPU 正在等待通道。

0x10

SPU 处于单步模式。

0x20

SPU 尝试执行无效指令。

0x40

SPU 尝试访问无效通道。

0x3fff0000

使用此值掩码的位包含从 stop-and-signal 返回的代码。

始终设置一个或多个低八位,或者从 spu_run 返回错误代码。

错误

EAGAIN 或 EWOULDBLOCK

fd 处于非阻塞模式,并且 spu_run 会阻塞。

EBADF fd 不是有效的文件描述符。

EFAULT npc 不是有效指针,或者 status 既不是 NULL 也不是有效的

指针。

EINTR 当 spu_run 正在进行时发生信号。如有必要,npc 值已更新为新的程序计数器值。

has been updated to the new program counter value if necessary.

EINVAL fd 不是从 spu_create(2) 返回的文件描述符。

ENOMEM 没有足够的内存来处理 MFC 直接内存访问导致的页面错误。

ing from an MFC direct memory access.

ENOSYS 当前系统未提供该功能,因为

硬件不提供 SPU 或未加载 spufs 模块。

注释

spu_run 旨在从实现 SPU 更抽象接口的库中使用,而不是从常规应用程序中使用。有关推荐的库,请参见http://www.bsc.es/projects/deepcomputing/linuxoncell/

遵循

此调用是 Linux 特定的,并且仅由 ppc64 架构实现。使用此系统调用的程序不可移植。

错误

该代码尚未完全实现此处列出的所有功能。

作者

Arnd Bergmann <arndb@de.ibm.com>

参见

capabilities(7), close(2), spu_create(2), spufs(7)