我写这篇文章是为了使用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){
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个错误。前端阶段编译失败。
--- Build log ---错误: clBuildProgram (CL_BUILD_PROGRAM_FAILURE)
发布于 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语言特性。因此,你的电话应该是这样的:
clBuildProgram (program, num_devices, device_list, "–cl-std=CL2.0", NULL, NULL);此外,我认为您的内核参数是不正确的。不能使用__global int *pipe1作为管道函数的参数。它可能应该声明为__write_only pipe int pipe1。
https://stackoverflow.com/questions/35239820
复制相似问题