#include "blis.h"
void bli_obj_create
(
num_t dt,
dim_t m,
dim_t n,
inc_t rs,
inc_t cs,
obj_t* obj
)
{
bli_init_once();
bli_obj_create_without_buffer( dt, m, n, obj );
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_obj_create(): " );
#endif
bli_obj_alloc_buffer( rs, cs, 1, obj );
}
void bli_obj_create_with_attached_buffer
(
num_t dt,
dim_t m,
dim_t n,
void* p,
inc_t rs,
inc_t cs,
obj_t* obj
)
{
bli_init_once();
bli_obj_create_without_buffer( dt, m, n, obj );
bli_obj_attach_buffer( p, rs, cs, 1, obj );
}
void bli_obj_create_without_buffer
(
num_t dt,
dim_t m,
dim_t n,
obj_t* obj
)
{
bli_init_once();
if ( bli_error_checking_is_enabled() )
bli_obj_create_without_buffer_check( dt, m, n, obj );
siz_t elem_size = bli_dt_size( dt );
bli_obj_set_defaults( obj );
bli_obj_set_as_root( obj );
bli_obj_set_buffer( NULL, obj );
bli_obj_set_dt( dt, obj );
bli_obj_set_elem_size( elem_size, obj );
bli_obj_set_target_dt( dt, obj );
bli_obj_set_exec_dt( dt, obj );
bli_obj_set_comp_dt( dt, obj );
bli_obj_set_dims( m, n, obj );
bli_obj_set_offs( 0, 0, obj );
bli_obj_set_diag_offset( 0, obj );
bli_obj_set_pack_fn( NULL, obj );
bli_obj_set_pack_params( NULL, obj );
bli_obj_set_ker_fn( NULL, obj );
bli_obj_set_ker_params( NULL, obj );
bli_obj_set_scalar_dt( dt, obj );
void* s = bli_obj_internal_scalar_buffer( obj );
if ( bli_is_float( dt ) ) { bli_cset1s( *(( scomplex* )s) ); }
else if ( bli_is_double( dt ) ) { bli_zset1s( *(( dcomplex* )s) ); }
else if ( bli_is_scomplex( dt ) ) { bli_cset1s( *(( scomplex* )s) ); }
else if ( bli_is_dcomplex( dt ) ) { bli_zset1s( *(( dcomplex* )s) ); }
}
void bli_obj_alloc_buffer
(
inc_t rs,
inc_t cs,
inc_t is,
obj_t* obj
)
{
dim_t n_elem = 0;
err_t r_val;
bli_init_once();
dim_t m = bli_obj_length( obj );
dim_t n = bli_obj_width( obj );
siz_t elem_size = bli_obj_elem_size( obj );
bli_adjust_strides( m, n, elem_size, &rs, &cs, &is );
if ( bli_error_checking_is_enabled() )
bli_obj_alloc_buffer_check( rs, cs, is, obj );
if ( m == 0 || n == 0 )
{
n_elem = 0;
}
else
{
n_elem = (m-1) * bli_abs( rs ) + (n-1) * bli_abs( cs ) + 1;
}
if ( bli_obj_is_complex( obj ) )
{
n_elem = bli_abs( is ) / 2 + n_elem;
}
siz_t buffer_size = ( siz_t )n_elem * elem_size;
void* p = bli_malloc_user( buffer_size, &r_val );
bli_obj_set_buffer( p, obj );
bli_obj_set_strides( rs, cs, obj );
bli_obj_set_imag_stride( is, obj );
}
void bli_obj_attach_buffer
(
void* p,
inc_t rs,
inc_t cs,
inc_t is,
obj_t* obj
)
{
bli_init_once();
if ( is == 0 ) is = 1;
if ( bli_error_checking_is_enabled() )
bli_obj_attach_buffer_check( p, rs, cs, is, obj );
bli_obj_set_buffer( p, obj );
bli_obj_set_strides( rs, cs, obj );
bli_obj_set_imag_stride( is, obj );
}
void bli_obj_create_1x1
(
num_t dt,
obj_t* obj
)
{
bli_obj_create_without_buffer( dt, 1, 1, obj );
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_obj_create_1x1(): " );
#endif
bli_obj_alloc_buffer( 1, 1, 1, obj );
}
void bli_obj_create_1x1_with_attached_buffer
(
num_t dt,
void* p,
obj_t* obj
)
{
bli_obj_create_without_buffer( dt, 1, 1, obj );
bli_obj_attach_buffer( p, 1, 1, 1, obj );
}
void bli_obj_create_conf_to
(
const obj_t* s,
obj_t* d
)
{
const num_t dt = bli_obj_dt( s );
const dim_t m = bli_obj_length( s );
const dim_t n = bli_obj_width( s );
const inc_t rs = bli_obj_row_stride( s );
const inc_t cs = bli_obj_col_stride( s );
bli_obj_create( dt, m, n, rs, cs, d );
}
void bli_obj_free
(
obj_t* obj
)
{
if ( bli_error_checking_is_enabled() )
bli_obj_free_check( obj );
if ( obj != NULL )
{
if ( bli_obj_buffer( obj ) != bli_obj_internal_scalar_buffer( obj ) )
{
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_obj_free(): " );
#endif
bli_free_user( bli_obj_buffer( obj ) );
}
}
}
#if 0#endif
void bli_adjust_strides
(
dim_t m,
dim_t n,
siz_t elem_size,
inc_t* rs,
inc_t* cs,
inc_t* is
)
{
if ( m == 0 || n == 0 ) return;
if ( *rs == 0 && *cs == 0 && ( *is == 0 || *is == 1 ) )
{
if ( m == 1 && n == 1 )
{
*rs = 1;
*cs = 1;
}
else if ( m == 1 && n > 1 )
{
*rs = n;
*cs = 1;
}
else
{
*rs = 1;
*cs = m;
}
*is = 1;
if ( bli_is_col_tilted( m, n, *rs, *cs ) )
{
*cs = bli_align_dim_to_size( *cs, elem_size,
BLIS_HEAP_STRIDE_ALIGN_SIZE );
}
else if ( bli_is_row_tilted( m, n, *rs, *cs ) )
{
*rs = bli_align_dim_to_size( *rs, elem_size,
BLIS_HEAP_STRIDE_ALIGN_SIZE );
}
}
else if ( *rs == -1 && *cs == -1 && ( *is == 0 || *is == 1 ) )
{
if ( m == 1 && n == 1 )
{
*rs = 1;
*cs = 1;
}
else if ( n == 1 && m > 1 )
{
*rs = 1;
*cs = m;
}
else
{
*rs = n;
*cs = 1;
}
*is = 1;
if ( bli_is_col_tilted( m, n, *rs, *cs ) )
{
*cs = bli_align_dim_to_size( *cs, elem_size,
BLIS_HEAP_STRIDE_ALIGN_SIZE );
}
else if ( bli_is_row_tilted( m, n, *rs, *cs ) )
{
*rs = bli_align_dim_to_size( *rs, elem_size,
BLIS_HEAP_STRIDE_ALIGN_SIZE );
}
}
else if ( *rs == 1 && *cs == 1 )
{
if ( m > 1 && n == 1 )
{
*cs = m;
}
else if ( m == 1 && n > 1 )
{
*rs = n;
}
}
}
static siz_t dt_sizes[6] =
{
sizeof( float ),
sizeof( scomplex ),
sizeof( double ),
sizeof( dcomplex ),
sizeof( gint_t ),
sizeof( constdata_t )
};
siz_t bli_dt_size
(
num_t dt
)
{
if ( bli_error_checking_is_enabled() )
bli_dt_size_check( dt );
return dt_sizes[dt];
}
static char* dt_names[ BLIS_NUM_FP_TYPES+1 ] =
{
"float",
"scomplex",
"double",
"dcomplex",
"int"
};
const char* bli_dt_string
(
num_t dt
)
{
if ( bli_error_checking_is_enabled() )
bli_dt_string_check( dt );
return dt_names[dt];
}
dim_t bli_align_dim_to_mult
(
dim_t dim,
dim_t dim_mult
)
{
if ( dim_mult == 0 ) return dim;
dim = ( ( dim + dim_mult - 1 ) /
dim_mult ) *
dim_mult;
return dim;
}
dim_t bli_align_dim_to_size
(
dim_t dim,
siz_t elem_size,
siz_t align_size
)
{
dim = ( ( dim * ( dim_t )elem_size +
( dim_t )align_size - 1
) /
( dim_t )align_size
) *
( dim_t )align_size /
( dim_t )elem_size;
return dim;
}
dim_t bli_align_ptr_to_size
(
const void* p,
size_t align_size
)
{
dim_t dim = ( ( ( uintptr_t )p + align_size - 1 ) /
align_size
) * align_size;
return dim;
}
#if 0#endif
void bli_obj_print
(
const char* label,
const obj_t* obj
)
{
bli_init_once();
FILE* file = stdout;
if ( bli_error_checking_is_enabled() )
bli_obj_print_check( label, obj );
fprintf( file, "\n" );
fprintf( file, "%s\n", label );
fprintf( file, "\n" );
fprintf( file, " m x n %lu x %lu\n", ( unsigned long )bli_obj_length( obj ),
( unsigned long )bli_obj_width( obj ) );
fprintf( file, "\n" );
fprintf( file, " offm, offn %lu, %lu\n", ( unsigned long )bli_obj_row_off( obj ),
( unsigned long )bli_obj_col_off( obj ) );
fprintf( file, " diagoff %ld\n", ( signed long int )bli_obj_diag_offset( obj ) );
fprintf( file, "\n" );
fprintf( file, " buf %p\n", ( void* )bli_obj_buffer( obj ) );
fprintf( file, " elem size %lu\n", ( unsigned long )bli_obj_elem_size( obj ) );
fprintf( file, " rs, cs %ld, %ld\n", ( signed long int )bli_obj_row_stride( obj ),
( signed long int )bli_obj_col_stride( obj ) );
fprintf( file, " is %ld\n", ( signed long int )bli_obj_imag_stride( obj ) );
fprintf( file, " m_padded %lu\n", ( unsigned long )bli_obj_padded_length( obj ) );
fprintf( file, " n_padded %lu\n", ( unsigned long )bli_obj_padded_width( obj ) );
fprintf( file, " pd %lu\n", ( unsigned long )bli_obj_panel_dim( obj ) );
fprintf( file, " ps %lu\n", ( unsigned long )bli_obj_panel_stride( obj ) );
fprintf( file, "\n" );
fprintf( file, " info %lX\n", ( unsigned long )(*obj).info );
fprintf( file, " - is complex %lu\n", ( unsigned long )bli_obj_is_complex( obj ) );
fprintf( file, " - is d. prec %lu\n", ( unsigned long )bli_obj_is_double_prec( obj ) );
fprintf( file, " - datatype %lu\n", ( unsigned long )bli_obj_dt( obj ) );
fprintf( file, " - target dt %lu\n", ( unsigned long )bli_obj_target_dt( obj ) );
fprintf( file, " - exec dt %lu\n", ( unsigned long )bli_obj_exec_dt( obj ) );
fprintf( file, " - comp dt %lu\n", ( unsigned long )bli_obj_comp_dt( obj ) );
fprintf( file, " - scalar dt %lu\n", ( unsigned long )bli_obj_scalar_dt( obj ) );
fprintf( file, " - has trans %lu\n", ( unsigned long )bli_obj_has_trans( obj ) );
fprintf( file, " - has conj %lu\n", ( unsigned long )bli_obj_has_conj( obj ) );
fprintf( file, " - unit diag? %lu\n", ( unsigned long )bli_obj_has_unit_diag( obj ) );
fprintf( file, " - struc type %lu\n", ( unsigned long )bli_obj_struc( obj ) >> BLIS_STRUC_SHIFT );
fprintf( file, " - uplo type %lu\n", ( unsigned long )bli_obj_uplo( obj ) >> BLIS_UPLO_SHIFT );
fprintf( file, " - is upper %lu\n", ( unsigned long )bli_obj_is_upper( obj ) );
fprintf( file, " - is lower %lu\n", ( unsigned long )bli_obj_is_lower( obj ) );
fprintf( file, " - is dense %lu\n", ( unsigned long )bli_obj_is_dense( obj ) );
fprintf( file, " - pack schema %lu\n", ( unsigned long )bli_obj_pack_schema( obj ) >> BLIS_PACK_SCHEMA_SHIFT );
fprintf( file, " - packinv diag? %lu\n", ( unsigned long )bli_obj_has_inverted_diag( obj ) );
fprintf( file, " - pack ordifup %lu\n", ( unsigned long )bli_obj_is_pack_rev_if_upper( obj ) );
fprintf( file, " - pack ordiflo %lu\n", ( unsigned long )bli_obj_is_pack_rev_if_lower( obj ) );
fprintf( file, " - packbuf type %lu\n", ( unsigned long )bli_obj_pack_buffer_type( obj ) >> BLIS_PACK_BUFFER_SHIFT );
fprintf( file, "\n" );
}