~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 385D5211DBC9E622AF63AB07F6A9D681__1718747340 ✰
Заголовок документа оригинал.:
✰ OpenHMPP - Wikipedia ✰
Заголовок документа перевод.:
✰ ОпенХМПП — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/OpenHMPP ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/38/81/385d5211dbc9e622af63ab07f6a9d681.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/38/81/385d5211dbc9e622af63ab07f6a9d681__translat.html ✰
Дата и время сохранения документа:
✰ 22.06.2024 17:31:43 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 19 June 2024, at 00:49 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

ОпенХМПП — Википедия 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]?   тип_директивы  [  ,  параметры_директивы  ]* [  &  ] 
 
  • Для языка ФОРТРАН:
!$hmpp <grp_label>  codelet_label  [  ]?   тип_директивы  [  ,  параметры_директивы  ]* [  &  ] 
 

Где:

  • <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  кодлет  
                              [  , версия  = major.minor[.micro]?]? 
                              [  , args[  arg_items  ].io=  [[  in  |   выход  |   вход  ]]* 
                              [  , args[  arg_items  ].size={  dimsize[,dimsize]*  }  ]* 
                              [  , args[  arg_items  ].const=true  ]* 
                              [  , cond =  "выражение"] 
                              [  , target=  имя_цели  [:  имя_цели  ]*] 
 

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

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

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

#pragma hmpp <  grp_label  >  codelet_label  сайт вызова 
                       [  , асинхронный  ]? 
                       [  , args[  arg_items  ].size={  dimsize[,dimsize]*  }  ]* 
                       [  , args[  arg_items  ].advancedload=  [[  true  |   ЛОЖЬ  ]]* 
                       [  , args[  arg_items  ].addr="  выражение  "  ]* 
                       [  , args[  arg_items  ].noupdate=true  ]* 
 

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

 /* объявление кодлета */ 
  #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  ; 
       для   (  я   знак равно   0   ;   я   <   см   ;   я  ++  )   { 
        float   temp   =   outv  [  я  ]; 
         for   (  j   знак равно   0   ;   j   <   sn   ;   j  ++  )   { 
          temp   +=   inv  [  j  ]   *   inm  [  i  ] [   j  ]; 
       } 
     Outv  [  я  ]   =   темп  ; 
    } 
  
   Int   main  (  int   argc  ,   char   **  argv  )   { 
     int   n  ; 
      ........ 
  
   /* использование кодлета */ 
   #pragma hmpp simple1 callsite, args[outv].size={n} 
   matvec  (  n  ,   m  ,   myinc  ,   inm  ,   myoutv  ); 
      ........ 
   } 

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

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

#pragma hmpp <  grp_label  > группа  
                            [  , version =  <основной>.<минорный>[.<микро>]?]?  
                            [  , цель =   имя_цели  [:  имя_цели  ]*]]?  
                            [  , cond = «  выражение  »  ]? 
 

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

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

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

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

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

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

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

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

#pragma hmpp <  grp_label  >  [codelet_label]?   расширенная загрузка 
                   , args[  arg_items  ] 
                    [  ,args[  arg_items  ].size={  dimsize[,dimsize]*  }  ]* 
                    [  ,args[  arg_items  ].addr="  выражение  "  ]* 
                    [  ,args[  arg_items  ].section={  [  subscript_triplet  ,  ]+  }  ]* 
                    [  , асинхронный  ] 
 
  • директива делегированного хранилища

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

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

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

#pragma hmpp <  grp_label  >  codelet_label  синхронизировать 
  • Пример

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

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 callsite sgemm, асинхронный, args[vin1;vin2;vout].advancedload=true, args[m ,n,k,alpha,beta].advancedload=true 
     sgemm   (  размер  ,   размер  ,   размер  ,   альфа  ,   вин1  ,   вин2  ,   бета  ,   vout  ); 
      #pragma hmpp sgemmsync 
  } 
 
  #pragma hmpp sgemm делегированное хранилище, args[vout] 
  #pragma hmpp sgemm Release 

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

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

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

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

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

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

#pragma hmpp <  grp_label  > имя_карты  [  ,  имя_переменной]+
 

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

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

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

#pragma hmpp <  grp_label  > резидент  
                 [  , args[::  var_name  ].io=  [[  in  |   выход  |   вход  ]]* 
                 [  , args[::  var_name  ].size={  dimsize[,dimsize]*  }  ]* 
                 [  , args[::  var_name  ].addr="  выражение  "  ]* 
                 [  , args[::  var_name  ].const=true  ]* 
 

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

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

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

На языке Си:

#pragma hmpp [<  MyGroup  >] [  метка  ] регион          
                             [  , args[  arg_items  ].io=  [[  in  |   выход  |   вход  ]]* 
                             [  , cond = "  выражение  "]  < 
                             [  , args[  arg_items  ].const=true  ]* 
                             [  , target=  имя_цели  [  :  имя_цели  ]*] 
                             [  , args[  arg_items  ].size={  dimsize[  ,  dimsize]*  }  ]* 
                             [  , args[  arg_items  ].advancedload=  [[  true  |   ЛОЖЬ  ]]* 
                             [  , args[  arg_items  ].addr="  выражение  "  ]* 
                             [  , args[  arg_items  ].noupdate=true  ]* 
                             [  , асинхронный  ]? 
                             [  , Private=[  arg_items  ]  ]* 
     { 
  ЗАЯВЛЕНИЯ БЛОКА C 
     } 
 

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

Открытый стандарт 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://en.wikipedia.org/wiki/OpenHMPP
Заголовок, (Title) документа по адресу, URL1:
OpenHMPP - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)