Fix the compute error of gemv when incx and incy are negative numbers.
This commit is contained in:
parent
c1e618ea2d
commit
a32e56500a
|
@ -16,13 +16,16 @@
|
||||||
int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER)
|
int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
BLASLONG kx=0, ky=0;
|
||||||
if(!ALPHA)
|
if(!ALPHA)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(INCX < 0)
|
//if(INCX < 0)
|
||||||
INCX = -INCX;
|
// kx = (1-N) * INCX;
|
||||||
if(INCY < 0)
|
// INCX = -INCX;
|
||||||
INCY = -INCY;
|
//if(INCY < 0)
|
||||||
|
// ky = (1-M) * INCY;
|
||||||
|
// INCY = -INCY;
|
||||||
|
|
||||||
BLASLONG fahead = 30;
|
BLASLONG fahead = 30;
|
||||||
BLASLONG spec_unroll = 4;
|
BLASLONG spec_unroll = 4;
|
||||||
|
@ -31,7 +34,7 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO
|
||||||
|
|
||||||
if(ALPHA == 1) {
|
if(ALPHA == 1) {
|
||||||
if(INCY == 1) {
|
if(INCY == 1) {
|
||||||
for(; likely(j < N); j++, k += INCX) {
|
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||||
BLASLONG i = 0;
|
BLASLONG i = 0;
|
||||||
for(; likely(i < tMQ);) {
|
for(; likely(i < tMQ);) {
|
||||||
prefetch(A[LDA * j + i + fahead]);
|
prefetch(A[LDA * j + i + fahead]);
|
||||||
|
@ -46,8 +49,8 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(; likely(j < N); j++, k += INCX) {
|
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||||
BLASLONG i = 0, h = 0;
|
BLASLONG i = 0, h = ky;
|
||||||
for(; likely(i < tMQ);) {
|
for(; likely(i < tMQ);) {
|
||||||
prefetch(A[LDA * j + i + fahead]);
|
prefetch(A[LDA * j + i + fahead]);
|
||||||
prefetch(Y[h + fahead]);
|
prefetch(Y[h + fahead]);
|
||||||
|
@ -63,7 +66,7 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(INCY == 1) {
|
if(INCY == 1) {
|
||||||
for(; likely(j < N); j++, k += INCX) {
|
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||||
BLASLONG i = 0;
|
BLASLONG i = 0;
|
||||||
for(; likely(i < tMQ);) {
|
for(; likely(i < tMQ);) {
|
||||||
prefetch(A[LDA * j + i + fahead]);
|
prefetch(A[LDA * j + i + fahead]);
|
||||||
|
@ -78,8 +81,8 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(; likely(j < N); j++, k += INCX) {
|
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||||
BLASLONG i = 0, h = 0;
|
BLASLONG i = 0, h = ky;
|
||||||
for(; likely(i < tMQ);) {
|
for(; likely(i < tMQ);) {
|
||||||
prefetch(A[LDA * j + i + fahead]);
|
prefetch(A[LDA * j + i + fahead]);
|
||||||
prefetch(Y[h + fahead]);
|
prefetch(Y[h + fahead]);
|
||||||
|
|
|
@ -18,10 +18,10 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO
|
||||||
if(!ALPHA)
|
if(!ALPHA)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(INCX < 0)
|
// if(INCX < 0)
|
||||||
INCX = -INCX;
|
// INCX = -INCX;
|
||||||
if(INCY < 0)
|
// if(INCY < 0)
|
||||||
INCY = -INCY;
|
// INCY = -INCY;
|
||||||
|
|
||||||
BLASLONG fahead = 30;
|
BLASLONG fahead = 30;
|
||||||
BLASLONG spec_unroll = 3;
|
BLASLONG spec_unroll = 3;
|
||||||
|
|
|
@ -19,10 +19,10 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT rALPHA, FLOAT iALPHA, F
|
||||||
if(!rALPHA && iALPHA)
|
if(!rALPHA && iALPHA)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(INCX < 0)
|
// if(INCX < 0)
|
||||||
INCX = -INCX;
|
// INCX = -INCX;
|
||||||
if(INCY < 0)
|
// if(INCY < 0)
|
||||||
INCY = -INCY;
|
// INCY = -INCY;
|
||||||
|
|
||||||
BLASLONG fahead = 60;
|
BLASLONG fahead = 60;
|
||||||
BLASLONG spec_unroll = 2;
|
BLASLONG spec_unroll = 2;
|
||||||
|
|
|
@ -18,10 +18,10 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT rALPHA, FLOAT iALPHA, F
|
||||||
if(!rALPHA && iALPHA)
|
if(!rALPHA && iALPHA)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(INCX < 0)
|
// if(INCX < 0)
|
||||||
INCX = -INCX;
|
// INCX = -INCX;
|
||||||
if(INCY < 0)
|
// if(INCY < 0)
|
||||||
INCY = -INCY;
|
// INCY = -INCY;
|
||||||
|
|
||||||
BLASLONG fahead = 30;
|
BLASLONG fahead = 30;
|
||||||
BLASLONG spec_unroll = 2;
|
BLASLONG spec_unroll = 2;
|
||||||
|
|
Loading…
Reference in New Issue