spu_run(2) | System Calls Manual | spu_run(2) |
spu_run - Exécuter un contexte SPU
Bibliothèque C standard (libc, -lc)
#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).
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 :
NULL est une valeur valable pour le paramètre event. Dans ce cas, les événements ne seront pas remontés au processus appelant.
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 :
Si spu_run() ne renvoie pas d'erreur, au moins un des huit bits de poids faible est toujours positionné.
L'appel système spu_run() est apparu dans Linux 2.6.16.
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.
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.
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); }
close(2), spu_create(2), capabilities(7), spufs(7)
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.
8 février 2023 | Pages du manuel de Linux 6.03 |