Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化OpenCL对象_C_Opencl - Fatal编程技术网

初始化OpenCL对象

初始化OpenCL对象,c,opencl,C,Opencl,嗨,我想知道我是否可以创建一个像这个结构的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

嗨,我想知道我是否可以创建一个像这个结构的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);
}
所以我的问题是如何传递这些信息,以及如何使我创建的对象可以从另一个内核重用


Cheers

OpenCL内核是用受限(例如结构中没有指针)和扩展(例如float4数据类型)C99类语言编写的。它们不是用C++编写的。 在主机上初始化类C结构,然后将它们复制到主机上。C类结构没有方法。在Visual Studio中使用主机上的C++ OpenCL绑定(从C.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);
__kernel void trace(__global Light* lights, ...) {
    float4 pos = lights[0].pos
    //find a new position (pos_new)
    lights[0].pos = pos_new;
将灯光复制到OpenCL设备。在内核中,您可以访问灯光结构,如下所示:

#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);
__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\u mem传递给下一个内核

kernel2.setArg(0, lights_mem); 
然而,通过使用只读或只写缓冲区,您可以获得更好的速度,因此它可能有助于将内核分为只读和只写的内核


我不知道包装()的标签和填充物是否仍然是必要的,但我一直在使用它们,因为每次有人说它们不再必要时,我都会遇到一个问题,当我把它们放回原处时,问题就消失了。

值得注意的是(非便携式)AMD中的静态C++内核语言可以用来编写OpenCL内核中的类C++结构和类。通常的限制仍然适用(包括:没有继承或虚函数,结构/类中没有指针,等等)。当然,它只适用于AMD运行时+最后一段,包装绝对是件令人头痛的事。事实上,我昨晚从渲染器中取出了它们,但我仍然担心它会在某个时候在我的脸上爆炸。哦,这很有趣。我不知道那件事。我只使用OpenCL 1.1和γ定义CLUSEUSEPDECREATEXOPELCLY1L1API,这样我的代码就可以在NVIDIA和AMD上工作。实际上,我不使用静态C++内核语言,我只提到它:P(CL_USE_已弃用的_OPENCL_1_1_API绝对有用,否则,由于缺少或错误的函数签名,在1.2运行时运行1.1几乎是不可能的-太令人恼火了)。我希望NVIDIA能够实现OpenCL 1.2,但是,这有多难?我认为NVIDIA对OpenCL不再感兴趣。我很确定他们故意破坏了Titan卡上的OpenCL驱动程序。事实上,我认为如果你不启用双浮点提升,它们仍然可以工作(但我不确定).这只是意味着,对于OpenCL来说,泰坦比GTX690慢,但价格也一样高。你们都是传奇人物!这些都是我想要的精彩信息和@raxman的一些很棒的信息狂道具