| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| { |
| INDEX i, j; |
| |
| CHECK_ARGS10(SD_SPMV,order,Uplo,N,alpha,Ap,X,incX,beta,Y,incY); |
| |
| if (alpha == 0.0 && beta == 1.0) |
| return; |
| |
| |
| if (beta == 0.0) { |
| INDEX iy = OFFSET(N, incY); |
| for (i = 0; i < N; i++) { |
| Y[iy] = 0.0; |
| iy += incY; |
| } |
| } else if (beta != 1.0) { |
| INDEX iy = OFFSET(N, incY); |
| for (i = 0; i < N; i++) { |
| Y[iy] *= beta; |
| iy += incY; |
| } |
| } |
| |
| if (alpha == 0.0) |
| return; |
| |
| |
| |
| if ((order == CblasRowMajor && Uplo == CblasUpper) |
| || (order == CblasColMajor && Uplo == CblasLower)) { |
| INDEX ix = OFFSET(N, incX); |
| INDEX iy = OFFSET(N, incY); |
| for (i = 0; i < N; i++) { |
| BASE tmp1 = alpha * X[ix]; |
| BASE tmp2 = 0.0; |
| const INDEX j_min = i + 1; |
| const INDEX j_max = N; |
| INDEX jx = OFFSET(N, incX) + j_min * incX; |
| INDEX jy = OFFSET(N, incY) + j_min * incY; |
| |
| Y[iy] += tmp1 * Ap[TPUP(N, i, i)]; |
| |
| for (j = j_min; j < j_max; j++) { |
| const BASE apk = Ap[TPUP(N, i, j)]; |
| Y[jy] += tmp1 * apk; |
| tmp2 += apk * X[jx]; |
| jy += incY; |
| jx += incX; |
| } |
| Y[iy] += alpha * tmp2; |
| ix += incX; |
| iy += incY; |
| } |
| } else if ((order == CblasRowMajor && Uplo == CblasLower) |
| || (order == CblasColMajor && Uplo == CblasUpper)) { |
| INDEX ix = OFFSET(N, incX); |
| INDEX iy = OFFSET(N, incY); |
| for (i = 0; i < N; i++) { |
| BASE tmp1 = alpha * X[ix]; |
| BASE tmp2 = 0.0; |
| |
| const INDEX j_min = 0; |
| const INDEX j_max = i; |
| INDEX jx = OFFSET(N, incX) + j_min * incX; |
| INDEX jy = OFFSET(N, incY) + j_min * incY; |
| |
| Y[iy] += tmp1 * Ap[TPLO(N, i, i)]; |
| |
| for (j = j_min; j < j_max; j++) { |
| const BASE apk = Ap[TPLO(N, i, j)]; |
| Y[jy] += tmp1 * apk; |
| tmp2 += apk * X[jx]; |
| jy += incY; |
| jx += incX; |
| } |
| Y[iy] += alpha * tmp2; |
| ix += incX; |
| iy += incY; |
| } |
| } else { |
| BLAS_ERROR("unrecognized operation"); |
| } |
| } |