Как правильно использовать clCreateProgramWithIL () с двоичным ядром spir-v? - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно создать приложение 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рнел библиотекаЕсть идеи как этого добиться?

...