CUDA 編程:基礎與實踐

樊哲勇

  • 出版商: 清華大學
  • 出版日期: 2020-10-01
  • 售價: $414
  • 貴賓價: 9.5$393
  • 語言: 簡體中文
  • ISBN: 7302564604
  • ISBN-13: 9787302564607
  • 相關分類: CUDA
  • 立即出貨 (庫存 < 4)

  • CUDA 編程:基礎與實踐-preview-1
  • CUDA 編程:基礎與實踐-preview-2
  • CUDA 編程:基礎與實踐-preview-3
CUDA 編程:基礎與實踐-preview-1

相關主題

商品描述

本書是一本理想的學習 CUDA 編程的入門書籍。本書分兩部分,第一部分(前十章)循序漸進地介紹 CUDA 編程的基礎,第二部分(後五章)通過一個具體的計算物理應用實例——分子動力學模擬——來介紹如何從頭開發一個大型的、高效的 CUDA 程序。

作者簡介

樊哲勇,1983 年生,2010 年在南京大學物理系獲理學博士學位,2010-2012 年在廈門大學物理系做博士後,2012-2014年在芬蘭 Aalto 大學做博士後,2014-2016 在渤海大學任副教授,2016 年至今在芬蘭 Aalto 大學做博士後。擁有 8 年 CUDA 編程經驗,用 CUDA 開發了高效的分子動力學模擬程序 GPUMD 和量子輸運程序 GPUQT,在計算物理的一流期刊《Computer Physics Communications》發表9篇原創論文。

目錄大綱

目   錄

第1章  GPU硬件與CUDA程序開發工具 1

  1.1  GPU 硬件簡介 1

  1.2  CUDA 程序開發工具 4

  1.3  CUDA 開發環境搭建示例 6

  1.4  用nvidia-smi檢查與設置設備 7

  1.5  其他學習資料 8

第2章  CUDA中的線程組織 10

  2.1  C++語言中的HelloWorld程序 10

  2.2  CUDA中的HelloWorld程序 11

    2.2.1  只有主機函數的CUDA程序 11

    2.2.2  使用核函數的CUDA程序 12

  2.3  CUDA 中的線程組織 14

    2.3.1  使用多個線程的核函數 14

    2.3.2  使用線程索引 15

    2.3.3  推廣至多維網格 17

    2.3.4  網格與線程塊大小的限制 21

  2.4   CUDA 中的頭文件 21

  2.5  用nvcc編譯CUDA程序 22

第3章  簡單CUDA程序的基本框架 25

  3.1  例子:數組相加 25

  3.2  CUDA 程序的基本框架 27

    3.2.1  隱形的設備初始化 29

    3.2.2  設備內存的分配與釋放 29

    3.2.3  主機與設備之間數據的傳遞 31

    3.2.4  核函數中數據與線程的對應 32

    3.2.5  核函數的要求 33

    3.2.6  核函數中if語句的必要性 34

  3.3  自定義設備函數 35

    3.3.1  函數執行空間標識符 35

    3.3.2  例子:為數組相加的核函數定義一個設備函數 36

第4章  CUDA程序的錯誤檢測 38

  4.1  一個檢測CUDA運行時錯誤的宏函數 38

    4.1.1  檢查運行時API函數 40

    4.1.2  檢查核函數 42

  4.2  用CUDA-MEMCHECK檢查內存錯誤 44

第5章  獲得GPU加速的關鍵 46

  5.1  用CUDA事件計時 46

    5.1.1  為C++程序計時 47

    5.1.2  為CUDA程序計時 48

  5.2  幾個影響GPU加速的關鍵因素 50

    5.2.1  數據傳輸的比例 50

    5.2.2  算術強度 51

    5.2.3  並行規模 54

    5.2.4  總結 55

  5.3  CUDA 中的數學函數庫 55

第6章  CUDA的內存組織 57

  6.1  CUDA 的內存組織簡介 57

  6.2  CUDA 中不同類型的內存 58

    6.2.1  全局內存 58

    6.2.2  常量內存 61

    6.2.3  紋理內存和表面內存 62

    6.2.4  寄存器 62

    6.2.5  局部內存 63

    6.2.6  共享內存 63

    6.2.7  L1和L2緩存 64

  6.3  SM 及其占有率 65

    6.3.1  SM 的構成 65

    6.3.2  SM 的占有率 65

  6.4  用CUDA運行時API函數查詢設備 67

第7 章  全局內存的合理使用 70

  7.1  全局內存的合並與非合並訪問 70

  7.2  例子:矩陣轉置 73

    7.2.1  矩陣復制 73

    7.2.2  使用全局內存進行矩陣轉置 75

第8 章  共享內存的合理使用 78

  8.1  例子:數組歸約計算 78

    8.1.1  僅使用全局內存 79

    8.1.2  使用共享內存 82

    8.1.3  使用動態共享內存 84

  8.2  使用共享內存進行矩陣轉置 85

  8.3  避免共享內存的bank沖突 86

第9 章  原子函數的合理使用 90

  9.1  完全在GPU中進行歸約 90

  9.2  原子函數 93

  9.3  例子:鄰居列表的建立 95

    9.3.1  C++ 版本的開發 96

    9.3.2  利用原子操作的CUDA版本 98

    9.3.3  不用原子操作的CUDA版本 101

第10章  線程束基本函數與協作組 104

  10.1  單指令-多線程執行模式 104

  10.2  線程束內的線程同步函數 106

  10.3  更多線程束內的基本函數 109

    10.3.1  介紹 109

    10.3.2  利用線程束洗牌函數進行歸約計算 114

  10.4  協作組 116

    10.4.1  線程塊級別的協作組 116

    10.4.2  利用協作組進行歸約計算 118

  10.5 數組歸約程序的進一步優化 119

    10.5.1  提高線程利用率 119

    10.5.2  避免反復分配與釋放設備內存 122

第11章  CUDA流 124

  11.1  CUDA 流概述 124

  11.2  在默認流中重疊主機和設備計算 125

  11.3  用非默認CUDA流重疊多個核函數的執行 128

    11.3.1  核函數執行配置中的流參數 128

    11.3.2  重疊多個核函數的例子 129

  11.4  用非默認CUDA流重疊核函數的執行與數據傳遞 131

    11.4.1  不可分頁主機內存與異步的數據傳輸函數 131

    11.4.2  重疊核函數執行與數據傳輸的例子 133

第12章  使用統一內存編程 136

  12.1  統一內存簡介 136

    12.1.1  統一內存的基本概念 136

    12.1.2  使用統一內存對硬件的要求 137

    12.1.3  統一內存編程的優勢 137

  12.2  統一內存的基本使用方法 137

    12.2.1  動態統一內存 138

    12.2.2  靜態統一內存 139

  12.3  使用統一內存申請超量的內存 140

    12.3.1  第一個測試 140

    12.3.2  第二個測試 142

    12.3.3  第三個測試 143

    12.4  優化使用統一內存的程序 144

第13章  分子動力學模擬的CUDA程序開發 147

  13.1  分子動力學模擬的基本算法和C++實現 147

    13.1.1  程序的整體結構 147

    13.1.2  分子動力學模擬的基本流程 148

    13.1.3  初始條件 149

    13.1.4  邊界條件 150

    13.1.5  相互作用 152

    13.1.6  運動方程的數值積分 156

    13.1.7  程序中使用的單位制 157

    13.1.8  程序的編譯與運行 158

    13.1.9  能量守恒的測試 159

    13.1.10  C++ 版本程序運行速度的測試 160

  13.2  CUDA 版本的分子動力學模擬程序開發 161

    13.2.1  僅加速求力和能量的部分 161

    13.2.2  加速全部計算 165

第14章  CUDA標準庫的使用 167

  14.1  CUDA 標準庫簡介 167

  14.2  Thrust 庫 168

    14.2.1  簡介 168

    14.2.2  數據結構 168

    14.2.3  算法 168

    14.2.4  例子:前綴和 169

  14.3  cuBLAS 庫 171

    14.3.1  簡介 171

    14.3.2  例子:矩陣乘法 172

  14.4  cuSolver 庫 176

    14.4.1  簡介 176

    14.4.2  例子:矩陣本征值 177

  14.5  cuRAND 庫 181

    14.5.1  簡介 181

    14.5.2  例子 182