目 錄 Contents
序一
序二
前言
第1章 異構并行計算的過去、現狀和未來 1
1.1 單核標量處理器的困境 3
1.1.1 單核標量處理器如何提高性能4
1.1.2 為什么單核標量處理器性能到達瓶頸6
1.2 多核并行計算與向量化的出現7
1.2.1 為什么會有多核 7
1.2.2 為什么會有向量化 7
1.2.3 如何利用多核和向量化的能力8
1.2.4 多核和向量化的難點8
1.3 異構并行計算的崛起 9
1.3.1 GPGPU的理念 9
1.3.2 CUDA的崛起 10
1.3.3 OpenCL橫空出世 10
1.4 異構并行計算的未來(百花齊放)11
1.5 本章小結 13
第2章 OpenCL的基本介紹 14
2.1 什么是OpenCL 14
2.2 OpenCL 平臺模型 15
2.3 OpenCL 執行模型 15
2.3.1 上下文 16
2.3.2 命令隊列 17
2.3.3 內核在OpenCL設備上執行 18
2.4 OpenCL存儲器模型 19
2.4.1 存儲器區域 19
2.4.2 存儲器對象 21
2.4.3 共享虛擬存儲器 21
2.5 OpenCL與OpenGL 22
2.6 OpenCL與CUDA 23
2.7 本章小結 23
第3章 進入OpenCL的世界(矢量加法) 25
3.1 構建示例 25
3.1.1 Windows平臺 26
3.1.2 Linux平臺 28
3.1.3 OS X平臺 28
3.1.4 矢量加示例 29
3.2 獲得OpenCL平臺和設備及其屬性 36
3.2.1 OpenCL平臺 36
3.2.2 OpenCL設備 40
3.3 創建上下文和命令隊列51
3.3.1 創建OpenCL上下文 51
3.3.2 創建命令隊列 56
3.4 創建程序對象和內核對象58
3.5 程序對象 59
3.5.1 創建程序對象 59
3.5.2 構建程序對象 61
3.5.3 查詢和管理程序對象66
3.6 內核對象 69
3.6.1 創建內核對象 69
3.6.2 設置內核參數 70
3.6.3 查詢和管理內核對象73
3.7 執行內核 75
3.8 編寫內核代碼 76
3.9 OpenCL錯誤處理 78
3.10 本章小結 81
第4章 OpenCL C語言 82
4.1 修飾符 82
4.1.1 地址空間修飾符 82
4.1.2 函數修飾符 86
4.1.3 對象訪問修飾符 88
4.2 標量數據類型 88
4.3 矢量數據類型 91
4.3.1 為什么要有矢量數據類型92
4.3.2 矢量數據的使用 93
4.4 運算符 96
4.5 工作項布局函數 99
4.5.1 維度和工作項 100
4.5.2 工作組 101
4.6 數據拷貝操作 102
4.6.1 矢量數據拷貝 102
4.6.2 異步拷貝和預取104
4.7 浮點函數 105
4.7.1 數學函數 106
4.7.2 公共函數 109
4.7.3 幾何函數 110
4.8 整數函數 110
4.9 關系函數 112
4.10 雜項矢量函數 115
4.11 同步函數 117
4.12 原子函數 119
4.13 圖像讀/寫函數 122
4.13.1 內建圖像讀函數122
4.13.2 內建無采樣器圖像讀 函數126
4.13.3 內建圖像寫函數129
4.13.4 內建圖像查詢函數131
4.14 工作組函數 132
4.15 管道函數 134
4.15.1 內建管道讀/寫函數 135
4.15.2 內建工作組管道讀/寫函數 139
4.15.3 內建管道查詢函數140
4.16 設備隊列 140
4.16.1 Blocks語法 142
4.16.2 設備隊列相關函數143
4.16.3 子內核存儲器可見性147
4.16.4 設備隊列的使用示例148
4.17 本章小結 153
第5章 OpenCL存儲器對象 154
5.1 緩沖區 154
5.1.1 分配緩沖區對象154
5.1.2 創建子緩沖區對象157
5.2 圖像對象和采樣器對象160
5.2.1 圖像對象 160
5.2.2 采樣器對象 166
5.2.3 圖像旋轉示例 171
5.3 管道 175
5.3.1 創建管道對象 175
5.3.2 管道對象查詢 175
5.4 存儲器對象數據傳輸176
5.4.1 主機與設備間數據傳輸176
5.4.2 存儲器對象數據填充181
5.4.3 存儲器對象間數據傳輸184
5.4.4 存儲器對象映射187
5.5 共享虛擬存儲器 192
5.5.1 SVM緩沖操作 192
5.5.2 SVM類型和特性 197
5.5.3 相關示例 204
5.6 存儲器一致性模型 208
5.6.1 存儲器次序規則214
5.6.2 原子操作的存儲器次序規則217
5.6.3 柵欄操作的存儲器次序規則219
5.6.4 工作組函數的存儲器次序規則220
5.6.5 主機端與設備端命令的存儲器次序規則221
5.6.6 關于存儲器次序在實際OpenCL計算設備中的實現 223
5.7 本章小結 230
第6章 OpenCL同步及事件機制 231
6.1 主機端的OpenCL同步 232
6.2 OpenCL 事件機制 235
6.2.1 對OpenCL事件的標記和柵欄 244
6.2.2 內核程序中的同步244
6.2.3 工作組內同步 245
6.3 原子操作 249
6.3.1 OpenCL 1.2中的原子操作 249
6.3.2 OpenCL 2.0中的原子操作 256
6.4 局部存儲器與全局存儲器間的異步拷貝268
6.5 工作組間同步 272
6.6 本章小結 280
第7章 OpenCL與OpenGL互操作281
7.1 從一個OpenGL上下文來創建OpenCL上下文 282
7.2 OpenCL使用OpenGL共享的緩存對象 283
7.3 OpenCL使用OpenGL紋理數據 295
7.4 OpenCL共享OpenGL渲染緩存 308
7.5 從一個OpenCL存儲器對象查詢OpenGL對象信息 314
7.6 訪問共享對象的OpenCL與OpenGL之間的同步 315
7.7 本章小結 320
第8章 OpenCL到主流GPU處理器的映射321
8.1 AMD家族GPU 321
8.1.1 AMD Cayman架構GPU 321
8.1.2 AMD GCN架構的GPU 326
8.2 NVIDIA CUDA兼容的GPU 333
8.2.1 NVIDIA GPU架構的執行模型 334
8.2.2 NVIDIA GPU的全局存儲器 335
8.2.3 NVIDIA GPU的局部存儲器 336
8.3 ARM Mali GPU架構 336
8.3.1 硬件架構 337
8.3.2 存儲器層次 337
8.3.3 OpenCL映射 337
8.4 本章小結 338
第9章 OpenCL計算二維卷積 339
9.1 測試平臺信息 340
9.2 AMD X86 CPU串行實現 341
9.2.1 簡單實現 341
9.2.2 循環展開優化實現342
9.2.3 AVX指令集優化 344
9.2.4 OpenMP 345
9.3 簡單OpenCL實現 347
9.4 使用常量存儲器優化349
9.5 使用局部存儲器優化351
9.6 一個工作項同時計算多個輸出353
9.7 本章小結 355
第10章 OpenCL計算矩陣乘法 356
10.1 串行實現 357
10.1.1 初次實現 357
10.1.2 緩存友好的實現357
10.1.3 使用AVX指令集實現 358
10.2 簡單OpenCL實現 359
10.3 使用局部存儲器優化361
10.4 使用向量加載指令363
10.5 一個工作項同時計算多個輸出365
10.6 優化流水線性能 368
10.7 本章小結 371
附錄A OpenCL Query實例 372
附錄B 其他主流異構并行計算編程環境簡介 376
<