我理解矩陣乘法理論實現矩陣乘法,我只是對這個特定內核實現了兩個問題:與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的觀點:爲什麼我們需要矩陣中的地址偏移?我們得到的地址不應該指向第一行嗎? – JDS
@YoungMoney誤解了你在那裏問的,我的壞。增加了一些信息來澄清。 – CrazyCasta
這就是偉大的人,這是幫助我瞭解openCL再好多了,再次感謝 – JDS