FLA_Gemm.c File Reference

(r)


Functions

FLA_Error FLA_Gemm (FLA_Trans transa, FLA_Trans transb, FLA_Obj alpha, FLA_Obj A, FLA_Obj B, FLA_Obj beta, FLA_Obj C)
void FLA_F2C() fla_gemm_f (F_INT *transa, F_INT *transb, F_INT *alpha, F_INT *A, F_INT *B, F_INT *beta, F_INT *C, F_INT *IERROR)

Variables

fla_gemm_tfla_gemm_cntl_blas
fla_gemm_tfla_gemm_cntl_pb_bb
fla_gemm_tfla_gemm_cntl_bp_bb
fla_gemm_tfla_gemm_cntl_ip_bb
fla_gemm_tfla_gemm_cntl_mp_ip
fla_gemm_tfla_gemm_cntl_mp_ip_bb
fla_gemm_tfla_gemm_cntl_op_bp
fla_gemm_tfla_gemm_cntl_op_bp_bb
fla_gemm_tfla_gemm_cntl_pm_ip
fla_gemm_tfla_gemm_cntl_pm_ip_bb
fla_gemm_tfla_gemm_cntl_op_pb
fla_gemm_tfla_gemm_cntl_op_pb_bb
fla_gemm_tfla_gemm_cntl_mp_pb
fla_gemm_tfla_gemm_cntl_mp_pb_bb
fla_gemm_tfla_gemm_cntl_pm_bp
fla_gemm_tfla_gemm_cntl_pm_bp_bb
fla_gemm_tfla_gemm_cntl_mm_pm
fla_gemm_tfla_gemm_cntl_mm_pm_ip
fla_gemm_tfla_gemm_cntl_mm_pm_ip_bb
fla_gemm_tfla_gemm_cntl_mm_mp
fla_gemm_tfla_gemm_cntl_mm_mp_ip
fla_gemm_tfla_gemm_cntl_mm_mp_ip_bb
fla_gemm_tfla_gemm_cntl_mm_op
fla_gemm_tfla_gemm_cntl_mm_op_bp
fla_gemm_tfla_gemm_cntl_mm_op_bp_bb
fla_blocksize_tfla_gemm_var1_bsize
fla_blocksize_tfla_gemm_var3_bsize
fla_blocksize_tfla_gemm_var5_bsize

Function Documentation

FLA_Error FLA_Gemm ( FLA_Trans  transa,
FLA_Trans  transb,
FLA_Obj  alpha,
FLA_Obj  A,
FLA_Obj  B,
FLA_Obj  beta,
FLA_Obj  C 
)

References FLA_Blocksize_extract(), FLA_Check_error_level(), FLA_Gemm_check(), FLA_Gemm_external(), FLA_Gemm_internal(), FLA_Obj_datatype(), FLA_Obj_length(), and FLA_Obj_width().

Referenced by fla_gemm_f(), fla_gemp_f(), fla_gepm_f(), and fla_gepp_f().

00069 {
00070   FLA_Error    r_val = FLA_SUCCESS;
00071 #ifdef FLA_ENABLE_BLAS3_FRONT_END_CNTL_TREES
00072   FLA_Datatype datatype;
00073   int          m_C, n_C, k_AB;
00074   int          FLA_GEMM_VAR1_BLOCKSIZE;
00075   int          FLA_GEMM_VAR3_BLOCKSIZE;
00076   int          FLA_GEMM_VAR5_BLOCKSIZE;
00077 #endif
00078   
00079   // Check parameters.
00080   if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING )
00081     FLA_Gemm_check( transa, transb, alpha, A, B, beta, C );
00082 
00083 #ifdef FLA_ENABLE_BLAS3_FRONT_END_CNTL_TREES
00084   // Determine the datatype of the operation.
00085   datatype = FLA_Obj_datatype( A );
00086 
00087   // Extract the appropriate blocksize for the given datatype.
00088   FLA_GEMM_VAR1_BLOCKSIZE = FLA_Blocksize_extract( datatype, fla_gemm_var1_bsize );
00089   FLA_GEMM_VAR3_BLOCKSIZE = FLA_Blocksize_extract( datatype, fla_gemm_var3_bsize );
00090   FLA_GEMM_VAR5_BLOCKSIZE = FLA_Blocksize_extract( datatype, fla_gemm_var5_bsize );
00091 
00092   // Determine the m and n dimensions from C.
00093   m_C = FLA_Obj_length( C );
00094   n_C = FLA_Obj_width( C );
00095 
00096   // Determine the k dimension of A and B.
00097   if ( transa == FLA_NO_TRANSPOSE )
00098     k_AB = FLA_Obj_width( A );
00099   else
00100     k_AB = FLA_Obj_length( A );
00101 
00102   // Invoke FLA_Gemm_internal() with the appropriate control tree.
00103   if      ( FLA_GEMM_VAR1_BLOCKSIZE < m_C && FLA_GEMM_VAR3_BLOCKSIZE < n_C && FLA_GEMM_VAR5_BLOCKSIZE < k_AB )
00104   {
00105     r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_mm_op );
00106     //r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_mm_mp );
00107     //r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_mm_pm );
00108   }
00109   else if ( m_C <= FLA_GEMM_VAR1_BLOCKSIZE && FLA_GEMM_VAR3_BLOCKSIZE < n_C && FLA_GEMM_VAR5_BLOCKSIZE < k_AB )
00110   {
00111     r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_pm_bp );
00112     //r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_pm_ip );
00113   }
00114   else if ( FLA_GEMM_VAR1_BLOCKSIZE < m_C && n_C <= FLA_GEMM_VAR3_BLOCKSIZE && FLA_GEMM_VAR5_BLOCKSIZE < k_AB )
00115   {
00116     r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_mp_pb );
00117     //r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_mp_ip );
00118   }
00119   else if ( FLA_GEMM_VAR1_BLOCKSIZE < m_C && FLA_GEMM_VAR3_BLOCKSIZE < n_C && k_AB <= FLA_GEMM_VAR5_BLOCKSIZE )
00120   {
00121     r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_op_bp );
00122     //r_val = FLA_Gemm_internal( transa, transb, alpha, A, B, beta, C, fla_gemm_cntl_op_pb );
00123   }
00124   else
00125   {
00126     r_val = FLA_Gemm_external( transa, transb, alpha, A, B, beta, C );
00127   }
00128 #else
00129   r_val = FLA_Gemm_external( transa, transb, alpha, A, B, beta, C );
00130 #endif
00131 
00132   return r_val;
00133 }

void FLA_F2C() fla_gemm_f ( F_INT *  transa,
F_INT *  transb,
F_INT *  alpha,
F_INT *  A,
F_INT *  B,
F_INT *  beta,
F_INT *  C,
F_INT *  IERROR 
)

References FLA_Gemm().

00137 {
00138   *IERROR = FLA_Gemm( *( ( FLA_Trans * ) transa ),
00139                       *( ( FLA_Trans * ) transb ),
00140                       *( ( FLA_Obj   * ) alpha  ),
00141                       *( ( FLA_Obj   * ) A      ),
00142                       *( ( FLA_Obj   * ) B      ),
00143                       *( ( FLA_Obj   * ) beta   ),
00144                       *( ( FLA_Obj   * ) C      ) );
00145 }


Variable Documentation


Generated on Mon Jul 6 05:45:53 2009 for libflame by  doxygen 1.5.9