Привет мир!
Поддержка, встроенная в XCode в OS X v10.7 и позже, подает разработку заявки OpenCL, намного проще, чем это раньше было. В этой главе описываются, как создать проект OpenCL в XCode. (Вы не должны регенерировать уже работающие проекты OpenCL.)
Создавание приложения, использующего OpenCL в XCode
Создать проект, использующий OpenCL в OS X v10.7 или позже:
-
Создайте свой проект OpenCL в XCode как новый проект OS X (пустой, прекрасен).
-
Поместите свой код ядра в один или несколько .cl файлов в Вашем проекте XCode. Можно поместить все ядра в единственный .cl файл, или можно разделить их, как Вы выбираете. Можно также включать код неядра, который будет работать на том же устройстве OpenCL как ядро в каждом .cl файле.
Каждый .cl файл компилируется по умолчанию в три файла, содержащие bitcode для i386, x86_64, и gpu_32 архитектура. (Можно измениться, какие bitcodes сгенерированы с помощью установки сборки Архитектуры OpenCL.)
Во время выполнения Ваше хост-приложение обнаруживает доступные устройства и определяет который из скомпилированных ядер, чтобы ставить в очередь и выполниться. Рисунок 1-1 показывает очень простой проект OpenCL в XCode.
-
Можно установить следующие настройки сборки для приложений OpenCL:
-
OpenCL — Сборка
Архитектура OpenCL. Значение по умолчанию - то, что продукт создается для всех трех архитектуры. Падение позволяет Вам разделиться на команды к трем из
-triple i386-applecl-darwin
,-triple x86_64-applecl-darwin
, и-triple gpu_32-applecl-darwin
.Версия Компилятора OpenCL. Значение по умолчанию является OpenCL C 1.1.
-
OpenCL — Генерация кода
Автовекторизатор. Выбрать
Yes
включать автовекторизатор илиNo
выключить автовекторизатор. Эта установка вступает в силу только для CPU.Дважды как единственный. Если Вы устанавливаете этот параметр на
Yes
, компилятор обрабатывает двойную точность выражения с плавающей точкой как одинарная точность выражения с плавающей точкой. Эта опция доступна для GPUs только. Значение по умолчаниюNo
.Сбросьте denorms для обнуления. Эта булевская переменная управляет, как единственный - и денормализованные числа двойной точности обрабатываются. Если Вы устанавливаете этот параметр на
Yes
, компилятор может сбросить денормализованные числа одинарной точности для обнуления; если дополнительное расширение для двойной точности поддерживается, это может также сбросить денормализованные числа двойной точности, чтобы обнулить. Это предназначается, чтобы быть подсказкой производительности, и компилятор OpenCL может принять решение не сбросить denorms, чтобы обнулить, если устройство поддерживает одинарную точность (или двойная точность) денормализованные числа (т.е. еслиCL_FP_DENORM
бит не установлен вCL_DEVICE_SINGLE_FP_CONFIG
). Этот флаг только запрашивает скалярную и векторную одинарную точность переменные с плавающей точкой и вычисления на этих переменных с плавающей точкой в программе. Это не применяется к чтению от или записи в объекты изображения. Значение по умолчаниюNo
.Уровень оптимизации. Можно выбрать между несколькими типами оптимизации от самой быстрой производительности до самого маленького размера кода. Значение по умолчанию должно оптимизировать для самой быстрой производительности.
Ослабьте Соответствие IEEE. Если Вы устанавливаете этот параметр на
Yes
, компилятор позволяет оптимизацию для арифметики с плавающей точкой, которая может нарушить стандарт IEEE 754 и OpenCL числовые требования соответствия, определенные в разделе 7.4 для одинарной точности, с плавающей точкой, разделить 9.3.9 для двойной точности, с плавающей точкой, и граничное поведение случая, как определено в разделе 7.5 из спецификации OpenCL 1.1. Это предназначается, чтобы быть оптимизацией производительности. Эта опция вызывает макрос препроцессора__FAST_RELAXED_MATH__
быть определенным в программе OpenCL. Значение по умолчаниюNo
.Используйте MAD. Если Вы устанавливаете этот параметр на
Yes
, Вы позволяете выражения типаa * b + c
чтобы быть замененным Умножением - Добавляют (MAD) инструкцию. Если MAD включен, многоступенчатые инструкции в формеa * b + c
выполняются на единственном шаге, но точность результатов может поставиться под угрозу. Например, для оптимизации производительности некоторые устройства OpenCL реализуют MAD путем усечения результатаa * b
работа прежде, чем добавить его кc
. Значение по умолчанию для этого параметраNo
.
OpenCL — Предварительная обработка
Можно ввести разделенный пробелом список макросов препроцессора формы
“foo”
или“foo=bar”
здесь, если Вы желаете.
-
-
Поместите свой код узла в один или несколько.c файлов в Вашем проекте XCode. Компиляция Из Командной строки показывает код узла в проекте XCode.
Соединитесь с платформой OpenCL в Вашем проекте. Посмотрите Добавление Существующей Платформы к Проекту.
-
Сборка.
Поскольку Вы компилируете свой узел и свой код ядра перед выполнением их Вы видите ошибки компилятора и предупреждения перед запуском приложения.
-
Выполненный.
Результаты показаны в области вывода XCode как показано на рисунке 1-3.
Посмотрите Основную Выборку Программирования для линию за линией описание узла и кода ядра в Привет Мировом демонстрационном проекте.
Отладка
Вот несколько подсказок, чтобы помочь Вам отладить свое приложение OpenCL:
-
Выполните свое ядро на CPU сначала. На некотором GPUs нет никакой защиты памяти. Если индекс пойдет за пределы на GPU, то он, вероятно, приведет в нерабочее состояние целую систему. Если индекс идет за пределы на CPU, он может разрушить программу, которую это выполняет, но он не приведет в нерабочее состояние целую систему.
-
Можно использовать
printf
функционируйте из своего ядра. -
Можно использовать gdb отладчик для рассмотрения ассемблерного кода, как только Вы создали свою программу. См. веб-сайт GDB.
-
На GPU используйте явные проверки диапазона адресов для поиска доступов адреса из диапазона. (Помните: на некотором GPUs нет никакой защиты памяти.)
Компиляция из командной строки
Можно также скомпилировать и запустить приложение OpenCL за пределами XCode.
Для компиляции из командной строки вызвать openclc
.
Можно установить следующие параметры строки компиляции:
Версия компилятора OpenCL
Версия OpenCL C компилятора поддерживается платформой. Для установки этого параметра из командной строки используйте:
-cl-std=CL1.1
Значение по умолчанию является OpenCL C 1.1.
OpenCL — Архитектура
A
StringList
указание списка архитектуры, для которой будет создан продукт. Это обычно устанавливается в предопределенную установку сборки, предоставленную платформой. Для установки этого параметра из командной строки перечислите три из следующих, разделенных пробелом:-triple i386-applecl-darwin
-triple x86_64-applecl-darwin
-triple gpu_32-applecl-darwin
Например, для компиляции для i386 и x86_64 список был бы похож на это:
-triple i386-applecl-darwin
-triple x86_64-applecl-darwin
Значение по умолчанию - то, что продукт создается для всех трех архитектуры.
Автовекторизатор
Этот переключатель включает или отключает автовекторизацию ядер OpenCL, скомпилированных для CPU. Для установки этого параметра из командной строки используйте:
-cl-auto-vectorize-enable
включить автовекторизатор.-cl-autovectorize-disable
отключить автовекторизатор.
Значение по умолчанию
-cl-auto-vectorize-enable
.Дважды как единственный
Если включено, двойная точность выражения с плавающей точкой обрабатываются как одинарная точность выражения с плавающей точкой. Эта опция доступна для GPUs только. Для включения этого параметра из командной строки используйте:
-cl-double-as-single
По умолчанию этот параметр отключен.
Сбросьте denorms для обнуления
Эта булевская переменная управляет, как единственный - и денормализованные числа двойной точности обрабатываются. Если указано как опция сборки, денормализованные числа одинарной точности могут быть сброшены для обнуления; если дополнительное расширение для двойной точности поддерживается, денормализованные числа двойной точности могут также быть сброшены, чтобы обнулить. Это предназначается, чтобы быть подсказкой производительности, и компилятор OpenCL может принять решение не сбросить denorms, чтобы обнулить, если устройство поддерживает одинарную точность (или двойная точность) денормализованные числа (т.е. если
CL_FP_DENORM
бит не установлен вCL_DEVICE_SINGLE_FP_CONFIG
). Этот флаг только запрашивает скалярную и векторную одинарную точность переменные с плавающей точкой и вычисления на этих переменных с плавающей точкой в программе. Это не применяется к чтению от или записи в объекты изображения.Для включения этого параметра из командной строки используйте:
-cl-denorms-are-zero
По умолчанию этот параметр отключен.
Уровень оптимизации
Указывает, оптимизировать ли для самой быстрой производительности или самого маленького размера кода.
Для установки этого параметра из командной строки используйте:
-Os
- оптимизируйте для самого маленького размера кода-O1
- оптимизируйте для быстрой производительности-O2
- оптимизируйте для более быстрой производительности-O3
- оптимизируйте для самой быстрой производительности-O0
- не оптимизировать
Значение по умолчанию быстро
-O1
оптимизация.Ослабьте соответствие IEEE
Если включено, позволяет оптимизацию для арифметики с плавающей точкой, которая может нарушить стандарт IEEE 754 и OpenCL числовые требования соответствия, определенные в разделе 7.4 для одинарной точности, с плавающей точкой, разделить 9.3.9 для двойной точности, с плавающей точкой, и граничное поведение случая в разделе 7.5 из спецификации OpenCL 1.1. Это предназначается, чтобы быть оптимизацией производительности. Эта опция вызывает макрос препроцессора
__FAST_RELAXED_MATH__
быть определенным в программе OpenCL.Для включения этого параметра из командной строки используйте:
-cl-fast-relaxed-math
По умолчанию этот параметр отключен.
Используйте MAD
Если включено, позволяет выражения типа
a * b + c
чтобы быть замененным Умножением - Добавляют (MAD) инструкцию. Если MAD включен, многоступенчатые инструкции в формеa * b + c
выполняются на единственном шаге, но точность результатов может поставиться под угрозу. Например, для оптимизации производительности некоторые устройства OpenCL реализуют MAD путем усечения результатаa * b
работа прежде, чем добавить его кc
.Для включения этого параметра из командной строки используйте:
-cl-mad-enable
По умолчанию этот параметр отключен.
OpenCL — Предварительная обработка
Разделенный пробелом список макросов препроцессора формы
“foo”
или“foo=bar”
. Для указания макросов препроцессора из командной строки снабдите префиксом строку макросов с:-D