私は宿題に取り組んでいます、そして私は私の解決策で何時間も立ち往生しています。私たちが与えられた問題は、次のコードを最適化して、コードがどれほど乱雑になっても、より高速に実行されるようにすることです。キャッシュブロックの活用やループ展開などを使用することになっています。
問題:
//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,2,3,4)、もう一方の配列にNのジャンプでアクセスするためです。関数を悪用することはできますが、キャッシュとsrcブロックへのアクセスが高速である場合でも、それらをdstマトリックスに配置するには長い時間がかかります。
配列アクセサーの代わりにポインターを使用することも試みましたが、実際にプログラムが高速化されるとは思いません。
どんな助けでも大歓迎です。
ありがとう