OpenCL編程指南

CL與PyOpen CL、Open CL33320.1PyOpen

內容介紹

OpenCL領域公認的權威著作,由OpenCL核心設計人員親自執筆,不僅全面而深刻地解讀了OpenCL規範和編程模型,而且通過大量案例和代碼演示了基於OpenCL編寫並行程式和實現各種並行算法的原理、方法、流程和最佳實踐,以及如何對OpenCL進行性能最佳化,如何對硬體進行探測和調整。
本書分為兩大部分:第一部分(1~13章),從介紹OpenCL的核心思想和編寫OpenCL程式的基礎知識開始,對枯燥的OpenCL規範進行了深刻而系統的解讀,旨在幫助讀者全面、正確地理解OpenCL規範及其編程模型;第二部分(14~22章),提供了一系列經典的案例,如圖像直方圖、Sobel邊界檢測過濾器、並行實現Dijkstra單源最短路徑圖算法、Bullet Physics SDK中的布模擬、用快速傅立葉變換模擬海洋、光流、OpenCL與PyOpenCL結合使用,使用OpenCL完成矩陣相乘與稀疏矩陣矢量乘法等,目的是讓讀者通過案例熟練掌握編寫複雜並行程式的方法和技巧。本書的附錄收錄了OpenCL規範定義的大量函式、命名常量和類型,可供程式設計師開發時查閱。

作者介紹

Aaftab Munshi,OpenCL核心設計小組的靈魂人物之一,同時他也是OpenCL、OpenGL ES 1.1、OpenGL ES 2.0規範的編輯,與Dan Ginsburg和Dave Shreiner合著了《OpenGL ES 2.0 Programming Guide》。目前他任職於Apple公司。
Benedict R. Gaster,資深軟體架構師,他的主要工作是為下一代異構處理器開發編程模型,具體工作是在包含CPU和加速器的新興處理器(如GPU)上探索並行編程的高層抽象。他為OpenCL的設計做出了巨大貢獻,在Khronos Group開放標準協會中他是AMD的代表。由於他在可擴展記錄和變數的類型系統方面成績卓著,因而獲得了計算機科學的博士學位。
Timothy G. Mattson,資深並行編程專家,從20世紀80年代中期開始從事相關工作,一直持續到現在。在此期間,他使用過各種類型的並行計算機(矢量超級計算機、SMP、VLIW、NUMA、MPP、集群和多核處理器)。1993年加入Intel公司,專注於OpenCL相關技術的研究。他還是一位資深的技術作家,參與撰寫了《Patterns for Parallel Programming》、《An Introduction to Concurrency in Programming Languages》等經典著作。他因自己在分子分散理論方面的工作獲得化學博士學位。
James Fung,NVIDIA資深技術工程師,專注於圖形硬體上的計算機視覺和圖像處理的研究,已經從圖形發展到通用計算,經驗十分豐富。擁有多倫多大學的電子與計算機工程博士學位,在並行GPU計算機視覺和介導現實領域發表過多篇IEEE和ACM論文。
Dan Ginsburg,資深OpenGL和OpenCL專家,曾經在AMD工作8年,是AMD技術部的高級成員,承擔過多種工作,包括開發OpenGL驅動程式、創建桌面和手持3D演示套用,以及領導手持GPU開發工具的開發。他還曾在Still River Systems工作,為Monarch 250質子束放射線治療系統開發GPU加速圖像註冊軟體。目前在Boston兒童醫院的新生兒神經影像和開發科學中心擔任首席軟體架構師,致力於使用OpenCL來提高神經影像算法的速度。他擁有Worcester Polytechnic學院的計算機科學學士學位和Bentley大學的MBA學位。

作品目錄

譯者序

前言
致謝
第一部分 OpenCL 1.1語言與API
第1章 OpenCL介紹2
1.1 什麼是OpenCL,或者為什麼需要這本書2
1.2 多核的未來:異構平台2
1.3 多核世界中的軟體4
1.4 OpenCL的概念基礎7
1.4.1 平台模型7
1.4.2 執行模型8
1.4.3 記憶體模型13
1.4.4 編程模型15
1.5 OpenCL與圖形18
1.6 OpenCL的內容19
1.6.1 平台API19
1.6.2 運行時API20
1.6.3 核心程式語言20
1.6.4 OpenCL小結22
1.7 嵌入式簡檔22
1.8 學習OpenCL23
第2章 HelloWorld:一個OpenCL例子24
2.1 構建示例24
2.1.1 必備條件25
2.1.2 Mac OS X與Code::Blocks25
2.1.3 Microsoft Windows與Visual Studio26
2.1.4 Linux與Eclipse28
2.2 HelloWorld示例29
2.2.1 選擇OpenCL平台並創建一個上下文31
2.2.2 選擇設備並創建命令佇列33
2.2.3 創建和構建程式對象34
2.2.4 創建核心和記憶體對象36
2.2.5 執行核心37
2.3 檢查OpenCL中的錯誤39
第3章 平台、上下文和設備41
3.1 OpenCL平台41
3.2 OpenCL設備44
3.3 OpenCL上下文53
第4章 OpenCL C編程64
4.1 使用OpenCL C編寫數據並行核心64
4.2 標量數據類型65
4.3 矢量數據類型67
4.3.1 矢量字面量68
4.3.2 矢量分量69
4.4 其他數據類型71
4.5 衍生類型71
4.6 隱式類型轉換72
4.7 顯式強制類型轉換76
4.8 顯式轉換77
4.9 將數據重新解釋為另一種類型80
4.10 矢量操作符82
4.10.1 算術操作符83
4.10.2 關係和相等操作符84
4.10.3 位操作符85
4.10.4 邏輯操作符85
4.10.5 條件操作符86
4.10.6 移位操作符86
4.10.7 一元操作符87
4.10.8 賦值操作符88
4.11 限定符89
4.11.1 函式限定符89
4.11.2 核心屬性限定符90
4.11.3 地址空間限定符91
4.11.4 訪問限定符94
4.11.5 類型限定符95
4.12 關鍵字95
4.13 預處理器指令和宏96
4.13.1 pragma指令97
4.13.2 宏98
4.14 限制99
第5章 OpenCL C內置函式101
5.1 工作項函式101
5.2 數學函式103
5.2.1 浮點pragma107
5.2.2 浮點常量108
5.2.3 相對誤差作為ulp108
5.3 整數函式111
5.4 公共函式113
5.5 幾何函式115
5.6 關係函式116
5.7 矢量數據載入和存儲函式119
5.8 同步函式124
5.9 異步複製和預取函式125
5.10 原子函式127
5.11 雜項矢量函式130
5.12 圖像讀、寫函式131
5.12.1 讀圖像132
5.12.2 採樣器134
5.12.3 確定邊界顏色137
5.12.4 寫圖像137
5.12.5 查詢圖像信息138
第6章 程式與核心140
6.1 程式和核心對象概述140
6.2 程式對象140
6.2.1 創建和構建程式141
6.2.2 程式構建選項143
6.2.3 由二進制碼創建程式145
6.2.4 管理和查詢程式153
6.3 核心對象153
6.3.1 創建核心對象和設定核心參數153
6.3.2 執行緒安全性156
6.3.3 管理和查詢核心157
第7章 緩衝區和子緩衝區159
7.1 記憶體對象、緩衝區和子緩衝區概述159
7.2 創建緩衝區和子緩衝區160
7.3 查詢緩衝區和子緩衝區166
7.4 讀、寫和複製緩衝區和子緩衝區167
7.5 映射緩衝區和子緩衝區180
第8章 圖像和採樣器183
8.1 圖像和採樣器對象183
8.2 創建圖像對象184
8.2.1 圖像格式187
8.2.2 查詢圖像支持189
8.3 創建採樣器對象189
8.4 處理圖像的OpenCL C函式192
8.5 傳輸圖像對象194
第9章 事件201
9.1 命令、佇列和事件概述201
9.2 事件和命令佇列202
9.3 事件對象206
9.4 宿主機上生成事件208
9.5 影響宿主機上執行的事件209
9.6 使用事件完成評測212
9.7 核心中的事件216
9.8 OpenCL外部的事件217
第10章 與OpenGL的互操作218
10.1 OpenCL/OpenGL共享概述218
10.2 查詢OpenGL共享擴展218
10.3 初始化OpenCL上下文實現OpenGL互操作220
10.4 從OpenGL緩衝區創建OpenCL緩衝區221
10.5 由OpenGL紋理創建OpenCL圖像對象225
10.6 查詢OpenGL對象的信息226
10.7 OpenGL和OpenCL之間的同步227
第11章 與Direct3D的互操作230
11.1 Direct3D/OpenCL共享概述230
11.2 初始化OpenCL上下文實現Direct3D互操作230
11.3 從Direct3D緩衝區和紋理創建OpenCL記憶體對象233
11.4 OpenCL中獲取和釋放Direct3D對象236
11.5 OpenCL中處理Direct3D紋理237
11.6 OpenCL中處理D3D頂點數據240
第12章 C++包裝器API242
12.1 C++包裝器API概述242
12.2 C++包裝器API異常244
12.3 使用C++包裝器API的矢量相加示例246
12.3.1 選擇OpenCL平台並創建一個上下文246
12.3.2 選擇一個設備並創建命令佇列246
12.3.3 創建和構建程式對象247
12.3.4 創建核心和記憶體對象248
12.3.5 執行矢量相加核心248
第13章 OpenCL嵌入式簡檔253
13.1 OpenCL簡檔概述253
13.2 64位整數254
13.3 圖像255
13.4 內置原子函式256
13.5 強制最小單精度數浮點能力256
13.6 OpenCL C程式中確定設備支持的簡檔258
第二部分 OpenCL 1.1案例研究
第14章 圖像直方圖260
14.1 計算圖像直方圖260
14.2 並行實現圖像直方圖261
14.3 對並行圖像直方圖的最佳化266
14.4 每個通道使用半浮點或浮點值計算直方圖268
第15章 Sobel邊界檢測過濾器272
15.1 什麼是Sobel邊界檢測過濾器272
15.2 實現Sobel過濾器作為OpenCL核心272
第16章 並行實現Dijkstra單源最短路徑圖算法276
16.1 圖數據結構276
16.2 核心278
16.3 利用多個計算設備281
第17章 Bullet Physics SDK中的布模擬286
17.1 布模擬介紹286
17.2 模擬柔軟物體288
17.3 CPU上執行模擬290
17.4 實現基本GPU執行所需要的修改291
17.5 兩層分批296
17.6 SIMD計算和局部記憶體最佳化298
17.7 增加OpenGL互操作302
第18章 用快速傅立葉變換模擬海洋305
18.1 Ocean應用程式概述305
18.2 Phillips頻譜生成308
18.3 OpenCL離散傅立葉變換311
18.3.1 確定2D分解311
18.3.2 使用局部記憶體312
18.3.3 確定子變換大小313
18.3.4 確定工作組大小314
18.3.5 得到旋轉因子314
18.3.6 確定需要多少局部記憶體314
18.3.7 避免局部記憶體庫衝突315
18.3.8 使用圖像315
18.4 詳細分析FFT核心315
18.5 詳細分析轉置核心318
第19章 光流320
19.1 光流問題概述320
19.2 用硬體線性插值提供亞像素精度328
19.3 紋理快取的套用329
19.4 使用局部記憶體329
19.5 提前退出和硬體調度331
19.6 利用OpenGL互操作實現高效可視化331
19.7 性能332
第20章 用PyOpenCL使用OpenCL333
20.1 PyOpenCL介紹333
20.2 運行PyImageFilter2D示例333
20.3 PyImageFilter2D代碼334
20.4 上下文和命令佇列創建337
20.5 載入到圖像對象338
20.6 創建和構建程式339
20.7 設定核心參數和執行核心340
20.8 讀取結果340
第21章 使用OpenCL完成矩陣乘法342
21.1 基本矩陣乘法算法342
21.2 直接轉換到OpenCL343
21.3 增加每個核心的工作量347
21.4 最佳化記憶體移動:局部記憶體350
21.5 性能結果和最佳化原來的CPU代碼352
第22章 稀疏矩陣矢量乘法354
22.1 稀疏矩陣矢量乘法算法354
22.2 實現描述355
22.3 分塊和分組稀疏矩陣表示357
22.4 首部結構359
22.5 分塊分組稀疏矩陣設計考慮359
22.6 可選的組信息360
22.7 測試的硬體設備和結果360
22.8 其他最佳化領域372
附錄A OpenCL 1.1小結373

相關詞條

相關搜尋

熱門詞條

聯絡我們