2011-10-10 92 views
0

聲明:作者在C/C++初學者級別。爲什麼一些OpenCL示例用C++編寫而不是C?

維基百科說,「OpenCL包括用於編寫內核的語言(基於C99)」。但是如果你看一下OpenCL編程指南書中的任何代碼示例,你會發現除了內核.cl文件之外,總是有一個.cpp文件(甚至很少)。

(「儘管許多在本 本書描述的示例應用程序都使用了C++編程語言開發的,我們有 上的OpenCL C API完全集中控制的OpenCL 組成部分。」)

不這意味着內核是用C語言編寫的,而所有其他的東西(如內存對象管理)是用C++編寫的?爲什麼一切都不是用C語言寫的? C++綁定不會引入開銷嗎?

+0

爲什麼?因爲他們可以,顯然。從C++調用C API沒有任何開銷。即使P /從.NET調用C API的開銷也很小。 –

回答

6

這是否意味着內核是用C語言編寫的,而所有其他的東西(如內存對象管理)是用C++寫的?

OpenCL本身是C99的擴展,所以.cl文件是寫在那。你必須檢查C++文件中的內容以查看它們的實現。

爲什麼一切都不是用C語言編寫的?

作者可能會發現C++更方便。

C++綁定不會引入開銷嗎?

不,因爲在C++語言標準中定義的C/C++橋可以實際上實現零開銷。它可能取決於編譯器,但通常,當您從C++調用C函數時,它與從C調用函數一樣便宜.C++本身遵循C的「零開銷」原則:它的高級(與C相比)特性不是沒有空閒,但你不支付你不使用的東西。

1

C++綁定可能會引入一個小的開銷,但它在CPU端。請記住,這些示例用作教程。沒有什麼能阻止你用C編寫你的代碼。我猜想用C++編寫示例應用程序更容易,因爲使用更高級別的語言可以讓讀者更容易地看到重要的細節,而不會被淹沒在低級別的內存管理使C代碼變得無效。

2

這是否意味着內核是用C語言編寫的,而所有其他東西(如內存對象管理)都是用C++編寫的?

OpenCL的有兩個部分:

  • 一種用於編寫內核的語言。內核在GPU或equivilent上運行。
  • API允許運行在普通CPU上的程序詢問系統運行內核。

使用OpenCL API的程序可以用任何可以調用C API的語言編寫。可能是C,C++,Java,Python,Ruby或其他任何可以對C庫進行函數調用的東西。

爲什麼一切都不是用C語言編寫的?

...因爲該語言是專門爲編寫內核而設計的。你不能寫一個通用程序。

1

從主機代碼調用內核。內核用OpenCL編寫,而主機代碼可以用任何其他語言編寫,只要存在用於從主機代碼調用OpenCL的綁定。 C++是宿主代碼的流行選擇,但我看到了對其他語言(如C#和FORTRAN)的引用。

相關問題