【问题标题】:How to improve sse based matrix multiplication如何改进基于 sse 的矩阵乘法
【发布时间】:2012-10-09 12:56:32
【问题描述】:
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 寄存器中的最快方法是什么?

【问题讨论】:

  • 好吧,您的内存访问模式完全不是 SSE,它不会那样工作。您不能将元素 [k][j] 和 [k+1][j] 等读入一个寄存器(嗯,您可以,但它太慢了,无法使用 SSE)。
  • 您可能想先尝试对您的代码进行一些非 sse 优化。This 可能会有所帮助。

标签: c++ performance matrix sse simd


【解决方案1】:

我不确定您是否想自己实现,但英特尔提供了很多有趣的代码:

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

他们有代码用于乘以 4x4、6x6 矩阵,找到它们的逆矩阵和其他矩阵。对于有和没有 SSE 的两个版本,它们还显示了一些基准测试等

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 2016-10-31
    • 2016-02-22
    • 2014-02-25
    • 2018-01-12
    • 2014-06-28
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多