快速提问(希望很清楚)。
有人告诉我,如果你处理指针别名的问题(从内存重新加载值,因为编译器不确定指向的值没有被另一个指针改变),可以大大提高考虑速度时的性能。这可以通过使指针保持不变来解决,例如:
void multiply (float a[2][2],float b[2][2], float c[2][2]){
a[0][0] = b[0][0]*c[1][1];
a[0][1] = b[1][1]*c[0][0];
a[1][0] = b[0][1]*c[1][0];
a[1][1] = b[1][0]*c[0][1];
}
// function below is supposedly much faster
void multiply (float a[2][2],float b[2][2], float c[2][2]){
const float b00(b[0][0]),b01(b[0][1]),b10([1][0]),b11([1][1]);
const float c00(c[0][0]),c01([0][1]),c10(c[1][0]),c11(c[1][1]);
a[0][0] = b00*c11;
a[0][1] = b11*c00;
a[1][0] = b02*c10;
a[1][1] = b10*c01;
}
我的问题是如何在循环中为更大的数据数组实现此功能,例如:
void multiply (float a[100][100],float b[100][100], float c[100][100]){
// cant possibly declare 100 pointer here
const float b00(b[0][0]),b01(b[0][1]),b10([1][0]),b11([1][1]).......
const float c00(c[0][0]),c01([0][1]),c10(c[1][0]),c11(c[1][1])......
for(i=0;1<100;i+=3){
for(i=0;1<100;i+=3){
a[i][j+1] = b[i][j]*c[i][j];
a[i][j+2] = b[i][j+1]*c[i][j+1];
a[i][j+3] = b[i][j+2]*c[i][j+2];
a[i+1][j+1] = b[i+1][j]*c[i+1][j];
a[i+2][j+2] = b[i+1][j+1]*c[i+1][j+1];
// and so on..
}
}
}