cuda-tutorial

6.0 行列計算

行列計算は大規模数値シミュレーションの処理の中で最も重たい処理の一つである。 ここの処理をきちんとGPUを用いた最適化ができれば、それだけで計算時間の大幅な削減が可能になる。

今回は2つの平方行列同士の積を題材に話を進める。

6.0.1 逐次計算

普通に行列行列積を逐次で行うには、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 を置くことで、キャッシュヒット率を上げてちょっとした高速化を図っている。

  1. 並列化
  2. 章末課題
  3. 解答例