IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Open source | Linux  >

Инфраструктура библиотек ускоренных вычислений для Cell Broadband Engine. Руководство программиста и справочник по функциям: Часть 1. Обзор ALF

Software Development Kit for Multicore Acceleration (Инструментарий разработчика для ускоренных многоядерных вычислений)

developerWorks
На предыдущую страницуСтраница 5 из 7 На предыдущую страницу

Опции документа

Обсудить


Выскажите мнение об этом учебном пособии

Помогите нам улучшить содержание


Глава 5. Основные понятия

В следующих разделах объясняются основные понятия и термины, используемые в ALF. Они охватывают следующие темы:

  • «Вычислительное ядро»
  • «Задание» (стр. 12)
  • «Дескриптор задания»
  • «Рабочие блоки» (стр. 14)
  • «Набор данных» (стр. 19)
  • «Обработка ошибок» (стр. 20)

Вычислительное ядро

Вычислительное ядро — это созданная пользователем программа для акселератора, которая принимает определенный набор входных данных и возвращает на его основе выходные данные.

Вычислительное ядро следует создавать в соответствии с определениями прототипов функций, помещая данные в предусмотренные буфера (см. главу 7, «Управление буферами акселератора», стр. 25). Затем вычислительное ядро следует зарегистрировать в среде исполнения ALF, когда создается соответствующий дескриптор задания.

Обычно вместе с вычислительным ядром используются четыре других, вспомогательных функции. В совокупности они составляют структуру из пяти записей для задания:

{
alf_accel_comp_kernel,
alf_accel_input_dtl_prepare,
alf_accel_output_dtl_prepare,
alf_accel_task_context_setup,
alf_accel_task_context_merge
}

Примечание: вышеприведенные названия функций акселератора, принятые в данном документе, не являются обязательными. Программист может назначить каждой из этих функций собственное название и зарегистрировать его с помощью сервиса дескриптора задания.

В зависимости от требований конкретного приложения некоторые элементы данной структуры могут принимать значение NULL.

Дополнительная информация об API, определяющих вычислительные ядра, приведена в разделе «Реализуемые пользователем API вычислительного ядра» на стр. 101.



В начало


Дескриптор задания

Дескриптор задания содержит все важные элементы описания задания. Чтобы достичь наивысшей производительности акселератора, ALF использует модель статического выделения памяти для выполнения каждого задания на акселераторе. Поэтому запуск задания требует предварительного указания информации о буферах, использовании стека и числе записей списка пересылки данных.

Наряду с информацией об использовании памяти акселератора дескриптор задания содержит также информацию об именах различных определяемых пользователем функций для акселератора и атрибут раздела данных.

Для определения дескриптора задания используется следующая информация:

  • Описание контекста задания
    • Размер буфера контекста задания
    • Элементы контекста задания: размер элемента, тип элемента
  • Образ исполняемого файла для акселератора, содержащий вычислительное ядро:
    • Имя функции вычислительного ядра акселератора
    • Имя функции подготовки списка пересылки входных данных акселератора (факультативно)
    • Имя функции подготовки списка пересылки выходных данных акселератора (факультативно)
    • Имя функции установки контекста задания акселератора (факультативно)
    • Имя функции объединения контекста задания акселератора
  • Размер буфера параметров и контекста рабочего блока
  • Размер входного буфера рабочего блока
  • Размер выходного буфера рабочего блока
  • Размер совмещенного буфера рабочего блока
  • Число элементов списка пересылки данных рабочего блока
  • Атрибут раздела данных задания:
    • Раздел данных на акселераторе
    • Раздел данных на основном процессоре
  • Размер стека акселератора

Дополнительная информация об API по вычислительным заданиям приведена в разделе «API для вычислительных заданий» на стр. 70.



В начало


Задание

Задание определяется как готовый к загрузке и исполнению экземпляр реализации, составленный на основе описания задания. Необходимое для выполнения задания число акселераторов можно указать явно, используя параметр num_instances в функции создания задания (alf_task_create), либо поручить определение нужного числа акселераторов среде исполнения ALF. Можно также заготовить данные для контекстного буфера, связанного с конкретным заданием.

Имеется также возможность зарегистрировать обработчик событий для отслеживания и обработки различных событий в ходе выполнения задания (см. «События задания» на стр. 14).

После того как создано задание, можно создавать рабочие блоки и помещать их в очередь, ассоциированную с данным заданием. В среде ALF действует режим немедленного выполнения. После того как рабочий блок помещен в очередь, если задание не имеет неразрешенных зависимостей от других заданий, то оно принимается к исполнению.

Информация о рабочих блоках приведена в разделе «Work blocks» на стр. 14.



В начало


Завершение задания

После того как все имеющиеся рабочие блоки добавлены в очередь, необходимо вызвать функцию alf_task_finalize, чтобы оповестить ALF о том, что для данного задания рабочие блоки исчерпаны. Если этого не сделать, задание не сможет завершиться.



В начало


Зависимости и планирование заданий

В программной модели ALF зависимость заданий используется для подтверждения возможности запуска нескольких заданий в определенном порядке, в том случае, когда порядок имеет значение. Ниже перечислены несколько типичных сценариев зависимости:

  • Зависимость по данным, когда выходные данные одного задания являются входными для другого
  • Конфликт ресурсов, когда задания используют одни и те же общие ресурсы, такие как временные буферы
  • Расписание, когда задания должны выполняться по заранее определенному порядку

После того как задание создано, для указания его зависимости от активного задания можно использовать функцию alf_task_depends_on. Среда исполнения ALF учитывает эту зависимость, а также число требуемых акселераторов при принятии задания к исполнению.

Среда исполнения ALF не распознает замкнутую зависимость. Для задания, зависящего от других заданий, необходимо определить зависимости до того, как к нему будет добавлен первый рабочий блок. Если в определении заданий присутствует замкнутая зависимость, приложение зависнет.

Задание, зависимое от других заданий, не может быть выполнено до тех пор, пока те не будут завершены. Задания создаются в режиме немедленного выполнения. После того как задание создано и все его зависимости разрешены, оно может быть принято к исполнению.

Пример использования зависимости задания приведен в разделе «Пример зависимости задания» на стр. 135.



В начало


Экземпляр задания

Задание может быть принято к исполнению на нескольких акселераторах. Программа, выполняемая на отдельном акселераторе, называется экземпляром задания. Если при создании задания не использован атрибут ALF_TASK_ATTR_SCHED_FIXED, среда исполнения ALF может загружать экземпляр задания в акселератор и выгружать его в любое время.

Среда исполнения ALF генерирует события в моменты запуска и выгрузки экземпляра задания из акселератора. Программист может зарегистрировать обработчик для этих событий (см. раздел «События заданий» на стр. 14).



В начало


Фиксированное назначение заданий

При планировании заданий можно явно указать среде исполнения, какое число экземпляров следует создавать для конкретного задания. Это называется фиксированным назначением заданий. Для этого следует:

  1. Передать число экземпляров задания в момент его создания посредством интерфейса alf_task_create
  2. Установить атрибут задания ALF_TASK_ATTR_SCHED_FIXED

В этом случае среда исполнения запустит все экземпляры заданий до того, как им будут назначены рабочие блоки.



В начало


Контекст задания

Примечание: дополнительная информация приведена в разделе «Типы буферов» на стр. 25.

Контекст задания применяется в следующих сценариях использования:



В начало


Общие для разных рабочих блоков перманентные данные

Контекст задания можно использовать в качестве общего массива перманентных доступных по ссылке данных для всех рабочих блоков задания. Это особенно полезно для статических входных данных, таблиц поиска или любых других входных данных, общих для всех рабочих блоков. Так как среда исполнения ALF загружает контекст задания в память акселератора до начала обработки любого рабочего блока, программист может быть уверенным в том, что общие данные всегда готовы к использованию.



В начало


Объединение результатов промежуточных вычислений различных рабочих блоков

Контекст задания можно использовать для инкрементального обновления окончательного результата задания, основанного на вычислениях каждого рабочего блока. В таких приложениях результаты обработки отдельных рабочих блоков являются промежуточными. Эти промежуточные результаты сохраняются в контексте задания. Контекст задания можно обновлять в вычислительном ядре в ходе обработки рабочего блока. После того как все рабочие блоки обработаны, среда исполнения ALF выполняет объединение промежуточных данных экземпляров задания в единый финальный результат с помощью функции alf_accel_task_context_merge.

Пример использования контекста задания для поиска максимального или минимального значения в большом массиве данных приведен в разделе «Пример поиска минимального или максимального значения» на стр. 128.



В начало


События задания

Среда исполнения ALF генерирует оповещения для следующих событий задания:

  • ALF_TASK_EVENT_READY — задание готово к началу обработки
  • ALF_TASK_EVENT_FINISHED — исполнение задания завершено
  • ALF_TASK_EVENT_FINALIZED — все рабочие блоки задания помещены в очередь, была вызвана функция alf_task_finalized
  • ALF_TASK_EVENT_INSTANCE_START — запущен один новый экземпляр задания
  • ALF_TASK_EVENT_INSTANCE_END — завершен один экземпляр задания
  • ALF_TASK_EVENT_DESTROY — задание снято

Для информации об установке процедур обработки событий см. alf_task_event_handler_register.



В начало


Рабочие блоки

Рабочий блок представляет собой инвокацию задания с набором соответствующих входных данных, выходных данных и параметров. Входные и выходные данные описываются соответствующими списками пересылки данных. Параметры передаются посредством API ALF. В зависимости от приложения, список пересылки данных может быть сгенерирован либо основной программой (раздел данных основного процессора) либо акселераторами (раздел данных акселератора).

Перед тем, как будет вызвано вычислительное задание, среда исполнения ALF, обрабатывая рабочий блок, принимает параметры и входные данные на основе списка пересылки входных данных и помещает их во входном буфере памяти акселератора. После того как вызвано вычислительное ядро, среда исполнения ALF на акселераторе помещает результаты в память ЦП. Среда исполнения ALF на акселераторе управляет памятью акселератора, размещая в ней входные и выходные данные рабочего блока.



В начало


Рабочий блок однократного использования

Рабочий блок однократного использования обрабатывается только один раз. Работая с такими блоками, можно выбирать, где будут генерироваться списки пересылки выходных и выходных данных: под управлением ЦП или на акселераторе.



В начало


Рабочий блок многократного использования

Обработка рабочего блока многократного использования повторяется заданное число раз. В отличие от рабочего блока однократного использования, здесь нельзя создавать списки пересылки входных и выходных данных из основного процесса. Все списки пересылки данных должны генерироваться на акселераторах всякий раз, когда блок обрабатывается средой исполнения ALF. Для каждого цикла обработки блока среда исполнения ALF передает параметры, общее число циклов, а также текущее значение счетчика цикла подпрограммам раздела данных на акселераторе. Основываясь на этой информации, программист может сгенерировать соответствующие списки пересылки данных для каждого цикла обработки. В разделе «Распределение данных на акселераторе» на стр. 23 приведена дополнительная информация о рабочих блоках однократного и многократного использования.



В начало


Список пересылки данных

Списки пересылки данных содержат описание входных и выходных данных рабочего блока. Программист может выбирать, где создавать списки для входных и выходных данных рабочих блоков каждого задания: под управлением ЦП или на акселераторе.

Во многих приложениях входные данные для одного вычислительного ядра нет возможности хранить в непрерывном участке основной памяти. Например, при обработке многомерных массивов их обычно разбивают на подматрицы меньшего размера и обрабатывают на акселераторах. Многие схемы распределения данных подразумевают хранение данных подматриц вразбивку в различных блоках основной памяти. Размер памяти акселератора, как правило, ограничен, и самый эффективный способ хранения подматрицы в ней — непрерывный.

Содержимое каждой строки или столбца помещается в непрерывный буфер. Входные данные объединяются в локальной памяти акселератора, будучи загружены туда из основной памяти, где они хранятся вразбивку. И наоборот, выходные данные, выгружаемые из памяти акселератора, помещаются в выделенные блоки основной памяти.

API ALF использует список пересылки данных для представления хранящихся вразбивку входных и выходных данных в основной памяти. Элемент списка пересылки данных содержит размер блока данных и его адрес в основной памяти (в виде указателя). Данные в локальной памяти акселератора всегда хранятся в упакованном виде и организованы в соответствии с порядком элементов списка. Список пересылки входных данных описывает процедуру сбора данных. Список пересылки выходных данных описывает процедуру размещения их в основной памяти. Структура списка пересылки данных приведена на рис. 3, стр. 16.


Рис. 3. Список пересылки данных
Рис. 3. Список пересылки данных

Для повышения производительности акселератора ALF использует статическую модель выделения памяти выполняющимся заданиям. Поэтому программисту необходимо явно задавать максимальное число элементов списка пересылки данных для каждого задания. Это число можно задать с помощью параметра ALF_TASK_DESC_NUM_DTL_ENTRIES функции alf_task_desc_set_int32.

Информация об ограничениях списков пересылки данных для различных реализаций процессора Cell BE приведена в разделе «Ограничения списков пересылки данных» на стр. 54.



В начало


Планирование обработки рабочих блоков

В данном разделе описывается планирование обработки рабочих блоков, в том числе:

  • «Политика планирования обработки рабочих блоков по умолчанию»
  • «Политика циклического распределения рабочих блоков», стр. 17
  • «Политика распределения пакетированных рабочих блоков», стр. 18


В начало


Политика планирования обработки рабочих блоков по умолчанию

API ALF поддерживает несколько способов назначения рабочих блоков экземплярам заданий. По умолчанию помещенные в очередь рабочие блоки могут быть назначены любому из экземпляров задания в любом порядке. Среда исполнения ALF пытается распределить нагрузку таким образом, чтобы выполнить задание как можно скорее. Поэтому экземпляры задания, которые запущены раньше или справились со своей работой быстрее, могут обработать больше рабочих блоков, чем те, которые запущены позже или работают медленнее.

На рис. 4 (стр. 17) приведен пример планирования обработки рабочего блока по умолчанию в условиях обработки блоков экземплярами заданий с различной скоростью.


Рис. 4. Порядок планирования обработки рабочих блоков по умолчанию
Рис. 4. Порядок планирования обработки рабочих блоков по умолчанию


В начало


Политика циклического распределения рабочих блоков

Программист имеет возможность включить циклическое распределение рабочих блоков, установив при создании задания атрибуты ALF_TASK_ATTR_WB_CYCLIC и ALF_TASK_ATTR_SCHED_FIXED. Это позволяет выполнять обработку блоков фиксированным числом экземпляров задания по круговой системе.

Число экземпляров задания должно быть указано в функции alf_task_create. Рабочие блоки назначаются экземплярам задания циклически, в том порядке, в каком они помещались в очередь посредством функции alf_wb_enqueue. На рис. 5 (стр. 18) приведен пример циклического распределения рабочих блоков.


Рис. 5. Циклическое распределение рабочих блоков
Рис. 5. Циклическое распределение рабочих блоков


В начало


Политика распределения пакетированных рабочих блоков

Экземплярам задания за один раз назначается целая группа (пакет) рабочих блоков, размер которой определяется параметром bundle_size, в порядке помещения в очередь посредством вызова функции alf_wb_enqueue. Все рабочие блоки, входящие в пакет, передаются одному и тому же экземпляру задания, при этом сохраняется порядок, определенный в alf_wb_enqueue.

Размер пакета определяется параметром wb_dist_size, задаваемым при создании задания. Пакетированное распределение можно использовать совместно с циклическим для более точного управления порядком обработки блоков. На рис. 6 (стр. 19) приведен пример политики пакетированного распределения в условиях обработки блоков экземплярами заданий с различной скоростью.


Рис. 6. Распределение пакетированных рабочих блоков
Рис. 6. Распределение пакетированных рабочих блоков


В начало


Набор данных

Набор данных ALF — это логический набор буферов данных. Набор данных содержит информацию для среды исполнения ALF о множестве всех данных, на которые ссылаются рабочие блоки задания. Среда исполнения ALF использует эту информацию для оптимизации процесса перемещения данных между основной памятью и памятью акселератора.

Наборы данных создаются независимо от заданий или рабочих блоков посредством функций alf_dataset_create и alf_dataset_buffer_add. Перед тем, как поместить в очередь первый рабочий блок, необходимо ассоциировать набор данных с одним или несколькими заданиями с помощью функции alf_task_dataset_associate. По мере помещения рабочих блоков в очередь осуществляется проверка нахождения связанных с ними наборов данных в соответствующих буферах. После того как операции с набором данных завершены, его следует уничтожить с помощью функции alf_dataset_destroy.

Набору данных может быть поставлено в соответствие множество буферов данных. Буфера данных могут быть помечены как допускающие только чтение, только запись, либо и то и другое. Программист может добавить к набору данных столько буферов данных, сколько требуется. (В некоторых реализациях ALF число буферов данных для конкретных наборов данных может быть ограничено — следует обращаться к документации в каждом конкретном случае). После того как набор данных был ассоциирован с заданием, к нему нельзя добавлять дополнительные буфера данных.

При желании задание может быть ассоциировано с одним и только одним набором данных. Рабочие блоки этого задания используют информацию соответствующего набора данных о буферах ввода, вывода и ввода-вывода. Ссылки на входные и выходные данные рабочего блока, находящиеся за пределами набора данных, вызовут ошибку. При этом буфер контекста задания и буфер параметров рабочего блока нет необходимости размещать внутри набора данных и они не подвергаются проверке на такое размещение.

Один и тот же набор данных может совместно использоваться несколькими заданиями, при этом ответственность за корректное использование данных лежит на программисте. Если два задания, не имеющие зависимостей друг от друга, используют одни и те же данные из одного и того же набора, ALF не может гарантировать целостности данных. Если же один и тот же набор данных используют задания, имеющие зависимости друг от друга, то этот набор обновляется в том порядке, в котором запускаются задания.

Хотя наборы данных и не обязательно создавать и использовать при распределении данных для основного процессора, все же рекомендуется это делать. Для распределения данных по акселераторам использование наборов данных обязательно.



В начало


Обработка ошибок

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

Если несколько ошибок происходят в течение короткого промежутка времени или одновременно, среда исполнения ALF пытается вызывать обработчик ошибок в последовательном порядке.

Возможные ошибки времени исполнения включают в себя:

  • ошибки периода исполнения вычислительного задания, такие как ошибки шины, неопределенные имена функций вычислительного ядра, ошибочные образы исполнения задания, проблемы с выделением памяти, зависания и др.;
  • распознаваемые ошибки повреждения внутренних структур данных, которые могут быть вызваны ошибочной пересылкой данных или граничных ошибок доступа;
  • распознаваемые/перехватываемые ошибки приложений.

Для возврата значений при возникновении ошибки используются стандартные коды ошибок для поддерживаемых платформ. При этом задействуется стандартный файл заголовков C/C++ errno.h. Список кодов возможных ошибок приведен в приложении E, «Коды и описания ошибок», стр. 147, а также в определениях API в главе 20 «Обзор API ALF», стр. 59.



В начало



На предыдущую страницуСтраница 5 из 7 На предыдущую страницу
    IBM в России Конфиденциальность Контакты