CUDA 4.0真技术解析
?
上周的帖子剛提到NVIDIA宣布了CUDA 4,昨天就收到NV的郵件說CUDA 4.0 RC可以下載了。developer注冊用戶可以從http://developer.nvidia.com/object/cuda_4_0_RC_downloads.html找到。
本來不打算說什么,碰巧在某網站看到了一篇所謂的“新特性解析”,典型的一個不懂技術的小編裝懂地寫軟文。所以我不得不在這里撥亂反正,以免國內讀者受其誤導。
CUDA 4.0的更新主要集中在三方面
簡化并行程序移植
在CUDA(其實還有AMD的stream)出來之前,并行程序移植GPU只能直接用shader,限制諸多,代碼不靈活,基本算重寫,而不是移植。有了CUDA之后,情況有所好轉。在CUDA 4.0下,移植的任務變得更簡單了。NV的說法是,它支持以下幾大新特性:
其中第1點和第2點說的是一回事。在以前的CUDA上,要使用多個GPU就得開多個thread,每一個thread負責與一個GPU打交道(或者 說不同GPU得在不同的context下)。這其實是個很愚蠢的限制。現在CUDA 4取消了這個限制,任何thread可以與任何GPU打交道,簡化了context管理。只能說它沒那么愚蠢了。
第3點我認為是CUDA 4里最重要的更新。內存地址映射在以前的CUDA上就部分支持,能把一個cudaHostMalloc出來的系統內存的地址映射到GPU,讓GPU可以直 接訪問系統內存中的數據。這樣就可以克服顯存不足的缺點(但是是以犧牲一部分性能為代價的)。CUDA 4的好處是,任意malloc/new出來的內存空間,都可以通過調用cudaHostRegister注冊給GPU,同樣也有 cudaHostUnregister來取消這個注冊,而不需要cudaMemcpy。實際上PCIE本身就支持把一個host地址映射到device 端,而且無論D3D還是OpenGL都用這種方式來處理buffer和texture等大數據,不是什么新東西。除了性能之外,這個特性帶來的另一個好處 是,可以把一個大的CPU程序一點一點地改成GPU程序,并一步一步驗證結果。以前這件事情需要前后都插入不少cudaMalloc和 cudaMemcpy等代碼,繁瑣而且容易出錯。
第4點只是個編譯器更新,把C++風格的new/delete、虛函數、內嵌PTX匯編等加入CUDA編譯器。D3D11級別的GPU都支持函數指 針,所以虛函數并不是什么難事。至于new/delete和內嵌PTX匯編,更是改不了幾行編譯器代碼就能實現的,倒是應該問問為什么以前不支持了。
第5點的Thrust是個第三方庫,模仿C++ STL的方法來把CUDA的一些數據結構和primitive算法(scan、reduce、sort等)封裝起來,讓沒有CUDA基礎的人也可以在 C++程序里使用GPU加速。這個庫已經發布很久了,跟以前的CUDA也可以很好地配合。這次只是把它集成了,也不是新東西。
第6點也是個CUDA庫,NV自己的,集成進來了。
第7點的Layered texture其實就是D3D10+的Texture Array,以前不知道為什么從來不在CUDA里暴露出來,現在突然列為“新特性”。
加速多GPU編程
這里的新技術被稱為GPUDirect 2.0。之前有個不出名的GPUDirect 1.0,先在升級成讓GPU之間可以點對點顯存訪問、傳輸數據、同步,可能需要特定的芯片組才能支持。這對多GPU來說確實是個福音。以前甚至讓多個 GPU做同樣的事情,都需要把同樣的數據依次拷貝到每一個GPU上,然后開始干活。以至于拷貝的時間掩蓋了計算的時間(這個拷貝是獨占的,不能讓多個 GPU并行拷貝),GPU越多反而越慢。更惡心的是,一個GPU要訪問另一個GPU的計算結果,就得cudaMemcpy到host memory,然后再次cudaMemcpy到另一個GPU。現在只要一次cudaMemcpy就能輕松搞定。
實際上,這件事情也要求把host memory和多個device memory統一編址(UVA),這樣的cudaMemcpy才能認清是從哪里到哪里。引用NV的一張圖就是:
?
?
有了UVA,在cudaMemcpy的時候就不用指定cudaMemcpyHostToHost、cudaMemcpyHostToDevice、 cudaMemcpyDeviceToHost、cudaMemcpyDeviceToDevice,而直接用cudaMemcpyDefault就可以 了。為什么這個到了4.0才支持,就得問NV了。
更好的工具鏈支持
從文本界面的profiler,到Visual Profiler,CUDA的工具鏈一直在進步。CUDA 4中的profiler除了以前的顯示kernel執行時間、占用率、各種指令的開銷之外,還可以給出總的統計和優化提示,更加實用。cuda-gdb也 得到了更新,支持C++調試。
CUDA x86
最后NV還提到了PGI CUDA x86的最新進展。四五月份會發布1.0(非常的初級,甚至不支持多核),八月份發布1.1(支持多核、SSE/AVX)。
總結
我認為CUDA 4的絕大部分更新都來自于上層和外圍的改進,核心更新的亮點是系統內存地址映射和統一尋址,其它都是不值一提的老掉牙的東西。也許NV也學了google 的版本大法,沒事就出一個新的大版本。CUDA 4雖然值得期待,但老這樣把本來就應該有的東西當作新特性來作秀就不好了。
轉載于:https://www.cnblogs.com/gongminmin/archive/2011/03/06/1972329.html
總結
以上是生活随笔為你收集整理的CUDA 4.0真技术解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DIV滚动条大全
- 下一篇: 网络——在网络上发送,接收数据