atl_ctrsmk.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 1,052 行 · 第 1/2 页
C
1,052 行
/* * 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"#include "atlas_prefetch.h"#ifdef Left_static void trsmLU_2(const int N, const TYPE *A, TYPE *B, const int ldb)/* * 'Left, 'Upper', with 1 col prefetch, written with all dependencies shown, * so that compiler can optimize. * A is known to be 2x2, with 1/alpha already applied, diagonals already * inverted */{ const TYPE ar11=*A, ai11=A[1], ar12=A[4], ai12=A[5]; const TYPE ar22=A[6], ai22=A[7]; TYPE xr1, xi1, xr2, xi2; TYPE t0, p0; const int ldb2=ldb+ldb; TYPE *bn=B+ldb2; const int pfd=ldb2+ldb2; int j; p0 = B[2]; for (j=N-1; j; j--) /* stop 1 iteration early to stop prefetch */ { xr2 = p0 ; xi2 = B[3]; xr1 = *B ; xi1 = B[1]; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; p0 = bn[2]; xr1 -= ar12*xr2 - ai12*xi2; xi1 -= ar12*xi2 + ai12*xr2; ATL_pfl1W(bn+pfd); t0 = xr1; xr1 = ar11*xr1 - ai11*xi1; xi1 = ar11*xi1 + ai11*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B = bn; bn += ldb2; } xr2 = p0 ; xi2 = B[3]; xr1 = *B ; xi1 = B[1]; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr1 -= ar12*xr2 - ai12*xi2; xi1 -= ar12*xi2 + ai12*xr2; t0 = xr1; xr1 = ar11*xr1 - ai11*xi1; xi1 = ar11*xi1 + ai11*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2;}static void trsmLU_3(const int N, const TYPE *A, TYPE *B, const int ldb)/* * 'Left, 'Upper', with 1 col prefetch, written with all dependencies shown, * so that compiler can optimize. * A is known to be 3x3, with 1/alpha already applied, diagonals already * inverted */{ const TYPE ar11=*A, ai11=A[1], ar12=A[6], ai12=A[7], ar13=A[12], ai13=A[13]; const TYPE ar22=A[ 8], ai22=A[ 9], ar23=A[14], ai23=A[15]; const TYPE ar33=A[16], ai33=A[17]; TYPE xr1, xi1, xr2, xi2, xr3, xi3; TYPE t0, p0; const int ldb2=ldb+ldb; TYPE *bn=B+ldb2; const int pfd=ldb2+ldb2; int j; p0 = B[4]; for (j=N-1; j; j--) { xr3 = p0 ; xi3 = B[5]; xr1 = *B ; xi1 = B[1]; xr2 = B[2]; xi2 = B[3]; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; xr2 -= ar23*xr3 - ai23*xi3; p0 = bn[4]; xi2 -= ar23*xi3 + ai23*xr3; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr1 -= ar13*xr3 - ai13*xi3; ATL_pfl1W(bn+pfd); xi1 -= ar13*xi3 + ai13*xr3; ATL_pfl1W(bn+pfd+4); xr1 -= ar12*xr2 - ai12*xi2; xi1 -= ar12*xi2 + ai12*xr2; t0 = xr1; xr1 = ar11*xr1 - ai11*xi1; xi1 = ar11*xi1 + ai11*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3; B = bn; bn += ldb2; } xr3 = p0 ; xi3 = B[5]; xr1 = *B ; xi1 = B[1]; xr2 = B[2]; xi2 = B[3]; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; xr2 -= ar23*xr3 - ai23*xi3; xi2 -= ar23*xi3 + ai23*xr3; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr1 -= ar13*xr3 - ai13*xi3; xi1 -= ar13*xi3 + ai13*xr3; xr1 -= ar12*xr2 - ai12*xi2; xi1 -= ar12*xi2 + ai12*xr2; t0 = xr1; xr1 = ar11*xr1 - ai11*xi1; xi1 = ar11*xi1 + ai11*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3;}static void trsmLU_4(const int N, const TYPE *A, TYPE *B, const int ldb)/* * 'Left, 'Upper', with 1 col prefetch, written with all dependencies shown, * so that compiler can optimize. * A is known to be 4x4, with 1/alpha already applied, diagonals already * inverted */{ const TYPE ar11=*A, ai11=A[1], ar12=A[8], ai12=A[9], ar13=A[16], ai13=A[17], ar14=A[24], ai14=A[25]; const TYPE ar22=A[10], ai22=A[11], ar23=A[18], ai23=A[19], ar24=A[26], ai24=A[27]; const TYPE ar33=A[20], ai33=A[21], ar34=A[28], ai34=A[29]; const TYPE ar44=A[30], ai44=A[31]; TYPE xr1, xi1, xr2, xi2, xr3, xi3, xr4, xi4; TYPE t0, p0; const int ldb2=ldb+ldb; TYPE *bn=B+ldb2; const int pfd = ldb2+ldb2; int j; p0 = B[6]; for (j=N-1; j; j--) { xr4 = p0 ; xi4 = B[7]; xr1 = *B; xi1 = B[1]; xr3 = B[4]; xi3 = B[5]; xr2 = B[2]; xi2 = B[3]; t0 = xr4; xr4 = ar44*xr4 - ai44*xi4; xi4 = ar44*xi4 + ai44*t0; xr3 -= ar34*xr4 - ai34*xi4; xi3 -= ar34*xi4 + ai34*xr4; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; xr2 -= ar24*xr4 - ai24*xi4; p0 = bn[6]; xi2 -= ar24*xi4 + ai24*xr4; xr2 -= ar23*xr3 - ai23*xi3; xi2 -= ar23*xi3 + ai23*xr3; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; ATL_pfl1W(bn+pfd); xi2 = ar22*xi2 + ai22*t0; ATL_pfl1W(bn+pfd+4); xr1 -= ar14*xr4 - ai14*xi4; xi1 -= ar14*xi4 + ai14*xr4; xr1 -= ar13*xr3 - ai13*xi3; xi1 -= ar13*xi3 + ai13*xr3; xr1 -= ar12*xr2 - ai12*xi2; xi1 -= ar12*xi2 + ai12*xr2; t0 = xr1; xr1 = ar11*xr1 - ai11*xi1; xi1 = ar11*xi1 + ai11*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3; B[6] = xr4; B[7] = xi4; B = bn; bn += ldb2; } xr4 = p0 ; xi4 = B[7]; xr1 = *B; xi1 = B[1]; xr3 = B[4]; xi3 = B[5]; xr2 = B[2]; xi2 = B[3]; t0 = xr4; xr4 = ar44*xr4 - ai44*xi4; xi4 = ar44*xi4 + ai44*t0; xr3 -= ar34*xr4 - ai34*xi4; xi3 -= ar34*xi4 + ai34*xr4; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; xr2 -= ar24*xr4 - ai24*xi4; xi2 -= ar24*xi4 + ai24*xr4; xr2 -= ar23*xr3 - ai23*xi3; xi2 -= ar23*xi3 + ai23*xr3; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr1 -= ar14*xr4 - ai14*xi4; xi1 -= ar14*xi4 + ai14*xr4; xr1 -= ar13*xr3 - ai13*xi3; xi1 -= ar13*xi3 + ai13*xr3; xr1 -= ar12*xr2 - ai12*xi2; xi1 -= ar12*xi2 + ai12*xr2; t0 = xr1; xr1 = ar11*xr1 - ai11*xi1; xi1 = ar11*xi1 + ai11*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3; B[6] = xr4; B[7] = xi4;}static void trsmLL_2(const int N, const TYPE *A, TYPE *B, const int ldb)/* * 'Left', 'Lower', with 1 column prefetch, written with all dependencies * shown, so that the compiler can optimize. * A is known to be 2x2, with 1/alpha already applied, diagonals already * inverted */{ const TYPE ar11=*A, ai11=A[1], ar21=A[2], ai21=A[3]; const TYPE ar22=A[6], ai22=A[7]; const int ldb2 = ldb+ldb; TYPE xr1, xi1, xr2, xi2; TYPE t0, p0; TYPE *pBn=B+ldb2; const int pfd=ldb2+ldb2; int j; p0 = *B; for (j=N-1; j; j--) { xr1 = p0; xi1 = B[1]; xr2 = B[2]; xi2 = B[3]; t0 = xr1; xr1 = ar11 * xr1 - ai11 * xi1; xi1 = ar11 * xi1 + ai11 * t0; p0 = *pBn; xr2 -= ar21*xr1 - ai21*xi1; xi2 -= ar21*xi1 + ai21*xr1; ATL_pfl1W(pBn+pfd); t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B = pBn; pBn += ldb2; } xr1 = p0; xi1 = B[1]; xr2 = B[2]; xi2 = B[3]; t0 = xr1; xr1 = ar11 * xr1 - ai11 * xi1; xi1 = ar11 * xi1 + ai11 * t0; xr2 -= ar21*xr1 - ai21*xi1; xi2 -= ar21*xi1 + ai21*xr1; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2;}static void trsmLL_3(const int N, const TYPE *A, TYPE *B, const int ldb)/* * 'Left', 'Lower', with 1 column prefetch, written with all dependencies * shown, so that the compiler can optimize. * A is known to be 3x3, with 1/alpha already applied, diagonals already * inverted */{ const TYPE ar11=*A, ai11=A[1], ar21=A[2], ai21=A[3], ar31=A[4], ai31=A[5]; const TYPE ar22=A[ 8], ai22=A[ 9], ar32=A[10], ai32=A[11]; const TYPE ar33=A[16], ai33=A[17]; const int ldb2 = ldb+ldb; TYPE xr1, xi1, xr2, xi2, xr3, xi3; TYPE t0, p0; TYPE *pBn=B+ldb2; const int pfd=ldb2+ldb2; int j; p0 = *B; for (j=N-1; j; j--) { xr1 = p0; xi1 = B[1]; xr3 = B[4]; xi3 = B[5]; xr2 = B[2]; xi2 = B[3]; t0 = xr1; xr1 = ar11 * xr1 - ai11 * xi1; xi1 = ar11 * xi1 + ai11 * t0; xr2 -= ar21*xr1 - ai21*xi1; xi2 -= ar21*xi1 + ai21*xr1; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; p0 = *pBn; xr3 -= ar31*xr1 - ai31*xi1; xi3 -= ar31*xi1 + ai31*xr1; xr3 -= ar32*xr2 - ai32*xi2; ATL_pfl1W(pBn+pfd); xi3 -= ar32*xi2 + ai32*xr2; ATL_pfl1W(pBn+pfd+4); t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3; B = pBn; pBn += ldb2; } xr1 = p0; xi1 = B[1]; xr3 = B[4]; xi3 = B[5]; xr2 = B[2]; xi2 = B[3]; t0 = xr1; xr1 = ar11 * xr1 - ai11 * xi1; xi1 = ar11 * xi1 + ai11 * t0; xr2 -= ar21*xr1 - ai21*xi1; xi2 -= ar21*xi1 + ai21*xr1; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr3 -= ar31*xr1 - ai31*xi1; xi3 -= ar31*xi1 + ai31*xr1; xr3 -= ar32*xr2 - ai32*xi2; xi3 -= ar32*xi2 + ai32*xr2; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3;}static void trsmLL_4(const int N, const TYPE *A, TYPE *B, const int ldb)/* * 'Left', 'Lower', with 1 column prefetch, written with all dependencies * shown, so that the compiler can optimize. * A is known to be 4x4, with 1/alpha already applied, diagonals already * inverted */{ const TYPE ar11=*A, ai11=A[1], ar21=A[2], ai21=A[3], ar31=A[4], ai31=A[5], ar41=A[6], ai41=A[7]; const TYPE ar22=A[10], ai22=A[11], ar32=A[12], ai32=A[13], ar42=A[14], ai42=A[15]; const TYPE ar33=A[20], ai33=A[21], ar43=A[22], ai43=A[23]; const TYPE ar44=A[30], ai44=A[31]; const int ldb2 = ldb+ldb; TYPE xr1, xi1, xr2, xi2, xr3, xi3, xr4, xi4; TYPE t0, p0; TYPE *pBn=B+ldb2; const int pfd = ldb2+ldb2; int j; p0 = *B; for (j=N-1; j; j--) { xr1 = p0; xi1 = B[1]; xr3 = B[4]; xi3 = B[5]; xr2 = B[2]; xi2 = B[3]; xr4 = B[6]; xi4 = B[7]; t0 = xr1; xr1 = ar11 * xr1 - ai11 * xi1; xi1 = ar11 * xi1 + ai11 * t0; xr2 -= ar21*xr1 - ai21*xi1; xi2 -= ar21*xi1 + ai21*xr1; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr3 -= ar31*xr1 - ai31*xi1; xi3 -= ar31*xi1 + ai31*xr1; xr3 -= ar32*xr2 - ai32*xi2; p0 = *pBn; xi3 -= ar32*xi2 + ai32*xr2; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; xr4 -= ar41*xr1 - ai41*xi1; ATL_pfl1W(pBn+pfd); xi4 -= ar41*xi1 + ai41*xr1; ATL_pfl1W(pBn+pfd+4); xr4 -= ar42*xr2 - ai42*xi2; xi4 -= ar42*xi2 + ai42*xr2; xr4 -= ar43*xr3 - ai43*xi3; xi4 -= ar43*xi3 + ai43*xr3; t0 = xr4; xr4 = ar44*xr4 - ai44*xi4; xi4 = ar44*xi4 + ai44*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3; B[6] = xr4; B[7] = xi4; B = pBn; pBn += ldb2; } xr1 = p0; xi1 = B[1]; xr3 = B[4]; xi3 = B[5]; xr2 = B[2]; xi2 = B[3]; xr4 = B[6]; xi4 = B[7]; t0 = xr1; xr1 = ar11 * xr1 - ai11 * xi1; xi1 = ar11 * xi1 + ai11 * t0; xr2 -= ar21*xr1 - ai21*xi1; xi2 -= ar21*xi1 + ai21*xr1; t0 = xr2; xr2 = ar22*xr2 - ai22*xi2; xi2 = ar22*xi2 + ai22*t0; xr3 -= ar31*xr1 - ai31*xi1; xi3 -= ar31*xi1 + ai31*xr1; xr3 -= ar32*xr2 - ai32*xi2; xi3 -= ar32*xi2 + ai32*xr2; t0 = xr3; xr3 = ar33*xr3 - ai33*xi3; xi3 = ar33*xi3 + ai33*t0; xr4 -= ar41*xr1 - ai41*xi1; xi4 -= ar41*xi1 + ai41*xr1; xr4 -= ar42*xr2 - ai42*xi2; xi4 -= ar42*xi2 + ai42*xr2; xr4 -= ar43*xr3 - ai43*xi3; xi4 -= ar43*xi3 + ai43*xr3; t0 = xr4; xr4 = ar44*xr4 - ai44*xi4; xi4 = ar44*xi4 + ai44*t0; *B = xr1; B[1] = xi1; B[2] = xr2; B[3] = xi2; B[4] = xr3; B[5] = xi3; B[6] = xr4; B[7] = xi4;}#endif#ifdef Right_static void trsmRU_2(const int M, const TYPE *A, TYPE *B, const int ldb)/* * 'Right', 'Upper', written with all dependencies shown, so that the * compiler can optimize. A is known to be 2x2, with 1/alpha already applied, * diagonals already inverted. */{ const TYPE ar11=*A, ai11=A[1], ar12=A[4], ai12=A[5]; const TYPE ar22=A[6], ai22=A[7]; const int ldb2 = ldb+ldb; TYPE xr1, xi1, xr2, xi2, t0; TYPE *pB0=B, *pB1 = B+ldb2; int i; #define PFD 8 for (i=M; i; i--) { xr1 = *pB0; xr2 = *pB1; xi1 = pB0[1]; xi2 = pB1[1];/* * real sequence: * x1 *= a11; * x2 = (x2 - x1*a12) * a22; */ t0 = xr1; xr1 = xr1*ar11 - xi1*ai11; xi1 = t0 *ai11 + xi1*ar11; xr2 -= xr1*ar12 - xi1*ai12; xi2 -= xr1*ai12 + xi1*ar12; ATL_pfl1W(pB0+PFD);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?