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 架構實現。使用此係統呼叫的程式不可移植。

缺陷

此程式碼尚未完全實現此處列出的所有功能。

作者

Arnd Bergmann <arndb@de.ibm.com>

另請參閱

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