6-パーフラブ
まず第一に、この実験について文句を言いたいのですが、5-cachelab では、パート B が実際にキャッシュを非常によく最適化しています。実際、この perflab の主な最適化ポイントはまだここにあり、特にブロックです。その他の新しい追加は、これ以上のものではありません。コードの移動よりも、メモリ参照を減らすなどの小さな最適化、実際にはあまりやりすぎていないように感じます、知識はあまり学べていないように感じます、そして私の文章は荒いです
1 簡単な分析
実験の目的: プログラムのパフォーマンスを最適化する方法を学ぶ
ワークスペース: kernels.c
実験的な内容: C 言語プログラムのパフォーマンスを最適化します。特に:
- コードの動き
- メモリ参照を減らす
- ループ展開
- ブロック
2 具体的な実装
1回転
次の最適化を行いました。
- 一部のコードをループ本体内に移動しました
- 8×8ブロックを実行した
最終スコアは約 15.5 です (スコアはテストごとに異なります)。
void rotate(int dim, pixel *src, pixel *dst)
{
for (int i = 0; i < dim; i += 8){
for (int j = 0; j < dim; j += 8){
for (int p = i; p < i+8; p++){
int s = p*dim;
for (int q = j; q < j+8; q++){
dst[RIDX(dim-1-q, p, dim)] = src[s+q];
}
}
}
}
}
2 滑らかな
8×8のループアンロールだけを行いましたが、実はループアンロールも可能で、すでにcachelabで行っているので続けて実行しませんでした。ただし、マルチスレッドまたはマルチプロセスを使用して実行しようとしましたが、実験から少し逸脱しているようで、この実験は少し荒いとしか言えません
最終スコアは16.5くらい
void smooth(int dim, pixel *src, pixel *dst)
{
for (int i = 0; i < dim; i+=8)
{
for (int j = 0; j < dim; j+=8)
{
for (int p = i; p < i+8; p++)
{
for (int q = j; q < j+8; q++)
{
dst[RIDX(p, q, dim)] = avg(dim, p, q, src);
}
}
}
}
}