2011-08-30 148 views
13

我只發現了一個說法,即本地內存比寄存器內存慢,每個線程類型爲兩個。本地內存比CUDA中的共享內存慢嗎?

共享內存應該是快速的,但它比本地內存[線程]更快嗎?

我想要做的是一種中值過濾器,但是給定的百分位數而不是中位數。因此,我需要拿出大量的清單,對它們進行分類,然後選擇合適的清單。但是我無法開始排序共享內存列表或出錯。通過複製到本地內存,我會失去很多性能嗎?

+0

這是不是真的與編程有關,是嗎?我沒有看到Mathematica標籤的強大鏈接。 –

+7

@Sjoerd C. de Vries:在CUDA的背景下,它是一個編程相關的問題 - 架構有一個非統一的內存空間,程序員必須明確地選擇在他或她的任何代碼中應該使用哪種內存類型和訪問方法寫道。這是CUDA編程的基本原則。 – talonmies

+0

@talonmies我明白,但這個問題不是關於以編程方式選擇內存,API的差異,編程寄存器與編程共享內存等。這基本上是關於哪種內存類型更快。這是一個硬件問題。我覺得操作系統應該改變這個問題,例如,在他使用CUDA中的共享內存尋找一定百分比數據的問題的方向上。 –

回答

23

本地內存只是線程本地全局內存。它比寄存器或共享內存慢得多(無論在帶寬和延遲方面)。它還消耗了內存控制器帶寬,否則這些帶寬可用於全局內存事務。溢出或故意使用本地內存的性能影響可能是輕微到嚴重的任何事情,具體取決於您使用的硬件以及本地內存的使用方式。根據Vasily Volkov的研究 - 見Better performance at lower occupancypdf) - Fermi GPU上的共享內存和寄存器之間的有效帶寬差異大約是8倍(共享內存約爲1000 Gb/s,而8000 Gb/s爲寄存器)。這與CUDA文檔有點矛盾,這意味着共享內存在速度上與寄存器相當。

+0

是的,謝謝你talonmies,進一步闡述我的實驗結果支持這個信息:與我的問題在當地的記憶工作,實際上慢了幾個數量級。由於我的程序已經在每個塊的硬件共享內存大小的限制下工作,所以我不能使用共享內存進行重新計算,所以我不得不使用一些不太聰明的寄存器內存算法來查找我的百分比,結果是非常快無論如何。 – JohnKay