spu_run¶
名称¶
spu_run - 执行 SPU 上下文
概要¶
#include <sys/spu.h> int spu_run(int fd, unsigned int *npc, unsigned int *event);
描述¶
spu_run 系统调用用于实现 Cell 宽带引擎架构的 PowerPC 机器,以访问协同处理器单元 (SPU)。它使用 spu_create(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 存储错误
如果 event 参数传递为 NULL,这些错误将导致信号传递给调用进程。
返回值¶
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 值
已更新为新的程序计数器值。
EINVAL fd 不是 spu_create(2) 返回的文件描述符。
- ENOMEM 没有足够的内存来处理 MFC 直接内存访问导致
的页面错误。
- ENOSYS 当前系统未提供此功能,因为
硬件不提供 SPU 或 spufs 模块未加载。
注意¶
spu_run 旨在由实现更抽象 SPU 接口的库使用,而不是由常规应用程序使用。有关推荐的库,请参阅 http://www.bsc.es/projects/deepcomputing/linuxoncell/。
符合标准¶
此调用是 Linux 特定的,仅由 ppc64 架构实现。使用此系统调用的程序不可移植。
缺陷¶
此代码尚未完全实现此处列出的所有功能。
另请参阅¶
capabilities(7), close(2), spu_create(2), spufs(7)