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 :
- 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.
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é.
- 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é.
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
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Pierre Giraud <
[email protected]>
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 à
[email protected]