optimized sgemv_n for very small size of m
This commit is contained in:
parent
274828fa50
commit
75207b1148
|
@ -438,25 +438,153 @@ int CNAME(BLASLONG m, BLASLONG n, BLASLONG dummy1, FLOAT alpha, FLOAT *a, BLASLO
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m3 == 0 ) return;
|
if ( m3 == 0 ) return(0);
|
||||||
|
|
||||||
j=0;
|
if ( m3 == 3 )
|
||||||
while ( j < m3 )
|
{
|
||||||
|
a_ptr = a;
|
||||||
|
x_ptr = x;
|
||||||
|
FLOAT temp0 = 0.0;
|
||||||
|
FLOAT temp1 = 0.0;
|
||||||
|
FLOAT temp2 = 0.0;
|
||||||
|
if ( lda == 3 && inc_x ==1 )
|
||||||
|
{
|
||||||
|
|
||||||
|
for( i = 0; i < ( n & -4 ); i+=4 )
|
||||||
|
{
|
||||||
|
|
||||||
|
temp0 += a_ptr[0] * x_ptr[0] + a_ptr[3] * x_ptr[1];
|
||||||
|
temp1 += a_ptr[1] * x_ptr[0] + a_ptr[4] * x_ptr[1];
|
||||||
|
temp2 += a_ptr[2] * x_ptr[0] + a_ptr[5] * x_ptr[1];
|
||||||
|
|
||||||
|
temp0 += a_ptr[6] * x_ptr[2] + a_ptr[9] * x_ptr[3];
|
||||||
|
temp1 += a_ptr[7] * x_ptr[2] + a_ptr[10] * x_ptr[3];
|
||||||
|
temp2 += a_ptr[8] * x_ptr[2] + a_ptr[11] * x_ptr[3];
|
||||||
|
|
||||||
|
a_ptr += 12;
|
||||||
|
x_ptr += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( ; i < n; i++ )
|
||||||
|
{
|
||||||
|
temp0 += a_ptr[0] * x_ptr[0];
|
||||||
|
temp1 += a_ptr[1] * x_ptr[0];
|
||||||
|
temp2 += a_ptr[2] * x_ptr[0];
|
||||||
|
a_ptr += 3;
|
||||||
|
x_ptr ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
{
|
||||||
|
temp0 += a_ptr[0] * x_ptr[0];
|
||||||
|
temp1 += a_ptr[1] * x_ptr[0];
|
||||||
|
temp2 += a_ptr[2] * x_ptr[0];
|
||||||
|
a_ptr += lda;
|
||||||
|
x_ptr += inc_x;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
y_ptr[0] += alpha * temp0;
|
||||||
|
y_ptr += inc_y;
|
||||||
|
y_ptr[0] += alpha * temp1;
|
||||||
|
y_ptr += inc_y;
|
||||||
|
y_ptr[0] += alpha * temp2;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( m3 == 2 )
|
||||||
|
{
|
||||||
|
a_ptr = a;
|
||||||
|
x_ptr = x;
|
||||||
|
FLOAT temp0 = 0.0;
|
||||||
|
FLOAT temp1 = 0.0;
|
||||||
|
if ( lda == 2 && inc_x ==1 )
|
||||||
|
{
|
||||||
|
|
||||||
|
for( i = 0; i < (n & -4) ; i+=4 )
|
||||||
|
{
|
||||||
|
temp0 += a_ptr[0] * x_ptr[0] + a_ptr[2] * x_ptr[1];
|
||||||
|
temp1 += a_ptr[1] * x_ptr[0] + a_ptr[3] * x_ptr[1];
|
||||||
|
temp0 += a_ptr[4] * x_ptr[2] + a_ptr[6] * x_ptr[3];
|
||||||
|
temp1 += a_ptr[5] * x_ptr[2] + a_ptr[7] * x_ptr[3];
|
||||||
|
a_ptr += 8;
|
||||||
|
x_ptr += 4;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for( ; i < n; i++ )
|
||||||
|
{
|
||||||
|
temp0 += a_ptr[0] * x_ptr[0];
|
||||||
|
temp1 += a_ptr[1] * x_ptr[0];
|
||||||
|
a_ptr += 2;
|
||||||
|
x_ptr ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
{
|
||||||
|
temp0 += a_ptr[0] * x_ptr[0];
|
||||||
|
temp1 += a_ptr[1] * x_ptr[0];
|
||||||
|
a_ptr += lda;
|
||||||
|
x_ptr += inc_x;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
y_ptr[0] += alpha * temp0;
|
||||||
|
y_ptr += inc_y;
|
||||||
|
y_ptr[0] += alpha * temp1;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m3 == 1 )
|
||||||
{
|
{
|
||||||
a_ptr = a;
|
a_ptr = a;
|
||||||
x_ptr = x;
|
x_ptr = x;
|
||||||
FLOAT temp = 0.0;
|
FLOAT temp = 0.0;
|
||||||
for( i = 0; i < n; i++ )
|
if ( lda == 1 && inc_x ==1 )
|
||||||
{
|
{
|
||||||
temp += a_ptr[0] * x_ptr[0];
|
|
||||||
a_ptr += lda;
|
for( i = 0; i < (n & -4); i+=4 )
|
||||||
x_ptr += inc_x;
|
{
|
||||||
|
temp += a_ptr[i] * x_ptr[i] + a_ptr[i+1] * x_ptr[i+1] + a_ptr[i+2] * x_ptr[i+2] + a_ptr[i+3] * x_ptr[i+3];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for( ; i < n; i++ )
|
||||||
|
{
|
||||||
|
temp += a_ptr[i] * x_ptr[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
{
|
||||||
|
temp += a_ptr[0] * x_ptr[0];
|
||||||
|
a_ptr += lda;
|
||||||
|
x_ptr += inc_x;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
y_ptr[0] += alpha * temp;
|
y_ptr[0] += alpha * temp;
|
||||||
y_ptr += inc_y;
|
return(0);
|
||||||
a++;
|
|
||||||
j++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue