gpt4 book ai didi

c - 初始化 OpenCL 对象

转载 作者:行者123 更新时间:2023-11-30 14:20:20 25 4
gpt4 key购买 nike

嗨,我想知道是否可以创建一个像这样的结构的 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);
}

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

干杯

最佳答案

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

您在主机上初始化类似 C 的结构,然后将它们复制过来。 C 类结构没有方法。通过 Visual Studio 在主机上使用 C++ OpenCL 绑定(bind)(来自 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 是否仍然必要,但我继续使用它们,因为每次有人说它们不再必要时,我都会遇到一个问题,当我把它们放回去时,这个问题就消失了。

关于c - 初始化 OpenCL 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com