OpenCL:未使用值初始化对象

OpenCL:未使用值初始化对象,opencl,Opencl,如果我这样做: this->bufferParams = cl::Buffer(context, CL_MEM_READ_ONLY, sizeof(Params), &params, NULL); 我的缓冲区似乎没有填充我的params对象。但是如果我这样做 this->queue.enqueueWriteBuffer(this->bufferParams, CL_TRUE, 0, sizeof(Params), &params, NULL); 然后它似乎起

如果我这样做:

this->bufferParams = cl::Buffer(context, CL_MEM_READ_ONLY, sizeof(Params), &params, NULL);
我的缓冲区似乎没有填充我的params对象。但是如果我这样做

this->queue.enqueueWriteBuffer(this->bufferParams, CL_TRUE, 0, sizeof(Params), &params, NULL);
然后它似乎起作用了。cl::Buffer语法中是否有任何方法可以直接初始化params对象,而不是执行enqueue命令

只需执行以下操作:

this->bufferParams = cl::Buffer(context, CL_MEM_READ_ONLY|
CL_MEM_COPY_HOST_PTR, sizeof(Params), &params, NULL);
如果不使用该标志从主机指针进行复制,则不会进行复制。 该指针可能用于其他用途(如获取内存),因此需要相应地设置标志


额外:另外,对于非常小的结构对象,如您的参数,请直接在
clSetKernelArgs()
上使用它。如果只是设置一些从未写入的常量值,则无需创建缓冲区。它还通过一个更优化的内存路径。

好的。但是从内核内部来说,它应该是快速访问的,对吗?我只会在创建缓冲区后执行上述操作,它的行为类似于缓冲区,因此它是内核中的指针,因此可以编写。因此,它没有以任何方式进行优化。但是,如果声明它为常量,编译器将使用常量内存对其进行优化。但最简单的方法是直接使用
clSetKernelArgs()
。这已经给了编译器一个永远不会被编写的提示,并且避免了您处理缓冲区的创建。我建议使用CL_MEM_use_HOST_PTR来获得更好的性能(如果设备支持,则为零拷贝)。英特尔Gfx有一些要求(缓冲区必须是4K对齐的,长度必须是64的倍数)