У меня есть 2 компьютера, в одном установлена Raden R9 290x, а в другом Raden R7 250, и далее речь пойдет только об видеокартах AMD. На обоих компьютерах установлены одни и те же драйвера. Я написал OpenCL ядро, скомпилировал его в бинарник и, в последствии, использую clCreateProgramWithBinary. Но я столкнулся с следующими сложностями:
Скомпилированные для этих двух устройств бинарники отличаются: для R7 бинарник весит ~500КБ, а для R9 ~1.5MB.
При использовании бинарника на устройстве для которого он был скомпилирован не возникает никаких проблем, все происходит мгновенно, но если попытаться запустить бинарник для R7 на R9, то clBuildProgram исполняется очень долго(~1 мин.), а наоборот clBuildProgram - вообще вызывает access violation.
Мне необходимо получить бинарник, который будет работать на все видеокартах AMD, поддерживающих OpenCL. Как правильно скомпилировать OpenCL ядро, что бы оно корректно работало на всех устройствах?
Ответ
Есть частичное решение, обеспечивающее совместимость на уровне платформ и устройств - SPIR. В данный формат исходники можно скомпилировать например с помощью Intel OpenCL Code Builder. К сожалению результирующий файл все еще требует компиляции, но времени это занимает немного меньше чем для исходного кода.
Комментариев нет:
Отправить комментарий