免责声明:作者处于C / C ++的初级阶段。
维基百科说“OpenCL包含一种用于编写内核的语言(基于C99)”。
但是,如果你看一下OpenCL编程指南书中的任何代码示例,你会发现除了内核.cl文件外,总会有一个.cpp文件(甚至很少)。
(“尽管在此描述了许多示例应用程序 我们已经使用C ++编程语言开发了本书 专注于OpenCL C API来控制OpenCL 成分“。)
这是否意味着内核是用类C语言编写的,而所有其他内容(如内存对象管理)都是用C ++编写的?为什么一切都不是用C语言编写的? C ++绑定不会引入开销吗?
答案 0 :(得分:6)
这是否意味着内核是用类似C语言编写的,而所有其他内容(如内存对象管理)都是用C ++编写的?
OpenCL本身是C99的扩展,因此.cl
文件就是用它来编写的。你必须检查C ++文件中的内容,看看它们中实现了什么。
为什么一切都不是用C语言编写的?
作者可能会发现C ++更方便。
C ++绑定不会引入开销吗?
不,因为C ++语言标准中定义的C / C ++桥可以实现几乎零开销。它可能取决于编译器,但通常,当你从C ++调用C函数时,它就像从C调用函数一样便宜.C ++本身遵循C的“零开销”理念:它的高级(与C相比)特征是没有钱,但是你没有为你不使用的东西买单。
答案 1 :(得分:2)
C ++绑定可能会带来很小的开销,但它在CPU端。请记住,这些示例可作为教程。没有什么可以阻止你用C编写代码。我猜想用C ++编写示例应用程序更容易,因为使用更高级别的语言可以让读者更容易地看到重要的细节,而不是被淹没在低级内存管理会破坏C代码。
答案 2 :(得分:2)
这是否意味着内核是用类C语言编写的,而所有其他内容(如内存对象管理)都是用C ++编写的?
OpenCL有两部分:
使用OpenCL API的程序可以用任何可以调用C API的语言编写。可能是C,C ++,Java,Python,Ruby或其他任何可以对C库进行函数调用的东西。
为什么一切都不是用C语言编写的?
...因为该语言专门用于编写内核。你不能在其中写一个通用程序。
答案 3 :(得分:1)
从主机代码调用内核。内核是用OpenCL编写的,而主机代码可以用任何其他语言编写,前提是存在从主机代码调用OpenCL的绑定。 C ++是主机代码的流行选择,但我看过其他语言的引用,如C#和FORTRAN。