初始化OpenCL对象

时间:2013-03-21 17:47:54

标签: c opencl

您好我想知道我是否可以像这个struct

一样创建一个openCL对象
struct Product
{

    int n_id;
    char n_name;

    Item(id, name){n_id = id; n_name = name;}
} item;

我想将这些信息传递给内核,以使结构可以从另一个结构中重用。

我想通过内核添加项目

kernel addItem(int name, char name)
{
    Item it(id,name);
    Items.add(it);
}

所以我的问题是如何传递这些信息以及如何使我创建的对象可以从另一个内核重用?

干杯

1 个答案:

答案 0 :(得分:2)

OpenCL内核是用受限制的(例如结构中没有指针)和扩展(例如float4数据类型)C99语言编写的。它们不是用C ++编写的。

您在主机上初始化C like结构,然后将它们复制过来。 C类结构没有方法。使用Visual Studio在主机上使用C ++ OpenCL绑定(来自cl.hpp),我执行以下操作:

#pragma pack(16)
struct Light {
    cl_float4 pos;
    cl_float4 dir;
    cl_float4 intensity;
    cl_int type; 
    cl_int pad[3];
};
#pragma pack()

const int nlight = 10
Light lights[nlight];
//...code to initialize array of structs

cl::Buffer lights_mem = cl::Buffer(context, CL_MEM_COPY_HOST_PTR,  sizeof(Light)*nlight, lights);

kernel1.setArg(0, lights_mem);

将灯光复制到OpenCL设备。在内核中,您可以访问这样的灯结构:

__kernel void trace(__global Light* lights, ...) {
    float4 pos = lights[0].pos
    //find a new position (pos_new)
    lights[0].pos = pos_new;

当内核完成时,你可以将cl :: Buffer lights_mem传递给下一个内核。

kernel2.setArg(0, lights_mem); 

但是,通过使用只读或只写缓冲区可以获得更好的速度,因此它可以帮助将内核分为只读和仅写内核。

我不知道pack()pragma和padding是否仍然是必要的,但我一直在使用它们,因为每当有人说他们不再需要时我会遇到一个问题,当我把它们放回去时会消失。