2012-12-09 71 views
1

目前我正在嘗試在OpenCL中的一些項目上工作,以瞭解它的工作原理以及它如何幫助我更快地進行計算。互聯網上的大多數教程都建議使用cl :: vector而不是std :: vector。爲什麼要用cl :: vector?

爲什麼?

它們之間的區別以及爲什麼cl :: vector更適合OpenCL開發?

+0

這可能會幫助你:http://stackoverflow.com/questions/9081956/clvector-vs-stdvector-different-iterator-behaviour – Maroun

+0

@MarounMaroun我實際上發現它之前問,但它只是聲明迭代器行爲是不同,不解答爲什麼。 – UldisK

回答

1

OpenCL C++ specs提及這在第5(第60頁):

雖然C++的標準模板庫提供一個很好的資源 ,以便快速訪問許多有用的算法和容器時,通常是 由於不使用除其他原因之外,跨不同工具鏈和操作系統的兼容性問題。 OpenCL C++ API在很多地方使用 向量和字符串,默認情況下將使用 std :: vector和std :: string,但是,開發人員有能力不包含這些以及 。

的C++ API提供了用於兩個替換的std ::矢量 (CL ::矢量)和std ::串(CL ::字符串)或顯影劑具有 選項以使用自己的實現。

因此,似乎這些標準C++類型的各種實現之間存在兼容性問題,因此OpenCL提供了自己的類型,這些類型已知可用於OpenCL需要的類型。

但是請注意,默認情況下OpenCL支持標準的C++類型;要使用cl :: vector和cl :: string,您必須定義宏__NO_STD_VECTOR和/或__NO_STD_STRING。這兩種替換類型可能不適用於非OpenCL代碼,因爲它們提供了減少的功能。示例:我理解它的方式,默認情況下,cl :: vector僅限於10個元素,無法將其重新調整大小。我的linux機器上的一個快速測試實際上默默無法push_back()超過10個元素到cl :: vector對象。這非常可怕。

不幸的是,我找不到有關哪些工具鏈確切地導致這些問題的更多細節。我只是開始做OpenCL工作,所以我還不能從我的經驗中發表意見。但我會嘗試儘可能使用標準std :: vector,並避免使用不好的工具鏈。

0

這兩個類都很相似。 cl::vector不實現resize, reserve, insert, erase or swap(至少在OpenCL 1.1中)。 因此,如果您需要這些功能之一,則必須使用std::vector

相關問題