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:

SPE_EVENT_DMA_ALIGNMENT
    Der opstod en DMA-justeringsfejl.

SPE_EVENT_INVALID_DMA
    En ugyldig MFC DMA-kommando blev forsøgt.

SPE_EVENT_SPE_DATA_STORAGE
    Der opstod en DMA-lagerfejl.

SPE_EVENT_SPE_ERROR
    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

EBADF
    fd er ikke en gyldig filbeskrivelse.

EFAULT
    npc er ikke en gyldig peger, eller event er ikke-NULL og en ugyldig peger.

EINTR
    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.

EINVAL
    fd er ikke en gyldig fildeskriptor returneret fra spu_create(2).

ENOMEM
    Der var ikke nok hukommelse tilgængelig til at håndtere en sidefejl medført fra en Memory Flow Controller (MFC) direkte hukommelsesadgang.

ENOSYS
    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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.