指针别名和性能改进

时间:2014-03-12 02:25:58

标签: c++ performance pointers aliasing

快速提问(希望很清楚)。

有人告诉我,如果你处理指针别名的问题(从内存重新加载值,因为编译器不确定指向的值没有被另一个指针改变),可以大大提高考虑速度时的性能。这可以通过使指针保持不变来解决,例如:

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

0 个答案:

没有答案