我正在做一个家庭作业任务,并且我一直在我的解决方案上停留数小时。我们给出的问题是优化以下代码,以便运行速度更快,无论它变得多么混乱。我们应该使用诸如利用缓存块和循环展开之类的东西。优化阵列转置功能
问题:
//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矩阵仍需要很长时间。
我也曾尝试使用指针而不是数组访问器,但我不认为这实际上加快以任何方式程序。
任何帮助将不胜感激。
谢谢
这是要走的路。 “缓存遗忘矩阵转置”是谷歌的短语。注意:通过采用2 * 2个16 * 16高速缓存行的瓦片,可以填充4096个字节,这是(大多数)x86机器上的内存页。 – wildplasser
是的!!!根据我的经验,优化内存访问可以产生几倍的提升。 – sharptooth
这是正确的答案。缓存优化>>其余。 –