spu_run -
выполняет
контекст SPU
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.
The
spu_run() system call was added in Linux 2.6.16.
Данный
вызов
существует
только в Linux и
реализован
только для
архитектуры
PowerPC.
Программы,
использующие
данный
вызов, не
переносимы.
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));
/*
* присвоить npc адрес начальной инструкции программы
* SPU. Так как мы записали инструкцию в начало
* файла mem, точка входа будет равна 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 <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]