1
float** matrix::mult(float** matrix1){
  float** result=new float *[n];
  int i,j,k;
  for(i=0;i<n;i++){
    result[i]=new float [n];
  }
  vect v1;
  vect v2;
  vect v3;
  vect total;
  clock_t start, end;
  start = clock();
  float result_ij=0;
  for(i=0;i<n;i++){   
    for(j=0;j<n;j++){
      result_ij=0;
      total.v=_mm_set1_ps(0);
      for(k=0;k<n;k=k+4){
        v1.v=_mm_set_ps(user_matrix[k][j],user_matrix[k+1][j],user_matrix[k+2][j],user_matrix[k+3][j]);
        v2.v=_mm_set_ps(matrix1[i][k],matrix1[i][k+1],matrix1[i][k+2],matrix1[i][k+3]);
        v3.v=_mm_mul_ps(v1.v,v2.v);
        total.v=_mm_add_ps(total.v,v3.v);
      }
      result[i][j]=total.a[1]+total.a[0]+total.a[2]+total.a[3];
    }
  }
  end = clock();
  cout<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
  return result;
}

このコードは、スカラー コードとほぼ同じ速度です。g++ でコンパイルされており、vect 型が共用体である理由がわかりません。

union vect {
__m128 v;    
float a[4];  
} ;

多次元配列としての行列の場合、それを SSE レジスタにロードする最速の方法は何ですか?

4

1 に答える 1

2

これを自分で実装したいかどうかはわかりませんが、インテルが提供する興味深いコードが次の場所にたくさんあります。

http://www.intel.com/design/Pentiumiii/sml/index.htm

それらには、4x4、6x6 行列を乗算し、それらの逆数を見つけるためのコードがあります。SSE を使用するバージョンと使用しないバージョンの両方で、いくつかのベンチマークなども示しています。

于 2012-10-19T21:32:59.953 に答える