CUDA 目前的一些缺點


nVidia CUDA 文章也寫了不少了,一些比較基本的,應該也都寫的差不多了?對於一般入門來說,這樣應該已經夠了吧?再下來,應該是比較進階的東西了…而 Heresy 在這邊,也大概來提一下目前 Heresy 感覺上,CUDA 的一些缺點吧~

  1. 太新

    其實簡單來說,CUDA 在目前最大的缺點,就是他太年輕了。CUDA 由 2007 年初開始 Beta,到了 2007 年中正式推出 1.0 版;以正式版來說,由 1.0 到現在的 1.1 版,也不到一歲。也因此,各類的資源、文章也都還是相當得少!而由於會去研究 CUDA 的人,大多也都是比較專業的,也導致中文的部分,資源更為缺乏。

    而也由於發展時間還不夠長,CUDA 整個開發環境,不管是文件或是工具,也還稱不上成熟、完整。以 CUDA 裡的 texture 來當例子,在《CUDA Programming Guide 1.1》中,Heresy 沒有找到他在使用上必須「在 file scope 做宣告」的限制,而是在別人的文章中得知的;而在編譯器 nvcc 的部分,針對這樣的寫法,編譯器也沒有給出是當的錯誤訊息,而是直接送出編譯器內部錯誤的訊息…讓人有點沒辦法去找到問題所在。

  1. 綁顯示卡

    目前 CUDA 仍屬於 nVidia 的獨家技術,只能用於 GeForce 8 以後的顯示卡(CUDA 1.1 支援的裝置);而由於這種東西主要是根據 GPU 的架構來設計的,所以其他家的顯示晶片會支援 CUDA 的機率應該是極低。相較於傳統根據 OpenGL 或 Direct3D 所寫的 GPGPU 來說,使用 nVidia 的 CUDA 就沒有辦法跨廠牌的顯示卡運作了~

    只能用在 nVidia 顯示卡上這點,在某些程度上,也影響了 CUDA 的擴展;雖然 Heresy 個人討厭 ATi,但是還是不少人在用啊~更晃論不少人還是使用 Intel IGP 的。

  2. 不支援 double 計算

    CUDA 在做為高速計算裝置時,有一項最被人詬病的一點,就是她的精確度。礙於傳統 GPU 的設計,CUDA 在 1.0/1.1 的現在,仍然只能支援 float 的計算,而不支援 double 的運算;這點在許多講究精確度的計算方面,算是滿慘的一點,更使的 CUDA 在應用上更為受限。當然,nVidia 也是知道這一點的,在將來的 CUDA,勢必一定會加入 double 的支援,但畢竟不是現在。

  3. 某種程度上,危險

    首先,先來看一張 Acrobat Reader 8 的截圖

    2209129706_e6b9aae0c0_o

    可以看到文件區內,都有一些怪怪的點吧?這是某次 Heresy 把 CUDA 程式寫爛後,用 Acrobat Reader 看文件時的情形;而之後 Heresy 開啟 3D 遊戲時,畫面也有類似這樣的雜點。

    原因呢?Heresy 認為是因為 CUDA 的程式沒寫好,所以改到不該改的記憶體吧?而之後,其他會使用到 GPU 的功能,也連帶受到影響(Acrobat Reader 8 有使用 GPU 來加速的功能);這種錯誤的影響,等到 Heresy 重開機後才消除。

    現在一般寫 Windows 的程式,應該都是在保護模式下執行了,所以不容易一個程式爛掉了,會影響到其他程式(當然,不是不可能);但是相對的,感覺上 CUDA 在顯示卡中是以真實模式在運作,似乎有可能在某些情形下,影響到其他使用顯示卡資源的程式。相較之下,CUDA 程式的安全性似乎就比較低了?(不知道以後會不會有 GPU 病毒? :p)不過這點仍屬於 Heresy 個人得臆測就是了。

    另外,CUDA 程式也有可能會造成螢幕顯示的畫面沒有回應的情形,在這種情形下,除了重開機,似乎是沒有辦法去中斷的…而一般使用 CPU 的程式可以透過工作管理員來監控他的資源使用,但是 CUDA 這類的 GPGPU 程式,目前也還沒有類似的管理程式,也使得這類的程式,沒辦法取得在執行期間取得相關細節。


對「CUDA 目前的一些缺點」的想法

  1. 在 CUDA Programming Guide 1.1 中有提到一些 Constant 的限制,不知道有沒有可能是這些造成的?
    __shared__ and __constant__ variables have implied static storage.__device__, __shared__ and __constant__ variables cannot be deexternal using the extern keyword.__device__ and __constant__ variables are only allowed at file scope.__constant__ variables cannot be assigned to from the device, only from host through host runtime functions (Sections 4.5.2.3 and 4.5.3.6).

  2. Can I have your code for testing?
    I can use __constant__ in CUDA 1.1, and I don’t think that constant had been removed.

  3. Hi Heresy. I have a question regarding CUDA. I think you may be able to answer it. I was trying to assign a var in constant memory using __constant__, but failed.  My VC 2005 doesn’t give me any description of the error, except ‘error: ‘. I have seen somewhere that saying __constant__ had been removed from 1.0. But it seems so common that many people are still talking about  __constant__, while I don’t know if they have tried it in 1.1 or not. Mine is 1.1, so I am wondering if you know whether __constant__ is back again? The following is the simple code that I tried and got error from.__constant__ int maxI;int dummy = 1;CUDA_SAFE_CALL( cudaMemcpyToSymbol(maxI, &dummy, 1 * sizeof(int)) myKernel<<<dimGrid,dimBlock>>>(a,b,c);_global__ void myKernel(int a, int b, int c){ … int d = maxI;Thanks a bunch.

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.