diff --git a/testing/chameleon_ztesting.c b/testing/chameleon_ztesting.c index 753b6097f41400910adc013ab94cd1fc72d749bc..bbe4d20ea9aa0144b2dcc4d6a5b4efcaa075aae4 100644 --- a/testing/chameleon_ztesting.c +++ b/testing/chameleon_ztesting.c @@ -98,6 +98,11 @@ parameter_t parameters[] = { { "mode", "Mode that specifies the eigen/singular values in xlatms", -40, PARAM_OPTION | PARAM_INPUT | PARAM_OUTPUT, 2, 4, TestValInt, {0}, NULL, pread_int, sprint_int }, { "cond", "Conditional number of the matrix used by xlatms", -41, PARAM_OPTION | PARAM_INPUT | PARAM_OUTPUT, 2, 13, TestValDouble, {0}, NULL, pread_double, sprint_double }, +#if defined(PRECISION_z) || defined(PRECISION_d) + { NULL, "Mixed precision Options", 0, PARAM_OPTION, 0, 0, 0, {0}, NULL, NULL, NULL }, + { "appaccuracy", "Application requested accuracy", -60, PARAM_OPTION | PARAM_INPUT | PARAM_OUTPUT, 1, 13, TestValFixdbl, {0.}, NULL, pread_fixdbl, sprint_fixdbl }, +#endif + { NULL, "Operation specific parameters", 0, PARAM_OPTION, 0, 0, 0, {0}, NULL, NULL, NULL }, { "trans", "Value of the trans parameter", -11, PARAM_OPTION | PARAM_INPUT | PARAM_OUTPUT, 2, 9, TestTrans, {0}, NULL, pread_trans, sprint_trans }, { "transA", "Value of the transA parameter", -12, PARAM_OPTION | PARAM_INPUT | PARAM_OUTPUT, 2, 9, TestTrans, {0}, NULL, pread_trans, sprint_trans }, @@ -164,7 +169,16 @@ int main (int argc, char **argv) { #if !defined(CHAMELEON_SIMULATION) /* Let's initialize the accuracy for the checks */ - testing_setaccuracy( LAPACKE_dlamch_work('e') ); + { + cham_fixdbl_t accuracy = parameters_getvalue_fixdbl( "appaccuracy" ); + if ( accuracy > 0 ) { + testing_setaccuracy( accuracy ); + } + else + { + testing_setaccuracy( LAPACKE_dlamch_work('e') ); + } + } #endif rc = CHAMELEON_Init( options.threads, options.gpus ); diff --git a/testing/parameters.c b/testing/parameters.c index cf2b598e3dfef07a6736940f549ddc6f80956a93..df6a8841a3d8810fff96ae1fd43cbe424ce0bc9e 100644 --- a/testing/parameters.c +++ b/testing/parameters.c @@ -671,6 +671,41 @@ parameters_getvalue_int( const char *name ) return -1; } +double +parameters_getvalue_fixdbl( const char *name ) +{ + parameter_t *param = parameters; + + while( param->helper != NULL ) + { + /* This is not an option, we skip it */ + if ( param->name == NULL ) { + param++; + continue; + } + + if ( strcasecmp( name, param->name ) != 0 ) { + param++; + continue; + } + + if ( param->has_arg > 1 ) { + fprintf( stderr, "parameters_getvalue_double should not be called with parameter %s\n", name ); + return -1; + } + + if ( param->valtype != TestValDouble ) { + fprintf( stderr, "parameters_getvalue_double has been called with a non float parameter (%s)\n", name ); + return -1; + } + + return param->value.dval; + } + + fprintf( stderr, "parameters_getvalue_int could not find parameter %s\n", name ); + return -1; +} + char * parameters_getvalue_str( const char *name ) { diff --git a/testing/testings.h b/testing/testings.h index 1c8f54548771394bf9d1e91374b78b389312290c..2b42ce8489500565b024a1095e0489c1b0e3ce8a 100644 --- a/testing/testings.h +++ b/testing/testings.h @@ -229,13 +229,13 @@ void parameters_read( parameter_t *param, const char *values ); void parameters_read_file( const char *filename ); parameter_t *parameters_getbyname( const char *name ); void parameters_addvalues( parameter_t *param, const char *values ); -int parameters_getvalue_int( const char *name ); int parameters_compute_q( int p ); parameter_t *parameters_get( int shname ); int parameters_compute_q( int p ); void parameters_getopt_init( char *optstring, struct option **longopts ); parameter_t *parameters_get( int shname ); int parameters_getvalue_int( const char *name ); +double parameters_getvalue_fixdbl( const char *name ); char * parameters_getvalue_str( const char *name ); parameter_t *parameters_getbyname( const char *name ); void parameters_parser( int argc, char **argv );