我写的是使用opencl 2.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” while(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:\ Users \ pdca \ AppData \ Local \ Temp \ OCLFB5”中检测到2个错误 E.tmp.cl”。 前端阶段编译失败。
--- Build log ---
错误:clBuildProgram(CL_BUILD_PROGRAM_FAILURE)
答案 0 :(得分:1)
来自CL-specs(https://www.khronos.org/registry/cl/specs/opencl-2.0.pdf),第203页:
如果未指定cl-std构建选项,则在为每个设备编译程序时将使用每个设备支持的最高OpenCL C 1.x语言版本。应用程序需要指定 -cl-std = CL2.0选项,如果他们想要编译或构建他们的程序 使用OpenCL C 2.0。
因此,如果您未在<form method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text"><?php echo _x( 'Search:', 'label' ) ?></span>
<span>Search</span>
<input type="search" class="search-field" placeholder="Search" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search:', 'label' ) ?>" />
</label>
<button type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>">
</button>
</form>
调用中包含此选项,则CL编译器将无法识别任何2.0语言功能。因此,你的电话应该是这样的:
clBuildProgram()
另外,我认为你的内核参数不正确。您不能使用clBuildProgram (program, num_devices, device_list, "–cl-std=CL2.0", NULL, NULL);
作为管道函数的参数。它应该被声明为__global int *pipe1
。