Глава 22. Вызовы API акселератора
Нижеследующие определения функций API относятся к работе акселератора.
Макроопределения экспорта функций вычислительного ядра
Программная модель MPMD, применяемая в ALF, позволяет использовать несколько вычислительных ядер в одном исполняемом образе для акселератора. Чтобы среда исполнения ALF распознавала функции разных ядер, их необходимо в нее экспортировать. Чтобы процедура экспорта функций была независима от платформы, предусмотрен ряд макрокоманд. В каждом исполняемом образе для акселератора должен быть как минимум один раздел экспортных определений API вычислительного ядра. Максимально допустимое число таких разделов зависит от платформы. Нижеприведенные примеры иллюстрируют использование данных макрокоманд.
/* Релизации API для задания "foo" */
int foo_comp_kernel(...) {...}
int foo_input_prepare(...) {...}
int foo_output_prepare(...) {...}
int foo_ctx_setup(...) {...}
int foo_ctx_merge(...) {...}
/* Реализации API для задания "bar" */
int bar_comp_kernel(...) {...}
int bar_input_prepare(...) {...}
int bar_output_prepare(...) {...}
int bar_ctx_setup(...) {...}
int bar_ctx_merge(...) {...}
/* раздел экспортных определений API */ ALF_ACCEL_API_LIST_BEGIN
/* для задания "foo" */
ALF_ACCEL_EXPORT_API ("foo_comp_kernel", foo_comp_kernel);
ALF_ACCEL_EXPORT_API ("foo_input_prepare", foo_input_prepare);
ALF_ACCEL_EXPORT_API ("foo_output_prepare", foo_output_prepare);
ALF_ACCEL_EXPORT_API ("foo_ctx_setup", foo_ctx_setup);
ALF_ACCEL_EXPORT_API ("foo_ctx_merge", foo_ctx_merge);
/* для задания "bar" */
ALF_ACCEL_EXPORT_API ("bar_comp_kernel", bar_comp_kernel);
ALF_ACCEL_EXPORT_API ("bar_input_prepare", bar_input_prepare);
ALF_ACCEL_EXPORT_API ("bar_output_prepare", bar_output_prepare);
ALF_ACCEL_EXPORT_API ("bar_ctx_setup", bar_ctx_setup);
ALF_ACCEL_EXPORT_API ("bar_ctx_merge", bar_ctx_merge);
ALF_ACCEL_EXPORT_API_LIST_END
|
ALF_ACCEL_EXPORT_API
ИМЯ
ALF_ACCEL_EXPORT_API — Объявляет один элемент раздела экспортных определений API вычислительного ядра.
СИНОПСИС
ALF_ACCEL_EXPORT_API(const char *p_api_name, int (*p_api)()) |
Параметры
| p_api_name[IN] | Строковая константа, уникальным образом идентифицирующая экспортируемый API. Рекомендуется использовать то же имя, что и в идентификаторе соответствующей функции. |
|---|
| p_api[IN] | Указатель на точку входа экспортируемой функции. |
|---|
ОПИСАНИЕ
Данная макрокоманда объявляет один элемент раздела экспортных определений API вычислительного ядра. Среда исполнения ALF находит адрес входа определяемых пользователем функций вычислительного ядра на основе информации, содержащейся в соответствующих элементах.
ALF_ACCEL_EXPORT_API_LIST_BEGIN
ИМЯ
ALF_ACCEL_EXPORT_API_LIST_BEGIN — Эта макрокоманда объявляет начало раздела экспортных определений API вычислительного ядра.
ОПИСАНИЕ
Данная макрокоманда должна быть первой командой в разделе определений.
ALF_ACCEL_EXPORT_API_LIST_END
ИМЯ
ALF_ACCEL_EXPORT_API_LIST_END — Эта макрокоманда объявляет конец раздела экспортных определений API вычислительного ядра.
ОПИСАНИЕ
Данная макрокоманда должна быть последней командой в разделе определений.
API вычислительного ядра, определяемые пользователем
В данном разделе перечислены прототипы API акселератора, которые требуется определить программисту. Некоторые из них являются факультативными, то есть их определять не обязательно. Примечание. Для удобства представления информации прототипам функций здесь присвоены различные имена. Вы можете выбирать любые имена при создании собственных реализаций этих функций.
alf_accel_comp_kernel
ИМЯ
alf_accel_comp_kernel — Обрабатывает рабочие блоки.
СИНОПСИС
int alf_accel_comp_kernel(void* p_task_ctx, void *p_parm_ctx_buffer, void
*p_input_buffer, void *p_output_buffer, void* p_inout_buffer, unsigned int
current_iter, unsigned int num_iter);
|
Параметры
| p_task_context [IN] | Указатель на блок локальной памяти, в котором содержится буфер контекста задания. |
|---|
| p_parm_ctx_data [IN] | Указатель на блок локальной памяти, в котором содержатся данные параметров и контекста. |
|---|
| p_input_buffer [IN] | Указатель на блок локальной памяти, в который загружаются входные данные. |
|---|
| p_output_buffer [IN] | Указатель на блок локальной памяти, в который записываются выходные данные. |
|---|
| p_inout_buffer [IN] | Указатель на блок памяти акселератора, где размещены буферы ввода-вывода. |
|---|
| current_iter [IN] | Текущее число итераций рабочих блоков многократного использования. Начальное значение — 0. Для блоков однократного использования это значение всегда равно 0. |
|---|
| num_iter [IN] | Общее число итераций рабочих блоков многократного использования. Для блоков однократного использования это значение всегда равно 1. |
|---|
ОПИСАНИЕ
Это вычислительное ядро, выполняющее обработку рабочих блоков. Среда исполнения ALF проверяет доступность всех входных данных, перед тем как осуществить этот вызов. Определение данной функции является обязательным.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| 0 | Операция выполнена корректно. |
|---|
| меньше 0 | В процессе обработки возникла ошибка. Код ошибки передается в обработчик ошибок. |
|---|
alf_accel_input_dtl_prepare
ИМЯ
alf_accel_input_dtl_prepare — Определяет списки пересылки входных данных.
СИНОПСИС
int alf_accel_input_dtl_prepare
(void* p_task_context, void *p_parm_context, void *p_dtl,
unsigned int current_iter, unsigned int num_iter); |
Параметры
| p_task_context[IN] | Указатель на буфер контекста задания в памяти акселератора. |
|---|
| p_parm_ctx_buffer[IN] | Указатель на буфер контекста параметров рабочего блока в памяти акселератора. |
|---|
| p_dtl[IN] | Указатель на список пересылки данных. Созданный список пересылки данных следует сохранить. |
|---|
| current_iter[IN] | Текущее число итераций рабочих блоков многократного использования. Начальное значение — 0. Для блоков однократного использования это значение всегда равно 0. |
|---|
| num_iter[IN] | Общее число итераций рабочих блоков многократного использования. Для блоков однократного использования это значение всегда равно 1. |
|---|
ОПИСАНИЕ
Эта функция вызывается средой исполнения ALF, когда от акселератора требуется определить списки пересылки входных данных. Следует принять во внимание, что поскольку среда ALF может использовать двойную буферизацию, данная функция должна ссылаться на информацию по p_parm_ctx_buffer. Эта функция должна генерировать списки пересылки данных для входного буфера (ALF_BUF_IN), совмещенного входного буфера (ALF_BUF_OVL_IN), а также совмещенного буфера ввода-вывода (ALF_BUF_OVL_INOUT), если такие буферы используются. Для совмещенного буфера ввода-вывода (ALF_BUF_OVL_INOUT) список пересылки данных, генерируемый данной функцией, повторно используется средой исполнения ALF, чтобы вернуть данные в основную память. Данная функция является факультативной. Она вызывается лишь в том случае, если атрибуту ALF_TASK_DESC_PARTITION_ON_ACCEL дескриптора задания присвоено значение «истина». Если данный атрибут не установлен либо ему присвоено значение «ложь», можно отказаться от реализации данной функции (если среда программирования поддерживает слабую связь) либо написать пустую функцию, возвращающую 0 (если слабая связь не поддерживается).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| 0 | Операция выполнена корректно. |
|---|
| меньше 0 | В процессе выполнения функции возникла ошибка. Код ошибки передается в обработчик событий. |
|---|
alf_accel_output_dtl_prepare
ИМЯ
alf_accel_output_dtl_prepare — Определяет раздел выходных данных.
СИНОПСИС
int alf_accel_output_dtl_prepare
(void* p_task_context, void *p_parm_ctx_buffer,
void *p_io_container, unsigned int current_iter,
unsigned int num_iter); |
Параметры
| p_task_context[IN] | Указатель на буфер контекста задания в памяти акселератора. |
|---|
| p_parm_ctx_buffer[IN] | Указатель на буфер контекста параметров рабочего блока в памяти акселератора. |
|---|
| p_dt_list_buffer[IN] | Указатель на буфер, где должен быть сохранен сгенерированный список пересылки данных. |
|---|
| current_iter[IN] | Текущее число итераций рабочих блоков многократного использования. Начальное значение — 0. Для блоков однократного использования это значение всегда равно 0. |
|---|
| num_iter[IN] | Общее число итераций рабочих блоков многократного использования. Для блоков однократного использования это значение всегда равно 1. |
|---|
ОПИСАНИЕ
Эта функция вызывается средой исполнения ALF, когда от акселератора требуется определить раздел выходных данных. Поскольку ALF может использовать двойную буферизацию, данная функция должна ссылаться лишь на информацию по p_parm_ctx_buffer. Эта функция создает списки пересылки данных для выходного буфера (ALF_BUF_OUT) и совмещенного выходного буфера (ALF_BUF_OVL_OUT), если эти буферы используются. Данная функция вызывается только если атрибуту ALF_TASK_DESC_PARTITION_ON_ACCEL дескриптора задания присвоено значение «истина». Если данному атрибуту присвоено значение «ложь» или не присвоено никакого значения, можно отказаться от определения данной функции (если среда программирования поддерживает слабую связь) либо написать пустую функцию, возвращающую 0 (если слабая связь не поддерживается).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| 0 | Операция выполнена корректно. |
|---|
| меньше 0 | В процессе выполнения функции возникла ошибка. Код ошибки передается обработчику событий. |
|---|
alf_accel_task_context_setup
ИМЯ
alf_accel_task_context_setup — Инициализирует задание.
СИНОПСИС
int alf_accel_task_context_setup (void* p_task_context); |
Параметры
| p_task_context [IN/OUT] | Указатель на контекст задания в памяти акселератора. |
|---|
ОПИСАНИЕ
Данная функция вызывается средой исполнения ALF, когда на акселераторе начинается выполнение задания. Среда исполнения загружает первоначальный контекст задания в локальную память и вызывает эту функцию, чтобы выполнить специфические процедуры инициализации для экземпляра задания. Среда исполнения ALF вызывает эту функцию только в том случае, если задание имеет контекст. Если задание не имеет контекста или приложению не требуется дополнительная настройка первоначального контекста, можно отказаться от определения данной функции (если среда программирования поддерживает слабую связь) либо написать пустую функцию, возвращающую 0 (если слабая связь не поддерживается).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| 0 | Вызов API корректно завершен. |
|---|
| меньше 0 | В процессе выполнения функции возникла ошибка. Код ошибки передается обработчику событий. |
|---|
alf_accel_task_context_merge
ИМЯ
alf_accel_task_context_merge — Выполняет объединение контекста после того, как выполнение задания завершено.
СИНОПСИС
int alf_accel_task_context_merge
(void* p_task_context_to_be_merged, void* p_task_context); |
Параметры
| p_task_context_to_merge[IN] | Указатель на блок локальной памяти, где размещается буфер объединенного контекста задания. |
|---|
| p_task_context[IN/OUT] | Указатель на блок в локальной памяти, где размещается буфер контекста целевого задания. |
|---|
ОПИСАНИЕ
Данная функция вызывается средой исполнения ALF, когда выполнение задания на акселераторе прекращается. Среда загружает контекст соответствующего задания в память акселератора, выполняющего задание, и вызывают эту функцию для объединения контекста. Среда исполнения ALF вызывает данную функцию только если задание имеет контекст. Если задание не имеет контекста или отсутствует необходимость в объединении контекстов, можно отказаться от определения данной функции (если среда программирования поддерживает слабую связь) либо написать пустую функцию, возвращающую 0 (если слабая связь не поддерживается).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| 0 | Вызов API корректно завершен. |
|---|
| меньше 0 | В процессе выполнения функции возникла ошибка. Код ошибки передается обработчику событий. |
|---|
API среды исполнения
В данном разделе перечислены API, предоставляемые средой исполнения ALF на стороне акселератора.
alf_accel_num_instances
ИМЯ
alf_accel_num_instances — Возвращает число экземпляров задания данного вычислительного ядра.
СИНОПСИС
int alf_accel_num_instances (void); |
Параметры
отсутствуют
ОПИСАНИЕ
Данная функция возвращает число экземпляров задания, выполняемых в настоящий момент вычислительным ядром. Ее следует использовать лишь в том случае, если при создании задания использовался атрибут ALF_TASK_ATTR_SCHED_FIXED. Если пользователь вызывает эту функцию, а атрибут ALF_TASK_ATTR_SCHED_FIXED не использовался, возвращаемо значение может меняться от вызова к вызову, по мере того так среда исполнения ALF динамически загружает и выгружает экземпляры задания.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| >0 | Число акселераторов, выполняющих данное вычислительное задание |
|---|
| меньше 0 | Внутренняя ошибка |
|---|
alf_accel_instance_id
ИМЯ
alf_accel_instance_id — Возвращает текущий идентификатор экземпляра задания.
СИНОПСИС
int alf_accel_instance_id (void); |
Параметры
отсутствуют
ОПИСАНИЕ
Данная функция возвращает текущий идентификатор экземпляра задания. Значение этого идентификатора лежит в диапазоне от 0 до alf_accel_num_instances.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
| >=0 | Идентификатор текущего акселератора. Гарантируется уникальность данного идентификатора в рамках зарезервированных акселераторов для среды исполнения ALF |
|---|
| меньше 0 | Внутренняя ошибка |
|---|
ALF_ACCEL_DTL_BEGIN
ИМЯ
ALF_ACCEL_DTL_BEGIN — Помечает начало списка пересылки данных для указанного целевого буфера buffer_type.
СИНОПСИС
ALF_ACCEL_DTL_BEGIN (void* p_dtl, ALF_IO_BUF_TYPE_T buf_type, unsigned int offset); |
Параметры
| p_dtl[IN/OUT] | Указатель на буфер для структуры списка пересылки данных. |
|---|
| buf_type | ALF_BUF_IN ALF_BUF_OUT ALF_OVL_IN ALF_OVL_OUT ALF_OVL_INOUT |
|---|
| offset[IN] | Смещение к указателю на входной или выходной буфер в локальной памяти, на которое ссылается список пересылки данных. |
|---|
ОПИСАНИЕ
Данная служебная функция помечает начало списка пересылки данных для указанного целевого буфера buffer_type. Дальнейшие вызовы функции ALF_ACCEL_DTL_ENTRY_ADD будут ссылаться на уже открытый список пересылки данных. Можно создать несколько списков пересылки данных для каждого типа буфера. Однако в любой момент времени для операции с элементом может быть открыт только один список. Примечание: Данная функция предназначена для акселераторной части узла и выполняет генерацию элементов списка пересылки данных. На некоторых платформах она может быть реализована в виде макрокоманды.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Отсутствует.
ALF_ACCEL_DTL_ENTRY_ADD
ИМЯ
ALF_ACCEL_DTL_ENTRY_ADD — Заполняет элемент списка пересылки данных.
СИНОПСИС
ALF_ACCEL_DTL_ENTRY_ADD
(void *p_dtl, unsigned int data_size, ALF_DATA_TYPE_T data_type,
alf_data_addr64_t p_host_address); |
Параметры
| p_dtl[IN] | Указатель на буфер, содержащий список пересылки данных. |
|---|
| data_size[IN] | Размер данных в единицах типа данных. |
|---|
| data_type[IN] | Тип данных. Данное значение требуется в том случае, когда при пересылке данных требуется преобразование порядка байтов в словах. |
|---|
| host_address[IN] | Адрес в основной памяти. |
|---|
ОПИСАНИЕ
Данная функция заполняет элемент списка пересылки данных. Примечание: Данная функция предназначена для акселераторной части узла и выполняет генерацию элементов списка пересылки данных. На некоторых платформах она может быть реализована в виде макрокоманды.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Отсутствует.
ALF_ACCEL_DTL_END
ИМЯ
ALF_ACCEL_DTL_END — Помечает конец списка пересылки данных.
СИНОПСИС
ALF_ACCEL_DTL_END(void* p_dtl); |
Параметры
| p_dtl[IN] | Указатель на буфер со списком пересылки данных. |
|---|
ОПИСАНИЕ
Данная служебная функция помечает конец списка пересылки данных.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Отсутствует.
|