Как использовать cl_amd_offline_devices для компиляции ядра для конкретного графического процессора?

Я хочу скомпилировать ядро ​​OpenCL для определенного графического процессора AMD, которого нет на моей машине, чтобы позже я мог просто загрузить и запустить его, когда этот графический процессор присутствует.

Я прочитал этот вопрос здесь, на SO:

Автономная компиляция для ядер AMD и NVIDIA OpenCL без установленных карт

И ответ, предлагающий создать контекст OpenCL с CL_CONTEXT_OFFLINE_DEVICES_AMD. Хорошо, я могу это сделать. Но что тогда? В Руководстве пользователя по программированию OpenCL от AMD говорится:

A.8.6 cl_amd_offline_devices Чтобы генерировать двоичные образы в автономном режиме, необходимо получить доступ к компилятору для каждого устройства, которое поддерживает среда выполнения, даже если устройство в настоящее время не установлено в системе. Когда во время создания контекста CL_CONTEXT_OFFLINE_DEVICES_AMD передается в свойствах контекста, сообщается обо всех поддерживаемых устройствах, будь то онлайн или офлайн, и их можно использовать для создания двоичных образов OpenCL.

хорошо, а как именно? Я предполагаю, что мне нужно позвонить clCompileProgram() или clBuildProgram(), верно? Как мне установить для него список устройств, которые мне нравятся?


person einpoklum    schedule 11.02.2020    source источник


Ответы (1)


Как вы и предполагали, вы начинаете с обычных clCompileProgram() и clBuildProgram().

Затем вы можете использовать clGetProgramInfo() с CL_PROGRAM_BINARY_SIZES, чтобы получить размеры для распределения ваших буферов, и второй раз с CL_PROGRAM_BINARIES, чтобы получить фактические двоичные изображения программы.

Затем это изображение можно использовать с clCreateProgramWithBinary() вместо clCreateProgramWithSource().

Надеюсь, это поможет.

person noma    schedule 13.03.2020
comment
Итак, мне нужно пройти через все устройства, чтобы выбрать то, которое я хочу, а затем использовать этот индекс, чтобы получить размер и указатель на скомпилированный двоичный файл, и записать это в файл? Хорошо, это звучит выполнимо. Я не думаю, что у вас есть ссылка на пример программы, делающей это? - person einpoklum; 13.03.2020
comment
К сожалению, под рукой нет примера, но вы можете в принципе использовать любой OpenCL Hello-World и, например, быстро изменить его на две версии - одну, которая создает двоичные файлы и завершает работу, а другая загружает их вместо исходного кода. Удачи. :-) - person noma; 13.03.2020