2011-05-18 43 views
1

我爲兩個矩陣的元素乘法構建了一個內核,但至少在我的配置中,當每個矩陣大於2GB時,我的OpenCL內核只會更快。所以我想知道,如果是因爲我的天真內核(見下文),或者是因爲元素操作的本質,這意味着元素操作不會從使用GPU中獲益。OpenCL中的元素操作(Cuda)

感謝您的輸入!

內核:

KERNEL_CODE = """ 
// elementwise multiplication: C = A .* B. 
__kernel void matrixMul(
     __global float* C, 
     __global float* A, 
     __global float* B, 
     int width, int height) 
{ 
    // ID 
    int x = get_global_id(0); 
    int y = get_global_id(1); 

    // Multiplying 
    C[y * height + x ] = A[y * height + x] * B[y * height + x]; 
} 
""" 

附:我看過一些專家認爲,CUDA與OpenCL的差異太大,無法在同一個問題中回答,因此可以免費將其從標題和標籤中刪除。

+0

檢查在啓動內核的過程中有多少時間正在丟失。你把這個比作什麼?在CPU上的相同操作? – 2011-05-18 17:02:34

回答

9

這類操作有N個FLOP,但有3N個內存事務,因此它將完全受內存帶寬限制。沒有數據重用的餘地,所以加速到參考CPU版本的上限是GPU與CPU帶寬的比率。這個數量很少會超過10倍,並且可能會因將數據移入和移出GPU內存的代價而很快受到侵蝕。一般來說,這種操作最好與其他O(N)操作「融合」以提高性能。通常情況下,您永遠不會只在一個內核中計算Hadamard產品,您可以將它作爲一個內核中一系列O(N)操作的一部分來執行。所以,不,這不是加速的好選擇,即使內核是最優的。

而你的內核肯定不是。你爲每個FLOP做3個IOP,這是一個巨大的懲罰。你當然可以做一些事情來改善這一點,但是什麼事情完全取決於將要運行什麼類型的硬件。

2

說到元素操作:這取決於設備。例如NVidia GPU使用標量處理器(使用標量指令),不需要矢量化。相反,ATI採用5d(或4d)VLIW處理器,對於這些處理器來說,矢量化至關重要。但是,編譯器有時可以執行它,而不是直接在代碼中使用矢量數據類型,但是在爲ATI的GPU進行優化時首先要做的事情。不過,正如talonmies所指出的那樣,上述算法幾乎沒有內存帶寬限制,並且不能僅僅使用GPU等待很多加速。

0

你發佈的內核應該至少和CPU一樣快。但是你根本沒有使用合併內存訪問!

這是殺死你的表現。

但是,正如@talonmies所述。對於GPU來說這不是一個好例子。你在內存拷貝中丟失了所有的時間。