天天看點

《OpenCL實戰》一 導讀

《OpenCL實戰》一 導讀

opencl實戰

1997年的夏天,我被震驚了。除了能在自己的專業(微電子工程)做實習生,我所能找到的最好的工作就是在一個專門研究高速信号處理的實驗室做事,負責用c和mpi(message passing interface,消息傳遞接口)程式設計實作二維快速傅裡葉變換(fast fourier transform,fft)。好消息是這個實驗室有16台新的sparc計算機,壞消息是我對mpi和fft一無所知。

在當時還是新奇古怪的amazon.com上,我購買了一些相關書籍,然後才費力弄清楚mpi的基本處理過程:應用程式将一系列指令部署到多台計算機上,每台計算機根據它的id通路資料。在每台處理器完成相應的任務之後,将結果傳回給id為0的處理器。

又過了些日子,我才對mpi有了更進一步的認識(阻塞和非阻塞資料傳輸,同步和異步通信)。在程式設計學習過程中,我發現自己愛上了分布式計算。我喜歡16台龐然大物鎖步處理資料,它們就像是同場競賽的運動員。我感覺自己就像是一名編舞,悉心策劃一出精彩的舞蹈演出,亦或是一名作曲家,為整個樂團創作交響樂。實習結束時,我已經能用mpi編寫出多個版本的二維快速傅裡葉變換了,但最後因為網絡延時的關系,實驗室的研究人員否決了這個不太可行的方案。

那個暑假之後,我就對高性能計算傾注了極大的熱情,全心投身于數字信号處理器、fpga(field-programmable gate arrays,現場可程式設計門陣列)以及cell處理器(它可是sony ps3的“大腦”)的應用之中。但我想說的是,所有這些都不能夠替代用opencl對gpu(graphics processing unit,圖像處理單元)的程式設計體驗。現在的超級計算機設計也已經說明,沒有哪塊cpu可以提供和gpu相并論的“計算處理能力/功耗”的性能。同時,也沒有哪門語言能夠像opencl一樣,得到如此廣泛的裝置支援。

當amd在2009年釋出它的opencl開發工具時,我就已經愛上了opencl。不僅僅是因為opencl能提供新的資料類型(向量資料類型)以及衆多的數學函數,還因為它在很多方面都和mpi很像。兩個工具集都免費、開源,也都可以用c或c++來編寫應用程式。同時,應用程式也都是将指令發送到多個裝置上,其中處理單元根據id來确定通路相應的資料。mpi和opencl也都允許使用相似的阻塞/非阻塞傳輸和同步/異步通信來進行資料傳輸。

opencl在高性能計算領域還很新,也許很多程式員都還不知道它的存在。是以,為了幫助擴大這門語言的影響,我決定編寫opencl in action這本書。我很享受寫書的過程,也希望它能幫助初學者了解、認識opencl和分布式計算。

在2011年的夏天,我開始寫作此書的時候,我不禁有種周而複始的感覺。昨天晚上,我将本書收官在第14章的fft應用程式上。它讓我回想起了和mpi打交道的日子,但我還是驚訝于這些年的技術變遷。1997年,我實驗裡的16台sparc機器花了将近1分鐘的時間才完成32k fft的運算。而到了2011年,300美元的顯示卡就能在幾秒之内完成上百萬個資料點的fft變換。

技術在變化,但是程式設計的樂趣不變。也許現如今,分布式計算的學習曲線越來越陡,但回報的甘饴,而非補償,也勝過以往。

前言

關于本書

緻謝

第一部分 opencl程式設計基礎

第1章 opencl簡介

第2章 主機程式設計:基本的資料結構

第3章 主機程式設計:資料傳輸和資料劃分

第4章 核心程式設計:資料類型和裝置記憶體

第5章 核心程式設計:運算符和函數

第6章 圖像處理

第7章 事件、性能分析及同步化

第8章 用c++開發

第9章 用java和python來開發

第10章 通用程式設計原則

第二部分 用opencl來程式設計實作實際的算法

第11章 歸并與排序

第12章 矩陣和qr分解

第13章 稀疏矩陣

第14章 信号處理和快速傅裡葉變換

第三部分 用opencl來加速opengl

第15章 将opencl和opengl結合

第16章 紋理和渲染緩存

附錄a 安裝和使用軟體開發包

附錄b 用opengl作實時渲染

附錄c 面向windows和opencl的最簡gnu

附錄d appendix d移動裝置上的opencl

繼續閱讀