2012-10-18 2 views
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 유형은 합집합이다.sse 기반 행렬 곱셈을 향상시키는 방법

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

매트릭스를 다차원 배열로 사용하는 경우 SSE 레지스터에로드하는 가장 빠른 방법은 무엇입니까?

+6

글쎄, 메모리 액세스 패턴은 완전히 비 SSE이며, 그렇게 작동하지 않습니다. [k] [j]와 [k + 1] [j] 등의 요소를 하나의 레지스터로 읽을 수는 없습니다 (물론 SSE를 사용하면 너무 느려집니다). – Damon

+0

먼저 코드에 대해 비 (non) sse 최적화를 시도해 볼 수 있습니다. [This] (http://stackoverflow.com/a/12831936/1410711) 도움이 될 수 있습니다. – Recker

답변

2

난 당신이 직접 구현하고자한다면 모르겠지만,에 인텔에서 제공하는 흥미로운 코드를 많이있다 :

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

그들은 4 × 4, 6 × 6 행렬을 곱하는 코드가이 찾는, 그들과 다른 것의 역. SSE가있는 버전과없는 SSE 버전 모두 벤치 마크 등을 보여줍니다.