使用C ++在Xcode 6.1.1下编译简单OpenCL示例代码的问题

时间:2015-01-16 04:57:56

标签: c++ xcode opencl

我有一个简单的hello world OpenCL程序。出于某种原因,当我尝试从代码中引用内核名称时,编译器会出错。

在kernel.cl中我有

kernel void square_kernel(global float *input, global float * output, const unsigned int count)
{
    size_t i = get_global_id(0);
    if(i<count)
        output[i] = input[i] * input[i];
}

在main.cpp中我有:

...
#include "kernel.cl.h"
...
int main()
{
    ...
    dispatch_sync(queue, ^{
        size_t wgs;
        gcl_get_kernel_block_workgroup_info(square_kernel, CL_KERNEL_WORK_GROUP_SIZE, sizeof(wgs), &wgs, NULL);

        cl_ndrange range = {
            1, // number of dims
            {0, 0, 0}, // offset in each dim
            {DATA_SIZE, 0, 0}, // global range (total)
            {wgs, 0, 0} // local size of each work group #work_groups = DATA_SIZE  / wgs    
        };

        // call kernel
        square_kernel(&range, (cl_float *)mem_in, (cl_float *)mem_out, DATA_SIZE);

        // copy the output
        gcl_memcpy(results, mem_out, sizeof(cl_float) * DATA_SIZE);

    });
    ...
}

我得到&#34;使用未声明的标识符square_kernel&#34;它被引用的地方。必须构建cl文件,因为它会生成字节代码文件。

现在我刚刚想到它可能是因为我从c ++文件引用它。但是我不知道如何解决这个问题,如果这是导致它的原因。如果我能提供帮助,我不想使用C.有什么想法吗?

1 个答案:

答案 0 :(得分:2)

值得检查自动生成的kernel.cl.h标头,以便在这种情况下仔细检查您尝试调用的函数的定义。我刚刚创建了一个新的Xcode项目并用它构建了你的OpenCL内核,结果函数定义如下所示:

extern void (^square_kernel_kernel)(const cl_ndrange *ndrange, cl_float* input, cl_float* output, cl_uint count);

请注意函数名称中的额外_kernel