Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       spu_run - Exécuter un contexte SPU

SYNOPSIS

       #include <sys/spu.h>          /* Definition of SPU_* constants */
       #include <sys/syscall.h>      /* Definition of SYS_* constants */
       #include <unistd.h>

       int spu_run(int fd, uint32_t *npc, uint32_t *event);

       Note: glibc provides no wrapper for spu_run(), necessitating the use of syscall(2).

DESCRIPTION

       L'appel  système  spu_run()  est  utilisé  sur  les PowerPC disposant de l'architecture du
       processeur Cell dans le but d'accéder aux SPUs (Synergistic Processor  Units).  L'argument
       fd  est  un  descripteur de fichiers renvoyé par spu_create(2) qui se réfère à un contexte
       SPU spécifique. Lorsque le contexte est livré à un SPU physique, il démarre son  exécution
       au pointeur d'instruction passé à npc.

       L'exécution  du  code  SPU  se  fait  de  manière  synchrone. C'est pourquoi spu_run() est
       bloquant tant que le SPU fonctionne.  S'il  est  nécessaire  d'exécuter  du  code  SPU  en
       parallèle  avec  d'autres  codes,  que se soit sur le processeur principal ou sur d'autres
       SPU,  un  nouveau  thread   doit   d'abord   être   créé   (par   exemple   en   utilisant
       pthread_create(3)).

       Lorsque  spu_run()  revient, la valeur courante du pointeur d'instruction SPU est écrite à
       npc, donc il est possible d'appeler spu_run() de nouveau avec le même pointeur npc.

       Le paramètre event fournit un tampon pour un code d'état étendu. Si le contexte SPU a  été
       créé  avec  l'attribut SPU_CREATE_EVENTS_ENABLED, ce tampon sera rempli par le noyau Linux
       avant que spu_run() revienne.

       Le code d'état peut être l'une (ou plus) des constantes suivantes :

       SPE_EVENT_DMA_ALIGNMENT
              Une erreur d'alignement DMA s'est produite.

       SPE_EVENT_INVALID_DMA
              Une commande MFC DMA invalide a été tentée.

       SPE_EVENT_SPE_DATA_STORAGE
              Une erreur de stockage DMA s'est produite.

       SPE_EVENT_SPE_ERROR
              Une instruction illégale a été exécutée.

       NULL est une valeur valable pour le paramètre event. Dans ce cas, les événements ne seront
       pas remontés au processus appelant.

VALEUR RENVOYÉE

       On  success,  spu_run()   returns  the  value  of  the spu_status register. On failure, it
       returns -1 and sets errno is set to indicate the error.

       La valeur du registre spu_status est un masque de bits de code d'erreurs et en option d'un
       code  de retour de 14 bits provenant de l'instruction stop-and-signal du SPU. Les bits des
       masques du code de retour sont :

       0x02   Le SPU a été stoppé par une instruction stop-and-signal.

       0x04   Le SPU a été arrêté par une instruction halt.

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

       0x10   Le SPU est en mode single-step.

       0x20   SPU a essayé d'exécuter une instruction non valable.

       0x40   SPU a essayé d'accéder à un canal non valable.

       0x3fff0000
              Les bits masqués avec cette valeur contiennent le code renvoyé par une  instruction
              stop-and-signal. Ces bits ne sont valables que si le bit 0x02 est positionné.

       Si  spu_run()  ne  renvoie  pas  d'erreur,  au  moins un des huit bits de poids faible est
       toujours positionné.

ERREURS

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

       EFAULT npc n'est pas un pointeur valable ou event n'est ni NULL ni un pointeur valable.

       EINTR  Un signal est apparu pendant la progression de spu_run() ; consultez signal(7).  La
              valeur  npc  a  été  mise  à  jour à la nouvelle valeur du compteur de programme si
              nécessaire.

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

       ENOMEM Il n'y a pas suffisamment 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 par fournie par le système actuel parce que le matériel ne
              fournit pas de SPU ou parce que le module spufs n'est pas chargé.

VERSIONS

       L'appel système spu_run() est apparu dans Linux 2.6.16.

CONFORMITÉ

       Cet appel système est spécifique à  Linux  et  implémenté  uniquement  sur  l'architecture
       PowerPC. Les programmes qui l'utilisent ne sont pas portables.

NOTES

       spu_run()   is meant to be used from libraries that implement a more abstract interface to
       SPUs,  not  to  be  used  from  regular  applications.   See   ⟨http://www.bsc.es/projects
       /deepcomputing/linuxoncell/⟩ for the recommended libraries.

EXEMPLES

       Vous  trouverez  ci-dessous  un exemple pour lancer un programme simple, d'une instruction
       SPU, utilisant l'appel système spu_run().

       #include <stdlib.h>
       #include <stdint.h>
       #include <unistd.h>
       #include <stdio.h>
       #include <sys/types.h>
       #include <fcntl.h>

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int main(void)
       {
           int context, fd, spu_status;
           uint32_t instruction, npc;

           context = spu_create("/spu/example-context", 0, 0755);
           if (context == -1)
               handle_error("spu_create");

           /*
            * Write a 'stop 0x1234' instruction to the SPU's
            * local store memory.
            */
           instruction = 0x00001234;

           fd = open("/spu/example-context/mem", O_RDWR);
           if (fd == -1)
               handle_error("open");
           write(fd, &instruction, sizeof(instruction));

           /*
            * set npc to the starting instruction address of the
            * SPU program. Since we wrote the instruction at the
            * start of the mem file, the entry point will be 0x0.
            */
           npc = 0;

           spu_status = spu_run(context, &npc, NULL);
           if (spu_status == -1)
               handle_error("open");

           /*
            * We should see a status code of 0x1234002:
            *   0x00000002 (spu was stopped due to stop-and-signal)
            * | 0x12340000 (the stop-and-signal code)
            */
           printf("SPU Status: %#08x\n", spu_status);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

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

COLOPHON

       Cette page fait partie de la publication 5.13 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier <barbier@debian.org> et David Prévot <david@tilapin.org>

       Cette  traduction  est  une  documentation libre ; veuillez vous reporter à la GNU General
       Public  License  version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   concernant   les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.