No.2 OpenCL 程序构建

概述

OpenCL 内核程序在运行之前,需要通过编译、链接等步骤。由于我们的疏忽,程序的编码往往会存在缺陷,导致程序运行异常。其中有些错误在构建时就能确定,这时就要找到导致程序构建错误的地方,再逐一纠正。例如,我们通过修改 No.1_HelloOpenCL,去掉内核程序第 6 行末尾的分号,使其出现编译错误,随后通过 OpenCL API 调用获取错误信息。完整代码参见 No.2_OpenCLBuild

该 OpenCL 程序在华为荣耀8 上执行,输出结果如下:

shell@HWFRD:/data/local/tmp $ ./opencl_build
[Platform Infomation]
platform name: ARM Platform

[Device Infomation]
device name: Mali-T880

build log:
<source>:6:28: error: expected ';' after expression
                out[g_id] = in[g_id] + 32
                                         ^

error: Compiler frontend failed (error code 59)

实现

1.修改内核程序

去掉内核程序中第 6 行末尾的分号,使其在构建时失败。

"__kernel void tolower(__global char *in, __global char *out)           \n"
"{                                                                      \n"
"       int g_id = get_global_id(0);                                    \n"
"                                                                       \n"
"       if ((in[g_id] >= 'A') && (in[g_id] <= 'Z'))                     \n"
"               out[g_id] = in[g_id] + 32                               \n"
"       else                                                            \n"
"               out[g_id] = in[g_id];                                   \n"
"}                                                                      \n";

2.获取构建错误信息

通过下面的 OpenCL API 调用获取构建错误信息。

err = clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG,
        bufSize, buf, NULL);
printf("build log:\n%s\n", buf);

3.输出日志

输出构建错误的信息,通过对日志信息进行分析,找到编码错误,然后对其纠正。

build log:
<source>:6:28: error: expected ';' after expression
                out[g_id] = in[g_id] + 32
                                         ^

error: Compiler frontend failed (error code 59)

日志中描述这是编译前端错误,对应的错误编码为 59。具体为表达式的后面缺少分号,其中 6 是 program 中的行号,便于快速定位引发错误的位置。

注意:
上面错误是编译器在编译阶段,语法检查时发现。并非在预处理阶段,预处理阶段主要是头文件包含处理以及宏替换操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值