Provided by: manpages-fr-dev_4.27.0-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 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.

Pages du manuel de Linux 6.9.1                    15 juin 2024                                        spu_run(2)