Привет мир!
Поддержка, встроенная в 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.
Рисунок 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.
Рисунок 1-2 OpenCL размещает код в XCode 

Соединитесь с платформой OpenCL в Вашем проекте. Посмотрите Добавление Существующей Платформы к Проекту.
-
Сборка.
Поскольку Вы компилируете свой узел и свой код ядра перед выполнением их Вы видите ошибки компилятора и предупреждения перед запуском приложения.
-
Выполненный.
Результаты показаны в области вывода XCode как показано на рисунке 1-3.
Результаты рисунка 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