2015-01-12 56 views
-1

我目前正在做一個家庭作業任務,我必須實現幾個矩陣乘法內核,嘗試幾個網格和塊尺寸並對結果進行基準測試。我的第一個內核是使用一維線程塊(其中每個線程塊負責計算一個1×n的子矩陣,每個線程在這個子矩陣內的一個元素),我的第二個內核是一個2D塊(其中每個線程塊負責計算一個方形子矩陣,並且每個線程在該子矩陣內線程一個元素)。他們兩個都在使用全局內存。與CUDA的矩陣乘法:2D塊與1D塊

我發起了幾個測試,大小爲4096 * 4096,每個塊的線程數爲1D內核從64到1024,2D內核從8 * 8到32 * 32。我預計對於這兩個內核都會有相同的性能,但不知何故,2D內核似乎總是稍快一點​​。

難道這可以通過以下事實來解釋:使用2D塊線程可以在同一個「區域」中發生更多的內存訪問,並且這會利用某種緩存機制?

+0

是的,如果你正在使用緩存的內存訪問。 –

回答

-1

是使用2D塊可減少每塊訪問的不同矩陣元素的數量。這個簡單的計算應當明確:

Calculation of A*B=C 
Matrix size: 4096*4096 

Block size: 1024x1 
Number of different elements read from Matrix A: 1 row = 4096 elements 
Number of different elements read from Matrix B: 1024 columnes = 4096*1024 
Sum: 4193280 

Block size: 32x32 
Number of different elements read from Matrix A: 32 rows = 32*1024 
Number of different elements read from Matrix B: 32 columnes = 32*1024 
Sum: 65536 

要生成的矩陣計算C(I,J),你必須閱讀從矩陣A的第i行和矩陣B.

所以j列如果要在矩陣B.計算就得讀取N次的第一行(假設矩陣是N×N個)的結果矩陣的第一行和每列一次

4x1 Block 

      v v v v 
>0 1 2 3 0 1 2 3  x x x x 
4 5 6 7 4 5 6 7  - - - - 
8 9 A B 8 9 A B  - - - - 
C D E F C D E F  - - - - 

2x2 Block 

      v v 
>0 1 2 3 0 1 2 3  x x - - 
>4 5 6 7 4 5 6 7  x x - - 
8 9 A B 8 9 A B  - - - - 
C D E F C D E F  - - - - 

箭頭指向的行和列,需要計算x指示的元素。

+0

也許你可以稍微解釋一下你的「簡單計算」? – talonmies

+2

@op,但請注意,在您的實現中,如您所描述的那樣,您並不是直接重用值。如果您正在使用緩存方法(由fermi默認設置,使用只讀緩存或在開普勒中啓用cahing),則好處是,由於您在較高位置重複使用值,因此緩存中值的可能性較高。 –