0

誰かがこれを手伝ってくれますか?

void _vect_mat(float *vect,float **mat){
  float temp[4];

  temp[0] = vect[0];
  temp[1] = vect[1];
  temp[2] = vect[2];
  temp[3] = vect[3];

  vect[0] = (temp[0] * mat[0][0]) + (temp[1] * mat[1][0]) + (temp[2] * mat[2][0]) + (temp[3] * mat[3][0]);
  vect[1] = (temp[0] * mat[0][1]) + (temp[1] * mat[1][1]) + (temp[2] * mat[2][1]) + (temp[3] * mat[3][1]);
  vect[2] = (temp[0] * mat[0][2]) + (temp[1] * mat[1][2]) + (temp[2] * mat[2][2]) + (temp[3] * mat[3][2]);
  vect[3] = (temp[0] * mat[0][3]) + (temp[1] * mat[1][3]) + (temp[2] * mat[2][3]) + (temp[3] * mat[3][3]);
}

int main(){
  int i,j,k;

  float *vect,**mat;

  vect =  (float *)malloc(4 * sizeof(float));
  mat  = (float **)malloc(4 * sizeof(float *);
  for(i=0;i<4;i++)mat[i] = (float *)malloc(4 * sizeof(float));

  vect[0] = 1.0;
  vect[n] = ......etc.

  mat[0][0] = 1.0;
  mat[n][m] ......etc.     

  while (1){
    for(i = 0;i < 5;i++){
      for(j = 0;j< 6;j++){
        for(k = 0;k < 3600;k++)_vect_mat(vect,mat); 
      }
    }
  }
}

_vect_matループ内で関数を呼び出すと、すべてのパフォーマンスが低下します。普通ですか?私は何が間違っているのですか?

4

1 に答える 1

0

1つの問題はあなたが言うことfloat **matです。つまり、のような要素のフェッチmat[1][2]は2段階のプロセスです。最初にmat[1]ポインタとしてフェッチする必要があり、次にそこ[2]から要素をフェッチする必要があります。

代わりに、を宣言しfloat mat[16]、それに直接インデックスを付けると、たとえばmat[1 + 2*4]、これらの要素のフェッチはおそらく2倍の速度になります。

于 2012-10-12T03:06:43.907 に答える