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 架构实现。使用此系统调用的程序不可移植。
错误¶
该代码尚未完全实现此处列出的所有功能。
参见¶
capabilities(7), close(2), spu_create(2), spufs(7)