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)