c++ - 用于读写的 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 进行互操作,但正如我所说,我想让事情尽可能简单,而且我只是想知道为什么会这样。有任何想法吗?
解决方案
内核映像参数必须__write_only
使用or来限定__read_only
,直到 OpenCL 2.0,它允许映像,__read_write
但必须遵循特殊规则(例如屏障)才能获得正确的结果。请注意,图像还具有指示主机如何访问它的限定符(只读、只写或读/写)。给定的图像可能__write_only
在一个内核中,然后__read_only
在下一个内核中,这允许一个内核的结果馈送到下一个内核。
推荐阅读
- python - 立即将 stdout 重定向到 tkinter(无需等待进程完成)
- reactjs - 反应本机状态不更新功能
- python - 如何使用请求从互联网上的 json 文件中获取信息
- c# - Docusign“无法加载文件或程序集 Restsharp”错误
- javascript - 为什么在 JavaScript 中对数组“B”的更改会传播到数组“A”(用于定义“B”但此后从未直接修改)?
- css - 如何在悬停时使顶部弹性框行不向下推底部弹性框行
- php - 预订系统的 PHP 对象/数组算法
- python - Django rest 框架简单模型序列化器列表视图需要永远显示 10 条记录
- apache-nifi - 如何在 Apache NIFI 中将机器学习应用于流数据
- regex - Notepad++ 正则表达式 - 如何从此列表中删除代理?