atl_ptsyr2k.c

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

C
464
字号
      vc = malloc( ATL_Cachelen + lgth );   if( vc == NULL ) return( 1 );#ifdef TREAL   alpha    = *((TYPE *)(ALPHA)); beta = *((TYPE *)(BETA) );   zero     = ATL_rzero;          zptr = (void *)(&zero);#else   alpha[0] = ((TYPE *)(ALPHA))[0]; alpha[1] = ((TYPE *)(ALPHA))[1];   beta [0] = ((TYPE *)(BETA ))[0]; beta [1] = ((TYPE *)(BETA ))[1];   zero [0] = ATL_rzero;            zero [1] = ATL_rzero;   zptr     = (void *)(zero);#endif   c = ATL_AlignPtr( vc );   if( TRANS == AtlasNoTrans )   {      root = Mjoin( PATL, ptgemm_nt )( NTHREADS, ATTR, AtlasNoTrans, TGEMM,                                       N, N, K, ALPHA, A, LDA, B, LDB, zptr,                                       (void *)(c), N );   }   else   {      root = Mjoin( PATL, ptgemm_nt )( NTHREADS, ATTR, TGEMM, AtlasNoTrans,                                       N, N, K, ALPHA, A, LDA, B, LDB, zptr,                                       (void *)(c), N );   }   ATL_join_tree( root );   ATL_free_tree( root );   if( UPLO == AtlasUpper )   {      if(      SCALAR_IS_ONE(  beta ) )      { Mjoin( PATL, syr2k_putU_b1   )( N, c, beta, (TYPE *)(C), LDC ); }      else if( SCALAR_IS_ZERO( beta ) )      { Mjoin( PATL, syr2k_putU_b0   )( N, c, beta, (TYPE *)(C), LDC ); }#ifdef TCPLX      else if( SCALAR_IS_NONE( beta ) )      { Mjoin( PATL, syr2k_putU_bn1  )( N, c, beta, (TYPE *)(C), LDC ); }      else if( beta[1] == ATL_rzero   )      { Mjoin( PATL, syr2k_putU_bXi0 )( N, c, beta, (TYPE *)(C), LDC ); }#endif      else      { Mjoin( PATL, syr2k_putU_bX   )( N, c, beta, (TYPE *)(C), LDC ); }   }   else   {      if(      SCALAR_IS_ONE(  beta ) )      { Mjoin( PATL, syr2k_putL_b1   )( N, c, beta, (TYPE *)(C), LDC ); }      else if( SCALAR_IS_ZERO( beta ) )      { Mjoin( PATL, syr2k_putL_b0   )( N, c, beta, (TYPE *)(C), LDC ); }#ifdef TCPLX      else if( SCALAR_IS_NONE( beta ) )      { Mjoin( PATL, syr2k_putL_bn1  )( N, c, beta, (TYPE *)(C), LDC ); }      else if( beta[1] == ATL_rzero   )      { Mjoin( PATL, syr2k_putL_bXi0 )( N, c, beta, (TYPE *)(C), LDC ); }#endif      else      { Mjoin( PATL, syr2k_putL_bX   )( N, c, beta, (TYPE *)(C), LDC ); }   }   free( vc );   return( 0 );/* * End of Mjoin( PATL, ptsyr2k0_nt ) */}void Mjoin( PATL, ptsyr2k )(   const enum ATLAS_UPLO      UPLO,   const enum ATLAS_TRANS     TRANS,   const int                  N,   const int                  K,   const SCALAR               ALPHA,   const TYPE                 * A,   const int                  LDA,   const TYPE                 * B,   const int                  LDB,   const SCALAR               BETA,   TYPE                       * C,   const int                  LDC){/* * Purpose * ======= * * Mjoin( PATL, ptsyr2k ) performs one of the symmetric rank 2k operations * *    C := alpha * A * B' + alpha * B * A' + beta * C, * * or * *    C := alpha * A' * B + alpha * B' * A + beta * C, * * where alpha and beta are scalars, C is an n by n symmetric matrix and * A and B are n by k matrices in the first case and k by n  matrices in * the second case. * * For a  more  detailed description of  the arguments of this function, * see the reference implementation in the  ATLAS/src/blas/reference di- * rectory. * * --------------------------------------------------------------------- *//* * .. Local Variables .. */   PT_TREE_T                  root = NULL;   pthread_attr_t             attr;#ifdef TREAL   TYPE                       alpha0 = ALPHA, beta0 = BETA;#endif/* .. * .. Executable Statements .. * */   if( ( N == 0 ) || ( ( SCALAR_IS_ZERO( ALPHA ) || ( K == 0 ) ) &&                       SCALAR_IS_ONE( BETA ) ) ) return;   if( ( SCALAR_IS_ZERO( ALPHA ) ) || ( K == 0 ) )   { Mjoin( PATL, pttrscal )( UPLO, N, N, BETA, C, LDC ); return; }   ATL_thread_init( &attr );#ifdef TREAL   root = Mjoin( PATL, ptsyr2k_nt )( ATL_NTHREADS, &attr, UPLO, TRANS, N,                                     K, (void *)(&alpha0), (void *)(&alpha0),                                     (void *)(A), LDA, (void *)(B), LDB,                                     (void *)(&beta0), (void *)(C), LDC );#else   root = Mjoin( PATL, ptsyr2k_nt )( ATL_NTHREADS, &attr, UPLO, TRANS, N,                                     K, (TYPE *)(ALPHA), (TYPE *)(ALPHA),                                     (void *)(A), LDA, (void *)(B), LDB,                                     (TYPE *)(BETA), (void *)(C), LDC );#endif   ATL_join_tree  ( root );   ATL_free_tree  ( root );   ATL_thread_exit( &attr );/* * End of Mjoin( PATL, ptsyr2k ) */}PT_TREE_T Mjoin( PATL, ptsyr2k_nt )(   const unsigned int         NTHREADS,   pthread_attr_t             * ATTR,   const enum ATLAS_UPLO      UPLO,   const enum ATLAS_TRANS     TRANS,   const int                  N,   const int                  K,   const void                 * ALPHA,   const void                 * ALPHC,   const void                 * A,   const int                  LDA,   const void                 * B,   const int                  LDB,   const void                 * BETA,   void                       * C,   const int                  LDC){/* * Purpose * ======= * * Mjoin( PATL, ptsyr2k_nt ) performs one of the symmetric rank 2k operations * *    C := alpha * A * B' + alpha * B * A' + beta * C, * * or * *    C := alpha * A' * B + alpha * B' * A + beta * C, * * where alpha and beta are scalars, C is an n by n symmetric matrix and * A and B are n by k matrices in the first case and k by n  matrices in * the second case. * * For a  more  detailed description of  the arguments of this function, * see the reference implementation in the  ATLAS/src/blas/reference di- * rectory. * * --------------------------------------------------------------------- *//* * .. Local Variables .. */   PT_TREE_T                  root = NULL;   PT_LVL3_TYPE_T             type;#ifdef TREAL   TYPE                       alpha,    beta;#else   TYPE                       alpha[2], beta[2];#endif   double                     tblks;   unsigned int               nthreads;   int                        nb, nbm1;/* .. * .. Executable Statements .. * */   nbm1  = ( nb = Mjoin( PATL, GetNB )() ) - 1;   tblks = (double)( (N+nbm1) / nb ) * (double)( (N+nbm1) / nb ) *           (double)( (K+nbm1) / nb );   if( ( tblks <= (double)(ATL_XOVER_L3_DEFAULT) ) || ( NTHREADS <= 1 ) )   {#ifdef TREAL      alpha    = *((TYPE *)(ALPHA));   beta     = *((TYPE *)(BETA ));#else      alpha[0] = ((TYPE *)(ALPHA))[0]; alpha[1] = ((TYPE *)(ALPHA))[1];      beta [0] = ((TYPE *)(BETA ))[0]; beta [1] = ((TYPE *)(BETA ))[1];#endif      Mjoin( PATL, syr2k )( UPLO, TRANS, N, K, alpha, (TYPE *)(A), LDA,                            (TYPE *)(B), LDB, beta, C, LDC );      return( root );   }   if( tblks >= (double)(NTHREADS) ) { nthreads = NTHREADS; }   else    { nthreads = (unsigned int)floor( tblks + 0.5 ); }   Mjoin( PATL, ptl3settype )( &type );   root = ATL_Ssyr2k( &type, 0, nthreads, ATTR, nb, UPLO, TRANS, AtlasTrans,                      0, 0, N, K, ALPHA, ALPHC, A, LDA, B, LDB, BETA, C, LDC );   ATL_thread_tree( root, ATTR );   return( root );/* * End of Mjoin( PATL, ptsyr2k_nt ) */}

⌨️ 快捷键说明

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