我了解矩阵乘法的理论,我对这个特定的内核实现只有两个问题:
作为参考,num_rows = 32。矩阵 B (b_mat) 之前已经被另一个内核转置,所以据我所知,我们将行向量点在一起。
1)为什么我们需要使用参数“vectors_per_row”以及内部循环?我以为我们可以只做 sum += dot(row of A, row of 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;
}
}