Как улучшить умножение матриц на основе sse

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?

1

Решение

Я не уверен, хотите ли вы реализовать это самостоятельно, но есть много интересного кода, предоставленного Intel по адресу:

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

У них есть код для умножения 4х4, 6х6-матриц, нахождения их обратных и других. В обеих версиях с SSE и без него они также показывают некоторые результаты тестирования и т. Д.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector