[分享] CUDA 程式設計(15) -- 翻譯 RWT P4 [CU …

看板C_and_CPP (C/C++)作者 (咖啡裡的海洋藍)時間16年前 (2009/01/30 16:32), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
※ [本文轉錄自 VideoCard 看板] 作者: a5000ml (咖啡裡的海洋藍) 看板: VideoCard 標題: [分享] CUDA 程式設計(15) -- 翻譯 RWT P4 [CUDA API] 時間: Fri Jan 30 16:30:12 2009 新年快樂 過完年肚子肥了一圈, 上來打打字運動一下, 這次翻譯 real world tech 的 文章的第 4 頁 http://www.realworldtech.com/page.cfm?ArticleID=RWT090808195242&p=4 前面三頁請參考 CSDN 的簡中翻譯 (感謝 VictorTom 大大協助搜尋) http://0rz.tw/5654x 祝大家今年事事順心 ^.^= 咖啡裡的海洋藍 ◆ CUDA API =========================================================================== CUDA 的 API 和其它作業平台一樣包含了完整的軟體生態系統。做為其心臟的 CUDA C 語言透過 NVIDIA 的編譯器 (nvcc - 基於 Open64 後端) 進行編譯,更精確 的說,CUDA C 並不是真正的 C 語言,而是 C 語言的一種延伸,主要包含了以下的 4 種功能 - 區分函式在 CPU 或是 GPU 執行 - 區分那些變數是在 GPU 的位址空間 - 指派 kernel 函式按照 grids 和 blocks 設定執行 - 描述 gridDim, blockDim, blockIdx, threadIdx 等狀態變數 這些 API 需要 CUDA 趨動程式,現已存在所有的NVIDIA 顯示卡趨動包中。 其中 的 CUDA run-time (cudart) 環境,使用了動態編譯器 (JIT, just in time compiler),可以鎖定底層的硬體架構 (NVIDIA尚未公開)。另外 API 亦包含了常見 的數學函式庫,例如 cuFFT、cuBLAS 和 cuDPP 等,供使用者直接叫用。 nvcc 可產生 3 種輸出碼:PTX, CUDA binary 或 standard C: 其中PTX (Parallel Thread eXecution) 是一套虛擬的指令集,設計做為 動態編譯器的輸入碼,透過 CUDA run-time 層的 JIT 編成符合安裝在主機上 GPU 的原生碼。這種做法的優點在於提供一層穩定的架構彈性,包括架構的 回溯相容性、長效性、延伸性、高效能,並付予工程師設計新硬體時足夠的彈性。 這種技術保証了相容性,新一代的硬體保証相容舊版本的軟體,也就是現在的 PTX code 在將來的新的硬體上也可以執行得很好。 (譯者按:PTX 有點像 Java 的 bin-code,應用這種虛擬機器的做法很容易和其它 高階語言接軌,例如 C++、Fortran、Pascal、Basic 等,硬體上也很容易進行 異質接合,除了不同世代的硬體外,也許那天 ATI 和 NV 的卡片可用來跑同一支 程式。另外不相容的地方在 JIT 層用軟體做掉了,且只在 kernel 第一次執行時 才編譯,花費的額外代價很小,剩下的只是各別機種上的 optimizing issue) 雖然 PTX + JIT 幾乎是最有效率的做法,卻不見得適用於所有的使用情況。一些 ISV (Independent Software Vendor) 傾向於犧牲部份效能以換取更為決定性以及 容易驗証的行為。因為 JIT 會因不同的硬體或其它因素 (CUDA 版本) 而改變它的 輸出碼,對於某些 ISV 的軟體驗証上 (例如財金軟體),他們寧可直接編譯 CUDA binary (.cubin files) 以避免因 JIT 所造成的不確定性。雖然直接編譯 CUDA binary 將會受限於特定的顯示卡版本和趨動程式,但避免不確定性在專業應用 卻更為重要。 最後 nvcc 亦可把 CUDA C (kernel) 輸出成標準 C,可以被重導至 ICC、GCC 或 其它高效能編譯器產生 CPU 的原生碼,雖然 CUDA 剛開始是設計來撰寫在 NVIDIA GPU 上的平行程式碼,但當 kernel 的平行化被展開成 multi-core CPU 的程序時 也會產生同樣的增速效果,一些早期的實驗在 x86 的機器上看到了透過 CUDA 語法 平行化產生的 4 倍的增速。 (譯者按:這不是 --emu 模式,只使用OS的執行緒來模擬,速度通常只會大幅下降, 這邊指的是直接對應 multi-core CPU 的一個核心到 GPU 的一個 multiprocessor, 在 2.1 版中使用 nvcc --multi-core 選項處理,主要的增速原因是在 CUDA 語法 對 kernel 平行化的規範下,使得 CPU 的 cache 使用率和記憶體存取的效率增加, 另一個原因是改寫成 CUDA 程序時演算法的改變。) ◆ Evolution of the ISA and Compute Capabilities ========================================================================= CUDA 被設計成能兼容軟硬體規格的變化,計算裝置 (NVIDIA GPUs) 的能力以版本號 標示 (compute capability),其第一個數字代表核心架構 (主版本),第二個數字 代表細部演進 (次版本號)。 在一年多來的演進後,CUDA已延伸出3個子版本,Compute 1.1新增了 32-bits global atomic 函數,Compute 1.2 新增了 32-bits shared 和 64-bits global 的 atomic 函數,兩個 warp vote 函數,並支援了 GT200 的微架構,Compute 1.3 增加 雙精確倍數的支援,現今的產品包括 GeForce GTX 280 and 260 and Tesla S1070 和 C1060。而 Compute 1.2 至今並無實際的產品上市,究其原因可能是用於將來 GPU 去除雙精確倍數,降低成本做為市場競爭用 (遊戲玩家市場)。 ◆ 原文 ========================================================================= http://www.realworldtech.com/page.cfm?ArticleID=RWT090808195242&p=4 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.12.151 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.12.151

01/31 02:32, , 1F
現在可以 __asm { /* PTX */ } 了嗎
01/31 02:32, 1F

02/01 21:37, , 2F
可以啊,我有用過,之前就是用它來鎖定 C 和 ptx 的對應~
02/01 21:37, 2F
文章代碼(AID): #19Whim0J (C_and_CPP)
文章代碼(AID): #19Whim0J (C_and_CPP)