OpenCL API 中的类型转换 (void *)&c_mem_obj

Posted

技术标签:

【中文标题】OpenCL API 中的类型转换 (void *)&c_mem_obj【英文标题】:Type casting in OpenCL APIs (void *)&c_mem_obj 【发布时间】:2018-11-14 20:30:00 【问题描述】:

我在 OpenCL 主机代码的 armaments 列表中遇到了一个奇怪的语法。但是,我的主机代码功能没有任何问题,但对我来说这意味着什么以及为什么它以这种方式传递参数很奇怪。

clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&c_mem_obj);

据我所知,它是类型转换。我错了吗 ?

我相信它没有任何特殊用途,因为 clSetKernelArg API 已经只接受指针。

有更多技术性的解释真的很有帮助。

谢谢, 金宝

【问题讨论】:

【参考方案1】:

你是对的,这是一个类型转换。它获取您的cl_mem 对象的地址(类型为cl_mem *)并将其转换为类型void *(并且由于clSetKernelArg 需要const void *,它甚至不是best 演员) .

不是必需的。您也可以只写clSetKernelArg(kernel, 0, sizeof(cl_mem), &c_mem_obj),它应该可以编译(它适用于我们的代码,在 Windows、Mac 和 Linux 上)。

【讨论】:

谢谢!!!是的你是对的。它没有演员表。我不明白他们为什么使用这种语法,因为它来自 NVIDIA 基准测试,它对我来说变得更有趣。

以上是关于OpenCL API 中的类型转换 (void *)&c_mem_obj的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 OpenCL API 标量数据类型?

更新到 Xcode 12:无法将类型“DataRequest”的值转换为闭包结果类型“Void”

不兼容的类型:条件表达式 void 中的错误类型无法转换为布尔值。请协助

void及void指针介绍

OpenCL 中的私有内存是不是有最大限制?

Opencl:从 __constant 复制到 __global 内存