OpenCL в трейдинге - страница 3

 

Центр разработчиков AMD: серия веб-семинаров по программированию OpenCL.2. Введение в OpenCL



2- Введение в OpenCL

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

  • 00:00:00 В этом разделе выступающий представляет OpenCL и его способность использовать центральные и графические процессоры для ускорения параллельных вычислений, что приводит к значительному ускорению. Хотя иногда приводятся такие цифры, как 100X или 1000X, в реальности для оптимизированных программ ожидается ускорение примерно в 10-20 раз. OpenCL может писать переносимый код для разных устройств и архитектур; поэтому программы, написанные для графических процессоров AMD, обычно могут работать и на графических процессорах NVIDIA. В реализации AMD предоставляется реализация OpenCL как для ЦП, так и для ГП, в отличие от некоторых других реализаций конкурентов. Раздел заканчивается обзором гетерогенных вычислений и того, как в них вписывается OpenCL.

  • 00:05:00 В этом разделе спикер знакомит с OpenCL — низкоуровневой и многословной платформой, которая может быть полезной с точки зрения производительности, если приложение имеет правильные характеристики. OpenCL — это модель на основе платформы, состоящая из хост-API, модели подключенных устройств и модели памяти. Устройства рассматриваются как набор вычислительных единиц, и каждая вычислительная единица разбита на элементы обработки, которые выполняются в SIMD. Модель выполнения основана на понятии ядра, которое представляет собой единицу исполняемого кода, которая может выполняться параллельно на множестве данных. Кроме того, OpenCL предоставляет набор очередей, которые позволяют асинхронно выполнять операции чтения и записи и выполнение ядра, которое может быть упорядоченным или неупорядоченным.

  • 00:10:00 В этом разделе спикер обсуждает две основные модели выполнения в OpenCL: параллелизм данных и параллелизм задач. Модель параллельных данных является наиболее эффективной для выполнения на графических процессорах и включает N-мерную область вычислений, где каждый отдельный элемент называется рабочим элементом, который потенциально может выполняться параллельно. Выполнение рабочих элементов можно сгруппировать в локальные измерения, называемые рабочими группами, которые выполняются на одном из доступных вычислительных блоков. Докладчик также объясняет, как цикл неявно присутствует в параллельном мире данных OpenCL и как процедура получения глобального идентификатора используется для индексации в a и b.

  • 00:15:00 В этом разделе спикер обсуждает локальную память, которая похожа на кеш и управляется пользователем, имеет низкую задержку и быстрее, чем глобальная память. Функция синхронизации позволяет рабочим элементам записывать в ячейку памяти, ждать завершения, а затем заставлять другой рабочий элемент читать эту ячейку памяти и получать значение, записанное предыдущим рабочим элементом. Синхронизация возможна только внутри рабочей группы. OpenCL также поддерживает параллелизм задач, выполняемых одним рабочим элементом, и выигрывает от использования модели очередей OpenCL и функций синхронизации хост-API, что позволяет использовать код, скомпилированный в собственном коде. OpenCL отличается от C тем, что иерархия памяти конкретных графических процессоров явно раскрывается, и программист может обеспечить упорядоченность и согласованность данных с помощью барьерных операций и синхронизации.

  • 00:20:00 В этом разделе спикер обсуждает преимущества OpenCL, такие как его мощные возможности производительности. Однако они отмечают, что управление памятью в OpenCL требует явных операций, которые могут быть сложными и требуют тщательного рассмотрения алгоритма. Модель компиляции основана на OpenGL и имеет онлайн-модель компиляции, которая позволяет передавать потоки или строки исходного кода OpenCL для онлайн-компиляции. OpenCL построен вокруг контекста, набора устройств и объектов памяти, а очереди используются для отправки работы на конкретное устройство, связанное с контекстом. Объекты памяти — это буферы, представляющие собой одномерные блоки памяти, которые можно рассматривать как массивы.

  • 00:25:00 В этом разделе спикер объясняет различные объекты OpenCL, включая объекты памяти, изображения, программы и ядра. Объекты памяти могут быть буферами или типами изображений, где изображения имеют аппаратную реализацию для оптимизации доступа. Программы, определяющие ядра для выполнения, могут быть собраны и извлечены, а значения аргументов ядра могут быть установлены с использованием объектов ядра. Очереди команд используются для постановки в очередь ядер и других команд для выполнения. Кроме того, события OpenCL полезны для построения зависимостей между командами и запроса состояния команд. Спикер также приводит примеры того, как запрашивать устройства и их идентификаторы.

  • 00:30:00 В этом разделе спикер объясняет, как OpenCL возвращает коды ошибок и объекты. Если функция возвращает объект CL, в результате она вернет этот объект. Но если он не возвращает объект CL, в качестве результата он вернет код ошибки. Обсуждается контекст и то, как память распределяется на уровне контекста, что означает, что буферы и изображения совместно используются устройствами. Докладчик также упоминает функцию CL get X info, в частности CL get device info, которая позволяет разработчикам запрашивать возможности устройства, чтобы определить, какое устройство лучше всего подходит для алгоритма. Наконец, спикер обсуждает буферы и изображения и то, как ядра могут получить к ним доступ, а также ограничения на доступ к изображениям.

  • 00:35:00 В этом разделе спикер обсуждает, как распределять буферы и изображения в OpenCL, в том числе как описать, как будет осуществляться доступ к буферам и преимущества использования изображений. Докладчик также объясняет, как получить доступ к данным объекта памяти с помощью явных команд и как вставить команды в очередь. Кроме того, в видео объясняется, как отображать регион и передавать данные между буферами, а также преимущества и недостатки использования блоков прямого доступа к памяти. Раздел завершается обсуждением программ и объектов ядра, а также установкой значений аргументов.

  • 00:40:00 В этом разделе спикер обсуждает диспетчеризацию и зависимости в OpenCL. Они объясняют, как будет выполняться диспетчеризация на основе домена или сетки выполнения, и как можно настроить зависимости, чтобы гарантировать, что вещи не обгоняют друг друга. Докладчик также объясняет аргументы команды NQ, которые учитывают количество событий в списке ожидания и событие, связанное с командой. Наконец, спикер дает обзор языка C OpenCL, который основан на C и имеет определенные ограничения и дополнения, такие как векторные типы и примитивы синхронизации. Язык допускает рабочие элементы и рабочие группы, а также квалификаторы адресного пространства и встроенные функции.

  • 00:45:00 В этом разделе спикер дает краткий обзор OpenCL и его функций, таких как различные адресные пространства, векторные и скалярные типы, которые можно использовать при программировании ядер. Они также обсуждают, как создавать объекты памяти, а также создавать и выполнять программы с помощью OpenCL API. Затем докладчик задает вопрос о том, чем параллелизм данных в OpenCL отличается от развертывания циклов в компиляторах.

  • 00:50:00 В этом разделе спикер объясняет концепцию параллельного выполнения данных и трудности компонентов, делающих это эффективно. Он также подчеркивает необходимость явного распараллеливания программ для OpenCL или любой другой модели. Inq_marker — это еще одна тема, которая рассматривается и как она полезна в сигналах не по порядку. Спикер повторяет, что постоянная память означает, что значения являются постоянными, и она используется на специальных графических процессорах для загрузки в очень быструю постоянную память, которая доступна только для чтения. Он предлагает проверить OpenCL Zone на веб-сайте MD для получения дополнительной информации об OpenCL и параллельном программировании. Наконец, он рассказывает о том, как get_global_ID(0) будет возвращать одно и то же значение при каждом вызове ядра.

  • 00:55:00 В этом разделе спикер объясняет, что когда два разных приложения работают и пытаются использовать OpenCL на одной машине, все сегодняшние реализации будут совместно использовать аппаратное обеспечение, а ОС будет мультиплексировать приложения. Они рекомендуют использовать визуальные профилировщики для OpenCL, такие как плагин Visual Studio или версию командной строки Linux, которые позволяют запрашивать информацию об оборудовании id. Накладные расходы на загрузку данных в объект изображения или буфер будут зависеть от устройства, где их передача через шину PCIe будет иметь большую задержку. Наконец, спикер упомянул, что новая серия графических процессоров AMD 680 сотни и лучшие практики программирования для них аналогичны архитектуре Evergreen, на которой они основаны.
 

Центр разработчиков AMD: серия вебинаров по программированию на OpenCL. 3. Архитектура графического процессора



3 - Архитектура графического процессора

В этом видео представлен обзор архитектуры графических процессоров с учетом происхождения и основного использования графических процессоров в качестве графических процессоров. Графические процессоры предназначены для обработки пикселей с высокой степенью параллелизма, в отличие от ЦП, предназначенных для скалярной обработки с конвейерами с малой задержкой. Архитектура графических процессоров оптимизирована для задач, связанных с графикой, которые могут не подходить для вычислений общего назначения. Докладчик объясняет, как GPU максимизирует пропускную способность набора потоков, а не минимизирует задержку выполнения одного потока. Также обсуждается архитектура блока ядра графического процессора, включая локальные общие данные, волновые фронты и рабочие группы. В видео рассматриваются различные функции архитектуры графического процессора, которые помогают увеличить количество операций, которые может выполнять компилятор, включая выдачу зависимых операций в одном пакете и поддержку зависимых счетчиков с глобальным общим доступом к бета-версии. Несмотря на то, что конструкции ядер GPU и ЦП могут быть схожими, их рабочие нагрузки должны совпадать, чтобы они имели схожие конструкции.

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

  • 00:00:00 В этом разделе докладчики представляют цель вебинара, которая состоит в том, чтобы предоставить обзор архитектуры графического процессора с другой точки зрения по сравнению с традиционным подходом к описанию низкоуровневой архитектуры или оптимизаций. Докладчики стремятся поместить архитектуру графического процессора в контекст, обсуждая ее происхождение и основной вариант использования в качестве графических процессоров. Они объясняют, как GPU предназначены для обработки пикселей с высокой степенью параллелизма, что отличается от CPU, предназначенных для скалярной обработки с конвейерами с малой задержкой. Докладчики также коснулись того, как архитектура графических процессоров может не подходить для вычислений общего назначения из-за их оптимизированных аппаратных блоков, предназначенных для ускорения графических задач.

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

  • 00:10:00 В этом разделе спикер обсуждает, как выполнение Синди требует простых инструкций и использования векторных инструкций. Хотя векторные инструкции могут быть сгенерированы аппаратным обеспечением или компилятором, это может сделать разработку громоздкой и сложной из-за необходимости ручной упаковки различных операций, маскирования ветвей и тщательного ручного кодирования. С другой стороны, программирование выполнения Cindy с использованием векторных инструкций может заставить разработчика думать, что дорожки разветвляются независимо, что не соответствует действительности. Несмотря на это, программистам все же проще думать, а для текущих графических процессоров AMD маскировка управляется аппаратно. Это важно учитывать для вычислений, о которых идет речь, поскольку это может повлиять на производительность, особенно при расхождении ветвей в более широком Waveland.

  • 00:15:00 В этом разделе докладчик обсуждает видимые аспекты архитектур графических процессоров, основанных на вычислениях пропускной способности, что означает, что если вектор инструкций останавливается в графическом процессоре, что может произойти, если сложение с плавающей запятой занимает несколько циклов для завершена, та же инструкция может использоваться для покрытия времени простоя в следующем векторе, что делает декодирование инструкции более эффективным. Докладчик объясняет, что вместо увеличения ширины вектора, что может уменьшить использование ALU, несколько волновых фронтов могут проникать в инструкции из других запущенных потоков, что дает вероятность не просто останавливаться, ожидая, когда блоки текстур вернут данные в память. Однако выполнение одного волнового фронта таким образом занимает больше времени из-за того, как работает архитектура.

  • 00:20:00 В этом разделе видео объясняется, как графический процессор максимизирует пропускную способность набора потоков, а не минимизирует задержку выполнения одного потока. Это означает, что GPU пытается увеличить использование потоков, ожидая, пока первый поток завершит выполнение, а затем подавая следующий фронт волны, в то время как результаты первого набора пикселей повторно используются, чтобы поддерживать конвейер как можно ближе к полной занятости, насколько это возможно. . Графический процессор поддерживает большой пул регистров, чтобы покрыть всю ширину вектора для каждого потока в полете, занимая место на устройстве, которое масштабируется с количеством состояний и шириной вектора. Графический процессор предназначен для покрытия задержек, и поэтому вместо минимизации задержки он максимально увеличивает доступную пропускную способность памяти, чтобы он мог удовлетворить весь параллелизм, используя кэши текстур и локальную память для повторного использования данных между рабочими элементами.

  • 00:25:00 В этом разделе докладчик обсуждает, как кэши и программно-управляемые области общей памяти могут сократить объем передаваемых данных, позволяя копировать данные только один раз из интерфейса основной памяти, а затем повторно использовать их различными рабочими элементами по разным путям. Они объясняют, как кэш текстур предназначен для автоматического принудительного применения 2D-структуры к своим данным для эффективного захвата 2D-доступа квадроциклами. Локальные области данных обеспечивают значительно больший контроль, но ответственность за структурирование нагрузок для эффективного использования этой памяти и совместного использования данных для снижения требований к глобальной памяти лежит на разработчике. В этом разделе также рассматривается, как можно рассматривать GPU как набор подключенных ядер Cindy с несколькими программными состояниями, чередующими 4, 8 или 16 потоков, чтобы покрыть задержку конвейера. Обсуждается компромисс между количеством ядер и плотностью ALU с преимуществом увеличения использования в зависимости от рабочей нагрузки.

  • 00:30:00 В этом разделе спикер обсуждает сходства и различия между конструкциями ядер ЦП и ГП на таких примерах, как Andy Phenom 2 X6 6 и Intel i7. В то время как подход, принятый Pentium 4 и ultraSPARC T2, предусматривал более крупные размеры ядра с несколькими наборами состояний для увеличения параллелизма на уровне команд, графические процессоры находятся на крайнем конце спектра с высокой степенью балансировки данных. Также обсуждаются технические детали AMD Radeon HD 5870 с указанием ее высокой пропускной способности и количества доступных одновременных сигналов, которые зависят от количества регистров, используемых каждым фронтом сигнала. Докладчик заключает, что, хотя дизайн ЦП и графических процессоров может иметь сходство, их рабочие нагрузки должны быть сходными, чтобы они имели схожие конструкции.

  • 00:35:00 В этом разделе мы узнаем об элементах дизайна графического процессора, включая локальные общие ресурсы данных, волновые фронты и рабочие группы, на которые он разделен. Конструкция графического процессора включает в себя командный процессор диспетчера полковника, который генерирует волновые фронты, которые назначаются доступному блоку SIMD, имеющему достаточно ресурсов для размещения в пространстве. Весь чип имеет 20 движков Cindy с 8 банками памяти GDDR5 для кроссбаров и кэшей. Кроме того, он имеет упрощенную модель согласованности глобальной памяти, которая требует инструкций ограждения для обеспечения прав видимости, что позволяет механизмам Cindy и фиксированным модулям поддерживать максимально возможную степень параллельного выполнения данных без накладных расходов на производительность. Графический процессор использует модель выполнения на основе предложений, что позволяет одновременно выполнять множество программ потока управления на простейшем движке.

  • 00:40:00 В этом разделе обсуждается архитектура движка графического процессора. Блок двигателя состоит из двух основных компонентов: локального обмена данными, который позволяет обмениваться данными между рабочими элементами в рабочей группе и элементами пост-тестирования, или потоковыми ядрами, которые выполняют инструкции из предложений ALU в ядре. Локальный общий ресурс данных имеет 32 банка, каждый из 16 элементов обработки в движке может запрашивать чтение или запись 32-битных слов из LDS в каждом цикле по произвольным адресам, а конфликты обнаруживаются устройством. Атомарные операции выполняются с использованием АЛУ только для целых чисел, а атомарные операции с плавающей запятой выполнять сложнее. Элемент обработки архитектуры 5870 представляет собой кластер из пяти идентичных ALU, которые работают с очень длинным пакетом командных слов из пяти операций, упакованных компилятором, с некоторым набором собственных зависимостей, и может выполняться большинство основных операций.

  • 00:45:00 В этом разделе спикер описывает различные особенности архитектуры графического процессора, которые помогают увеличить объем упаковки, которую может выполнять компилятор, включая выдачу зависимых операций в одном пакете и поддержку зависимых счетчиков с глобальным общим доступом к бета-версии. Глобальная бета-версия — это менее известная функция, которая связана со всем набором вычислительных механизмов на устройстве и имеет гораздо меньшую задержку, чем доступ к другим блокам памяти. Спикер также предупреждает, что доступ к случайным пикселям в кеше текстур может вызвать проблемы с производительностью, поскольку он будет быстрее, чем доступ к глобальной памяти, только если данные сгруппированы вместе.

  • 00:50:00 В этом разделе спикер отвечает на вопросы, связанные с достижением полной занятости в архитектуре GPU. В приведенном примере рабочие группы должны состоять из кратных 64 рабочих элементов, чтобы получить полную занятость. Волновые фронты и количество волновых фронтов, которые могут поместиться на каждом ядре, также влияют на полную занятость. Спикер также упоминает, что не существует полноточных версий трансцендентных функций, генерируемых 5-й дорожкой, которые представляют собой быстрые приближения, которые могут быть или не быть достаточно хорошими, в зависимости от потребностей кода. На вопрос, есть ли способ запросить размер волнового фронта на всех устройствах, ответ таков: такого способа нет.

  • 00:55:00 В этом разделе спикер объясняет, что означает полное объединение с точки зрения доступа к глобальной памяти в архитектуре графического процессора. По сути, это означает, что фронт четверти волны будет выдавать запрос памяти, в котором каждая дорожка будет последовательно обращаться к 128 битам из выровненных адресов, проходящих через вычислительный блок. Однако существуют уровни эффективности в зависимости от типа доступа, подключенного или отсоединенного, а также от того, является ли это случайным сбором. Спикер также уточняет, что волновой фронт — это единица работы, состоящая из 64 рабочих элементов, выполняемых вместе с одной инструкцией, и это не то же самое, что рабочая группа, представляющая собой набор рабочих элементов.

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

Центр разработчиков AMD: серия вебинаров по программированию на OpenCL. 4 Программирование OpenCL в деталях



4 - Программирование OpenCL в деталях

В этом видео спикер дает обзор программирования OpenCL, обсуждая его язык, платформу и API среды выполнения. Они подробно описывают модель программирования, которая требует мелкозернистого параллелизма, рабочих элементов и групп или потоков, синхронизации и управления памятью. Затем спикер обсуждает алгоритм n-тел и его вычислительный порядок порядка n-квадратов. Они объясняют, как код ядра OpenCL обновляет положение и скорость частиц в ньютоновской механике, вводит кэш для хранения положения одной частицы и как ядро обновляет положение и скорость частицы, используя типы данных с плавающим вектором. Докладчик также подробно рассматривает, как код хоста взаимодействует с ядрами OpenCL, явно устанавливая параметры и аргументы, передавая данные между хостом и графическим процессором и ставя в очередь выполнение ядра для синхронизации. Наконец, в видео показано, как изменить код OpenCL для поддержки нескольких устройств, синхронизировать данные между графическими процессорами и установить идентификаторы устройств для представляющих их массивов половинного размера.

Во второй части обсуждаются различные аспекты программирования OpenCL. Он охватывает такие темы, как схема двойного буфера для синхронизации обновленной позиции частиц между двумя массивами, ограничения OpenCL и разница между глобальными и локальными указателями в распределении памяти. Кроме того, в нем освещаются методы оптимизации для программирования OpenCL, включая векторные операции, контролируемый доступ к памяти и развертывание циклов, а также инструменты, доступные для анализа реализации OpenCL, такие как инструменты профилирования. Докладчик рекомендует стандарт OpenCL в качестве ресурса для программистов OpenCL и предоставляет URL-адреса стандарта и ATI Stream SDK. В видео также рассматриваются вопросы по таким темам, как совместное использование памяти, оптимизация кода, выделение памяти и использование вычислительных блоков.

  • 00:00:00 В этом разделе спикер представляет концепции OpenCL, обсуждая появление гибридных архитектур CPU-GPU и проблемы, которые они создают для программирования. OpenCL предоставляет независимый от платформы и устройства API с общеотраслевой поддержкой, и выступающий описывает три части OpenCL API: спецификацию языка, API платформы и API среды выполнения. Модель выполнения разбита на две части: ядро, представляющее исполняемый код, который будет выполняться на устройстве OpenCL, и хост-программа, которая выполняет управление памятью и управляет выполнением ядра на одном или нескольких устройствах с помощью очереди команд. Расширение языка C, используемое для программирования ядра, основано на ISO C99 с некоторыми ограничениями и дополнениями для поддержки параллелизма.

  • 00:05:00 В этом разделе спикер объясняет модель программирования OpenCL, которая требует мелкозернистого распараллеливания потоков и синхронизации. Рабочие элементы и рабочие группы представляются как потоки и группируются в рабочие группы, обладающие особыми свойствами с точки зрения синхронизации и доступа к общей памяти. Докладчик также рассказывает о модели выполнения на стороне хоста, объясняя, что все собирается вместе в контексте, который включает в себя набор устройств, программных объектов, ядер, объектов памяти и очередь команд для постановки в очередь ядер и памяти или операций передачи данных. . OpenCL также поддерживает иерархию различных типов памяти, чтобы отразить природу памяти в гибридной системе с распределенной памятью.

  • 00:10:00 В этом разделе спикер обсуждает важность управления памятью и синхронизацией при использовании OpenCL-программирования. В OpenCL используется нестрогая модель согласованности памяти, поэтому ответственность за управление передачей данных и контроль за перемещением данных с одного устройства на другое лежит на программисте. Синхронизация становится важной при использовании нескольких устройств, и программист несет ответственность за правильную синхронизацию событий, включая выполнение ядра и передачу данных. Докладчик рассказывает об использовании Standard CL, который представляет собой упрощенный интерфейс к OpenCL и предоставляет контекст по умолчанию, который готов к использованию, включает все устройства и не прерывается от полной функциональности OpenCL. Кроме того, Standard CL упрощает управление памятью с помощью CL Maylock, который выделяет память, совместно используемую устройствами OpenCL.

  • 00:15:00 В этом разделе спикер обсуждает базовый алгоритм n-тел, который моделирует движение n-частиц с учетом некоторой формы взаимодействия между частицами. Алгоритм включает в себя вычисление силы, действующей на каждую частицу, путем суммирования вкладов взаимодействия со всеми другими частицами в системе. Как только сила, действующая на каждую частицу, известна, положение и скорость частицы обновляются через небольшой временной шаг. Этот процесс повторяется для каждой частицы, что приводит к моделированию движения этих частиц под действием сил взаимодействия. Алгоритм имеет вычислительный порядок n-squared, что позволяет добиться хорошего ускорения при использовании сопроцессоров с ограничениями пропускной способности передачи памяти. Весь алгоритм можно записать всего в нескольких десятках строк кода на C.

  • 00:20:00 В этом разделе спикер объясняет реализацию алгоритма n тел через цикл, который накапливает взаимодействие между частицами. Код ядра предназначен для обеспечения достаточно стандартной реализации с использованием передового опыта с точки зрения OpenCL, но он может быть неоптимальным для конкретной архитектуры. Ядро будет выполняться для каждого рабочего элемента в индексном пространстве, где каждый поток отвечает за обновление положения и скорости одной частицы. Приложение имеет простую одномерную индексную базу с количеством рабочих элементов, равным количеству частиц в системе. Хост-код также важен для инициализации, управления памятью и координации операций на устройствах OpenCL.

  • 00:25:00 В этом разделе спикер представляет код ядра для обновления положения и скорости частиц в ньютоновской механике. Прототип кода ядра аналогичен коду функции C, но с некоторыми квалификаторами, определяющими адресное пространство и использование схемы блокировки. Код ядра хранится в отдельном файле и используется для оперативной компиляции при запуске программы. Затем спикер объясняет, как код ядра определяет размер и индекс, прежде чем приступить к физическим расчетам. Глобальные и локальные идентификаторы потоков также подробно объясняются, и докладчик отмечает, что внешний цикл неявно присутствует в коде ядра, поскольку ядро будет автоматически выполняться для каждой частицы в системе.

  • 00:30:00 В этом разделе спикер объясняет реализацию ядра OpenCL для расчета попарных сил с использованием кеша. Ядро кэширует одну позицию частицы и полагается на другие рабочие элементы в рабочей группе, чтобы также заполнить кэш. После кэширования 64 позиций частиц ядро перебирает кэшированные позиции частиц и выполняет тот же расчет силы, что и в коде C, с заметными отличиями, характерными для OpenCL. К ним относятся использование вектора с плавающей запятой для положения частицы, встроенная функция OpenCL для извлечения квадратного корня и сохранение массы в неиспользуемом четвертом компоненте вектора с плавающей запятой для удобства. Ядро обновляет положение и скорость частицы за один такт, используя тип данных вектора с плавающей запятой. Наконец, спикер объясняет необходимость барьеров для синхронизации при заполнении кеша и циклических операциях.

  • 00:35:00 В этом разделе мы узнаем, как новая позиция и новая скорость записываются обратно в глобальную память в новый массив, чтобы избежать перезаписи данных, которые все еще требуются другим потокам. Эта схема двойной буферизации используется на более поздних этапах для безопасного обновления положения частиц без возникновения каких-либо проблем параллелизма потоков. Переходя к реализации основного кода ядра, мы узнаем о том, как программа задает параметры, выделяет память, инициализирует позиции и скорости, строит и компилирует ядро OpenCL, запрашивает по имени необходимое текущее ядро n-body, создает одно -мерная вычислительная область ядра и явно устанавливает аргументы ядра. В целом код показывает, чем OpenCL отличается от базовых программ на C тем, что хост выполняет ядро через прокси, и как аргументы для ядра должны устанавливаться напрямую.

  • 00:40:00 В этом разделе спикер объясняет процесс передачи данных с хоста на GPU с помощью вызова clm-sink и синхронизацию массивов на устройстве (GPU) с помощью флагов блокировки вызовов. Затем они обсуждают цикл по шагам, вводя значение и пакет, которые будут использоваться в диагностических целях, и откладывают установку аргументов ядра два и три для двойной буферизации. Докладчик отмечает, что выполнение ядра поставлено в очередь, а вызов синхронизации ожидания CL используется, чтобы убедиться, что все выполнения ядра завершены, прежде чем продолжить. Наконец, они возвращают данные с графического процессора на хост с помощью буфера чтения в очереди CL.

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

  • 00:50:00 В этом разделе лекции объясняются изменения, которые необходимо внести в код ядра, чтобы выполнить симуляцию частиц на двух GPU. Цикл по позициям частиц кэша остается таким же, как и раньше, но перед строкой 21 цикл теперь проходит по локальным позициям частиц, которыми владеет GPU. Затем код повторяется для удаленных частиц, за обновление которых отвечает другой графический процессор. Код для обновления положения и скорости частиц остается прежним. Чтобы изменить код хоста для двух графических процессоров, инициализация остается прежней, но также выделяются массивы для позиций и скоростей частиц, которые содержат половину частиц, где A и B представляют два графических процессора. Создается вычислительная область с индексным пространством, равным половине исходного размера, и удаляется код для статической установки указателя аргумента на массив скоростей.

  • 00:55:00 В этом разделе мы узнаем, как установить идентификатор устройства, чтобы определить, на какой графический процессор будут записываться данные при копировании массивов половинного размера на соответствующие графические процессоры. Мы также видим, что для обмена данными между несколькими графическими процессорами нам необходимо синхронизировать обновленные позиции частиц обратно с графическими процессорами, переключая массивы частиц половинного размера, представляющие их. Мы также узнали, что для некоторых реализаций OpenCL может потребоваться вызов сброса CL для истинного параллелизма, но это не является частью стандарта.

  • 01:00:00 В этом разделе ведущий просматривает код, который реализует схему двойной буферизации для замены старых и новых позиций частиц между двумя массивами. Эта схема гарантирует, что обновленные позиции частиц возвращаются либо в массив A, либо в массив B. После синхронизации частиц с хостом их необходимо скопировать обратно в больший массив, чтобы повторно использовать некоторые вспомогательные функции. Докладчик рекомендует стандарт OpenCL как необходимый ресурс для программистов OpenCL и предоставляет URL-адреса для стандарта и ATI Stream SDK. Докладчик также отвечает на вопросы о том, можно ли использовать OpenCL для таких алгоритмов, как разложение по сингулярным числам или неотрицательная матричная факторизация, и подтверждает, что данные в глобальной памяти графического процессора остаются неизменными между запусками ядра, что имеет решающее значение для более сложных алгоритмов.

  • 01:05:00 В этом разделе видео обсуждаются текущие ограничения API OpenCL, который поддерживает только системы Unix/Linux и разрабатывается для порта Windows. В видео также рассматривается вопрос о совместном использовании памяти между графическим процессором и хостом, объясняя, что, хотя это возможно, существуют потери производительности, что делает использование глобальной памяти, выделенной на видеокарте, обычным явлением. При выделении памяти через OpenCL API есть способы контролировать, как она обрабатывается, но некоторые из них выполняются автоматически на уровне реализации. Кроме того, в видео объясняется разница между глобальными и локальными указателями в распределении памяти и то, как выбор оптимального количества ядер зависит от выполняемого алгоритма.

  • 01:10:00 В этом разделе спикер обсуждает различные вопросы, связанные с программированием OpenCL, такие как загрузка и запуск модуля FTL FGL RX, совместимость стандартного CL Lib с привязками C++, оптимизация ядер OpenCL для повышения производительности и использование CL mem только для чтения или закрытие их для чтения/записи при выделении буферов памяти. Докладчик также указывает, что могут существовать специальные инструменты для редактирования ядер OpenCL и оптимизации для графических процессоров AMD, а также отмечает, что методы оптимизации могут быть очень тонкими и требуют большой настройки.

  • 01:15:00 В этом разделе докладчик обсуждает методы оптимизации для программирования OpenCL, включая организацию данных для использования преимуществ векторных операций, тщательное управление доступом к памяти для повышения производительности и ручное разворачивание циклов для оптимизации. Кроме того, использование сложных типов данных и возможность передачи данных между графическими процессорами без возврата к хосту зависят от реализации и могут различаться в зависимости от компилятора. Докладчик также упоминает, что существуют ограничения на размер буферов памяти, которые будут зависеть от доступной памяти на устройствах OpenCL в системе. Для повышения производительности можно хранить более простые параметры с плавающей запятой в постоянной памяти.

  • 01:20:00 В этом разделе выступающий объясняет, что в различных SDK доступны инструменты для анализа реализации OpenCL, включая инструменты профилирования для измерения использования вычислительных единиц или использования передачи памяти. Докладчик также поясняет, что управление фрагментацией памяти на стороне графического процессора зависит от реализации и что реализация должна управлять ею должным образом. При использовании двойной точности нет очевидного ответа на вопрос, следует ли уменьшить размер локальной рабочей группы до 32 или 16, поскольку это зависит от используемой архитектуры. Спикер также упоминает наличие вспомогательных вызовов для простого получения информации обо всех устройствах в стандартном контексте GPU.
 

Центр разработчиков AMD: серия вебинаров по программированию на OpenCL. 5. Реальные приложения OpenCL



5 - Реальные приложения OpenCL

В этом видео Йоахим Дегуара рассказывает о приложении для обработки многопотокового видео, над которым он работал, уделяя особое внимание оптимизации производительности. Видео охватывает различные темы, такие как декодирование форматов видео, использование DMA для передачи памяти между ЦП и ГП, двойная буферизация, выполнение ядер, использование объектов событий для синхронизации и операций профилирования, взаимодействие OpenCL-OpenGL, обработка прокруток в видео и выбор между ними. OpenCL и OpenGL при обработке алгоритмов. Йоахим также обсуждает различные выборки и SDK, доступные для приложений OpenCL, но отмечает, что в настоящее время нет доступного примера кода для конкретного приложения, обсуждаемого в видео.

  • 00:00:00 В этом разделе Хоахим Дегуара описывает приложение для обработки многопотокового видео, над которым он работал. Приложение включает в себя открытие нескольких видеопотоков, их декодирование, применение к ним видеоэффектов, их объединение и, наконец, представление одного видеопотока, который в конце многократно обрабатывается. Йоахим Дегуара упоминает, что производительность является ключевым фактором для этого приложения, и для достижения представления в реальном времени важно вписать декодирование, обработку и отображение в циклическую структуру, которая происходит 30 раз в секунду или частоту кадров входного видео. .

  • 00:05:00 В этом разделе основное внимание уделяется декодированию форматов видео и перемещению кадра в графический процессор. Для декодирования формата видео необходимо следить за тем, чтобы это делалось как можно быстрее, чтобы это не повлияло на производительность. Один из способов сделать это — запустить функцию декодирования отдельно от основного цикла и при ее вызове возвращать последний кадр. Это гарантирует, что декодирование будет выполняться в фоновом режиме, в то время как основной цикл будет продолжаться непрерывно. Для перемещения кадра в графический процессор используются вызовы API, которые включают указание изображения для записи и того, должна ли запись выполняться синхронно или асинхронно.

  • 00:10:00 В этом разделе спикер обсуждает DMA (прямой доступ к памяти) и то, как его можно использовать для передачи памяти между основной памятью системы и памятью графического процессора без необходимости ее копирования процессором. Механизм прямого доступа к памяти выполняет эту операцию параллельно, освобождая ресурсы ЦП и ГП. Передача буферов и изображений может выполняться асинхронно и требует специальных флагов. Однако данные нельзя использовать сразу после копирования, поэтому программу необходимо соответствующим образом реструктурировать, чтобы воспользоваться преимуществами прямого доступа к памяти. Докладчик предлагает двойную буферизацию и реструктуризацию циклических процессов, чтобы избежать повреждения текущих обрабатываемых или отображаемых данных. В целом, DMA может значительно повысить производительность приложений за счет разгрузки циклов CPU и GPU.

  • 00:15:00 В этом разделе спикер обсуждает подход двойной буферизации, используемый в OpenCL для обработки и отображения кадров видео. Этот подход включает в себя постоянную буферизацию двух кадров, A и B, и обработку одного из них во время загрузки другого. Это устраняет необходимость суммировать время обработки и время загрузки, а вместо этого занимает максимальное время, необходимое для любого процесса. Спикер также обсуждает настройку аргументов для ядра, которую нужно сделать только один раз и которую можно использовать для всех последующих обработок, если параметры не нужно менять.

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

  • 00:25:00 В этом разделе спикер объясняет, как использовать объекты событий OpenCL для синхронизации операций и как использовать профилирование событий для тестирования производительности. При создании графа зависимостей для фильтров указатель на событие передается в качестве последнего аргумента для операции постановки в очередь, но объект события создается внутри InQ. Это может вызвать путаницу, но позволяет настроить зависимости между фильтрами и операциями загрузки. Докладчик описывает, как с помощью профилирования событий можно получить от события временные метки о том, когда произошли определенные события в жизненном цикле события, например, когда эта операция со ссылками на события была поставлена в очередь, отправлена, запущена, и завершили бег. Это позволяет профилировать, сохраняя при этом все операции асинхронными.

  • 00:30:00 В этом разделе видео спикер объясняет различные состояния, через которые проходит событие при использовании OpenCL, например, поставлено в очередь, отправлено, запущено и завершено, а также как использовать данные профиля события и временные метки для измерения производительности. и выявить потенциальные проблемы, такие как длительное время выполнения операций или загрузки данных. Также спикер рассказывает, как дождаться завершения событий, чтобы обеспечить корректное отображение видеопотоков с различными фильтрами и эффектами.

  • 00:35:00 В этом разделе спикер обсуждает взаимодействие OpenCL и OpenGL, которое позволяет обмениваться определенной информацией между ними. Эта функциональность не является обязательной, поэтому не все реализации должны ее поддерживать. Докладчик подчеркивает важность проверки расширения и создания контекста в OpenCL с определенными флагами для включения взаимодействия OpenCL-OpenGL. Это работает путем создания изображения OpenCL из уже созданной текстуры OpenGL, поэтому данные не копируются без необходимости туда и обратно.

  • 00:40:00 В этом разделе спикер объясняет, как OpenCL и OpenGL могут совместно использовать данные изображения через Interop. Они охватывают цель, уровень NIP и объект текстуры, которые необходимы для ссылки на текстуру Open GL. После создания образ OpenCl можно использовать как обычный образ OpenCl, но две программы должны выполнить некоторое согласование, чтобы гарантировать, что они не мешают друг другу. Спикер также отвечает на вопрос о том, как создавать переходы при рендеринге видео. Он говорит, что это можно сделать, используя положение свайпа в качестве входных данных для фильтра. В конечном итоге окончательный результат передается в OpenGL для отображения, что завершает все этапы.

  • 00:45:00 В этом разделе спикер объясняет, как они обрабатывают свайпы в видео, глядя на маркер времени каждого кадра и используя ключевой кадр для интерполяции положения свайпа. Они также отвечают на вопрос о профилировании в OpenCL, заявляя, что метки времени зависят от внешнего таймера с высоким разрешением, а не от вызова завершения CL. Кроме того, выступающий обсуждает порядок выполнения в устройствах и средах выполнения OpenCL и подтверждает, что операции обрабатываются по порядку для большинства устройств.

  • 00:50:00 В этом разделе спикер исследует различия между OpenCL и OpenGL при обработке алгоритмов. Решение о том, какую платформу использовать, зависит от индивидуальных предпочтений, хотя OpenCL может быть проще в программировании из-за его всеобъемлющей языковой структуры. Что касается производительности, OpenCL может позволить обрабатывать приложения, требующие более сложного оборудования; однако бывают случаи, когда использование затенения OpenGL может привести к повышению производительности. Кроме того, хотя докладчик не смог предоставить какой-либо доступный пример кода для конкретного приложения, в SDK AMD OpenCL есть различные примеры кода, из которых пользователи могут извлечь уроки.

  • 00:55:00 В этом разделе спикер обсуждает различные образцы и SDK, доступные разработчикам для приложений OpenCL. В примерах показано, как запрашивать устройства и время выполнения для получения расширений, а также приведены примеры взаимодействия OpenCL с OpenGL. Однако в настоящее время нет доступного примера кода для конкретного приложения, обсуждаемого в видео, но это может измениться в будущем. Вебинар завершился, и его запись будет доступна всем участникам.
 

Центр разработчиков AMD: серия вебинаров по программированию на OpenCL. 6. Расширения Device Fission для OpenCL



6 - Расширения Device Fission для OpenCL

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

  • 00:00:00 В этом разделе докладчик обсуждает расширения в OpenCL, в частности, три различных типа расширений: расширения KHR, расширения EXT и расширения поставщиков. Расширения KHR одобрены рабочей группой OpenCL и поставляются с набором тестов на соответствие. Расширения EXT разрабатываются как минимум двумя членами рабочей группы и не требуют тестов на соответствие. Расширения поставщиков, такие как CL_AMD_printf, разрабатываются одним поставщиком и могут поддерживаться только этим поставщиком. Документация для всех расширений доступна на веб-сайте реестра Chronos OpenCL, что обеспечивает прозрачность и доступность для разных поставщиков.

  • 00:05:00 В этом разделе спикер упоминает расширение устройства fission для OpenCL, называемое устройством зрения. Это расширение позволяет пользователю разделить большие устройства с большим количеством вычислительных блоков на более мелкие устройства OpenCL либо по имени, либо по привязке памяти. Это разделение может помочь зарезервировать ядро для приоритетной задачи или обеспечить назначение определенных рабочих групп определенным ядрам, как в системе на основе SMP. Докладчик мотивирует использование машинного зрения примером параллельных алгоритмов и параллельных контейнеров, построенных поверх OpenCL, и заявляет, что это расширение в настоящее время поддерживается AMD и IBM на их процессорах и устройствах Cell Broadband.

  • 00:10:00 В этом разделе спикер обсуждает важность сохранения последовательной семантики при распараллеливании операций переноса векторов. Они объясняют, что при вставке элементов в вектор во время последовательного цикла ожидаемый порядок будет отображаться как функция цикла. Однако при распараллеливании этот порядок теряется, и элементы могут вставляться не по порядку, поэтому спикер предлагает сохранить последовательную семантику операции переноса векторов. Затем они приводят пример того, как это может быть важно в таком приложении, как упрощенная версия потока MPEG-2. В заключение они представляют функцию C и обсуждают, как реализовать эти параллельные операции на ЦП.

  • 00:15:00 В этом разделе спикер объясняет, как использовать параллельные шаблоны для оптимизации процесса Device Fission Extensions for OpenCL. Они используют шаблон конвейера для параллельного выполнения функций и вводят блок данных для чтения из входных данных для обработки одного рабочего элемента в локальной памяти. Затем этот подход записывает смещение почтового ящика в соответствующую рабочую группу для расчета смещений при сохранении порядка вывода. Порядок достигается за счет связи между рабочими группами вместо использования глобального идентификатора, который может выполняться в произвольном порядке. Шаблон конвейера обеспечивает параллельное выполнение функций для оптимизации процесса.

  • 00:20:00 В этом разделе спикер обсуждает свой конвейер и то, как теперь они используют термин «счетчик» в качестве почтового ящика, поскольку они вышли за рамки простого подсчета вещей. Они объясняют, что передают идентификаторы групп для индексации в почтовые ящики и используют локальную и глобальную память для простых вычислений. Однако они отмечают, что нет никаких гарантий для выполнения рабочей группы, и объясняют, как это может привести к тупиковой ситуации. Для решения этой проблемы спикер предлагает разделить устройство на два отдельных ядра с помощью машинного зрения, запустить по одной рабочей группе на каждом ядре и гарантировать прогресс. Они также представляют важный механизм, предоставляемый OpenCL для работы на хост-устройстве.

  • 00:25:00 В этом разделе спикер обсуждает преимущества использования собственных ядер в OpenCL, что позволяет выполнять произвольные функции C или C++. Он может предложить большую гибкость при опробовании различных реализаций, а также возможность вызывать стандартные процедуры ввода-вывода или другие библиотечные функции, которые могут быть недоступны в OpenCL. Процесс создания собственного ядра в OpenCL включает передачу очереди команд и функции вместе с ее аргументами и объектами памяти. Однако следует соблюдать осторожность с локальным хранилищем потока, поскольку функция может выполняться не в том же потоке, в котором она была включена. Докладчик также представляет API привязок OpenCL C++, который предлагает некоторые абстракции поверх C API. Программа начинается с запроса доступных платформ и создания контекста и типа устройства.

  • 00:30:00 В этом разделе спикер обсуждает использование расширений деления устройства для OpenCL. После запроса действительного устройства возвращается список устройств, и первое устройство выбирается для поддержки разделения устройств. Деление устройства является новым для OpenCL API и требует механизмов расширения, позволяющих описать раздел. Они используют раздел в равной степени, чтобы разделить его на устройства единиц из одного. Затем настраиваются свойства подустройства и вызывается функция создания подустройств. Предположим, что создано хотя бы одно подустройство, созданы почтовые ящики и очередь команд для каждого устройства. Полученные устройства точно такие же, как и любые другие устройства, и могут использоваться взаимозаменяемо с существующими библиотеками. Затем докладчик переходит к настройке собственных ядер OpenCL.

  • 00:35:00 В этом разделе спикер обсуждает входные данные и аргументы, необходимые для реализации расширений Device Fission для OpenCL. Спикер поясняет, что буфер памяти для входов будет разделен на четыре части, куда будут ставиться указатели самой FN c временем выполнения. Буфер памяти будет состоять из почтовых ящиков, блоков и кэш-транзакций, а для каждого ядра будут генерироваться уникальные идентификаторы. Далее спикер объясняет, что каждый экземпляр ядра будет работать на отдельных устройствах, и как только все события будут завершены, данные будут записаны со вставленным дополнением. Само ядро будет включать оптимизации, связанные с блокировкой и кэшированием, чтобы обеспечить эффективное выполнение.

  • 00:40:00 В этом разделе спикер обсуждает реализацию приложения, использующего расщепление устройств для OpenCL. Они объясняют, как работает приложение, используя различные типы, такие как ввод/вывод, почтовые ящики, локальные массивы блоков, размер блока и идентификаторы групп, для параллельного индексирования наборов данных. Приложение также реализует простые оптимизации ожидания и блокировки, чтобы все выполнялось как можно больше параллельно. Используя деление устройств, реализация этого приложения демонстрирует потенциал для достижения ускорения ЦП с минимальными операциями ALU или без них, что может еще больше возрасти с внедрением более широких векторов в будущем. Спикер также обсуждает другие приложения и варианты использования устройства деления, такие как деление относительно бесконечности и космические системы Numa.

  • 00:45:00 В этом разделе спикер обсуждает преимущества сходства памяти в OpenCL, что позволяет точно связать буферы с конкретным устройством. Это может привести к лучшей локализации кэша и повышению производительности за счет предотвращения конфликтов и отрицательного совместного использования. Схема почтового ящика, используемая в OpenCL, может быть расширена для поддержки нескольких итераций, что позволяет использовать цикл, который снова и снова запускает каскадный конвейер. Докладчик также упомянул о наличии ресурсов в зоне OpenCL на сайте developer.amd.com, где заинтересованные стороны могут найти дополнительную информацию об OpenCL, включая вебинары, прошедшие презентации и предстоящий саммит по гетерогенным вычислениям. Спикер также намекает на возможность поддержки деления устройств на GPU в будущем, что позволило бы зарезервировать часть ядра для высокоприоритетных задач и обеспечить лучшую производительность.

  • 00:50:00 В этом разделе видео спикер обсуждает будущее деления устройств, движущихся к другим устройствам. В настоящее время только AMD и IBM поддерживают расширения разделения устройств для OpenCL, но другие поставщики проявили интерес к этому предложению. Поднимается вопрос о том, будут ли поддерживаться математические библиотеки, такие как BLAS и FFT, и спикер подтверждает, что они работают над реализациями OpenCL как BLAS, так и различными вариантами и реализациями для линейной алгебры, которые будут представлены в библиотеке в стиле FFT.
 

Центр разработчиков AMD: серия вебинаров по программированию на OpenCL. 7. Гидродинамика сглаженных частиц.




7 - Гидродинамика сглаженных частиц

В этом видео обсуждается гидродинамика сглаженных частиц (SPH), метод решения уравнений гидродинамики, в частности уравнений Навье-Стокса. В видео объясняются различные члены уравнений, в том числе условия плотности, давления и вязкости, а также то, как они аппроксимируются с помощью ядра сглаживания. Также обсуждается численный алгоритм, используемый для SPH, а также использование пространственного индексирования и Interop. Докладчик объясняет процесс построения пространственного индекса и карты соседей, а также то, как вычисляются физические параметры. Видео предлагает зрителям загрузить и использовать программу и обсуждает ограничения моделирования. Затем спикер отвечает на вопросы аудитории о производительности графического процессора, несжимаемом поведении и использовании кэшированных изображений.

  • 00:00:00 В этом разделе Алан Херих, старший технический сотрудник AMD, представляет обзор вычислительной гидродинамики, в частности, гидродинамики гладких частиц (SPH). Первоначально SPH использовался для астрофизических расчетов, но стал довольно популярным в видеоиграх и симуляторах. Этот метод используется для решения уравнений Навье-Стокса, которые представляют собой дифференциальные уравнения в частных производных, сформулированные в 1900-х годах и лежащие в основе большинства работ по гидродинамике сегодня. Аллен дает определение жидкостей и дает интуитивно понятное объяснение того, как они работают, уделяя особое внимание жидкостям и газам. Он также подчеркивает, что жидкости обычно описываются уравнениями Навье-Стокса, а несжимаемые уравнения Навье-Стокса управляют жидкостями, такими как вода, при нормальных скоростях и нормальных температурах.

  • 00:05:00 В этом разделе спикер объясняет уравнения, управляющие жидкостями, известные как уравнения Навье-Стокса. Уравнение движения представляет изменение скорости как функцию гравитации, давления и вязкости, в то время как уравнение неразрывности массы утверждает, что масса не создается и не уничтожается. Явлениями, которые управляют жидкостью, являются гравитация, давление и скорость, а вязкость — это липкость жидкости, которая определяет вероятность движения частиц жидкости в одном направлении. Также обсуждается термин конвективного ускорения, который описывает ускорение жидкости при ее движении через меньшее отверстие, такое как сопло садового шланга. Спикер предлагает аудитории загрузить и поиграть с продемонстрированной программой, имитирующей жидкости в коробке.

  • 00:10:00 В этом разделе докладчик объясняет различные термины уравнения движения для гидродинамики, включая конвективное ускорение, градиент давления и вязкость. Давление определяется как разница между фактической плотностью жидкости в точке и плотностью покоя. Член вязкости, который является последним членом в правой части уравнения движения, рассеивает импульс системы, что в конечном итоге приводит к состоянию, в котором скорость одинакова во всех местах. Существует также уравнение неразрывности массы, del dot V равно 0, что означает, что в уравнениях несжимаемости масса не создается и не уничтожается. Наконец, чтобы представить динамику системы, говорящий берет материальную производную уравнения, чтобы получить уравнение движения для частицы.

  • 00:15:00 В этом разделе видео обсуждается метод гидродинамики сглаженных частиц (SPH) для решения упрощенных уравнений Навье-Стокса для несжимаемой жидкости, представленных в предыдущем разделе. Метод SPH был впервые представлен в 1992 году для изучения астрофизики и галактик, но его можно использовать и для уравнений жидкости. Он включает в себя представление сглаживающих ядер величин, которые подобны базисным функциям, которые позволяют нам аппроксимировать любую величину путем суммирования количества в соседних точках, умноженного на весовую функцию. Метод SPH используется для аппроксимации членов плотности и градиента давления в уравнениях Навье-Стокса. В видео также упоминается, что уравнения Навье-Стокса численно чувствительны к масштабу и что расчеты выполняются в меньшем масштабе, прежде чем они будут расширены до обычного пространственного масштаба, чтобы перемещать частицы в пространстве.

  • 00:20:00 В этом разделе докладчик объясняет три основных термина, которые аппроксимируются в гидродинамике сглаженных частиц (SPH): термины плотности, давления и вязкости. Для расчета плотности программа вычисляет массу частиц в различных точках и умножает ее на градиент ядра сглаживания. Затем вычисляется член давления, используя скалярную величину давления, деленную на плотность, которая умножается на градиент ядра сглаживания. С другой стороны, член вязкости аппроксимируется с помощью скалярного коэффициента, который определяет уровень вязкости жидкости и разницу скоростей между двумя точками, деленную на плотность точки J. Докладчик также объясняет свойства ядра сглаживания, которое используется в моделировании SPH, и как он суммируется с единицей на сфере радиуса H.

  • 00:25:00 В этом разделе докладчик обсуждает численный алгоритм, используемый для гидродинамики сглаженных частиц (SPH). Алгоритм включает в себя вычисление плотности, давления, градиента давления, вязкого члена и ускорения, которые затем используются для временного шага скоростей и положений частиц. Спикер объясняет, что первоначальный алгоритм включает проверку взаимодействия всех частиц со всеми частицами, что правильно, но недостаточно быстро. Следовательно, вводится лучший алгоритм, который делит пространство на воксели, позволяя взаимодействовать только с частицами в пределах радиуса взаимодействия. Кроме того, для вычисления взаимодействий случайным образом выбирается подмножество частиц, а не все частицы, что создает эффективную программу.

  • 00:30:00 В этом разделе докладчик обсуждает использование пространственного индексирования только для вычисления взаимодействий с ограниченным числом частиц в симуляциях OpenCL, а также важность использования Interop для совместного использования буферов данных с графической системой. В то время как Interop позволяет выполнять рендеринг напрямую из буфера графического процессора и экономит место в графической памяти, без него программе пришлось бы копировать данные в память хоста и обратно, что значительно замедляло бы симуляцию. Докладчик объясняет изменения, необходимые для использования Interop, включая создание другого контекста, и представляет набор буферов, необходимых для моделирования, включая индекс частиц для сортировки. Несмотря на обсуждение важности Interop, показанная программа не использует его, что замедляет моделирование.

  • 00:35:00 В этом разделе спикер обсуждает различные ядра, используемые в алгоритме гидродинамики сглаженных частиц. Первое ядро — это «хэш-частицы», которое связывает частицы с вокселем. Затем ядра «сортировки» и «сортировки после прохода» сортируют частицы по вокселям и организуют их для построения пространственного индекса. Затем ядра «индекс» и «индекс после прохода» создают пространственный индекс от вокселей к частицам. После этого ядро «точных соседей» решает, какие соседи будут взаимодействовать друг с другом. Наконец, «вычислить давление плотности», «вычислить ускорение» и «интегрировать» ядра вычисляют взаимодействие и физику между частицами. Докладчик объясняет, что сортировка по основанию используется в версии кода для графического процессора, а сортировка Q используется в версии кода для процессора.

  • 00:40:00 В этом разделе видео объясняет процесс построения пространственного индекса от вокселей до частиц в гидродинамике сглаженных частиц (SPH). Ядро использует бинарный поиск для определения частицы с наименьшим номером в каждом вокселе и оставляет отрицательное значение единицы в вокселах, не содержащих частиц. Последующий проход индекса затем заполняет значение индекса для пустых вокселей, копируя значение следующего непустого вокселя в индексе ячейки сетки. После завершения индексации программа строит карту соседей путем поиска в локальной области вокселей размером два на два на два, окружающих каждую частицу. Чтобы устранить систематическую ошибку, программа генерирует случайное смещение в каждом вокселе и меняет направление поиска. Затем ядро выбирает первые 32 частицы в пределах радиуса взаимодействия и добавляет их на карту соседей.

  • 00:45:00 В этом разделе спикер объясняет, как они рассчитали физику, построив карту соседей, которая позволяет им взаимодействовать с 32 частицами. Они просматривают уравнения, используемые для аппроксимации плотности и давления, вычисляют условия ускорения, а затем комбинируют все, чтобы определить общее ускорение. Затем скорость и положение увеличиваются посредством численного интегрирования с граничными условиями, предотвращающими вылет частиц из ящика. Докладчик призывает зрителей загрузить и поиграть с исходным кодом и подчеркивает, что, хотя существует множество медленных методов решения уравнений Навье-Стокса, медленный не обязательно означает хороший.

  • 00:50:00 В этом разделе видео спикер объясняет этап обновления симуляции, где скорость интегрируется в новое положение перед обновлением положения. Обновление скорости является явным, в то время как обновление положения является полунеявным, используя значение скорости на следующем временном шаге. Симуляция находится в плавающем режиме для повышения производительности, но если требуется высокая точность и точность, рекомендуется использовать double. Алгоритм полностью параллелизуем, но необходимо учитывать компромиссы пространственного разбиения. Наконец, спикер отвечает на вопросы об использовании Interop с несколькими графическими процессорами, моделировании турбулентности и максимальном практическом количестве частиц в моделировании.

  • 00:55:00 В этом разделе спикер отвечает на некоторые вопросы аудитории. Они объясняют, что практическим ограничением их моделирования является уровень производительности, который зависит от класса используемых GPU и CPU. Они также упоминают, что, хотя их моделирование основано на несжимаемых уравнениях, они явно не решают условие несжимаемости, которое может ограничить его сжимаемое поведение. Спикер также отвечает на вопрос о том, почему они использовали буферы вместо кешированной памяти изображений, заявляя, что на момент разработки программы они не видели никакого преимущества в производительности от использования кешированных изображений. Однако они упоминают, что в будущем OpenCL обеспечит поддержку кэшированных буферов и что они могут изменить программу для их поддержки. В целом, спикер предлагает аудитории скачать и использовать программу так, как они хотят, так как для нее нет никаких ограничений.
 

Центр разработчиков AMD: серия вебинаров по программированию на OpenCL. 8. Методы оптимизации: свертка изображений



В этом видео Udeepta D. Bordoloi обсуждает методы оптимизации при свертке изображений.

 

AMD Developer Inside Track: как оптимизировать свертку изображений



Как оптимизировать свертку изображений

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

  • 00:00:00 В этом разделе Удипта Бордоло из графической группы AMD объясняет концепцию свертки изображений, которая включает взвешенное суммирование по области входного изображения для создания пикселя выходного изображения. Он использует OpenCL и графический процессор 5870 для выполнения оптимизации, постепенно работая над базовым кодом корреляции. Зеркалирование и использование LDS (Local Data Share) — некоторые из используемых методов оптимизации, что приводит к значительному сокращению времени выполнения.

  • 00:05:00 В этом разделе спикер обсуждает оптимизацию свертки изображений в программе, которая работает для всех размеров фильтров и всех входных размеров. Он фокусируется на использовании локальных областей для улучшения обмена данными и сокращения времени, затрачиваемого на ожидание. Интерпретируя константы и входные данные как 128-битные значения, компилятор и джинн могут легче интерпретировать код и сократить время обработки. Он показывает, как оптимизация констант и использование больших локальных областей может значительно повысить эффективность свертки изображений. В целом докладчик подчеркивает важность поиска способов минимизировать время обработки при свертке изображений для повышения общей производительности.

  • 00:10:00 В этом разделе спикер обсуждает, как оптимизировать свертку изображения, определяя размер фильтра и как его менять для разных масок. Спикер отмечает, что применение оптимизации в разное время может повлиять на производительность, но может помочь в обнаружении любых непредвиденных проблем. Докладчик также обсуждает запуск того же количества элементов для входного изображения 2k на 2k с полными данными, что привело к более эффективному формату данных. Кроме того, спикер рассказывает о новом методе повторного использования данных вместо использования двигателя с использованием локальной памяти, известной как LDS в аппаратном обеспечении.

  • 00:15:00 В этом разделе спикер рассказывает об оптимизации методов свертки изображений. Они загружают все входные данные, откладывают их на определенную группу, а затем отрабатывают очевидное. Они используют деньги, как они их знают, и перестают использовать LDS, чтобы попробовать использовать текстуры. Они проводят эксперимент с разрешением 2K на 2K и разными размерами фильтров и получают самые быстрые цифры при использовании текстур. Они предлагают шаги по оптимизации с использованием очевидных или текстур, использования силы мысли и использования параметров передачи счетчику. Они также предлагают использовать денежного монстра, когда это возможно. Они опубликовали пошаговую статью об оптимизации методов свертки изображений на веб-сайте разработчика AMD, на которую они ссылаются рядом с видео.
 

Центр разработчиков AMD: технический обзор OpenCL. Введение в OpenCL



Центр разработчиков AMD: технический обзор OpenCL. Введение в OpenCL

В этом видео Майкл Хьюстон представляет обзор OpenCL, отраслевого стандарта для параллельных вычислений данных, предназначенного для многоядерных процессоров, мобильных устройств и других форм кремния. OpenCL стремится объединить ранее конкурирующие проприетарные реализации, такие как CUDA и Brook+, что упростит разработку для независимых поставщиков программного обеспечения. Он предлагает разбивку между кодом, который работает на устройстве, и кодом, который управляет устройством с помощью системы очередей, предназначенной для обратной связи с разработчиками игр. OpenCL хорошо работает с графическими API, создавая вездесущий язык вычислений, который можно использовать для различных приложений, таких как редактирование фотографий и видео, а также для систем искусственного интеллекта, моделирования и физики. Ведущий также обсуждает использование OpenCL для голливудского рендеринга и надеется увидеть больше работ в этой области.

  • 00:00:00 В этом разделе Майк Хьюстон объясняет цель OpenCL как отраслевого стандарта для параллельных вычислений данных, предназначенных для многоядерных процессоров, мобильных устройств и других форм кремния. OpenCL стремится объединить ранее конкурирующие проприетарные реализации, такие как CUDA и Brook+, что упростит разработку для независимых поставщиков программного обеспечения. Хотя в OpenCL используется другой диалект и незначительные отличия, переход с других языков параллельных данных, таких как CUDA, является прямым и быстрым. OpenCL также предлагает разделение между кодом, работающим на устройстве, и кодом, который управляет устройством с помощью системы очередей, предназначенной для обратной связи с разработчиками игр. Он предназначен для хорошей работы с графическими API, создавая вездесущий вычислительный язык для потребительского пространства в таких приложениях, как редактирование фотографий и видео.

  • 00:05:00 В этом разделе спикер объясняет некоторые начальные способы использования OpenCL, включая обработку изображений или видео высокого разрешения и запуск антивирусных сканеров. Кроме того, технология полезна для систем искусственного интеллекта, систем моделирования, физики, постобработки и ускорения освещения и рендеринга для фильмов. Докладчик надеется увидеть больше работы по использованию OpenCL для голливудского рендеринга, среди прочего.
Introduction to OpenCL
Introduction to OpenCL
  • 2013.05.29
  • www.youtube.com
Michael Houston, GPG System Architect Learn about OpenCL, what the transition to OpenCL will be like, what applications are ideal for OpenCL and what impact ...
 

Центр разработчиков AMD: технический обзор OpenCL. Эпизод 2: Что такое OpenCL™? (продолжение)



Центр разработчиков AMD: технический обзор OpenCL. Эпизод 2: Что такое OpenCL™? (продолжение)

В этом видео Джастин Хенсли обсуждает модели платформы и памяти OpenCL, которые важно понимать при использовании OpenCL для ускорения приложений. Он объясняет, что хост подключен к одному или нескольким устройствам OpenCL, таким как графические процессоры или многоядерные процессоры, которые имеют вычислительные блоки, выполняющие код в одной модели данных с несколькими инструкциями. Рабочие элементы имеют частную память, в то время как рабочие группы имеют общую локальную память, каждое устройство имеет глобальную и постоянную память, и разработчики должны явно управлять синхронизацией памяти и данными для достижения максимальной производительности. Кроме того, Хенсли обсуждает такие объекты OpenCL, как устройства, контексты, очереди, буферы, изображения, программы, ядра и события, которые используются для передачи работы устройствам, синхронизации и профилирования данных. Наконец, он описывает, как выполнить программу OpenCL в три простых шага: создание программы и объектов ядра, создание объектов памяти и создание очередей команд с событиями для обеспечения надлежащего порядка выполнения ядра.

  • 00:00:00 В этом разделе Джастин Хенсли объясняет модели платформы и памяти OpenCL, которые важно понимать при использовании OpenCL для ускорения приложений. Хост подключен к одному или нескольким устройствам OpenCL (GPU, DSP или многоядерному процессору), у которых есть вычислительные блоки, выполняющие код в модели с несколькими данными с одной инструкцией. Что касается памяти, хост-процессор имеет память, доступную только ЦП, в то время как вычислительное устройство имеет глобальную и постоянную память (не синхронизированную), и каждый рабочий элемент имеет свою собственную частную память, доступ к которой имеет только он. Рабочие группы имеют общую локальную память, и разработчики должны явно управлять синхронизацией памяти и данными, если они хотят получить максимальную производительность от своих устройств. Наконец, Хенсли обсуждает объекты OpenCL, такие как устройства, контексты, очереди, буферы, изображения, программы, ядра и события, которые используются для передачи работы устройствам, синхронизации и профилирования данных.

  • 00:05:00 В этом разделе спикер объясняет, как выполнить программу OpenCL за три простых шага. Во-первых, вы создаете программные объекты для сборки исходного кода и объекты ядра, содержащие код для запуска на различных устройствах с аргументами. Во-вторых, вы создаете объекты памяти, изображения или буферы. В-третьих, вы создаете очереди команд и используете их для постановки в очередь работы для разных устройств, но порядок работы может быть в порядке или не по порядку. Следовательно, события используются для обеспечения того, чтобы ядра выполнялись в нужном порядке при наличии зависимостей.
Причина обращения: