簡體   English   中英

VexCL,Thrust和Boost.Compute之間的差異

[英]Differences between VexCL, Thrust, and Boost.Compute

通過對這些庫的粗略理解,它們看起來非常相似。 我知道VexCL和Boost.Compute使用OpenCl作為后端(盡管v1.0版本VexCL也支持CUDA作為后端)並且Thrust使用CUDA。 除了不同的后端,這些之間的區別是什么。

具體來說,他們解決了什么問題空間,為什么我要使用其中一個。

另外,在Thrust常見問題解答中說明了這一點

OpenCL支持的主要障礙是缺少OpenCL編譯器和運行時支持C ++模板

如果是這種情況,VexCL和Boost.Compute怎么可能存在。

我是VexCL的開發者,但我真的很喜歡Boost.Compute的作者Kyle LutzBoost郵件列表上對同一主題所說的話。 簡而言之,從用戶的角度來看, Thrust ,Boost.Compute,AMD的Bolt和可能的Microsoft的C ++ AMP都實現了類似STL的API,而VexCL是一個基於表達式模板的庫,本質上更接近Eigen 我相信類似STL的庫之間的主要區別在於它們的可移植性:

  1. Thrust僅支持NVIDIA GPU,但也可以通過其OpenMP和TBB后端在CPU上運行。
  2. Bolt使用AMD對OpenCL的擴展,這些擴展僅在AMD GPU上可用。 它還提供Microsoft C ++ AMP和Intel TBB后端。
  3. 唯一支持Microsoft C ++ AMP的編譯器是Microsoft Visual C ++(盡管正在開展關於使用C ++ AMP超越Windows的工作)。
  4. Boost.Compute似乎是最便攜的解決方案,因為它基於標准的OpenCL。

同樣,所有這些庫都試圖實現類似STL的接口,因此它們具有非常廣泛的適用性。 VexCL的開發考慮了科學計算。 如果Boost.Compute的開發時間稍早,我可能會將VexCL建立在它之上:)。 另一個值得關注的科學計算庫是ViennaCL ,這是一個免費的開源線性代數庫,用於計算多核架構(GPU,MIC)和多核CPU。 看看[1]比較VexCL,ViennaCL,CMTL4和Thrust對於該領域。

關於Thrust開發人員引用無法添加OpenCL后端:Thrust,VexCL和Boost.Compute(我不熟悉其他庫的內部)都使用元編程技術來完成他們的工作。 但是由於CUDA支持C ++模板,Thrust開發人員的工作可能更容易一些:他們必須編寫在C ++編譯器的幫助下生成CUDA程序的元程序。 VexCL和Boost.Compute作者編寫元程序,生成生成OpenCL源代碼的程序。 看一下我試圖解釋VexCL如何實現的幻燈片 所以我同意當前Thrust的設計禁止他們添加OpenCL后端。

[1] Denis Demidov,Karsten Ahnert,Karl Rupp,Peter Gottschling, 編程CUDA和OpenCL:使用現代C ++庫的案例研究 ,SIAM J. Sci。 Comput。,35(5),C453-C472。 (也提供arXiv版本 )。

更新:@gnzlbg評論說在基於OpenCL的庫中不支持C ++仿函數和lambda。 事實上,OpenCL基於C99,並且是在運行時從存儲在字符串中的源代碼編譯的,因此沒有簡單的方法可以與C ++類完全交互。 但公平地說,基於OpenCL的庫確實在某種程度上支持基於用戶的功能甚至lambda。

話雖如此,基於CUDA的庫(可能是C ++ AMP)具有實際編譯時編譯器的明顯優勢(你甚至可以這么說嗎?),因此與用戶代碼的集成可以更加緊密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM