在openCL代码

时间:2016-02-06 10:14:45

标签: opencl

我写的是使用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)

1 个答案:

答案 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