atl_mm6x8x8_1p.c

来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 1,986 行 · 第 1/5 页

C
1,986
字号
      rC2_3 += rA2 * rB3;      rC3_3 += rA3 * rB3;      rC4_3 += rA4 * rB3; ra5 = *pA5++;      rC5_3 += rA5 * rB3;      rC0_4 += rA0 * rB4;      rC1_4 += rA1 * rB4; rb1 = *pB1++;      rC2_4 += rA2 * rB4;      rC3_4 += rA3 * rB4;      rC4_4 += rA4 * rB4; rb2 = *pB2++;      rC5_4 += rA5 * rB4;      rC0_5 += rA0 * rB5;      rC1_5 += rA1 * rB5; rb3 = *pB3++;      rC2_5 += rA2 * rB5;      rC3_5 += rA3 * rB5;      rC4_5 += rA4 * rB5; rb4 = *pB4++;      rC5_5 += rA5 * rB5;      rC0_6 += rA0 * rB6;      rC1_6 += rA1 * rB6; rb5 = *pB5++;      rC2_6 += rA2 * rB6;      rC3_6 += rA3 * rB6;      rC4_6 += rA4 * rB6; rb6 = *pB6++;      rC5_6 += rA5 * rB6;      rC0_7 += rA0 * rB7;      rC1_7 += rA1 * rB7; rb7 = *pB7++;      rC2_7 += rA2 * rB7;      rC3_7 += rA3 * rB7;      rC4_7 += rA4 * rB7; rB0 = *pB0++;      rC5_7 += rA5 * rB7;      rC0_0 += ra0 * rb0;      rC1_0 += ra1 * rb0; rA0 = *pA0++;      rC2_0 += ra2 * rb0;      rC3_0 += ra3 * rb0;      rC4_0 += ra4 * rb0; rA1 = *pA1++;      rC5_0 += ra5 * rb0;      rC0_1 += ra0 * rb1;      rC1_1 += ra1 * rb1; rA2 = *pA2++;      rC2_1 += ra2 * rb1;      rC3_1 += ra3 * rb1;      rC4_1 += ra4 * rb1; rA3 = *pA3++;      rC5_1 += ra5 * rb1;      rC0_2 += ra0 * rb2;      rC1_2 += ra1 * rb2; rA4 = *pA4++;      rC2_2 += ra2 * rb2;      rC3_2 += ra3 * rb2;      rC4_2 += ra4 * rb2; rA5 = *pA5++;      rC5_2 += ra5 * rb2;      rC0_3 += ra0 * rb3;      rC1_3 += ra1 * rb3; rB1 = *pB1++;      rC2_3 += ra2 * rb3;      rC3_3 += ra3 * rb3;      rC4_3 += ra4 * rb3; rB2 = *pB2++;      rC5_3 += ra5 * rb3;      rC0_4 += ra0 * rb4;      rC1_4 += ra1 * rb4; rB3 = *pB3++;      rC2_4 += ra2 * rb4;      rC3_4 += ra3 * rb4;      rC4_4 += ra4 * rb4; rB4 = *pB4++;      rC5_4 += ra5 * rb4;      rC0_5 += ra0 * rb5;      rC1_5 += ra1 * rb5; rB5 = *pB5++;      rC2_5 += ra2 * rb5;      rC3_5 += ra3 * rb5;      rC4_5 += ra4 * rb5; rB6 = *pB6++;      rC5_5 += ra5 * rb5;      rC0_6 += ra0 * rb6;      rC1_6 += ra1 * rb6;      rC2_6 += ra2 * rb6; rB7 = *pB7++;      rC3_6 += ra3 * rb6;      rC4_6 += ra4 * rb6;      rC5_6 += ra5 * rb6;      rC0_7 += ra0 * rb7;      rC1_7 += ra1 * rb7;      rC2_7 += ra2 * rb7;      rC3_7 += ra3 * rb7;      rC4_7 += ra4 * rb7;      rC5_7 += ra5 * rb7;      rC0_0 += rA0 * rB0;      rC1_0 += rA1 * rB0;      rC2_0 += rA2 * rB0;      rC3_0 += rA3 * rB0;      rC4_0 += rA4 * rB0; rb0 = *pB0++;      rC5_0 += rA5 * rB0;      rC0_1 += rA0 * rB1;      rC1_1 += rA1 * rB1; ra0 = *pA0++;      rC2_1 += rA2 * rB1;      rC3_1 += rA3 * rB1;      rC4_1 += rA4 * rB1; ra1 = *pA1++;      rC5_1 += rA5 * rB1;      rC0_2 += rA0 * rB2;      rC1_2 += rA1 * rB2; ra2 = *pA2++;      rC2_2 += rA2 * rB2;      rC3_2 += rA3 * rB2;      rC4_2 += rA4 * rB2; ra3 = *pA3++;      rC5_2 += rA5 * rB2;      rC0_3 += rA0 * rB3;      rC1_3 += rA1 * rB3; ra4 = *pA4++;      rC2_3 += rA2 * rB3;      rC3_3 += rA3 * rB3;      rC4_3 += rA4 * rB3; ra5 = *pA5++;      rC5_3 += rA5 * rB3;      rC0_4 += rA0 * rB4;      rC1_4 += rA1 * rB4; rb1 = *pB1++;      rC2_4 += rA2 * rB4;      rC3_4 += rA3 * rB4;      rC4_4 += rA4 * rB4; rb2 = *pB2++;      rC5_4 += rA5 * rB4;      rC0_5 += rA0 * rB5;      rC1_5 += rA1 * rB5; rb3 = *pB3++;      rC2_5 += rA2 * rB5;      rC3_5 += rA3 * rB5;      rC4_5 += rA4 * rB5; rb4 = *pB4++;      rC5_5 += rA5 * rB5;      rC0_6 += rA0 * rB6;      rC1_6 += rA1 * rB6; rb5 = *pB5++;      rC2_6 += rA2 * rB6;      rC3_6 += rA3 * rB6;      rC4_6 += rA4 * rB6; rb6 = *pB6++;      rC5_6 += rA5 * rB6;      rC0_7 += rA0 * rB7;      rC1_7 += rA1 * rB7; rb7 = *pB7++;      rC2_7 += rA2 * rB7;      rC3_7 += rA3 * rB7;      rC4_7 += rA4 * rB7;      rC5_7 += rA5 * rB7;      rC0_0 += ra0 * rb0;      rC1_0 += ra1 * rb0;      rC2_0 += ra2 * rb0;      rC3_0 += ra3 * rb0;      rC4_0 += ra4 * rb0;      rC5_0 += ra5 * rb0;      rC0_1 += ra0 * rb1;      rC1_1 += ra1 * rb1;      rC2_1 += ra2 * rb1;      rC3_1 += ra3 * rb1;      rC4_1 += ra4 * rb1;      rC5_1 += ra5 * rb1;      rC0_2 += ra0 * rb2;      rC1_2 += ra1 * rb2;      rC2_2 += ra2 * rb2;      rC3_2 += ra3 * rb2;      rC4_2 += ra4 * rb2;      rC5_2 += ra5 * rb2;      rC0_3 += ra0 * rb3;      rC1_3 += ra1 * rb3;      rC2_3 += ra2 * rb3;      rC3_3 += ra3 * rb3;      rC4_3 += ra4 * rb3;      rC5_3 += ra5 * rb3;      rC0_4 += ra0 * rb4;      rC1_4 += ra1 * rb4;      rC2_4 += ra2 * rb4;      rC3_4 += ra3 * rb4;      rC4_4 += ra4 * rb4;      rC5_4 += ra5 * rb4;      rC0_5 += ra0 * rb5;      rC1_5 += ra1 * rb5;      rC2_5 += ra2 * rb5;      rC3_5 += ra3 * rb5;      rC4_5 += ra4 * rb5; pA0 += incAn;      rC5_5 += ra5 * rb5; pA1 += incAn;      rC0_6 += ra0 * rb6; pA2 += incAn;      rC1_6 += ra1 * rb6; pA3 += incAn;      rC2_6 += ra2 * rb6; pA4 += incAn;      rC3_6 += ra3 * rb6; pA5 += incAn;      rC4_6 += ra4 * rb6; pB0 += incBn;      rC5_6 += ra5 * rb6; pB1 += incBn;      rC0_7 += ra0 * rb7; pB2 += incBn;      rC1_7 += ra1 * rb7; pB3 += incBn;      rC2_7 += ra2 * rb7; pB4 += incBn;      rC3_7 += ra3 * rb7; pB5 += incBn;      rC4_7 += ra4 * rb7; pB6 += incBn;      rC5_7 += ra5 * rb7; pB7 += incBn;      switch(M)      {      case 5:         #ifdef TREAL            pC0[4] = rC4_0; pC1[4] = rC4_1; pC2[4] = rC4_2; pC3[4] = rC4_3;            pC4[4] = rC4_4; pC5[4] = rC4_5; pC6[4] = rC4_6; pC7[4] = rC4_7;         #else            pC0[8] = rC4_0; pC1[8] = rC4_1; pC2[8] = rC4_2; pC3[8] = rC4_3;            pC4[8] = rC4_4; pC5[8] = rC4_5; pC6[8] = rC4_6; pC7[8] = rC4_7;         #endif      case 4:         #ifdef TREAL            pC0[3] = rC3_0; pC1[3] = rC3_1; pC2[3] = rC3_2; pC3[3] = rC3_3;            pC4[3] = rC3_4; pC5[3] = rC3_5; pC6[3] = rC3_6; pC7[3] = rC3_7;         #else            pC0[6] = rC3_0; pC1[6] = rC3_1; pC2[6] = rC3_2; pC3[6] = rC3_3;            pC4[6] = rC3_4; pC5[6] = rC3_5; pC6[6] = rC3_6; pC7[6] = rC3_7;         #endif      case 3:         #ifdef TREAL            pC0[2] = rC2_0; pC1[2] = rC2_1; pC2[2] = rC2_2; pC3[2] = rC2_3;            pC4[2] = rC2_4; pC5[2] = rC2_5; pC6[2] = rC2_6; pC7[2] = rC2_7;         #else            pC0[4] = rC2_0; pC1[4] = rC2_1; pC2[4] = rC2_2; pC3[4] = rC2_3;            pC4[4] = rC2_4; pC5[4] = rC2_5; pC6[4] = rC2_6; pC7[4] = rC2_7;         #endif      case 2:         #ifdef TREAL            pC0[1] = rC1_0; pC1[1] = rC1_1; pC2[1] = rC1_2; pC3[1] = rC1_3;            pC4[1] = rC1_4; pC5[1] = rC1_5; pC6[1] = rC1_6; pC7[1] = rC1_7;         #else            pC0[2] = rC1_0; pC1[2] = rC1_1; pC2[2] = rC1_2; pC3[2] = rC1_3;            pC4[2] = rC1_4; pC5[2] = rC1_5; pC6[2] = rC1_6; pC7[2] = rC1_7;         #endif      default:         *pC0 = rC0_0; *pC1 = rC0_1; *pC2 = rC0_2; *pC3 = rC0_3;         *pC4 = rC0_4; *pC5 = rC0_5; *pC6 = rC0_6; *pC7 = rC0_7;      }      pC0 += incCn; pC1 += incCn; pC2 += incCn; pC3 += incCn;      pC4 += incCn; pC5 += incCn; pC6 += incCn; pC7 += incCn;   }   while(pB0 != stN);}#ifdef ldc2   #undef ldc2#endif#ifdef PFD   #undef PFD#endif#ifdef PFB   #undef PFB#endif#endif /* end CleanM */#ifdef ATL_CleanN#if defined(CleanM) || defined(CleanK)   #error Can clean only one dimension at a time!!#endifstatic void CleanN   (const int M, const int N, const int K, const TYPE alpha, const TYPE *A, const int lda, const TYPE *B, const int ldb, const TYPE beta, TYPE *C, const int ldc)/* * matmul with TA=T, TB=N, MB=0, NB=0, KB=0, * lda=0, ldb=0, ldc=0, mu=6, nu=8, ku=2 */{   const int Mb = (M/6)*6;   const int Nb = (N>>3)<<3;   #define PFD KB6   const int Kstart = (K>>3) - 1;   #define PFB 16   const TYPE *stM = A + (lda*Mb);   const TYPE *stN = B + (ldb*Nb);   const int incAm = ((((lda) << 2)+((lda) << 1)) - K), incAn = -(Mb*lda);   const int incBm = -K, incBn = (((ldb) << 3));   #ifdef TREAL      #define incCm 6      #define ldc2 ldc      const int incCn = (((ldc) << 3)) - (Mb);   #else      #define incCm 12      const int incCn = ((((ldc) << 3)) - (Mb))<<1, ldc2=ldc<<1;   #endif   TYPE *pC0=C, *pC1=pC0+(ldc2), *pC2=pC1+(ldc2), *pC3=pC2+(ldc2),        *pC4=pC3+(ldc2), *pC5=pC4+(ldc2), *pC6=pC5+(ldc2), *pC7=pC6+(ldc2);   const TYPE *pA0=A, *pA1=pA0+(lda), *pA2=pA1+(lda), *pA3=pA2+(lda),              *pA4=pA3+(lda), *pA5=pA4+(lda);   const TYPE *pB0=B, *pB1=pB0+(ldb), *pB2=pB1+(ldb), *pB3=pB2+(ldb),              *pB4=pB3+(ldb), *pB5=pB4+(ldb), *pB6=pB5+(ldb), *pB7=B;   register int k;   #ifdef BETAX      TYPE *bp = (TYPE *) &beta;   #endif   register TYPE rA0, rA1, rA2, rA3, rA4, rA5;   register TYPE ra0, ra1, ra2, ra3, ra4, ra5;   register TYPE rB0, rB1, rB2, rB3, rB4, rB5, rB6, rB7;   register TYPE rb0, rb1, rb2, rb3, rb4, rb5, rb6, rb7;   register TYPE rC0_0, rC1_0, rC2_0, rC3_0, rC4_0, rC5_0,                 rC0_1, rC1_1, rC2_1, rC3_1, rC4_1, rC5_1,                 rC0_2, rC1_2, rC2_2, rC3_2, rC4_2, rC5_2,                 rC0_3, rC1_3, rC2_3, rC3_3, rC4_3, rC5_3,                 rC0_4, rC1_4, rC2_4, rC3_4, rC4_4, rC5_4,                 rC0_5, rC1_5, rC2_5, rC3_5, rC4_5, rC5_5,                 rC0_6, rC1_6, rC2_6, rC3_6, rC4_6, rC5_6,                 rC0_7, rC1_7, rC2_7, rC3_7, rC4_7, rC5_7;   switch(N)   {   case 1:      pB1 = B;   case 2:      pB2 = B;   case 3:      pB3 = B;   case 4:      pB4 = B;   case 5:      pB5 = B;   case 6:      pB6 = B;   default:;   }   do /* M-loop */   {      rC0_0 = rC1_0 = rC2_0 = rC3_0 = rC4_0 = rC5_0 =      rC0_1 = rC1_1 = rC2_1 = rC3_1 = rC4_1 = rC5_1 =      rC0_2 = rC1_2 = rC2_2 = rC3_2 = rC4_2 = rC5_2 =      rC0_3 = rC1_3 = rC2_3 = rC3_3 = rC4_3 = rC5_3 =      rC0_4 = rC1_4 = rC2_4 = rC3_4 = rC4_4 = rC5_4 =      rC0_5 = rC1_5 = rC2_5 = rC3_5 = rC4_5 = rC5_5 =      rC0_6 = rC1_6 = rC2_6 = rC3_6 = rC4_6 = rC5_6 =      rC0_7 = rC1_7 = rC2_7 = rC3_7 = rC4_7 = rC5_7 = ATL_rzero;      #ifndef BETA0         switch(N)         {         case 7:            #ifdef TREAL               rC0_6 = *pC6;   rC1_6 = pC6[1]; rC2_6 = pC6[ 2];               rC3_6 = pC6[3]; rC4_6 = pC6[4]; rC5_6 = pC6[ 5];            #else               rC0_6 = *pC6;   rC1_6 = pC6[2]; rC2_6 = pC6[ 4];               rC3_6 = pC6[6]; rC4_6 = pC6[8]; rC5_6 = pC6[10];            #endif         case 6:            #ifdef TREAL               rC0_5 = *pC5;   rC1_5 = pC5[1]; rC2_5 = pC5[ 2];               rC3_5 = pC5[3]; rC4_5 = pC5[4]; rC5_5 = pC5[ 5];            #else               rC0_5 = *pC5;   rC1_5 = pC5[2]; rC2_5 = pC5[ 4];               rC3_5 = pC5[6]; rC4_5 = pC5[8]; rC5_5 = pC5[10];            #endif         case 5:            #ifdef TREAL               rC0_4 = *pC4;   rC1_4 = pC4[1]; rC2_4 = pC4[ 2];               rC3_4 = pC4[3]; rC4_4 = pC4[4]; rC5_4 = pC4[ 5];            #else               rC0_4 = *pC4;   rC1_4 = pC4[2]; rC2_4 = pC4[ 4];               rC3_4 = pC4[6]; rC4_4 = pC4[8]; rC5_4 = pC4[10];            #endif         case 4:            #ifdef TREAL               rC0_3 = *pC3;   rC1_3 = pC3[1]; rC2_3 = pC3[ 2];               rC3_3 = pC3[3]; rC4_3 = pC3[4]; rC5_3 = pC3[ 5];            #else               rC0_3 = *pC3;   rC1_3 = pC3[2]; rC2_3 = pC3[ 4];               rC3_3 = pC3[6]; rC4_3 = pC3[8]; rC5_3 = pC3[10];            #endif         case 3:            #ifdef TREAL               rC0_2 = *pC2;   rC1_2 = pC2[1]; rC2_2 = pC2[ 2];               rC3_2 = pC2[3]; rC4_2 = pC2[4]; rC5_2 = pC2[ 5];            #else               rC0_2 = *pC2;   rC1_2 = pC2[2]; rC2_2 = pC2[ 4];               rC3_2 = pC2[6]; rC4_2 = pC2[8]; rC5_2 = pC2[10];            #endif         case 2:            #ifdef TREAL               rC0_1 = *pC1;   rC1_1 = pC1[1]; rC2_1 = pC1[ 2];               rC3_1 = pC1[3]; rC4_1 = pC1[4]; rC5_1 = pC1[ 5];            #else               rC0_1 = *pC1;   rC1_1 = pC1[2]; rC2_1 = pC1[ 4];               rC3_1 = pC1[6]; rC4_1 = pC1[8]; rC5_1 = pC1[10];            #endif         default:            #ifdef TREAL               rC0_0 = *pC0;   rC1_0 = pC0[1]; rC2_0 = pC0[ 2];               rC3_0 = pC0[3]; rC4_0 = pC0[4]; rC5_0 = pC0[ 5];            #else               rC0_0 = *pC0;   rC1_0 = pC0[2]; rC2_0 = pC0[ 4];               rC3_0 = pC0[6]; rC4_0 = pC0[8]; rC5_0 = pC0[10];            #endif         }         #ifdef BETAX            rb7 = *bp;            rC0_0 *= rb7; rC1_0 *= rb7; rC2_0 *= rb7;            rC3_0 *= rb7; rC4_0 *= rb7; rC5_0 *= rb7;            rC0_1 *= rb7; rC1_1 *= rb7; rC2_1 *= rb7;            rC3_1 *= rb7; rC4_1 *= rb7; rC5_1 *= rb7;            rC0_2 *= rb7; rC1_2 *= rb7; rC2_2 *= rb7;            rC3_2 *= rb7; rC4_2 *= rb7; rC5_2 *= rb7;            rC0_3 *= rb7; rC1_3 *= rb7; rC2_3 *= rb7;            rC3_3 *= rb7; rC4_3 *= rb7; rC5_3 *= rb7;            rC0_4 *= rb7; rC1_4 *= rb7; rC2_4 *= rb7;            rC3_4 *= rb7; rC4_4 *= rb7; rC5_4 *= rb7;            rC0_5 *= rb7; rC1_5 *= rb7; rC2_5 *= rb7;            rC3_5 *= rb7; rC4_5 *= rb7; rC5_5 *= rb7;            rC0_6 *= rb7; rC1_6 *= rb7; rC2_6 *= rb7;            rC3_6 *= rb7; rC4_6 *= rb7; rC5_6 *= rb7;            rC0_7 *= rb7; rC1_7 *= rb7; rC2_7 *= rb7;            rC3_7 *= rb7; rC4_7 *= rb7; rC5_7 *= rb7;         #endif      #endif      rA0 = *pA0++; rA1 = *pA1++; rA2 = *pA2++; rA3 = *pA3++;      rA4 = *pA4++; rA5 = *pA5++;      rB0 = *pB0++; rB1 = *pB1++; rB2 = *pB2++; rB3 = *pB3++;      rB4 = *pB4++; rB5 = *pB5++; rB6 = *pB6++; rB7 = *pB7++;      for (k=Kstart; k; k--) /* easy loop to unroll */      {         rC0_0 += rA0 * rB0;         rC1_0 += rA1 * rB0; ATL_pfl1R(pA0+PFD-1);         rC2_0 += rA2 * rB0;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?