行列計算は大規模数値シミュレーションの処理の中で最も重たい処理の一つである。 ここの処理をきちんとGPUを用いた最適化ができれば、それだけで計算時間の大幅な削減が可能になる。
今回は2つの平方行列同士の積を題材に話を進める。
普通に行列行列積を逐次で行うには、3重ループを組めば実現できる。
"matmat_mul_cpu.cu"
const int Narr = 10;
void matmatProduct(int *C, int *A, int*B){
int c_ij;
for (int i = 0; i < Narr; i++){
for (int j = 0; j < Narr; j++){
c_ij = 0;
for (int k = 0; k < Narr; k++){
C_ij += A[i*Narr + k] * B[k*Narr + j];
}
C[i*Narr + j] = c_ij;
}
}
return;
}
ここで一度レジスタ上に c_ij
を置くことで、キャッシュヒット率を上げてちょっとした高速化を図っている。