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 | |||
) |