Provided by: manpages-fr-dev_4.23.1-1_all bug

NOM

       spu_run - Exécuter un contexte SPU

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/spu.h>          /* Définition des constantes SPU_* */
       #include <sys/syscall.h>      /* Définition des constantes SYS_* */
       #include <unistd.h>

       int syscall(SYS_spu_run, int fd, uint32_t *npc, uint32_t *event);

       Remarque :  la  glibc ne fournit pas d'enveloppe pour spu_run(), imposant l'utilisation de
       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

       En cas de succès, spu_run() renvoie la valeur du  registre  spu_status.  En  cas  d'échec,
       l'appel renvoie -1 et errno est défini pour indiquer l'erreur.

       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é.

STANDARDS

       Linux sur PowerPC.

HISTORIQUE

       Linux 2.6.16.

NOTES

       spu_run()  est  conçu  pour  être  appelé  depuis  des  bibliothèques qui implémentent une
       interface plus  abstraite  pour  les  SPU,  pas  pour  être  appelé  directement  par  les
       applications  normales.  Consultez ⟨http://www.bsc.es/projects/deepcomputing/linuxoncell/⟩
       pour les bibliothèques recommandées.

EXEMPLES

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

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

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

           context = syscall(SYS_spu_create, "/spu/example-context", 0, 0755);
           if (context == -1)
               err(EXIT_FAILURE, "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)
               err(EXIT_FAILURE, "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 = syscall(SYS_spu_run, context, &npc, NULL);
           if (spu_status == -1)
               err(EXIT_FAILURE, "open");

           /*
            * We should see a status code of 0x12340002:
            *   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)

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>,  David  Prévot  <david@tilapin.org>  et  Jean-Pierre  Giraud
       <jean-pierregiraud@neuf.fr>

       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⟩.