簡単な質問です(うまくいけば、それは明らかです)。
ポインターのエイリアシングの問題を処理すると、速度を考慮した場合のパフォーマンスが大幅に向上すると言われました (コンパイラーは、指している値が別のポインターによって変更されていないことを確認できないため、常にメモリから値をリロードします)。これは、たとえば次のようにポインターを定数にすることで解決できます。
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..
}
}
}