Я пытаюсь загрузить двоичный файл SPIR, созданный с помощью clang + llvm 6.0.1.
Создал несколько разных файлов с помощью:
clang -target spir-unknown-unknown -cl-std=CL1.2 -c -emit-llvm -Xclang -finclude-default-header OCLkernel.cl
clang -target amdgcn-amd-amdhsa -cl-std=CL1.2 -c -emit-llvm -Xclang -finclude-default-header OCLkernel.cl
clang -cc1 -emit-llvm-bc -triple spir-unknown-unknown -cl-std=CL1.2 -include "include\opencl-c.h" OCLkernel.cl
Все это происходит в Windows с установленными драйверами AMD APP SDK 3 и Adrenalin 18.6.1.
После этого я пытаюсь создать программу из двоичного файла:
clCreateProgramWithBinary(context, 1, &device, &programSrcSize, (const unsigned char**)&programSrc, 0 , &status)
Все идет нормально, у меня нет никаких ошибок, но я получаю, когда пытаюсь построить его потом:
clBuildProgram(program, 1, &device, " –x spir -spir-std=1.2", NULL, NULL);
Я получаю следующую ошибку:
Ошибка CL_INVALID_COMPILER_OPTIONS при вызове clBuildProgram
Я тоже пробовал без "-x spir ...", но потом просто получил:
ошибка: недопустимое значение (Производитель: 'LLVM6.0.1' Читатель: 'LLVM 3.9.0svn')
Обновлено:
CL_DEVICE_NAME: gfx900
CL_DEVICE_VERSION: OpenCL 2.0 AMD-APP (2580.6)
CL_DEVICE_OPENCL_C_VERSION: OpenCL C 2.0
CL_DRIVER_VERSION: 2580.6 (PAL, HSAIL)
CL_DEVICE_SPIR_VERSIONS: 1.2
После запуска clCreateProgramWithBinary я запрашиваю устройство с clGetProgramBuildInfo и получаю:
CL_PROGRAM_BINARY_TYPE = [CL_PROGRAM_BINARY_TYPE_INTERMEDIATE]
Это должно означать, что двоичный файл распознается, иначе я думаю, он вернет CL_PROGRAM_BINARY_TYPE_NONE
РЕДАКТИРОВАТЬ2:
Я думаю, что clang не создает «хороший» двоичный файл, но как тогда его создать?
Ценю вашу помощь!
Да, я отредактировал свой пост. У меня Вега56. Спасибо
Вы пробовали Khronos clang github.com/KhronosGroup/SPIR?





К сожалению, поддержка SPIR была тихо удалена из драйверов AMD, см. Ответы на дипак в этой ветке форума сообщества AMD:
https://community.amd.com/thread/232093
Что касается вашего второго вопроса: общий clang + LLVM (не секретная версия, настроенная AMD и включенная в их проприетарные драйверы) по-прежнему не может создавать двоичные файлы, совместимые с универсальными драйверами AMD для Windows, однако это возможно для Linux: охвачены все новые среды выполнения AMD ROCm, AMD PAL и Mesa 3D.
Для меня загадка, почему бэкэнд-разработчики LLVM AMDGPU не ставят в приоритет задачу создания двоичных файлов для драйверов Windows, поскольку существует пара проектов ассемблера GCN, которые обеспечивают такую функциональность через интерфейс Windows OpenCL, и это лишь некоторые из них: CLRadeonExtender, ASM4GCN , HepPas и т. д. Более того, я знаю недокументированный форк clang + LLVM, который (как утверждает его автор) создает такие двоичные файлы OpenCL! «На небе и на земле, Горацио, есть больше вещей, чем мечтает твоя философия».
Не могли бы вы проверить информацию об устройстве для
CL_DEVICE_SPIR_VERSIONS, чтобы убедиться, что поддерживается SPIR?