首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在openCL代码中使用管道相关函数时生成错误

在openCL代码中使用管道相关函数时生成错误
EN

Stack Overflow用户
提问于 2016-02-06 10:14:44
回答 1查看 430关注 0票数 0

我写这篇文章是为了使用OpenCL2.0的管道特性。我有一个内核,它过滤输入并写入管道。但问题是,当我使用管道相关的函数时,我会得到错误“函数隐式声明”。当我在线检查时,我发现如果函数在使用之前没有声明,那么这个错误通常会出现在c代码中。但这是一个openCL库函数。

我的内核代码是:

__kernel void filter1_kernel(__global int *input,const unsigned int rLen,const unsigned int lower,const unsigned int upper,__global int *pipe1){

代码语言:javascript
运行
复制
unsigned int bitmap = 0;
int count = 0;
//reserve_id_t rid;

uint numWorkItems = get_global_size(0);
uint tid          = get_global_id(0);
uint num_packets = get_local_size(0);

while(tid < rLen){
    if(input[tid] >= lower && input[tid] <= upper){
        bitmap = bitmap | (1 << count);
        printf((__constant char *)"\nfilter1 %u %u %d %u", tid, bitmap, input[tid], count);
    }
    tid += numWorkItems;
    count++;
}

reserve_id_t rid = work_group_reserve_write_pipe(pipe1, num_packets);
while(is_valid_reserve_id(rid) == false) {
    rid = work_group_reserve_write_pipe(pipe1, num_packets);
}
//write to pipe

}

我所犯的错误是:

构建日志缓冲区长度: 1048 -构建日志- "C:\Users\pdca\AppData\Local\Temp\OCLFB5E.tmp.cl",第40行:错误:函数"work_group_reserve_write_pipe“声明为reserve_id_t rid = work_group_reserve_write_pipe(pipe1,num_packets);^

"C:\Users\pdca\AppData\Local\Temp\OCLFB5E.tmp.cl",第40行:警告:"int“类型的值不能用于初始化" reserve_id_t”reserve_id_t rid = work_group_reserve_write_pipe(pipe1,num_packets)类型的实体;^

"C:\Users\pdca\AppData\Local\Temp\OCLFB5E.tmp.cl",第41行:错误:函数"is_valid_reserve_id“隐式声明,而(is_valid_reserve_id(Rid) == false) {^

"C:\Users\pdca\AppData\Local\Temp\OCLFB5E.tmp.cl",第42行:警告:不能将"int“类型的值分配给"reserve_id_t”rid = work_group_reserve_write_pipe(pipe1,num_packets)类型的实体;^

在编译“C:\User\pdca\AppData\Local\Temp\OCLFB5 5 E.tmp.cl”中检测到2个错误。前端阶段编译失败。

代码语言:javascript
运行
复制
                            --- Build log ---

错误: clBuildProgram (CL_BUILD_PROGRAM_FAILURE)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 11:49:01

来自CL-规范(https://www.khronos.org/registry/cl/specs/opencl-2.0.pdf),第203页:

如果没有指定选项,则在为每个设备编译程序时使用每个设备支持的最高OpenCL C1.x语言版本。如果应用程序希望使用OpenCL C2.0编译或构建其程序,则需要指定-CL2.0=cl2.0选项。

因此,如果您没有将此选项包含到您的clBuildProgram()调用中,CL-编译器将不会识别任何2.0语言特性。因此,你的电话应该是这样的:

代码语言:javascript
运行
复制
clBuildProgram (program, num_devices, device_list, "–cl-std=CL2.0", NULL, NULL);

此外,我认为您的内核参数是不正确的。不能使用__global int *pipe1作为管道函数的参数。它可能应该声明为__write_only pipe int pipe1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35239820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档