AMD OpenCL 1.1 image3d_t在内核中写入

AMD OpenCL 1.1 image3d_t writing in kernel

本文关键字:内核 OpenCL image3d AMD      更新时间:2023-10-16

我正在使用AMD的OpenCL 1.1实现编写GPU ray marcher(我正在使用他们的c++包装器api)。最初,我使用网格体积的大型一维数组和dsm以及我自己的插值函数来实现内核,效果很好。附带说明一下,我正在使用一个单独的内核进行dsm采样。

现在我正在重新实现我的代码,以利用OpenCL类型的image3d,它有自己的体积和dsm的硬件加速插值功能。我的体积image3d工作得很好,但我无法让dsm image3d在ray march内核中工作。

正如我前面提到的,我正在使用一个单独的内核来对dsm进行采样。从我阅读的文档(和视频卡设备规格)来看,我应该能够使用直接写入内核中的image3d

write_imagef(image3d_t图像,int4坐标,float4值);

其中image是dsm,coord是网格的x、y、z值(由于我在三维中运行dsm内核,这是由全局id定义的),value是该位置的值。

我正在我的代码中初始化我的dsm-image3d,使用:cl::Image3D(上下文,标志,格式,宽度,高度,深度,0,0,host_ptr,&err);

其中context是我的OpenCL上下文flags=CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_TRwidth,height and depth是dsm网格的宽度、高度和深度format是cl::ImageFormat,具有以下设置:format.image_channel_order=CL_RGBA;format.image_channel_data_type=CL_FLOAT;接下来的两个位置未被使用,因此它们被设置为0host_ptr是指向原始网格的指针和&err是指向错误对象的指针

我启用了cl_khr_3d_image_writes,还将内核中的dsm声明为:__只写image3d_t dsm。

本质上,我运行我的DSM示例内核,然后运行我的ray march内核。我对image3d数据的两个内核参数使用相同的指针。

我想不出还有什么其他细节可以包括在内。

CL_MEM_READ_ONLY意味着您只从缓冲区中读取。因此不允许写入。如果要从缓冲区进行读写操作,请使用CL_MEM_READ_WRITE