Совместимость на уровне двоичных кодов ядер OpenCL

Как другие платформы, OpenCL гарантирует назад совместимость на уровне двоичных кодов для вызовов API. OpenCL, однако, не гарантирует что двоичные файлы ядра OpenCL (двоичные файлы, полученные путем вызова clGetProgramInfo(CL_PROGRAM_BINARIES) функция), будет продолжать работать над будущими версиями OpenCL. Фактически, эти двоичные файлы, вероятно, будут часто повреждаться, возможно с каждым новым OpenCL незначительная и главная версия.

Обработка ошибок периода выполнения

Если Вы планируете получить двоичные файлы ядра с clGetProgramInfo(CL_PROGRAM_BINARIES) и сохраните на диск их или другое устройство длительного хранения для более позднего повторного использования, необходимо обработать возможность что clBuildProgram функция перестанет работать с ошибкой CL_INVALID_BINARY когда Вы пытаетесь снова использовать сохраненный двоичный файл позже. Если это происходит, Ваше приложение должно:

  1. Создайте новую программу OpenCL путем вызова clCreateProgramWithSource функция, передавая исходный код OpenCL C в strings параметр.

  2. Перекомпилируйте программу с помощью clBuildProgram функция.

  3. Извлеките новое двоичное использование clGetProgramInfo(CL_PROGRAM_BINARIES) и замените старый на диске.

Предотвращение ошибок сборки

Двоичные сохраненные на диск изображения ядра OpenCL также могут не создать для текущей машины, если образ был создан другой машиной и сохранен к сетевому тому, если пользователь устанавливает новые аппаратные средства, такие как дополнительный GPU или заменяет существующие аппаратные средства, или изменяет некоторые аппаратные настройки (например, включает и выключает дискретную видеокарту на MacBook Pro и с дискретным и с интегрированным GPUs).

Лучший способ избежать поставлять двоичный код OpenCL состоит в том, чтобы использовать оффлайновый компилятор OpenCL для создания LLVM bitcode.

Для генерации LLVM IR (на OS X v10.8) скомпилируйте bitcode файл для каждой доступной архитектуры: i368 32b, x86_64 бит, и 32b GPU. Для каждой архитектуры вызовите openclc компилятор:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -Os -arch i386 -emit-llvm-bc clFileName -o outputFileName
/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -Os -arch x86_64 -emit-llvm-bc clFileName -o outputFileName
/System/Library/Frameworks/OpenCL.framework/Libraries/openclc -Os -arch gpu_32 -emit-llvm-bc clFileName -o outputFileName

Выходной файл будет объектным файлом разрядного кода LLVM, который может использоваться с clCreateProgramWithBinary функция.