NOM
spu_run - Exécuter un contexte SPU
SYNOPSIS
#include <sys/spu.h>
int spu_run(int fd, unsigned int *npc, unsigned int *event);
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 retourné 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’appeller 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’erreur l’appel renvoie -1 et positionne errno à l’un des codes
d’erreur listés ci-dessous.
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() ; voir
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
La glibc ne fournit pas de fonction pour cet appel système : utilisez
syscall(2) pour l’appeler. Notez cependant que 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.
EXEMPLE
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: 0x%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 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et est maintenue par Julien Cristau
<julien.cristau@ens-lyon.org> et l’équipe francophone de traduction de
Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».