gpt4 book ai didi

c++ - 处理结构的OpenCL缓冲区的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-01 14:51:00 25 4
gpt4 key购买 nike

我有以下OpenCL内核:

//OPENCL KERNEL
struct MyStruct
{
float A;
float B;
float C;
float D;
float E;
};

__kernel void kernelMain(struct MyStruct* outputBuffer)
{
size_t idx = get_global_id(0);

//Do some stuff here with the outputBuffer
outputBuffer[idx].A = 42.0;
}

如您所见,它定义了一个自定义类型,称为MyStruct。

在主机方面,我具有相同的结构定义(copy-pasta'd):
//HOST SIDE
struct MyStruct
{
float A;
float B;
float C;
float D;
float E;
};

我试图创建一个缓冲区来写内核数据,同样是主机端代码:
//HOST SIDE
cl::Buffer outputBuffer(clContext, CL_MEM_READ_WRITE, (size_t)numElements * sizeof(MyStruct));

clKernel.setArg(0, outputBuffer);

当我调用clKernel.setArg时,会发生问题。它失败,并显示错误代码-51,根据OpenCL文档,该代码是内核无效的参数大小错误。

我尝试使用openCL数据类型,将结构的主机定义重写为:
struct MyStruct
{
cl_float A;
cl_float B;
cl_float C;
cl_float D;
cl_float E;
};

但这也会产生错误。

我的问题是这样的:
创建使用自定义结构的OpenCL缓冲区的正确方法是什么?

最佳答案

如果您能够使用C++,则可以使用 BOOST_COMPUTE_ADAPT_STRUCT() 宏,该宏负责包装结构并将其用于OpenCL内核。

包装后,您可以使用 boost::compute::vector<T> 容器类为结构的集合创建OpenCL内存缓冲区:

// adapt "MyStruct" for OpenCL
BOOST_COMPUTE_ADAPT_STRUCT(MyStruct, MyStruct, (A, B, C, D, E));

// create a OpenCL buffer with 100 "MyStruct" objects
boost::compute::vector<MyStruct> my_structs(100);

// use "my_structs" with an opencl kernel
my_kernel.set_arg(0, my_structs);

关于c++ - 处理结构的OpenCL缓冲区的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538646/

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