2012-11-04 32 views
0

我理解矩陣乘法理論實現矩陣乘法,我只是對這個特定內核實現了兩個問題:與OPENCL/C

僅供參考,NUM_ROWS = 32的矩陣B(b_mat)之前已經被調換由另一個內核,據我瞭解,我們是一起點行向量。

1)爲什麼我們需要使用參數「vectors_per_row」,從而內部循環?我認爲我們可以做sum + = dot(A行,B行),並且它看起來像這個參數將行分成更小的部分(爲什麼?)。

2)我不明白a_mat和b_mat的地址偏移量,即a_mat + = start; b_mat + = start * 4;

__kernel void matrix_mult(__global float4 *a_mat, 
    __global float4 *b_mat, __global float *c_mat) { 
    float sum; 
    int num_rows = get_global_size(0); 
    int vectors_per_row = num_rows/4; 
    int start = get_global_id(0) * vectors_per_row;  
    a_mat += start;           
    c_mat += start*4;         
    for(int i=0; i<num_rows; i++) {    
     sum = 0.0f;          
     for(int j=0; j<vectors_per_row; j++) { 
     sum += dot(a_mat[j],     
       b_mat[i*vectors_per_row + j]); 
     }          
     c_mat[i] = sum;       
    }           
} 

回答

2
  1. 你的基質由個float4的陣列。 Flaoa4是4個花車的向量。這是4來自哪裏。 Dot只適用於內建類型,所以你必須在float4上做。

  2. c_mat的類型是float,這就是爲什麼它有* 4開始並且a_mat已經開始。偏移量是因爲代碼分成幾個(可能是數百個)線程。每個線程只計算乘法操作的一小部分。 start就是線程開始計算的地方。這是get_global_id(0)的用途。它基本上得到你的線程ID。從技術上講,它是第一維的線索索引,但看起來你只有一個維度,所以在這裏你可以把它想象成線程ID。

+0

謝謝!我想我還是錯過了#2的觀點:爲什麼我們需要矩陣中的地址偏移?我們得到的地址不應該指向第一行嗎? – JDS

+1

@YoungMoney誤解了你在那裏問的,我的壞。增加了一些信息來澄清。 – CrazyCasta

+0

這就是偉大的人,這是幫助我瞭解openCL再好多了,再次感謝 – JDS