Мне нужно создать приложение OpenCL, которое оснащает код ядра OpenCL, который он получает в качестве входных данных, для каких-то экзотических целей профилирования (не нашел того, что мне нужно, поэтому мне нужно / я хочу сделать это сам).
Я хочу скомпилировать ядро в промежуточное представление (прямо сейчас LLVM-IR), обработать его (используя привязки LLVM C ++), перенести инструментированный код в SPIR-V и затем создать ядро в коде хоста с помощьюclCreateProgramWithIL()
.
Пока я просто компилирую простое ядро OpenCL, которое добавляет 2 вектора без инструментария:
__kernel void vadd(
__global float* a,
__global float* b,
__global float* c,
const unsigned int count)
{
int i = get_global_id(0);
if(i < count) c[i] = a[i] + b[i];
}
Для компиляции вышеупомянутого в LLVM IR я использую следующеекоманда:
clang -c -emit-llvm -include libclc/generic/include/clc/clc.h -I libclc/generic/include/ vadd.cl -o vadd.bc -emit-llvm -O0 -x cl
После этого я перемещаю vadd.bc
в vadd.spv
с помощью инструмента llvm-spirv
( здесь ).
Наконец, я пытаюсь создатьЯдро из кода хоста C выглядит так:
...
cl_program program = clCreateProgramWithIL(context, binary_data->data, binary_data->size, &err);
err = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
...
После запуска кода хоста я получаю вышеуказанную ошибку от команды clBuildProgram
:
CL_BUILD_PROGRAM_FAILURE
error: undefined reference to `get_global_id()'
error: backend compiler failed build.
Кажется, что vadd.spv
файл не связан с OpenCL keрнел библиотекаЕсть идеи как этого добиться?