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

 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



6. Суперскаляр и VLIW

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

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

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

  • 00:10:00 В этом разделе объясняется концепция очень длинного командного слова (VLIW). Это позволяет упаковывать несколько инструкций в одно длинное командное слово, которое извлекается и декодируется вместе. VLIW перекладывает на компиляторы ответственность за обнаружение возможностей для выполнения инструкций одновременно до запуска программы и снижает потребность в проверке во время выполнения. Однако, если в длинном командном слове есть пустые места, исполнительный блок все равно может испытывать некоторые потери.
 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



7. SIMD и аппаратная многопоточность

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

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

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

  • 00:10:00 В этом разделе видео ведущий обсуждает, как обеспечить занятость арифметико-логического устройства (ALU) путем реализации планирования потоков с разделением по времени. Этот метод позволяет потокам по очереди занимать путь данных процессора в циклическом режиме, что значительно снижает задержку за счет планирования большего количества потоков. Выполняя следующую инструкцию во время ожидания остановленного потока, этот метод позволяет использовать вычислительные блоки и системы памяти несколькими потоками одновременно. В конечном счете, в результате нет потерь времени, и процессор может обрабатывать столько потоков, сколько требуется. Однако производительность одного потока на однопоточном процессоре может быть не так высока, как на многопоточном процессоре.
SIMD and Hardware Multithreading
SIMD and Hardware Multithreading
  • 2020.05.23
  • www.youtube.com
This video introduces SIMD, Vector Processing and Hardware Multithreading
 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



8. Архитектура многоядерного процессора

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

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

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

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



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

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

  • 00:00:00 В этом разделе мы узнаем об ускоренном процессоре (APU), который представляет собой типичный гетерогенный процессор, состоящий из ядер малой мощности, используемых для вычислений общего назначения, управления и настройки системы, и блоков GPU, все на одном чипе. APU имеет типичное ядро x86 с двумя уровнями кэш-памяти, тогда как ядра графического процессора отличаются, а не x86, с более низким локальным хранилищем данных, которое считается частной памятью. Владение памятью видно на диаграмме, показывающей расположение, доступность и размер памяти, при этом частная память меньше, чем локальная память, и намного меньше, чем глобальная память. Текущие процессоры для ноутбуков от Intel или AMD обычно имеют небольшое количество ядер общего назначения, встроенную память и встроенный графический процессор.

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

  • 00:10:00 В этом разделе мы узнаем, как AMD и Nvidia используют небольшие вычислительные блоки с аппаратным обеспечением cmd для одновременной поддержки операций над несколькими фрагментами данных. У обоих поставщиков есть 16 широких команд, и они могут группировать рабочие элементы в более крупные группы и сопоставлять их с различными пакетами в зависимости от параметров чипа и конфигурации. Кроме того, у них есть большие файлы регистров для поддержки быстрого переключения контекста, и оба поставщика имеют комбинацию автоматического кэша первого уровня и управляемой пользователем блокнотной памяти, которая в значительной степени поддерживается высокой пропускной способностью для поддержки быстрых операций с их личными воспоминаниями. Наконец, мы кратко коснемся потока управления и концепции выполнения нескольких данных с помощью одной инструкции, а также того, как инструкции ветвления вызывают некоторые отклонения в путях выполнения, требуя способа минимизировать объем вычислений, выполняемых с недопустимыми данными.

  • 00:15:00 В этом разделе спикер объясняет, как управлять потоком управления в архитектуре графического процессора, особенно при работе с инструкциями ветвления, которые могут привести к недопустимым результатам. Чтобы решить эту проблему, дорожки cmd можно замаскировать, чтобы отбросить некоторые вычисления, хотя это может снизить производительность. Еще одна проблема, которую нам необходимо решить при использовании технологии одной инструкции и нескольких потоков (SIMT), — это расхождение между программными потоками, которое может привести к трате вычислительных циклов, если ими не управлять должным образом. К счастью, программистам OpenCL не нужно сильно беспокоиться об этих проблемах, потому что поставщики процессоров уже обеспечили аппаратную логику управления.
GPU Architecture
GPU Architecture
  • 2020.05.23
  • www.youtube.com
This video introduces the internals of a Graphics Processing Unit (GPU), which can be an accelerator for general purpose computing, in addition to graphics p...
 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)


10. Внутреннее устройство FPGA

В этом видео обсуждается архитектура и особенности программируемых вентильных матриц (FPGA). FPGA имеют программируемую логику, позволяющую перепрограммировать их для реализации новых функций, и имеют прямой доступ к данным через огромное количество входов и выходов (I/O). Структура таблицы поиска в ПЛИС состоит из нескольких уровней мультиплексоров, которые можно запрограммировать для определения логических функций. В FPGA используются программируемые регистры, которые можно использовать для счетчиков, регистров сдвига, конечных автоматов и функций DSP. Каждый прямоугольный блок на микросхеме представляет собой блок логической матрицы (LAB), причем каждый LAB содержит десять модулей адаптивной логики (ALM). FPGA используются в таких отраслях, как потребительские устройства, автомобилестроение, медицинское оборудование, связь и радиовещание.

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

  • 00:05:00 В этом разделе видео ведущий объясняет структуру таблицы поиска в ПЛИС, которая состоит из нескольких уровней мультиплексоров с выбираемыми входами. Входные данные для интерполяционной таблицы могут быть использованы для построения произвольной комбинационной логической функции. Затем в видео обсуждаются программируемые регистры, которые представляют собой элементы хранения в FPGA, используемые для счетчиков, сдвиговых регистров, конечных автоматов и функций DSP. Эти регистры имеют тактовый сигнал, обычно управляемый глобальными часами, и могут возвращаться в таблицу поиска. Кроме того, видео объясняет, как логические элементы и модули адаптивной логики соединяются через цепочку сигналов.
    и биты переноса, и как ввод в регистры может поступать от предыдущих логических элементов.

  • 00:10:00 В этом разделе мы узнаем, как организовать логические элементы внутри микросхемы FPGA. Каждый прямоугольный блок на микросхеме представляет собой блок логической матрицы (LAB), причем каждый LAB содержит десять модулей адаптивной логики (ALM). Каждый ALM состоит из арифметических блоков, локальных межсоединений и регистрационных соединений, а также выделенных ресурсов и адаптивной таблицы поиска для гибкой организации входных данных и формирования конкретных выходных данных. Кроме того, у нас есть межсоединения строк и столбцов, которые могут соединять определенные лабораторные лаборатории, а маршрутизация масштабируется линейно в зависимости от плотности устройств. Наконец, у нас есть встроенные блоки памяти, которые поддерживают различные типы структур памяти, такие как ОЗУ с одним или двумя портами, память только для чтения или небольшие фрагменты структур памяти, называемые eMLAB.

  • 00:15:00 В этом разделе мы узнаем о различных функциях ПЛИС, включая блоки цифровой обработки сигналов (DSP) и компоненты ввода/вывода (IO). Блоки DSP полезны для реализации функций обработки сигналов, таких как преобразование БПФ и высокопроизводительные операции умножения и накопления. ПЛИС также могут взаимодействовать с различными компонентами ввода-вывода, позволяя включать, контролировать и прерывать вывод. Логика элемента ввода-вывода включает в себя двунаправленные контакты и управление выходным сигналом разрешения, а выходной тракт генерирует значения A и B через тактовый сигнал. С другой стороны, если управление выходом отключено, входные сигналы проходят через входной регистр.

  • 00:20:00 В этом разделе, посвященном внутреннему устройству FPGA, подчеркивается важность тактовых сигналов, а также использование выделенных входных тактовых контактов для поддержки операций FPGA. Также обсуждаются высокоскоростные приемопередатчики, которые полезны для реализации более сложных сигнальных протоколов в ПЛИС без необходимости сложной подготовки и обработки сигналов. Также объясняется использование PLL для генерации различных тактовых сигналов для использования во всем устройстве с минимальным перекосом, а также использование технологии ячеек SRAM и справочных таблиц для настройки программируемых битов, которые управляют связностью входных и выходных сигналов. В видео также рассматриваются методы, используемые для программирования FPGA с использованием внешнего W prom, Cpl D или ЦП для управления последовательностями программирования, а также использование специального аппаратного соединения JTAG для дальнейшей диагностики и отладки.

  • 00:25:00 В этом разделе обсуждаются конструкция и функции программируемой пользователем вентильной матрицы (FPGA). Большая часть области в FPGA — это блоки логического массива, которые могут быть соединены через межсоединения строк и столбцов. Другие блоки включают в себя PR, приемопередатчики и контроллер памяти, которые могут быть подключены к различным компонентам памяти. В качестве примера используется область PJ 10g X FPGA с 1 миллионом логических элементов, 1,7 миллионами регистров, 54 000 блоков памяти по 22 бита каждый, 1 518 блоков DSP, приемопередатчиками 367,4 гигабит в секунду, двумя жесткими блоками PCIe, 492 общими выводами ввода-вывода и 12 контроллеров памяти. Преимуществом FPGA является высокая плотность для создания сложных функций, интеграция нескольких функций, доступ к различным стандартам и функциям ввода-вывода и прямой доступ к данным в одном чипе.
 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



11. Память OpenCL в системе GPU

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

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

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

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

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



12. Пример OpenCL: умножение матриц

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

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

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

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

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



13. Структура программы OpenCL (часть 1)

В видеоролике «Структура программы OpenCL (часть 1)» объясняется процесс создания приложения OpenCL. Программа должна сначала запросить платформу OpenCL, чтобы понять ее ресурсы и создать контекст OpenCL и очередь команд. Затем создаются буферы для обмена данными между хостом и памятью устройства, а программа ядра компилируется в двоичный файл для выполнения на устройстве. Далее в видео объясняется, как создавать буферы только для чтения и только для записи, выделять место для выходных матриц и копировать результаты обратно на хост. Подчеркнута важность проверки вызовов API на успешное выполнение.

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

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

  • 00:10:00 В этом разделе видео объясняется, как создать контекст OpenCL, и важность объекта контекста для объединения всех ресурсов, необходимых для операций OpenCL, таких как очереди команд и буферы. В стенограмме описывается, как создавать буферы только для чтения и только для записи, а также как копировать данные между хостом и устройством с помощью команд CL ink и CL in Q для буфера записи. В качестве примера используется умножение матриц, где матрицы A и B являются входными, а матрица C является выходной. В видео подчеркивается важность проверки успешных вызовов API.

  • 00:15:00 В этом разделе спикер объясняет, как выделить место для матрицы C, которая является выходной матрицей. Говорят, что буфер C объявлен как память CL, что позволяет устройству записывать в него результаты. Однако это не запрещает чтение этого буфера со стороны хоста, что необходимо для извлечения результатов из устройства и копирования полученной матрицы куда-то на хост. Докладчик показывает полное определение API буфера, которое принимает пять аргументов: контекст, флаги, размер, указатель хоста и возвращаемое значение.
Structure of an OpenCL Program (part1)
Structure of an OpenCL Program (part1)
  • 2020.06.05
  • www.youtube.com
This video describes the basic structure of an OpenCL program. (this is part1, a second part follows)
 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



14. Структура программы OpenCL (часть 2)

Третий шаг в программировании OpenCL включает компиляцию ядра, которая отличается для устройств FPGA, поскольку выполняется в автономном режиме. Программа создания CL с исходным кодом и C TX используется для создания программы, за которой следует программа сборки CL для сборки программы в двоичный файл. Правильная функция ядра выбирается с использованием соответствующей точки входа, а аргументы ядра должны быть инициализированы с помощью CL set аргумента ядра с правильным указателем. Докладчик подробно рассказывает о правильной настройке аргументов при умножении матриц. Затем они обсуждают настройку размеров локальной и глобальной рабочей группы, выполнение ядра и получение результатов с помощью CL в API буфера очереди. Наконец, спикер кратко упоминает о событиях в программировании OpenCL.

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

  • 00:05:00 В этом разделе спикер рассказывает об инициализации нескольких аргументов ядра и подчеркивает важность правильной настройки индексов этих аргументов, чтобы избежать ошибок. Затем они объясняют, как установить локальные и глобальные размеры рабочей группы, указав количество рабочих элементов в группе и количество рабочих групп. Наконец, они описывают шаги по выполнению ядра, включая вызов API OpenCL и получение результатов от устройства в память хоста с помощью CL в API буфера очереди. Докладчик также кратко упоминает события и то, как их можно использовать в программировании на OpenCL, но об этом будет рассказано в последующих лекциях.
Structure of an OpenCL Program (part2)
Structure of an OpenCL Program (part2)
  • 2020.06.05
  • www.youtube.com
This video describe the basic structure of an OpenCL program. (continued from part 1)
 

EECE.6540 Гетерогенные вычисления (Массачусетский университет Лоуэлла)



15. Демонстрация умножения матриц в OpenCL

Видео «Демонстрация умножения матриц OpenCL» объясняет процесс запуска примера умножения матриц с использованием платформы OpenCL. Он включает в себя несколько файлов исходного кода, таких как основная программа C для хост-стороны, программа ядра и make-файл. Видео охватывает различные аспекты инфраструктуры OpenCL, получение идентификаторов платформы и устройства, создание контекста OpenCL, объектов программы и ядра, управление буфером для хоста, а также создание и инициализацию буферов на устройстве. Докладчик также демонстрирует образец ядра, выполняющего операции скалярного произведения, и демонстрацию конечного результата на вычислительном движке AMD Radeon pro 575.

  • 00:00:00 В этом разделе спикер объясняет, как запустить пример умножения матриц через OpenCL. Пример состоит из нескольких файлов с исходным кодом, в том числе основной программы на C в качестве программы на стороне хоста, программы ядра с именем my kernel CL и make-файла, помогающего скомпилировать проект. Основная программа включает в себя стандартные библиотеки, определения макросов для среды OpenCL и объявления для входных матриц (матрица A и матрица B), а также имя устройства, идентификаторы платформы и количество устройств. Докладчик также описывает различные аспекты фреймворка OpenCL, такие как контекст, программа, ядро, чтение и компиляция исходного кода. Кроме того, спикер объясняет важность идентификаторов платформ и устройств, а также размеров матриц в коде.

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

  • 00:10:00 В этом разделе видео объясняется, как создать программный объект из исходного кода ядра OpenCL. Этот процесс отличается на разных платформах. В Mac OS с собственной поддержкой OpenCL можно создать программный объект, используя исходный код. Однако в Altera FPGA OpenCL SDK создание программного объекта включает в себя компиляцию ядра и его создание из бинарного результата этой компиляции с использованием специального API Altera. После создания объекта программы видео показывает, как собрать программу ядра и создать объект ядра. Наконец, видео переходит в управление буфером на стороне хоста, где выделяется буфер для хранения результирующей матрицы C.

  • 00:15:00 В этом разделе ведущий объясняет, как создавать и инициализировать буферы на стороне устройства для умножения матриц с помощью OpenCL. Далее они показывают, как правильно устанавливать аргументы ядра, включая настройку глобальных и локальных размеров рабочей группы. Также подчеркивается важность проверки возвращаемого значения CL. Затем докладчик демонстрирует, как считывать результаты в память хоста, после чего освобождает ресурсы, выделенные на хосте и OpenCL. Наконец, они показывают пример ядра, которое использует get global ID для перебора ширины матрицы, выполнения операций скалярного произведения и сохранения результатов в соответствующем элементе матрицы C.

  • 00:20:00 В этом разделе спикер обсуждает создание основной программы C и программы Майка Риндера на CL. Чтобы построить программу на стороне хоста, пользователям необходимо скомпилировать один файл программы C, а для ядра можно использовать компилятор GPU для компиляции Micra, знающей CL, в двоичный файл GPU. После сборки программы как на стороне хоста, так и на стороне устройства пользователи получают исполняемый файл с именем «main», а также различные двоичные файлы, доступные для разных версий графического процессора. После выполнения этого файла спикер показывает платформу OpenCL с вычислительным движком AMD Radeon pro 575, который имеет начальное значение матрицы C со всеми элементами, содержащими восемь точек.
OpenCL Matrix Multiplication Demo
OpenCL Matrix Multiplication Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Matrix Multiplication.
Причина обращения: