2

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

4

0 回答 0