OpenCL на основах OS X
Инструменты, предоставленные на OS X, позволяют Вам включать ядра OpenCL как ресурсы в проектах XCode, скомпилировать их вместе с остальной частью Вашего приложения, вызвать ядра путем передачи их параметры так же, как если бы они были типичными функциями и используют Grand Central Dispatch (GCD) в качестве организации очередей API для выполнения команд OpenCL и ядер на CPU и GPU.
Если необходимо создать программы OpenCL во время выполнения с источником, загруженным как строка или от файла, или если Вы хотите управление уровня API организацией очередей, посмотрите Спецификацию OpenCL, доступную от Khronos Group в http://www .khronos.org/registry/cl/.
Понятия
В спецификации OpenCL вычислительные процессоры являются вызываемыми устройствами. Устройство OpenCL имеет один, или больше вычисляет модули. Рабочая группа выполняется на сингле, вычисляют модуль. Вычислить модуль составлен из одного или более элементов обработки и локальной памяти.
Компьютер Mac всегда имеет единственный CPU. Это может не иметь никакого GPUs, или это может иметь несколько. CPU на Mac имеет многократный, вычисляют модули, который является, почему его вызывают многожильным CPU. Число вычисляет модули в пределах CPU число рабочих групп, которые могут выполниться одновременно.
CPUs обычно содержит между два, и восемь вычисляют модули, иногда больше. Графический процессор (GPU) обычно содержит, многие вычисляют модули-GPUs в текущих системных десятках функции Mac, вычисляют модули, и будущий GPUs может содержать сотни. К OpenCL число вычисляет модули, не важно. OpenCL полагает, что CPU с восемь вычисляет модули, и GPU с 100 вычисляет модули каждый, чтобы быть единым устройством.
OS X v10.7 реализация OpenCL API упрощает разработку и кодирование программ параллели данных для работы и CPU и на устройств GPU. В программе параллели данных ту же программу (или ядро) выполнения одновременно на различных частях данных и каждого вызова вызывают единицей работы и дают единицу работы ID. Единица работы IDs организована в до трех измерений (названный диапазоном N-D).
Ядро является по существу функцией, записанной на языке OpenCL, позволяющем ему быть скомпилированным для выполнения на любом устройстве, поддерживающем OpenCL. Однако ядро отличается от функции, вызванной другим языком программирования, потому что то, когда Вы вызываете ядро, что фактически происходит, - то, что много экземпляров ядра выполняются, каждый из которых обрабатывает различный блок данных.
Программа, вызывающая функции OpenCL для установки контекста, в которых выполненных ядрах и ставят в очередь ядра для выполнения, известна как хост-приложение. Хост-приложение выполняется OS X на CPU. Устройство, на котором выполняется хост-приложение, известно как устройство хоста. Прежде чем это выполнит ядра, хост-приложение обычно:
Определяет то, что вычисляет устройства, доступны, при необходимости.
Выбирает вычисляют устройства, подходящие для приложения.
Создает очереди отгрузки для выбранного, вычисляют устройства.
Выделяет объекты памяти, необходимые ядрам для выполнения. (Этот шаг может произойти ранее в процессе, как удобный.)
Хост-приложение может ставить в очередь команды, чтобы читать из и записать в объекты памяти, которые также доступны ядрами. Посмотрите Объекты Памяти в OS X OpenCL. Объекты памяти используются для управления памятью устройства. Существует два типа объектов памяти, используемых в OpenCL: буферизуйте объекты и объекты изображения. Буферные объекты могут содержать любой тип данных; объекты изображения содержат данные, организованные в пиксели в данном формате.
Несмотря на то, что ядра ставятся в очередь для выполнения хост-приложениями, записанными в C, C++ или Objective C, ядро должно быть скомпилировано отдельно, чтобы быть настроенным для устройства, на котором это собирается работать. Можно записать исходный код ядра OpenCL в отдельном файле или включать его встроенный в исходный код хост-приложения.
Ядра OpenCL могут быть:
-
Скомпилированный во время компиляции, затем выполненный, когда поставлено в очередь хост-приложением.
или
-
Скомпилированный и затем выполненный во время выполнения, когда поставлено в очередь хост-приложением.
или
-
Выполненный от ранее созданного двоичного файла.
Единица работы является параллельным выполнением ядра на некоторых данных. Это походит на поток. Каждое ядро выполняется на сотни тысяч единиц работы.
Рабочая группа является рядом единиц работы, выполняющихся одновременно и совместно использующих данные. Каждая рабочая группа выполняется на вычислить модуле.
Размерности рабочей группы определяют, как ядра работают после ввода параллельно. Приложение обычно указывает размерности на основе размера ввода. Существуют ограничения; например, может быть максимальное количество единиц работы, которые могут быть запущены для определенного ядра на определенном устройстве.
Существенные задачи разработки
С OS X v10.7, процесс разработки OpenCL включает эти существенные шаги:
-
Идентифицируйте задачи, которые будут параллелизированы.
Определение, как параллелизировать Вашу программу эффективно, часто является самой твердой частью разработки программы OpenCL. Посмотрите Идентификацию Подпрограммы Parallelizable.
-
Запишите свои функции ядра.
Посмотрите, как ядро взаимодействует с данными в OS X OpenCL.
Пример кода Простого ядра показывает, как можно сохранить код ядра в файле, который может быть скомпилирован с помощью XCode.
-
Запишите код узла, который вызовет ядро (ра).
Посмотрите Используя Центральную Отгрузку С OpenCL для получения информации о том, как узел может использовать GCD для постановки в очередь ядра.
Посмотрите Объекты Памяти в OS X OpenCL для получения информации о том, как узел передает параметры и получает результаты ядра.
Посмотрите Совместное использование Данных Между OpenCL и OpenGL для получения информации о том, как узел OpenCL может совместно использовать данные с приложениями OpenGL.
Посмотрите Управление OpenCL / Взаимодействие OpenGL С GCD для получения информации о том, как узел OpenCL может синхронизировать обработку с приложениями OpenGL с помощью GCD.
Посмотрите Используя IOSurfaces С OpenCL для получения информации о том, как узел OpenCL может использовать IOSurfaces для обмена данными с ядром.
Основной Пример кода Узла показывает, как можно сохранить код узла в файле, который может быть скомпилирован с XCode.
-
Скомпилируйте использование XCode.
Посмотрите привет мир!.
-
Выполниться.
-
Отладка (если необходимый).
Посмотрите отладку.
Улучшите производительность (если необходимый):
Если Ваше ядро (ра) будет работать на CPU, посмотрите Автовекторизатор и, для предложений о дополнительной оптимизации, посмотрите Улучшающуюся Производительность На CPU.
Если Ваше ядро (ра) будет работать на GPU, посмотрите Настраивающуюся Производительность На GPU.