2011-11-04 44 views
3

我有一個巨大的數組,必須由不同的線程並行讀取。每個線程必須從整個陣列的不同位置讀取不同的條目,從頭到尾。該緩衝區是隻讀的,所以我不認爲需要「臨界區」。使用CUDA儘可能快地訪問只讀全局數組?

但是恐怕這種方法的性能很差。但我沒有看到其他方式去做。我可以將整個數組加載到每個塊的共享內存中,但我認爲這沒有足夠的共享內存。

任何想法?

編輯:有些人問我爲什麼要訪問數組的不同部分,所以這裏有一些解釋:我試圖實現"auction algorithm"。在一個內核中,每個線程(人)必須針對具有價格的項目進行投標,這取決於其對該項目的興趣。每個線程都必須檢查它對大數組中給定對象的興趣,但這不是問題,我可以將共享內存中的讀數合併。問題是,當一個線程選擇爲一個物品出價時,首先要檢查它的價格,並且由於有很多很多物品要競標,所以我不能將所有這些信息都放到共享內存中。此外,每個線程都必須訪問整個價格緩衝區,因爲他們可以競標任何對象。我唯一的優點是緩衝區是隻讀的。

+0

你的應用程序試圖計算什麼?有可能有另一種方式來以結構化的方式訪問數據。 –

+0

你可以在內核中添加一個訪問模式的例子嗎? – pQB

+0

我編輯的問題更加明確! –

回答

2

訪問全局內存的最快方法是通過合併訪問,但在您的情況下這可能是不可能的。您可以調查只讀的紋理內存,儘管通常用於空間2D訪問。

Cuda Best practice guide 的3.2節有關於這個和其他內存技術的很好的信息。

1

與從全局內存讀取相比,從共享內存讀取速度要快得多。也許你可以將數組的一個子集加載到塊中線程所需的共享內存中。如果塊中的線程需要來自陣列的大部分不同部分的值,則應該更改算法,因爲這會導致速度慢的非扇區訪問。此外,在從共享內存中讀取數據時,請注意兩個線程在共享內存中從同一個存儲區讀取時發生的bank衝突。紋理內存也可能是一個不錯的選擇,因爲它被緩存了