#include <complex>
#include <iostream>
#include "blis.hh"
#include "test.hh"
using namespace blis;
using namespace std;
#define ALPHA 1.0
#define BETA 0.0
#define N 6
#define K 4
template< typename T >
void ref_syrk(int64_t n, int64_t k,
T * alpha,
T *A,
T * beta,
T *C )
{
obj_t obj_a,obj_c;
obj_t obj_alpha, obj_beta;
num_t dt;
if(is_same<T, float>::value)
dt = BLIS_FLOAT;
else if(is_same<T, double>::value)
dt = BLIS_DOUBLE;
else if(is_same<T, complex<float>>::value)
dt = BLIS_SCOMPLEX;
else if(is_same<T, complex<double>>::value)
dt = BLIS_DCOMPLEX;
bli_obj_create_with_attached_buffer( dt, 1, 1, alpha, 1,1,&obj_alpha );
bli_obj_create_with_attached_buffer( dt, 1, 1, beta, 1,1,&obj_beta );
bli_obj_create_with_attached_buffer( dt, n, k, A, 1,n,&obj_a );
bli_obj_create_with_attached_buffer( dt, n, n, C, 1,n,&obj_c );
bli_obj_set_struc( BLIS_SYMMETRIC, &obj_c );
bli_obj_set_conjtrans( BLIS_NO_TRANSPOSE, &obj_c );
bli_obj_set_uplo( BLIS_LOWER, &obj_c );
bli_syrk( &obj_alpha,
&obj_a,
&obj_beta,
&obj_c );
}
template< typename T >
void test_syrk( )
{
T *A, *C, *C_ref;
T alpha, beta;
int n,k;
int lda, ldc, ldc_ref;
alpha = ALPHA;
beta = BETA;
k = K;
n = N;
lda = n;
ldc = n;
ldc_ref = n;
srand (time(NULL));
allocate_init_buffer(A , n , k);
allocate_init_buffer(C , n , n);
copy_buffer(C, C_ref , n ,n);
#ifdef PRINT
printmatrix(A, lda ,n,k, (char *)"A");
printmatrix(C, ldc ,n,n, (char *)"C");
#endif
blis::syrk(
CblasColMajor,
CblasLower,
CblasNoTrans,
n,
k,
alpha,
A,
lda,
beta,
C,
ldc
);
#ifdef PRINT
printmatrix(C, ldc ,n,n, (char *)"C output");
#endif
ref_syrk(n, k, &alpha, A, &beta, C_ref);
#ifdef PRINT
printmatrix(C_ref, ldc_ref ,n,n, (char *)"C ref output");
#endif
if(computeErrorM(ldc, ldc_ref, n, n, C, C_ref )==1)
printf("%s TEST FAIL\n" ,__PRETTY_FUNCTION__);
else
printf("%s TEST PASS\n" , __PRETTY_FUNCTION__);
delete[]( A );
delete[]( C );
delete[]( C_ref );
}
int main( int argc, char** argv )
{
test_syrk<double>( );
test_syrk<float>( );
test_syrk<complex<float>>( );
test_syrk<complex<double>>( );
return 0;
}