Совместимость на уровне двоичных кодов ядер OpenCL
Как другие платформы, OpenCL гарантирует назад совместимость на уровне двоичных кодов для вызовов API. OpenCL, однако, не гарантирует что двоичные файлы ядра OpenCL (двоичные файлы, полученные путем вызова clGetProgramInfo(CL_PROGRAM_BINARIES)
функция), будет продолжать работать над будущими версиями OpenCL. Фактически, эти двоичные файлы, вероятно, будут часто повреждаться, возможно с каждым новым OpenCL незначительная и главная версия.
Обработка ошибок периода выполнения
Если Вы планируете получить двоичные файлы ядра с clGetProgramInfo(CL_PROGRAM_BINARIES)
и сохраните на диск их или другое устройство длительного хранения для более позднего повторного использования, необходимо обработать возможность что clBuildProgram
функция перестанет работать с ошибкой CL_INVALID_BINARY
когда Вы пытаетесь снова использовать сохраненный двоичный файл позже. Если это происходит, Ваше приложение должно:
Создайте новую программу OpenCL путем вызова
clCreateProgramWithSource
функция, передавая исходный код OpenCL C вstrings
параметр.Перекомпилируйте программу с помощью
clBuildProgram
функция.Извлеките новое двоичное использование
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
функция.