我需要创建一个 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 内核库链接。知道如何实现这一目标吗?