我正在使用AMD的OpenCL 1.1实现编写GPU射线游标(我正在使用他们的c ++包装器api)。最初,我使用大型单维数组为我的嵌入体积和dsm实现了内核,并且我自己的插值函数运行良好。作为旁注,我正在使用单独的内核进行dsm采样。
现在我正在重新实现我的代码以利用OpenCL类型image3d,它具有自己的卷和dsm的硬件加速插值功能。我的卷image3d工作正常,但是我无法在光线行进内核中使dsm image3d工作。
正如我之前提到的,我正在使用一个单独的内核来对dsm进行采样。从我阅读的文档(和视频卡设备规格),我应该能够使用以下内容直接写入我的内核中的image3d:
write_imagef(image3d_t image,int4 coord,float4 value);
如果图像是dsm,则coord是网格的x,y,z值(因为我在3维中运行dsm内核,这由全局ID定义),value是该位置的值。 / p>
我在我的代码中使用以下命令初始化我的dsm image3d: cl :: Image3D(上下文,标志,格式,宽度,高度,深度,0,0,host_ptr和& err);
上下文是我的OpenCL上下文 flags = CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR 宽度,高度和深度是dsm网格的宽度,高度和深度 format是一个cl :: ImageFormat,具有以下设置: format.image_channel_order = CL_RGBA; format.image_channel_data_type = CL_FLOAT; 未使用接下来的两个位置,因此将它们设置为0 host_ptr是指向原始网格的指针 和& err是指向错误对象的指针
我启用了cl_khr_3d_image_writes,我还在内核中声明了我的dsm: __write_only image3d_t dsm。
基本上,我运行我的DSM示例内核然后运行我的光线行军内核。我对image3d数据的两个内核参数使用相同的指针。
我无法想到我可以包含的任何其他细节。
答案 0 :(得分:1)
CL_MEM_READ_ONLY
表示您只是要从缓冲区中读取。因此不允许写入。如果您要从缓冲区读取和写入,请使用CL_MEM_READ_WRITE
。