行列乗算演算のキャッシュ ミスを減らすために行列を転置する割り当てに取り組んでいます。何人かのクラスメートから聞いた話によると、私は 8 倍上達しているはずです。しかし、私は2倍しか得ていません...何が間違っているのでしょうか?
void transpose(int size, matrix m) {
int i, j;
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
std::swap(m.element[i][j], m.element[j][i]);
}
void mm(matrix a, matrix b, matrix result) {
int i, j, k;
int size = a.size;
long long before, after;
before = wall_clock_time();
// Do the multiplication
transpose(size, b); // transpose the matrix to reduce cache miss
for (i = 0; i < size; i++)
for (j = 0; j < size; j++) {
int tmp = 0; // save memory writes
for(k = 0; k < size; k++)
tmp += a.element[i][k] * b.element[j][k];
result.element[i][j] = tmp;
}
after = wall_clock_time();
fprintf(stderr, "Matrix multiplication took %1.2f seconds\n", ((float)(after - before))/1000000000);
}
これまでのところ、私は正しいことをしていますか?
参考までに: 次に行う必要がある最適化は、SIMD/Intel SSE3 を使用することです