0

簡単な質問です(うまくいけば、それは明らかです)。

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

 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..
          }
      }
  }
4

0 に答える 0