我想學習OpenCL,但我很難決定使用哪個地址空間,因爲我只找到彙編的資源來聲明這些地址空間是,但不是它們爲什麼存在或何時使用它們。資源至少太分散了,所以在這個問題中,我希望彙集所有這些信息:什麼是所有的地址空間,它們爲什麼存在,何時使用哪個地址空間以及關於內存和性能的優點和缺點。OpenCL何時使用全球,私人,本地,恆定的地址空間
據我瞭解(這可能是過於簡化的),該GPU擁有兩個物理類型的存儲器:全局內存,遠離實際的處理器,因此緩慢的,但相當大的,並提供給所有工人,本地內存,靠近實際的處理器,速度很快但很小,無法從其他工作人員那裏訪問。
直觀上,local
限定符確保將變量放置在本地內存上,並且global
限定符可確保將變量放置在全局內存上,但我不確定這是否會發生。這留下了private
和constant
限定符。那些人的目的是什麼?
還有一些隱式限定符。例如,the specifications提到通用地址空間,我認爲它用於沒有限定符的參數。這到底做了什麼?那麼也有局部函數變量。這些地址空間是什麼?
下面是一個使用我的直覺的例子,但不知道什麼,我實際上做:
例: 說我通過long
類型和長度10000數組的內核,我只會用閱讀,那麼我會宣佈它,因爲它必須提供給所有工人,它不會改變。爲什麼我不使用constant
限定符?當通過CPU爲這個數組設置緩衝區時,我實際上也可以使數組只讀,這在我眼中說與聲明const
相同。那麼,何時以及爲什麼我會聲明constant
或global const
?
執行內存密集型任務時,最好是將數組複製到內核中的本地數組中?我的猜測是本地內存太小,但如果數組只有10的長度呢?陣列何時會太大/太小?更一般的:什麼時候將數據從全局數據複製到本地內存?假設我也想傳遞這個數組的長度,然後我將const int length
添加到我的內核的參數中,但我不確定爲什麼我會省略global
限定符,除非因爲我看到其他人這樣做。畢竟,所有員工都必須接觸到length
。如果我是對的,那麼length
就會有一個通用的地址空間,但是我再也不知道這意味着什麼。
我希望有一些經驗的人可以清楚這一點。這不僅對我來說很棒,而且對希望獲得關於GPU上的內存管理的實用知識的其他愛好者也是如此。
常量:從所有內核訪問同一個單元的速度很快。全局:訪問合併後的鄰居地址很快。本地:沒有碰撞的訪問很快。私人:它的速度很快。例外:單個全局/本地可以廣播到所有內核。全球服務gpu的全部核心,本地服務一個計算單元的全部核心,不斷服務於gpu的全部核心,私有服務單核心。按核心,我的意思是工作項目。 –