零基礎學習OpenCL,有哪些好的建議?
課題需要學習OpenCL,但是之前完全沒有接觸過這些東西,拿了一本OpenCL編程指南來看,第一章沒看完就陣亡了,太多沒接觸的概念,一個一個百度可還是不太明白。。。求有經驗的前輩指教,應該怎麼學起,怎麼快速掌握基本的概念,而不是每個字我都認識可就是看不懂是什麼意思,暈@_@。。。越詳細越好,最好有推薦的資料,謝謝!
我不會OpenCL啊。
我以為group_id local_id什麼的就代表分塊,kernel里就寫最簡單的 計算 就好了,然而別人的代碼都不是這麼寫的,而是這樣
for(;;){
複製到local
barrier
計算
barrier
複製到輸出
}
真心看不懂
GPU計算優化的原理是什麼? - GPU 通用計算先找一本opencl的基礎書過一遍基本語法,理解gpu做並行運算的基本原理。張雲泉翻譯那本白皮或者munshi那本經典綠皮就夠了。
接下來就是看大量實例,裝一下amd app sdk或者intel opencl sdk,裝完裡面有example目錄,很多例子,比如矩陣乘法,,向量加法,sobel濾波,dct等等很多例子,看懂別人的,然後嘗試自己重新編一遍。用codexl做performamce對比,體會opencl的一些基本原理,比如work group size大小啊,wavefront之類。
在有了一定基礎之後,書就不用看了,直接看opencl spec,畢竟書內容沒有spec更新快。上github上找程序,大規模的,比如如果用opencl實現一個cnn加速,讀程序,跑程序,做performamnce對比評估。既然用gpu進行計算,最終目的肯定是加速,因此時刻要把性能優化放在首位。如果你是用opencl做fpga計算,那資源也很重要。其實和學習任何一門編程語言一樣,多讀好的程序,然後動手模仿,是入門最好最快的方法。如果你對計算機體系結構沒有任何概念,比如對cache,pipeline不理解,那最好還是先補一補計算機基礎知識。推薦peterson那本經典書籍。OpenCL入門還是比較容易的,只要有C語言基礎就可以快速上手了~
推薦《OpenCL實戰》一書。
首先當然是從向量加法的並行化或者矩陣乘法的kernel代碼來作為你的第一個例子,這裡理解並行化的思想非常重要,並行化的編程模型把多核設備的計算單元抽象化,不用關心你的計算設備在物理上有多少個計算單元,而只要在邏輯上劃分成你需要的任意多個計算單元即可(這裡也就是global_size),從邏輯上的多核到物理上多核的映射由編譯器完成,這也就是多核編程非常方便的原因所在。
此間,了解platform/context/device/queue之間的依賴關係,你的OpenCL代碼是打包為一個個kernel在多核設備上以隊列的形式挨個運行
練習的過程中請固定一塊計算卡,不要更換你的設備,當然一般的GPU或者CPU都支持OpenCL
OpenCL相對於CUDA來說封裝了更多的硬體細節,所以對硬體架構不需要做深入的了解,但還需要知道向量化、local memory、網格劃分(也就是local size的劃分)這些基本概念,在並行化編程中對這些具體細節的調優會給你帶來性能上顯著的提升
更核心的東西依然是演算法,了解演算法的細節以窺探演算法中可並行化的部分是哪些,如何靈活的應用數據並行和任務並行,做到演算法的最大加速和內存壓榨,才是OpenCL編程需要解決的核心問題
你用百度當然不明白了 用Google拿英語查
OpenCL沒啥用,不如學CUDA。
推薦閱讀:
※蕭井陌(蕭大)的編程入門指南,你在實踐指南過程中遇到了哪些困難與瓶頸?
※學編程的話,譚浩強的c教材學完,接下來怎麼辦?求推薦(偏硬)?
※怎麼學習golang?
※Visual Studio 2013 怎樣新建 Windows Phone 8 項目?
※寢室五人準備買衛衣,我們想每個人的衣服上都印上一小段代碼的,低調有內涵的那種。?