Jump to content

OpenHMPP

ОпенХМПП (HMPP [1] for Hybrid Multicore Parallel Programming) — стандарт программирования для гетерогенных вычислений . Стандарт основан на наборе директив компилятора и представляет собой модель программирования, предназначенную для работы с аппаратными ускорителями без сложностей, связанных с программированием на графическом процессоре . Этот подход, основанный на директивах, был реализован, поскольку они обеспечивают слабую связь между кодом приложения и использованием аппаратного ускорителя (HWA).

Введение [ править ]

Модель программирования на основе директив OpenHMPP предлагает синтаксис для разгрузки вычислений на аппаратных ускорителях и оптимизации перемещения данных в/из аппаратной памяти.

Модель основана на работах, инициированных CAPS (Компилятор и архитектура для встраиваемых и суперскалярных процессоров), совместным проектом INRIA , CNRS , Университета Ренна 1 и INSA Ренна.

Концепция OpenHMPP [ править ]

OpenHMPP основан на концепции кодлетов — функций, которые можно удаленно выполнять на HWA.

Концепция кодлета OpenHMPP [ править ]

Кодлет имеет следующие свойства:

  1. Это чистая функция .
    • Он не содержит объявлений статических или изменчивых переменных и не ссылается на какие-либо глобальные переменные, за исключением случаев, когда они были объявлены резидентной директивой HMPP.
    • Он не содержит вызовов функций с невидимым телом (которые нельзя встроить). Сюда входит использование библиотек и системных функций, таких как malloc, printf,...
    • Каждый вызов функции должен ссылаться на статическую чистую функцию (без указателей на функции).
  2. Он не возвращает никакого значения (функция void в C или подпрограмма в Fortran ).
  3. Количество аргументов должно быть фиксированным (т.е. оно не может быть переменной функцией , как в stdarg.h в C).
  4. Это не рекурсивно.
  5. Предполагается, что его параметры не имеют псевдонимов (см. Псевдонимы (вычисления) и Псевдонимы указателей ).
  6. Он не содержит директив места вызова (т. е. RPC для другого кодлета) или других директив HMPP.

Эти свойства гарантируют, что кодлет RPC может быть удаленно выполнен HWA. Этот RPC и связанные с ним передачи данных могут быть асинхронными.

Кодлет RPC [ править ]

HMPP обеспечивает синхронный и асинхронный RPC. Реализация асинхронной операции зависит от оборудования.

Синхронный и асинхронный RPC

Модель HMPP памяти

HMPP рассматривает два адресных пространства: хост-процессор и память HWA.

Модель памяти HMPP

Концепция директив [ править ]

Директивы OpenHMPP можно рассматривать как «метаинформацию», добавленную в исходный код приложения. Они являются безопасной метаинформацией, т.е. не меняют исходное поведение кода. Они касаются удаленного выполнения (RPC) функции, а также передачи данных в/из памяти HWA.

В таблице ниже представлены директивы OpenHMPP. Директивы OpenHMPP удовлетворяют различные потребности: некоторые из них посвящены объявлениям, а другие — управлению выполнением.

Инструкции по управлению потоком Директивы по управлению данными
Декларации маленькая собака
группа
резидент
карта
имя карты
Операционные директивы место вызова
синхронизировать
область
выделять
выпускать
расширенная загрузка
делегированное хранилище

Концепция набора директив [ править ]

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

Существует два вида этикеток:

  • Один связан с кодлетом. В общем, директивы, имеющие метки такого типа, ограничиваются управлением только одним кодлетом (в остальной части документа он называется автономным кодлетом, чтобы отличить его от группы кодлетов).
  • Один связан с группой кодлетов. Эти метки обозначаются следующим образом: «<LabelOfGroup>», где «LabelOfGroup» — это имя, указанное пользователем. В общем, директивы, имеющие метку этого типа, относятся ко всей группе. Понятие группы зарезервировано для класса проблем, которые требуют особого управления данными во всем приложении для достижения производительности.

Синтаксис директив OpenHMPP [ править ]

Для упрощения обозначений регулярные выражения для описания синтаксиса директив HMPP будут использоваться .

Приведенное ниже соглашение о цветах используется для описания синтаксических директив:

  • Зарезервированные ключевые слова HMPP выделены зеленым цветом ;
  • Элементы грамматики, которые можно отклонять в ключевых словах HMPP, выделены красным ;
  • Пользовательские переменные остаются черными.

Общий синтаксис [ править ]

Общий синтаксис директив OpenHMPP:

  • Для языка Си:
#pragma hmpp <grp_label> [codelet_label]? directive_type [,directive_parameters]* [&]
  • Для языка ФОРТРАН:
!$hmpp <grp_label> [codelet_label]? directive_type [,directive_parameters]* [&]

Где:

  • <grp_label>: уникальный идентификатор, обозначающий группу кодлетов. В тех случаях, когда в приложении не определены группы, эта метка может просто отсутствовать. Название официальной этикетки должно соответствовать следующей грамматике: [a-zA-Z_][a-zA-Z0-9_]*. Обратите внимание, что символы «< >» относятся к синтаксису и являются обязательными для меток такого типа.
  • codelet_label: уникальный идентификатор, именующий кодлет. Название официальной этикетки должно соответствовать следующей грамматике: [a-zA-Z_][a-zA-Z0-9_]*
  • directive: имя директивы;
  • directive_parameters: обозначает некоторые параметры, связанные с директивой. Эти параметры могут быть разных типов и указывать либо некоторые аргументы, передаваемые директиве, либо режим выполнения (например, асинхронный или синхронный);
  • [&]: символ, используемый для продолжения директивы на следующей строке (то же самое для C и FORTRAN).

Параметры директивы [ править ]

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

  • version = major.minor[.micro]: указывает версию директив HMPP, которая будет учитываться препроцессором.
  • args[arg_items].size={dimsize[,dimsize]*}: указывает размер нескалярного параметра (массива).
  • args[arg_items].io=[in|out|inout]: указывает, что указанные аргументы функции являются либо входными, либо выходными, либо и тем, и другим. По умолчанию неквалифицированные аргументы являются входными данными.
  • cond = "expr": указывает условие выполнения в виде логического выражения C или Fortran, которое должно быть истинным, чтобы начать выполнение группы или кодлетов.
  • target=target_name[:target_name]*: указывает, какие цели следует попытаться использовать в заданном порядке.
  • asynchronous: указывает, что выполнение кодлета не блокируется (по умолчанию синхронно).
  • args[<arg_items>].advancedload=true: указывает, что указанные параметры предварительно загружены. Предварительно могут быть загружены только параметры in или inout.
  • args[arg_items].noupdate=true: это свойство указывает, что данные уже доступны в HWA и поэтому передача не требуется. Если это свойство установлено, передача рассматриваемого аргумента не производится.
  • args[<arg_items>].addr="<expr>": <expr> — это выражение, которое дает адрес данных для загрузки.
  • args[<arg_items>].const=true: указывает, что аргумент должен быть загружен только один раз.

Директивы OpenHMPP [ править ]

Директивы для объявления и выполнения кодлета [ править ]

А codelet Директива объявляет, что вычисление будет удаленно выполняться на аппаратном ускорителе. Для codelet директива:

  • Метка кодлета является обязательной и должна быть уникальной в приложении.
  • Метка группы не требуется, если группа не определена.
  • Директива codelet вставляется непосредственно перед объявлением функции.

Синтаксис директивы:

#pragma hmpp <grp_label> codelet_label codelet 
                            [, version = major.minor[.micro]?]?
                            [, args[arg_items].io=[[in|out|inout]]*
                            [, args[arg_items].size={dimsize[,dimsize]*}]*
                            [, args[arg_items].const=true]*
                            [, cond = "expr"]
                            [, target=target_name[:target_name]*]

К функции можно добавить более одной директивы codelet, чтобы указать разные варианты использования или разные контексты выполнения. Однако для данной метки места вызова может быть только одна директива codelet.

The callsite Директива определяет, как использовать кодлет в заданном месте программы.

Синтаксис директивы:

#pragma hmpp <grp_label> codelet_label callsite
                     [, asynchronous]?
                     [, args[arg_items].size={dimsize[,dimsize]*}]*
                     [, args[arg_items].advancedload=[[true|false]]*
                     [, args[arg_items].addr="expr"]*
                     [, args[arg_items].noupdate=true]*

Пример показан здесь:

 /* declaration of the codelet */
 #pragma hmpp simple1 codelet, args[outv].io=inout, target=CUDA
 static void matvec(int sn, int sm, float inv[sm], float inm[sn][sm], float *outv){
     int i, j;
     for (i = 0 ; i < sm ; i++) {
       float temp = outv[i];
       for (j = 0 ; j < sn ; j++) {
         temp += inv[j] * inm[i][ j];
     }
    outv[i] = temp;
  }
  
  int main(int argc, char **argv) {
    int n;
    ........
  
  /* codelet use */
  #pragma hmpp simple1 callsite, args[outv].size={n}
  matvec(n, m, myinc, inm, myoutv);
    ........
  }

В некоторых случаях требуется специальное управление данными во всем приложении (оптимизация перемещения данных ЦП/ГП, общие переменные...).

The group Директива позволяет объявить группу кодлетов. Параметры, определенные в этой директиве, применяются ко всем кодлетам, принадлежащим группе. Синтаксис директивы:

#pragma hmpp <grp_label> group 
                          [, version = <major>.<minor>[.<micro>]?]? 
                          [, target = target_name[:target_name]*]]? 
                          [, cond  = “expr]?

передачи данных для оптимизации затрат связь Директивы на

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

  • выделить директиву

The allocate Директива блокирует HWA и выделяет необходимый объем памяти.

#pragma hmpp <grp_label> allocate [,args[arg_items].size={dimsize[,dimsize]*}]*
  • директива выпуска

The release Директива определяет, когда выпускать HWA для группы или автономного кодлета.

#pragma hmpp <grp_label> release
  • директива расширенной загрузки

The advancedload Директива предварительно выбирает данные перед удаленным выполнением кодлета.

#pragma hmpp <grp_label> [codelet_label]? advancedload
                  ,args[arg_items]
                  [,args[arg_items].size={dimsize[,dimsize]*}]*
                  [,args[arg_items].addr="expr"]*
                  [,args[arg_items].section={[subscript_triplet,]+}]*
                  [,asynchronous]
  • директива делегированного хранилища

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

#pragma hmpp <grp_label> [codelet_label]? delegatedstore 
                ,args[arg_items]
                [,args[arg_items].addr="expr"]*
                [,args[arg_items].section={[subscript_triplet,]+}]*
  • Асинхронные вычисления

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

#pragma hmpp <grp_label> codelet_label synchronize
  • Пример

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

The synchronize Директива позволяет дождаться завершения асинхронного выполнения кодлета перед запуском следующей итерации. Наконец delegatedstore Директива вне цикла загружает результат sgemm.

 int main(int argc, char **argv) {
 
 #pragma hmpp sgemm allocate, args[vin1;vin2;vout].size={size,size}
 #pragma hmpp sgemm advancedload, args[vin1;vin2;vout], args[m,n,k,alpha,beta]
   
 for ( j = 0 ; j < 2 ; j ++) {
    #pragma hmpp sgemm callsite, asynchronous, args[vin1;vin2;vout].advancedload=true, args[m,n,k,alpha,beta].advancedload=true
    sgemm (size, size, size, alpha, vin1, vin2, beta, vout);
    #pragma hmpp sgemm  synchronize
 }
 
 #pragma hmpp sgemm delegatedstore, args[vout]
 #pragma hmpp sgemm release

Обмен данными между кодлетами [ править ]

Эти директивы сопоставляют вместе все аргументы, имеющие одно и то же имя для всей группы.

Типы и размеры всех отображаемых аргументов должны быть идентичными.

The map Директива отображает несколько аргументов на устройстве.

#pragma hmpp <grp_label>  map, args[arg_items]

Эта директива очень похожа на map Директива, за исключением того, что отображаемые аргументы напрямую указываются по их имени. mapbyname директива эквивалентна множеству map директивы.

#pragma hmpp <grp_label> mapbyname [,variableName]+

Глобальная переменная [ править ]

The resident Директива объявляет некоторые переменные как глобальные внутри группы. Затем к этим переменным можно будет получить прямой доступ из любого кодлета, принадлежащего группе. Эта директива применяется к оператору объявления, следующему за ним в исходном коде.

Синтаксис этой директивы:

#pragma hmpp <grp_label> resident 
               [, args[::var_name].io=[[in|out|inout]]*
               [, args[::var_name].size={dimsize[,dimsize]*}]*
               [, args[::var_name].addr="expr"]*
               [, args[::var_name].const=true]*

Обозначения ::var_name с префиксом ::, указывает переменную приложения, объявленную как резидентную.

Ускорение регионов [ править ]

Регион представляет собой объединение директив codelet/callsite. Цель состоит в том, чтобы избежать реструктуризации кода при построении кодлета. Таким образом, все атрибуты, доступные для codelet или callsite директивы можно использовать на regions директивы.

На языке Си:

#pragma hmpp [<MyGroup>] [label] region         
                           [, args[arg_items].io=[[in|out|inout]]*
                           [, cond = "expr"]<
                           [, args[arg_items].const=true]*
                           [, target=target_name[:target_name]*]
                           [, args[arg_items].size={dimsize[,dimsize]*}]*
                           [, args[arg_items].advancedload=[[true|false]]*
                           [, args[arg_items].addr="expr"]*
                           [, args[arg_items].noupdate=true]*
                           [, asynchronous]?
                           [, private=[arg_items]]*
   {
C BLOCK STATEMENTS
   }

Реализации [ править ]

Открытый стандарт OpenHMPP основан на версии HMPP 2.3 (май 2009 г., предприятие CAPS).

Модель программирования на основе директив OpenHMPP реализована в:

  • Компиляторы CAPS, компиляторы CAPS Entreprise для гибридных вычислений
  • PathScale ENZO Compiler Suite (поддержка графических процессоров NVIDIA)

OpenHMPP используется HPC участниками [ ВОЗ? ] в области нефти и газа, [ нужна ссылка ] Энергия, [ нужна ссылка ] Производство, [ нужна ссылка ] Финансы, [ нужна ссылка ] Образование и исследования. [ нужна ссылка ]

См. также [ править ]

Ссылки [ править ]

  1. ^ Дольбо, Ромен; Бихан, Стефан; Боден, Франсуа (4 октября 2007 г.). HMPP: гибридная многоядерная среда параллельного программирования (PDF) . Семинар по обработке данных общего назначения на графических процессорах . Архивировано из оригинала (PDF) 16 января 2014 года . Проверено 14 января 2014 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 385d5211dbc9e622af63ab07f6a9d681__1718747340
URL1:https://arc.ask3.ru/arc/aa/38/81/385d5211dbc9e622af63ab07f6a9d681.html
Заголовок, (Title) документа по адресу, URL1:
OpenHMPP - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)