spu_run(2)

ИМЯ
spu_run - выполняет контекст SPU

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#include <sys/spu.h>          /* определения констант SPU_* */
#include <sys/syscall.h>      /* определения констант SYS_* */
#include <unistd.h>

int syscall(SYS_spu_run, int fd, uint32_t *npc, uint32_t *event);

Note: glibc provides no wrapper for spu_run(), necessitating the use of syscall(2).

ОПИСАНИЕ
Системный вызов spu_run() используется на машинах PowerPC с архитектурой Cell Broadband Engine для получения доступа к Synergistic Processor Unit (SPU). Аргумент fd представляет собой файловый дескриптор, возвращаемый вызовом spu_create(2) и указывающий на определённый контекст SPU. Когда контекст планируется на физическом SPU, он запускается на выполнение начиная с инструкции, на которую указывает значение npc.

Выполнение кода SPU происходит синхронно, то есть spu_run() блокируется на время работы SPU. Если требуется параллельное выполнение кода SPU и кода на основном процессоре или других SPU, то сначала нужно создать новую нить выполнения (например с помощью pthread_create(3)).

При завершении работы spu_run() текущее значение программного счётчика SPU записывается в npc, что позволяет использовать тот же указатель npc в последующих вызовах spu_run().

В аргументе event указывается буфер для расширенного кода состояния. Если контекст SPU создан с флагом SPU_CREATE_EVENTS_ENABLED, то ядро Linux заполняет этот буфер перед возвратом из spu_run().

Код состояния может быть одной (или несколькими) из следующих констант:

SPE_EVENT_DMA_ALIGNMENT
    Произошла ошибка выравнивания DMA.

SPE_EVENT_INVALID_DMA
    Попытка выполнить неверную команду MFC DMA.

SPE_EVENT_SPE_DATA_STORAGE
    Произошла ошибка хранилища DMA.

SPE_EVENT_SPE_ERROR
    Выполнена недопустимая инструкция.

Для аргумента event допускается значение NULL. В этом случае информация о событиях не будет поступать в вызывающий процесс.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, spu_run() returns the value of the spu_status register. On failure, it returns -1 and sets errno is set to indicate the error.

Значение регистра spu_status представляет собой битовую маску кодов состояния и необязательный 14-битный код, возвращаемый при выполнении инструкции stop-and-signal SPU. Битовые маски кодов состояний:

0x02
    SPU остановлен инструкцией stop-and-signal.

0x04
    SPU остановлен инструкцией halt.

0x08
    SPU ожидает канала.

0x10
    SPU в пошаговом режиме.

0x20
    SPU пытался выполнить неверную инструкцию.

0x40
    SPU пытался получить доступ к неверному каналу.

0x3fff0000
    При наложении этой маски получается код, возвращаемый инструкцией stop-and-signal. Полученные биты корректны только, если установлен бит 0x02.

Если spu_run() не вернул ошибку, то один или более младших восьми битов всегда установлены.

ОШИБКИ

EBADF
    Значение fd не является правильным файловым дескриптором.

EFAULT
    Задан неправильный указатель в npc или значение event не равно NULL и является неправильным указателем.

EINTR
    При выполнении spu_run() получен сигнал; см. signal(7). При необходимости, значение npc обновляется до нового значения программного счётчика.

EINVAL
    Значение fd не является правильным файловым дескриптором, возвращённым spu_create(2).

ENOMEM
    Недостаточно памяти для обработки страничного сбоя в результате прямого доступа Memory Flow Controller (MFC).

ENOSYS
    Возможность не предоставляется текущей системой, так как или аппаратура не предоставляет SPU, или не загружен модуль spufs.

СТАНДАРТЫ
Linux on PowerPC.

ИСТОРИЯ
Linux 2.6.16.

ЗАМЕЧАНИЯ
spu_run() is meant to be used from libraries that implement a more abstract interface to SPUs, not to be used from regular applications. See http://www.bsc.es/projects/deepcomputing/linuxoncell/ for the recommended libraries.

ПРИМЕРЫ
В следующем примере реализована простая программа, состоящая из одной инструкции SPU и системного вызова 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)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.