我正在做家庭作业,我的解决方案已经被困了好几个小时。我们遇到的问题是优化下面的代码,让它运行得更快,不管它变得多么混乱。我们应该使用诸如利用缓存块和循环展开之类的东西。
问题:
//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 矩阵仍然需要很长时间。
我也尝试过使用指针而不是数组访问器,但我认为这实际上并没有以任何方式加速程序。
任何帮助将不胜感激。
谢谢