1. 程式人生 > >GPU(CUDA)學習日記(十)------ Kernal 核心函式 引數的傳遞

GPU(CUDA)學習日記(十)------ Kernal 核心函式 引數的傳遞

之前做了一個專案,核心函式什麼的編寫都沒有問題,但是處理完的圖片就是會產生條紋,這個問題困擾了我很長時間(真的很長時間。。。),我的核心函式傳入的引數有很多,我做過實驗,在host函式中給所有的引數都cudamalloc顯示卡空間(當初以為這樣處理會更省視訊記憶體一些,畢竟是開闢的線性儲存器globle memory空間),但是實驗結果是每一個引數都開闢cudamalloc的話,速度會降低,顯示卡的視訊記憶體也沒有實質性的節省(反而感覺少了~)。不明白其中的道理,後來查了一下,看了許多大家的看法,最後得出的結論是:

1、在fermi架構之前的引數都是在shared mem中的,而fermi這代則全都放在了constant memory裡,核心引數在global memory裡沒有副本。

2、反覆對constant memory中的數值進行賦值與呼叫會發生意外錯誤,因為你不知道內部具體的執行緒的執行順序,尤其是一個執行緒中for迴圈的時候。

3、核心函式中申請的變數都會儲存在暫存器中,所以引數如果過多的話,會大大降低暫存器的效率。