Scroll to navigation

spu_run(2) System Calls Manual spu_run(2)

NAVN

spu_run - afvikl en SPU-kontekst

BIBLIOTEK

C-standardbibliotek (libc-lc)

SYNOPSIS

#include <sys/spu.h>          /* Definition af SPU_*-konstanter */
#include <sys/syscall.h>      /* Definition af SYS_*-konstanter */
#include <unistd.h>
int syscall(SYS_spu_run, int fd, uint32_t *npc, uint32_t *event);

Bemærk: glibc tilbyder intet omslag for spu_run(), hvilket nødvendiggør brug af syscall(2).

BESKRIVELSE

Systemkaldet spu_run() bruges på PowerPC-maskiner, der implementerer Cell Broadband Engine Architecture for at tilgå Synergistic Processor Units (SPU'er). Argumentet fd er en fildeskriptor returneret af spu_create(2), der refererer til en specifik SPU-kontekst. Når konteksten bliver planlagt til en fysisk SPU, så startes afvikling på instruktionspegeren sendt i npc.

Afvikling af SPU-kode sker synkront, hvilket betyder at spu_run() blokerer mens SPU stadig afvikles. Hvis der er et behov for at afvikle SPU-kode parallelt med anden kode på enten hoved-cpu'en eller andre SPU'er, skal en ny afviklingstråd oprettes først (f.eks. via pthread_create(3)).

Når spu_run() returnerer skrives den nuværend eværdi for SPU-programtælleren til npc, så efterfølgende kald til spu_run() kan bruge den samme npc-peger.

Argumentet event tilbyder et mellemlager for en udvidet statuskode. Hvis SPU-konteksten blev oprettet med flaget SPU_CREATE_EVENTS_ENABLED, så udfyldes dette mellemlager af Linuxkernen før spu_run() returnerer.

Statuskoden kan være en (eller flere) af de følgende konstanter:

Der opstod en DMA-justeringsfejl.
En ugyldig MFC DMA-kommando blev forsøgt.
Der opstod en DMA-lagerfejl.
En illegal instruktion blev afviklet.

NULL er en gyldig værdi for argumentet event argument. I dette tilfælde vil hændelserne ikke blive rapporteret til den kaldende proces.

RETURVÆRDI

Ved succes returnerer spu_run() værdien for registeret spu_status. Ved returneres -1 og errno angives for at indikere fejlen.

Registerværdien spu_status er en bitmaske for statuskoder og valgfrit en 14-bit kode returneret fra instruktionen stop-and-signal på SPU'en. Bitmaskene for statuskoderne er:

0x02
SPU blev stoppet af en stop-and-signal-instruktion.
0x04
SPU blev stoppet af en halt-instrution.
0x08
SPU venter på en kanal.
0x10
SPU er i enkelt trin-tilstand.
0x20
SPU har forsøgt at afvikle en ugyldig instruktion.
0x40
SPU har forsøgt at tilgå en ugyldig kanal.
0x3fff0000
Bittene maskeret med denne værdi indeholder koden returneret fra en stop-and-signal-instruktion. Disse bit er kun gyldige hvis 0x02-bitten er angivet.

Hvis spu_run() ikke har returneret en fejl, er en eller flere bit blandt de nedre otte altid angivet.*

FEJL

fd er ikke en gyldig filbeskrivelse.
npc er ikke en gyldig peger, eller event er ikke-NULL og en ugyldig peger.
Der opstod et signal mens spu_run() var i gang; se signal(7). Værdien npc er blevet opdateret til den nye programtællerværdi hvis nødvendigt.
fd er ikke en gyldig fildeskriptor returneret fra spu_create(2).
Der var ikke nok hukommelse tilgængelig til at håndtere en sidefejl medført fra en Memory Flow Controller (MFC) direkte hukommelsesadgang.
Funktionaliteten er ikke tilbudt af det nuværende system, da hverken udstyret tilbyder SPU'er eller spufs-modulet er indlæst.

STANDARDER

Linux på PowerPC.

HISTORIK

Linux 2.6.16.

NOTER

spu_run() er lavet til brug fra biblioteker, der impelemnterer en mere abstrakt grænseflade til SPU'er, ikke til brug fra normale programmer. Se http://www.bsc.es/projects/deepcomputing/linuxoncell/ for de anbefalede biblioteker.

EKSEMPLER

Det følgende er et eksempel på afvikling af et simpelt, en instruktion SPU-program med systemkaldet 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");
/*
* Skriv en 'stop 0x1234' instruktion til SPU'en's
* lokale lagerhukommelse.
*/
instruction = 0x00001234;
fd = open("/spu/example-context/mem", O_RDWR);
if (fd == -1)
err(EXIT_FAILURE, "open");
write(fd, &instruction, sizeof(instruction));
/*
* angiv npc til den startende instruktionsadresse for
* SPU-programmet. Siden vi skrev instruktionen i starten af
* mem-filen vil indgangspunktet være 0x0.
*/
npc = 0;
spu_status = syscall(SYS_spu_run, context, &npc, NULL);
if (spu_status == -1)
err(EXIT_FAILURE, "open");
/*
* Vi bør se en statuskode på 0x12340002:
* 0x00000002 (spu blev stoppet på grund af stop og signal)
* | 0x12340000 (stop og signal-koden)
*/
printf("SPU Status: %#08x\n", spu_status);
exit(EXIT_SUCCESS); }

SE OGSÅ

close(2), spu_create(2), capabilities(7), spufs(7)

OVERSÆTTELSE

Oversættere af denne manual til dansk Joe Dalton <joedalton2@yahoo.dk>

Denne oversættelse er gratis dokumentation; læs GNU General Public License version 3 eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR.

Hvis du støder på fejl i oversættelsen af ​​denne vejledning, skal du sende en besked til debian-l10n-danish@lists.debian.org.

8. februar 2026 Linux man-pages (ej udgivet)