SPU_RUN(2)

NOM
spu_run - Exécuter un contexte spu

SYNOPSIS
#include <sys/spu.h>
int spu_run(int fd, unsigned int *npc, unsigned int *event);

DESCRIPTION
L'appel système spu_run() est utilisé sur les machines PowerPC à base de processeur « Cell Broadband Engine » afin d'accéder aux unités synergiques SPU (Synergistic Processor Units). L'argument fd est un descripteur de fichier renvoyé par spu_create(2) qui adresse un contexte SPU spécifique. Lorsque le contexte est transmis à une SPU physique, il démarre son exécution au pointeur d'exécution passé dans npc. L'exécution du code SPU se fait de manière synchrone, ce qui signifie que spu_run() ne revient pas tant que la SPU est en cours d'exécution. S'il est nécessaire d'exécuter du code SPU en parallèle d'autres codes soit sur l'unité centrale principale, soit sur d'autres SPU, il faut d'abord créer un nouveau thread avec pthread_create(3). Lorsque spu_run() revient, la valeur actuelle du pointeur d'instruction SPU est écrite dans npc, ainsi, on peut appeler à nouveau spu_run() sans avoir à mettre à jour les pointeurs. event peut être NULL ou un pointeur vers un tampon que spu_run() utilise pour renvoyer un code d'état étendu. Le code d'état peut être l'une des constantes suivantes :

SPE_EVENT_DMA_ALIGNMENT
    Une erreur d'alignement DMA est apparue (SIGBUS, si_code est mise à BUS_ADRALN).

SPE_EVENT_INVALID_DMA
    MFC DMA n'était pas valide (SIGBUS, si_code est mise à BUS_OBJERR).

SPE_EVENT_SPE_DATA_STORAGE
    Une erreur de stockage DMA est apparue (SIGBUS, si_code est mise à BUS_ADRERR).

SPE_EVENT_SPE_ERROR
    Instruction illégale (SIGBUS, si_code est mise à BUS_ADRALN).

Si event est NULL, ces erreurs provoqueront la transmission des signaux correspondants indiqués ci-dessus au processus appelant.

VALEUR RENVOYÉE
S'il réussit, spu_run() renvoie la valeur du registre spu_status. S'il échoue, il renvoie -1 et remplit errno avec l'un des codes d'erreur indiqués plus loin. La valeur du registre spu_status est un masque de bits de codes d'état et éventuellement un code sur 14 bits renvoyé par l'instruction « stop-and-signal » de la SPU. Les masques de bits des codes d'états sont :

0x02
    La SPU a été arrêtée par l'instruction « stop-and-signal ». Dans ce cas, le code 14 bits renvoyé par l'instruction peut être récupéré avec le masque 0x3fff0000.

0x04
    La SPU a été arrêté par « halt ».

0x08
    La SPU est en attente d'un canal.

0x10
    La SPU est en mode simple pas (single-step).

0x20
    La SPU a essayé d'exécuter une instruction invalide.

0x40
    La SPU a essayé d'accéder à un canal invalide.

Si spu_run() n'a pas renvoyé d'erreur, un ou plusieurs bits parmi les 8 de poids faiblesest (sont) toujours positionné(s).

ERREURS

EAGAIN ou EWOULDBLOCK
    fd est en mode non bloquant et spu_run() bloquerait.

EBADF
    fd n'est pas un descripteur de fichier valide.

EFAULT
    npc n'est pas un pointeur valide ou status n'est ni NULL, ni un pointeur valide.

EINTR
    Un signal est apparu alors que spu_run() était en cours d'exécution. Si nécessaire, la valeur npc a été mise à jour avec la nouvelle valeur du compteur programme.

EINVAL
    fd n'est pas un descripteur de fichier renvoyé par spu_create(2).

ENOMEM
    Il n'y a pas assez de mémoire disponible pour gérer une faute de page résultant d'un accès direct à la mémoire d'un MFC (Memory Flow Controller).

ENOSYS
    La fonctionnalité n'est pas fournie par le système, soit parce que le matériel ne fournit pas de SPU, soit parce que le module spufs n'est pas chargé.

VERSIONS
L'appel système spu_run() a été indroduit dans la version 2.6.16 du noyau Linux.

CONFORMITÉ
Cet appel est spécifique à Linux et n'est implémenté que sur l'architecture ppc64. Les programmes qui utilisent cet appel système ne sont pas portables.

NOTES
La glibc ne fournit pas d'enveloppe pour cet appel système ; appelez-le avec syscall(2). Veuillez noter toutefois que spu_run() est conçu pour être utilisé par des bibliothèques qui implémentent une interface plus abstraite pour les SPU, pas pour être utilisé directement par des applications normales. Voir http://www.bsc.es/projects/deepcomputing/linuxoncell/ pour les bibliothèques recommandées.

BOGUES
Le code n'implémente pas encore toutes les fonctionnalités décrites ici.

VOIR AUSSI
close(2), spu_create(2), spufs(7)

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 18 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 spu_run ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.