首页 > 解决方案 > 用于读写的 OpenCL OpenGL 互操作内核参数

问题描述

我正在尝试使用英特尔教程中所述的 OpenGL 纹理进行 OpenCL/OpenGL 互操作。我想让我的主机代码尽可能简单,所以我想使用“方法 1”,从而从 OpenGL 纹理创建一个 OpenCL 图像clCreateFromGLTexture。该教程还说明了以下内容:

请注意允许快速丢弃数据的 CL_MEM_WRITE_ONLY 标志。如果您的内核需要读取当前纹理上下文,请使用 CL_MEM_READ_WRITE。此外,在这种情况下,删除内核中图像访问的 _write_only 限定符。

但是,这似乎不起作用。一旦我__write_only从内核中删除,我就会得到一个编译错误,使用平台 Nvidia OpenCL 1.2 CUDA 10.0.132(驱动程序 417.71):

错误:sust 中的图像类型无效。

不管什么意思。使用平台 Intel OpenCL 2.1 UHD Graphics 620(驱动程序 24.20.100.6286)我得到以下信息:

CTHeader.h:1333:38:注意:候选函数不可行:第一个参数 void __attribute ((overloadable)) write_imagef(write_only image1d_array_t image_array, int2 coord, float4 color) ;

似乎 image2D_t 默认为__read_only?

无论如何,我发现规范明确指出不支持教程中提出的内容,至少不使用图像对象:

不支持对内核中相同图像内存对象的 read_image 和 write_image 调用

所以我想知道,由于本教程没有详细介绍如何设置内核参数,所以可能image2d_t首先使用是错误的。由于参数是cu_mem主机端的类型,我尝试使用float*,但到目前为止没有成功。

我意识到我可以做双缓冲或使用其他方法,比如使用 PBO 进行互操作,但正如我所说,我想让事情尽可能简单,而且我只是想知道为什么会这样。有任何想法吗?

标签: c++openglopencl

解决方案


内核映像参数必须__write_only使用or来限定__read_only,直到 OpenCL 2.0,它允许映像,__read_write但必须遵循特殊规则(例如屏障)才能获得正确的结果。请注意,图像还具有指示主机如何访问它的限定符(只读、只写或读/写)。给定的图像可能__write_only在一个内核中,然后__read_only在下一个内核中,这允许一个内核的结果馈送到下一个内核。


推荐阅读