atl_trmv_scal.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 331 行
C
331 行
/* * Automatically Tuned Linear Algebra Software v3.8.0 * (C) Copyright 1997 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */#include "atlas_kern3.h"#ifdef TCPLX#ifdef Upper_#ifdef UnitDiag_ #define ATL_trmv Mjoin(PATL,Mjoin(trmv_scalUNU,NM))#else #define ATL_trmv Mjoin(PATL,Mjoin(trmv_scalUNN,NM))#endifvoid ATL_trmv(const int N, const SCALAR alpha, const TYPE *A, const int lda, TYPE *X){ int i, j; const int lda2=(lda<<1), n=(N>>1)<<1; const TYPE zero=0.0; TYPE *x; const TYPE *Ad=A, *a; register TYPE xr, xi, yr0, yi0, yr1, yi1, Ar0, Ai0, Ar1, Ai1; for (i=0; i != n; i += 2) {/* yr0 = *x; yi0 = x[1]; yr1=x[2]; xi1 = x[3]; */ yr0 = yi0 = yr1 = yi1 = zero; /* * Handle diagonal part */ x = X; xr = *x; xi = x[1]; x += 2; #ifdef Unitdiag_ yr0 += xr; yi0 += xi; #else Ar0 = *Ad; Ai0 = Ad[1]; yr0 += Ar0 * xr; yi0 += Ai0 * xr; yr0 -= Ai0 * xi; yi0 += Ar0 * xi; #endif Ad += lda2; xr = *x; xi = x[1]; x += 2; Ar0 = *Ad; Ai0 = Ad[1]; yr0 += Ar0 * xr; yi0 += Ai0 * xr; #ifdef UnitDiag_ yr1 += xr; #else Ar1 = Ad[2]; Ai1 = Ad[3]; yr1 += Ar1 * xr; yi1 += Ai1 * xr; #endif a = Ad + lda2; Ad = a + 4; yr0 -= Ai0 * xi; yi0 += Ar0 * xi; #ifdef UnitDiag_ yi1 += xi; #else yr1 -= Ai1 * xi; yi1 += Ar1 * xi; #endif /* * Handle rectangular part */ for (j=i+2; j < N; j++) { xr = *x; xi = x[1]; Ar0 = *a; Ai0 = a[1]; Ar1 = a[2]; Ai1 = a[3]; yr0 += Ar0 * xr; yi0 += Ai0 * xr; x += 2; yr1 += Ar1 * xr; yi1 += Ai1 * xr; yr0 -= Ai0 * xi; yi0 += Ar0 * xi; a += lda2; yr1 -= Ai1 * xi; yi1 += Ar1 * xi; } #ifdef ALPHAN1 *X = -yr0; X[1] = -yi0; X[2] = -yr1; X[3] = -yi1; #else xr = *alpha; xi = alpha[1]; Ar0 = xr * yr0; Ai0 = xi * yr0; Ar1 = xr * yr1; Ai1 = xi * yr1; Ar0 -= xi * yi0; Ai0 += xr * yi0; Ar1 -= xi * yi1; Ai1 += xr * yi1; *X = Ar0; X[1] = Ai0; X[2] = Ar1; X[3] = Ai1; #endif X += 4; } if (N-n) { if (!n) a = A; #ifdef UnitDiag_ #ifdef ALPHAN1 *X = -(*X); X[1] = -X[1]; #else xr = *X; xi = X[1]; Ar0 = *alpha; Ai0 = alpha[1]; yr0 = xr * Ar0; yi0 = xi * Ar0; yr0 -= xi * Ai0; yi0 += xr * Ai0; *X = yr0; X[1] = yi0; #endif #else xr = *X; xi = X[1]; Ar0 = *Ad; Ai0 = Ad[1]; yr0 = xr * Ar0; yi0 = xi * Ar0; yr0 -= xi * Ai0; yi0 += xr * Ai0; #ifdef ALPHAN1 *X = -yr0; X[1] = -yi0; #else xr = *alpha; xi = alpha[1]; Ar0 = xr * yr0; Ai0 = xi * yr0; Ar0 -= xi * yi0; Ai0 += xr * yi0; *X = Ar0; X[1] = Ai0; #endif #endif }}#else /* Lower triangular matrix */#ifdef UnitDiag_ #define ATL_trmv Mjoin(PATL,Mjoin(trmv_scalLNU,NM))#else #define ATL_trmv Mjoin(PATL,Mjoin(trmv_scalLNN,NM))#endifvoid ATL_trmv(const int N, const SCALAR alpha, const TYPE *A, const int lda, TYPE *X){ int i, j; const int n = (N>>1)<<1, lda2=lda<<1; #ifdef UnitDiag_ #define ii i #else int ii; #endif const TYPE *a; TYPE *y, *x; register TYPE yr0, yi0, yr1, yi1, xr, xi; register TYPE ar0, ai0, ar1, ai1; if (n) { i = (N - 2)<<1; A += i; y = X + i; for (i=N-2; i >= 0; i -= 2) { #ifndef UnitDiag_ ii = i + 1; #endif a = A; x = X; yr0 = yi0 = yr1 = yi1 = 0.0; for (j=0; j != ii; j++) { ar0 = *a; xr = *x; xi = x[1]; yr0 += ar0 * xr; ar1 = a[2]; yi0 += ar0 * xi; ai0 = a[1]; yr1 += ar1 * xr; ai1 = a[3]; yi1 += ar1 * xi; a += lda2; yr0 -= ai0 * xi; x += 2; yi0 += ai0 * xr; yr1 -= ai1 * xi; yi1 += ai1 * xr; } xr = *x; xi = x[1]; #ifdef UnitDiag_ yr0 += xr; ar1 = a[2]; yi0 += xi; ai1 = a[3]; yr1 += ar1 * xr; a += lda2; yi1 += ar1 * xi; yr1 -= ai1 * xi; xi = x[3]; yi1 += ai1 * xr; xr = x[2]; yr1 += xr; yi1 += xi; #else ar1 = a[2]; yr1 += ar1 * xr; ai1 = a[3]; yi1 += ar1 * xi; yr1 -= ai1 * xi; yi1 += ai1 * xr; #endif #ifdef ALPHAN1 *y = -yr0; y[1] = -yi0; y[2] = -yr1; y[3] = -yi1; #else xr = *alpha; ar0 = xr * yr0; xi = alpha[1]; ai0 = xr * yi0; ar0 -= xi * yi0; ai0 += xi * yr0; ar1 = xr * yr1; ai1 = xr * yi1; ar1 -= xi * yi1; ai1 += xi * yr1; *y = ar0; y[1] = ai0; y[2] = ar1; y[3] = ai1; #endif A -= 4; y -= 4; } } if (N-n) { xr = *X; xi = X[1]; #ifdef UnitDiag_ #ifdef ALPHAN1 *X = -xr; X[1] = -xi; #endif #else if (n) A += 2; ar0 = *A; yr0 = ar0 * xr; ai0 = A[1]; yi0 = ar0 * xi; yr0 -= ai0 * xi; yi0 += ai0 * xr; #ifndef ALPHAN1 xr = *alpha; xi = alpha[1]; ar0 = xr * yr0; ai0 = xr * yi0; ar0 -= xi * yi0; ai0 += xi * yr0; *X = ar0; X[1] = ai0; #endif #endif }}#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?