Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

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

БИБЛИОТЕКА

       Стандартная библиотека языка C (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> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                      spu_run(2)