私は宿題に取り組んでいます。私は何時間も私の解決策に取り組んできました。私たちが与えられた問題は、次のコードを最適化して、それがいかに乱雑であるかにかかわらず、より速く実行することです。キャッシュブロックやループアンローリングのようなものを使用することになっています。配列転置機能を最適化する
問題:
//transpose a dim x dim matrix into dist by swapping all i,j with j,i
void transpose(int *dst, int *src, int dim) {
int i, j;
for(i = 0; i < dim; i++) {
for(j = 0; j < dim; j++) {
dst[j*dim + i] = src[i*dim + j];
}
}
}
私がこれまで持っている:
私は、ループアンローリングが、私について考えている:私が間違っている場合
//attempt 1
void transpose(int *dst, int *src, int dim) {
int i, j, id, jd;
id = 0;
for(i = 0; i < dim; i++, id+=dim) {
jd = 0;
for(j = 0; j < dim; j++, jd+=dim) {
dst[jd + i] = src[id + j];
}
}
}
//attempt 2
void transpose(int *dst, int *src, int dim) {
int i, j, id;
int *pd, *ps;
id = 0;
for(i = 0; i < dim; i++, id+=dim) {
pd = dst + i;
ps = src + id;
for(j = 0; j < dim; j++) {
*pd = *ps++;
pd += dim;
}
}
}
いくつかのアイデアは、私を修正してくださいそれはNxN行列が主次元を持つかどうかわからないので、それは助けになるとは思わない。もし私がそれを確認したら、機能を遅くする余分な計算が含まれているでしょう。
キャッシュブロックは、何があっても1つの配列に線形に(1,2,3,4)アクセスし、もう一方はNのジャンプでアクセスするため、あまり有用ではありません。キャッシュを乱用してsrcブロックに高速にアクセスする機能は、それらをdstマトリックスに配置するのにまだ長い時間がかかります。
私は配列アクセサーの代わりにポインタを使用しようとしましたが、実際にプログラムをスピードアップするとは思われません。
任意の助けいただければ幸いです。
ありがとうございます。
これは方法です。 "キャッシュを知らない行列転置"はGoogleのフレーズです。注:16 * 16キャッシュラインの2 * 2タイルを取ることで、(ほとんどの)x86マシン上のメモリページである4096バイトを埋めることができます。 – wildplasser
はい!メモリアクセスを最適化することで、私の経験から何倍もの価値を向上させることができます。 – sharptooth
これは正解です。キャッシュ最適化>>残り。 –