行列の乗算の理論を理解しています。この特定のカーネルの実装について2つの質問があります。
参考までに、num_rows =32です。行列B(b_mat)は、以前に別のカーネルによって置き換えられたため、私が理解しているように、行ベクトルをドットでつなぎ合わせています。
1)パラメータ "vectors_per_row"を使用する必要があるのはなぜですか?したがって、内部ループを使用する必要がありますか?sum + = dot(Aの行、Bの行)を実行できると思いましたが、このパラメーターは行をより小さな部分に分割しているようです(なぜですか?)。
2)a_matとb_matのアドレスオフセットがわかりません。つまり、a_mat + = start; b_mat+=開始*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;
}
}