为什么有些OpenCL示例用C ++而不是C语言编写?

时间:2011-10-10 10:50:20

标签: c++ c opencl

免责声明:作者处于C / C ++的初级阶段。

维基百科说“OpenCL包含一种用于编写内核的语言(基于C99)”。

但是,如果你看一下OpenCL编程指南书中的任何代码示例,你会发现除了内核.cl文件外,总会有一个.cpp文件(甚至很少)。

(“尽管在此描述了许多示例应用程序 我们已经使用C ++编程语言开发了本书 专注于OpenCL C API来控制OpenCL 成分“。)

这是否意味着内核是用类C语言编写的,而所有其他内容(如内存对象管理)都是用C ++编写的?为什么一切都不是用C语言编写的? C ++绑定不会引入开销吗?

4 个答案:

答案 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有两部分:

  • 用于编写内核的语言。内核在GPU上运行或等效。
  • 允许在普通CPU上运行的程序要求系统运行内核的API。

使用OpenCL API的程序可以用任何可以调用C API的语言编写。可能是C,C ++,Java,Python,Ruby或其他任何可以对C库进行函数调用的东西。

  

为什么一切都不是用C语言编写的?

...因为该语言专门用于编写内核。你不能在其中写一个通用程序。

答案 3 :(得分:1)

从主机代码调用内核。内核是用OpenCL编写的,而主机代码可以用任何其他语言编写,前提是存在从主机代码调用OpenCL的绑定。 C ++是主机代码的流行选择,但我看过其他语言的引用,如C#和FORTRAN。