【问题标题】:Can I embed C++ Classes in OpenCL Kernels?我可以在 OpenCL 内核中嵌入 C++ 类吗?
【发布时间】:2011-02-17 13:04:36
【问题描述】:

是否有可能在 OpenCL 内核中使用自定义 C++ - 类? 它应该像这样工作:

#include "element.cpp"
__kernel void do_something(__global element* input, __global element* output);
{
    int index = get_global_id(0);
    output[index] = input[index].update(index);
}

这很有趣,因为你可以在 element::update(int no) 中指定之后必须完成的工作。

我没有让它工作。这是 OpenCL 编译器告诉我的:

未知类型名称“类”

在 CUDA 中这是有效的。如果在 OpenCL 内核中使用对象的方法不起作用,还有其他想法吗?

提前感谢您的提示!

【问题讨论】:

  • CUDA 允许一些 C++ 功能,例如内核中的模板。

标签: c++ object opencl


【解决方案1】:

我相信 OpenCL 遵循 C99 语言规范,而不是 C++。 OpenCL is going on 的 C++ 版本的规范。我相信AMD APP已经实现了OpenCL的C++版本。回到你的问题,我认为最好有一个结构作为 C++ 和 C 之间的接口。如果你迫切需要,C++ 版本应该是 C 实现的包装器。

编辑:我不能把它放在 cmets 中,因此把它放在这里。 AMD 围绕 OpenCL 的 C++ 库包括 static C++ libraryBolt

【讨论】:

  • 这不是我想要的,而是一个好主意。谢谢!这真的值得考虑,我会做的。目标是为程序提供一个 C++ 类,使其灵活且易于使用。理解 C++ 类(函数和数据相结合)的情况会很直观,所以我更喜欢这样的解决方案。不过你还是为我打开了一扇门,谢谢!
  • @EliBendersky:谢谢。已编辑! :)
  • @ViteFalcon:链接到官方文档?
  • @einpoklum:Google 是你最好的朋友 :) ... 但如果你发现它很难发现,那就去khronos.org/registry/cl/sdk/1.2/docs/man/xhtml
  • @einpoklum 因为 OpenCL 不支持 C++。这条评论是关于如何绕过它的想法。没有官方文档AFAIK。如果您询问 AMD 的 C++ 版本,您可以搜索他们的网站。当时,他们的网站上有一篇关于这方面的文章。
【解决方案2】:

没有。 OpenCL 语言扩展了 C99,因此不支持 C++ 关键字和功能,例如“班级”。

如果您要应用的代码既是 C++ 又是 OpenCL,即在两者的共同子集中,您可能会有类似于

element update(element in) { ... ; return result; }

并根据需要在 OpenCL 或 C++ 中调用它,例如

output[index] = update(input[index]);

前提是元素是一个结构体,而不是非 C 类型的字段。

通常,OpenCL 的输入和输出必须是简单的结构或数组,而不是类。

【讨论】:

  • 好的。这支持我得到的第一个答案。 C99 是这里的限制......但正如你所写的,这对我来说一定不是限制。谢谢你让我深思。
【解决方案3】:

不,其他人告诉你 OpenCL 基于 C99,因此你可以使用像

这样的结构
typedef struct{
   float mini;
   int pos;
}A;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多