One core per compute unit что это

One core per compute unit что это

Введение в GPU-вычисления – CUDA/OpenCL

Введение в GPU-вычисления

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

В этой заметке собрана информация которая поможет понять общие принципы GPU-программирования.

Введение в архитектуру GPU

Разделяют два вида устройств – то которое управляет общей логикой – host, и то которое умеет быстро выполнить некоторый набор инструкций над большим объемом данных – device.

В роли хоста обычно выступает центральный процессор (CPU – например i5/i7).
В роли вычислительного устройства – видеокарта (GPU – GTX690/HD7970). Видеокарта содержит Compute Units – процессорные ядра. Неразбериху вводят и производители NVidia называет свои Streaming Multiprocessor unit или SMX , а
ATI – SIMD Engine или Vector Processor. В современных игровых видеокартах – их 8-32.
Процессорные ядра могут исполнять несколько потоков за счет того, что в каждом содержится несколько (8-16) потоковых процессоров (Stream Cores или Stream Processor). Для карт NVidia – вычисления производятся непосредственно на потоковых процессорах, но ATI ввели еще один уровень абстракции – каждый потоковый процессор, состоит из processing elementsPE (иногда называемых ALU – arithmetic and logic unit) – и вычисления происходят на них.

Необходимо явно подчеркнуть что конкретная архитектура (число всяческих процессоров) и вычислительные возможности варьируются от модели к модели – что несколько влияет на универсальность и простоту кода для видеокарт от обоих производителей.
Для CUDA-устройств от NVidia это sm10, sm20, sm30 и т.д. Для OpenCL видеокарт от ATI/NVidia определяющее значение имеет версия OpenCL реализованная в драйверах от производителя 1.0, 1.1, 1.2 и поддержка особенностей на уровне железа. Да, вы вполне можете столкнуться с ситуацией когда на уровне железа какие-то функции просто не реализованы (как например локальная память на амд-ешных видеокарт линейки HD4800). Да, вы вполне можете столкнуться с ситуацией когда какие-то функции не реализованы в драйверах (на момент написания – выполнение нескольких ядер на видео-картах от NVidia с помощью OpenCL).

Программирование для GPU

Программы пишутся на расширении языка Си от NVidia/OpenCL и компилируются с помощью специальных компиляторов входящих в SDK. У каждого производителя разумеется свой. Есть два варианта сборки – под целевую платформу – когда явно указывается на каком железе будет исполнятся код или в некоторый промежуточный код, который при запуске на целевом железе будет преобразован драйвером в набор конкретных инструкций для используемой архитектуры (с поправкой на вычислительные возможности железа).

Выполняемая на GPU программа называется ядром – kernel – что для CUDA что для OpenCL это и будет тот набор инструкций которые применяются ко всем данным. Функция одна, а данные на которых она выполняется – разные – принцип SIMD.

Важно понимать что память хоста (оперативная) и видеокарты – это две разные вещи и перед выполнением ядра на видеокарте, данные необходимо загрузить из оперативной памяти хоста в память видеокарты. Для того чтобы получить результат – необходимо выполнить обратный процесс. Здесь есть ограничения по скорости PCI-шины – потому чем реже данные будут гулять между видеокартой и хостом – тем лучше.

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

Читать еще:  Фрагментировано 0 процентов что это значит

Схематично, распределение задач на GPU происходит так:

Выполнение программы на GPU

work-item (OpenCL) или thread (CUDA) – ядро и набор данных, выполняется на Stream Processor (Processing Element в случае ATI устройств).
work group (OpenCL) или thread block (CUDA) выполняется на Multi Processor (SIMD Engine)
Grid (набор блоков такое понятие есть только у НВидиа) = выполняется на целом устройстве – GPU. Для выполнения на GPU все потоки объединяются в варпы (warp – CUDA) или вейффронты (wavefront – OpenCL) – пул потоков, назначенных на выполнение на одном отдельном мультипроцессоре. То есть если число блоков или рабочих групп оказалось больше чем число мултипроцессоров – фактически, в каждый момент времени выполняется группа (или группы) объединенные в варп – все остальные ожидают своей очереди.

Одно ядро может выполняться на нескольких GPU устройствах (как для CUDA так и для OpenCL, как для карточек ATI так и для NVidia).
Одно GPU-устройство может одновременно выполнять несколько ядер (как для CUDA так и для OpenCL, для NVidia – начиная с архитектуры 20 и выше). Ссылки по данным вопросам см. в конце статьи.

Модель памяти OpenCL (в скобках – терминология CUDA)

Здесь главное запомнить про время доступа к каждому виду памяти. Самый медленный это глобальная память – у современных видекарт ее аж до 6 Гб. Далее по скорости идет разделяемая память (shared – CUDA, local – OpenCL) – общая для всех потоков в блоке (thread block – CUDA, work-group – OpenCL) – однако ее всегда мало – 32-48 Кб для мультипроцессора. Самой быстрой является локальная память за счет использования регистров и кеширования, но надо понимать что все что не уместилось в кеширегистры – будет хранится в глобальной памяти со всеми вытекающими.

Паттерны параллельного программирования для GPU

1. Map

Map – GPU parallel pattern

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

Отношение – как один к одному (one-to-one).

пример – перемножение матриц, оператор инкремента или декремента примененный к каждому элементу матрицы и т.п.

2. Scatter

Scatter – GPU parallel pattern

Для каждого элемента входного массива мы вычисляем позицию в выходном массиве, на которое он окажет влияние (путем применения соответствующего оператора).

Отношение – как один ко многим (one-to-many).

3. Transpose

Transpose – GPU parallel pattern

Данный паттерн можно рассматривать как частный случай паттерна scatter.
Используется для оптимизации вычислений – перераспределяя элементы в памяти можно достичь значительного повышения производительности.

4. Gather

Gather – GPU parallel pattern

Является обратным к паттерну Scatter – для каждого элемента в выходном массиве мы вычисляем индексы элементов из входного массива, которые окажут на него влияние:

Отношение – несколько к одному (many-to-one).

5. Stencil

Stencil – GPU parallel pattern

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

Отношение несколько к одному (several-to-one)

Пример: фильтр Гауссиана.

6. Reduce

Reduce – GPU parallel pattern

Отношение все к одному (All-to-one)

Пример – вычисление суммы или максимума в массиве.

7. Scan/ Sort

При вычислении значения в каждой ячейке выходного массива необходимо учитывать значения каждого элемента входного. Существует две основные реализации – Hillis and Steele и Blelloch.

Читать еще:  Флешка не показывает содержимое что делать

out[i] = F[i] = operator(F[i-1],in[i])

Отношение все ко всем (all-to-all).

Примеры – сортировка данных.

Полезные ссылки

Введение в CUDA:

Введение в OpenCL:

Хорошие статьи по основам программирования (отдельный интерес вызывает область применения):
http://www.mql5.com/ru/articles/405
http://www.mql5.com/ru/articles/407

Вебинары по OpenCL:

Курс на Udacity по программированию CUDA:

Выполнение ядра на нескольких GPU:

Причем можно пойти по пути упрощения и задействовать один из специальных планировщиков:
http://www.ida.liu.se/

CUDA – grid, threads, blocks- раскладываем все по полочкам

доступные в сети ресурсы по CUDA

UPDATE 28.06.2013

Враперы для взаимодействия с ОпенСЛ:
JOCL – Java bindings for OpenCL (JOCL)
PyOpenCL – для python
aparapi – полноценная библиотека для жавы

Интересные статью по OpenCL – тут.

доступные материалы курсов по параллельным вычислениям:

One core per compute unit что это

Рассмотрим настройки BIOS материнской платы ASUS PRIME Z370-A построенной на чипсете Intel Z370 Express.
При загрузке ПК удерживаем клавишу: Delete. И попадаем в UEFI BIOS, по-умолчанию в упрощенный режим: EZ Mode. На нем отображается основная информация о подключённых устройствах: памяти, SATA/PCIe NVMe -накопители, вентиляторы, процессор, а также температура и напряжение процессора, скорости вращения вентиляторов и режим работы системы.

При нажатии горячей клавиши F11 появляется меню для разгона системы исходя из комплектующих, охлаждения и сценария использования системы. Здесь же можно произвести конфигурацию RAID массива.
EZ Tunning Wizard > OC > Current System Configuration — текущая системная конфигурация. Next.

PC scenario > Daily Computing или Gaming/Media Editing. Next.

Main cooling system > Box cooler, Tower cooler или Water cooler. Next.

Estimated tuning results.

Для установленного набора памяти, выбираем профиль Extreme Memory Profiles (XMP). Для набора памяти CORSAIR Vengeance RGB CMR16GX4M2C3200C16 доступен только один Profile#1.

Появится сообщение: «Notice. Would you like to apply the all core enhancement with the XMP settings for improved performance? Select «No» for Intel stock operation. Sufficient processor cooling is required under the all core enhancement».
Нажимаем на кнопку: Yes (Да).

И получаем память XMP DDR4-3200 16-18-18-36-1.35V.

По нажатию кнопки QFan Control (F6) появится график настройки семи вентиляторов и одной помпы СВО.
Управление скоростью. Выберите целевой вентилятор, затем переместите ползунок для выбора любого из этих профилей: стандартный, тихий, турбо и полная скорость. Также можно переместить ползунок в положение «Вручную» и вручную настроить скорость вентилятора.

Переходим в расширенный режим: Advanced Mode (F7), в нем мы найдем 8х стандартных закладок (My Favorites, Main, Ai Tweaker, Advanced, Monitor, Boot, Tool, Exit). Закладка: My Favorites, сюда можно добавить любые параметры по своему усмотрению для ускоренного доступа к ним (для этого нажимаем на «My Favorite (F3)» сверху меню или используем горячую клавишу F3).

CPU Core Ratio позволяет выбрать три варианта: Auto, Sync All Cores, Per Core.

Остальные настройки в закладке My Favorites:

Закладка Main содержит основную информацию о системе: версия BIOS, установленная модель процессора и спецификации памяти, также здесь можно выбрать язык меню и т.д.

Закладка Ai Tweaker.
Ai Overclock Tuner – здесь выбираем из выпадающего списка тип разгона оперативной памяти: Auto (номинальные настройки без разгона), Manual (ручной режим) и XMP (разгон только памяти с использованием профиля XMP). В ручном и XMP режимах можно менять все настройки в BIOS. В автоматическом материнская плата сама подбирает нужные настройки ближе к оптимальным.
BCLK Frequency — частота системной шины (значение по-умолчанию: 100 МГц). Частота BCLK меняется до 650 МГц.
ASUS Multicore Enhancement – включение или отключение автоматического увеличения множителей процессора. В автоматическом режиме (Auto — занчение по умолчанию) плата старается повысить множители процессорных ядер до максимальных. В выключенном режиме загружаются рекомендованные параметры согласно спецификациям Intel.
AVX Instruction Core Ratio Negative Offset – установка отрицательных множителей для AVX инструкций. Такие задачи сильно нагружают ядра, поэтому иногда целесообразно для иных операций оставить высокую частоту процессора, но для AVX задач процессор будет работать с меньшей частотой теряя производительность. При этом не будут появляться ошибки и сохранится разгон. Диапазон значений: от 0 до 31 (частота 1600МГц).
CPU Core Ratio – тип управления множителями процессорных ядер: Auto — автоматический, Sync All Cores (все синхронизированы), Per Core — отдельно по каждому ядру (максимальный коэффициент умножения может быть равен 83) или задать поядерно в зависимости от нагрузки.

Читать еще:  Shipment information received что означает

BCLK Frequency: Dram Frequency Ratio – выбор множителя для памяти (1:1 или 1:1,33).
Dram Frequency — доступны следующие частоты: 800-8533 МГц с шагом 100 или 133 МГц. Отображается текущая рабочая частота памяти.
TPU – функция автоматического разгона силами материнской платы. Задействуются заложенные в BIOS настройки памяти, частоты процессора, активация его лимитов и т.п. Разгон обычно происходит до максимального Turbo множителя. Есть 2 готовых сценария – с хорошей воздушной системой охлаждения, и с СВО. Значение по-умолчанию: Keep Current Settings.
Power-saving & Performance Mode – выбор режима работы системной платы. Со всеми энергосберегающими функциями или полностью их отключить.
Load CPU 5G OC Profile — профиль для автоматического разгона процессоров серии К, до тактовой частоты 5ГГц.

*Видео экспортировалось в формат H.264, процессор отработал нормально, никаких Имя модуля с ошибкой: mc_enc_avc.dll в программе Adobe Premiere Pro CC 2018.1, не появлялось при рендеринге. Т.е. нормально отработал и процессор и его система охлаждения Noctua NH-D15S.
CPU SVID Support – включение или выключение возможности общаться процессору с системой питания и управлять ей. Лучше выключить в разгоне.
Dram Timing Control – настройка таймингов памяти.
Digi+ VRM – расширенные настройки регуляторов напряжений процессора, памяти, PCH и т.д.

Internal CPU Power Management – управление функциями энергосбережения процессора и лимитами энергопотребления.
Tweaker’s Paradise – вспомогательные настройки для разгона (VPPDDR Voltage, DMI Voltage, Internal PLL Voltage, GT PLL Voltage, Ring PLL Voltage, System Agent PLL Voltage, Memory Controller PLL Voltage).
CPU Core/Cache Current Limit Max. – максимальная нагрузка на процессор задается условным значением.
Ring Down Bin – параметр бита, управляющего поведением процессора с множителями кольцевой шины. Можно оставить в автомате или задать максимальный и минимальный множитель. Max CPU cache и Min как раз отвечают за эти множители.

BCLK Aware Adaptive Voltage – вспомогательная настройка помогающая повысить стабильность при разгоне по шине BCLK.
CPU Core Voltage/Cache Control – настройка типа задания напряжения для процессора (автоматический, ручной и добавочный режим. В добавочном плата самостоятельно выставляет базовое напряжение, а вы либо добавляете относительно его, либо уменьшаете). Этим же параметром задается напряжение для кеш памяти процессора.
Dram Voltage – напряжение памяти, разбито по парным каналам – от 1,0 В до 2,0 В с шагом 0,0066 В.
CPU VCCIO Voltage – напряжение VCCIO от 0,9 В до 1,8 В с шагом 0,0125 В.
CPU System Agent Voltage — напряжение шины и контроллера шины процессора — от 0,7 В до 1,8 В с шагом 0,0125 В.
CPU Graphics Voltage — напряжение интегрированной графики процессора — от 0,7 В до 1,8 В с шагом 0,0125 В.
PCH Core Voltage – напряжение южного моста (PCH), от 0,7 В до 1,8 В с шагом 0,01 В.
CPU Standby Voltage — от 0,8 В до 1,8 В с шагом 0,01 В.

Ссылка на основную публикацию
Adblock
detector