Add test for real number exp and tanh functions.
This commit is contained in:
parent
d406a6df62
commit
4f16144857
|
@ -2,6 +2,8 @@ set(OpenVML_REF_SRC
|
||||||
vadd.c
|
vadd.c
|
||||||
vsub.c
|
vsub.c
|
||||||
vpow.c
|
vpow.c
|
||||||
|
vexp.c
|
||||||
|
vtanh.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(${OpenVML_LIBNAME}_ref SHARED ${OpenVML_REF_SRC})
|
add_library(${OpenVML_LIBNAME}_ref SHARED ${OpenVML_REF_SRC})
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/* * Copyright (c) 2014, 2015 Zhang Xianyi
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <openvml_reference.h>
|
||||||
|
|
||||||
|
void OpenVML_FUNCNAME_REF(vsExp)(VML_INT n, const float * a, float * y){
|
||||||
|
VML_INT i;
|
||||||
|
if (n<=0) return;
|
||||||
|
if (a==NULL || y==NULL) return;
|
||||||
|
|
||||||
|
for(i=0; i<n; i++){
|
||||||
|
y[i]=expf(a[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenVML_FUNCNAME_REF(vdExp)(VML_INT n, const double * a, double * y){
|
||||||
|
VML_INT i;
|
||||||
|
if (n<=0) return;
|
||||||
|
if (a==NULL || y==NULL) return;
|
||||||
|
|
||||||
|
for(i=0; i<n; i++){
|
||||||
|
y[i]=exp(a[i]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/* * Copyright (c) 2014, 2015 Zhang Xianyi
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <openvml_reference.h>
|
||||||
|
|
||||||
|
void OpenVML_FUNCNAME_REF(vsTanh)(VML_INT n, const float * a, float * y){
|
||||||
|
VML_INT i;
|
||||||
|
if (n<=0) return;
|
||||||
|
if (a==NULL || y==NULL) return;
|
||||||
|
|
||||||
|
for(i=0; i<n; i++){
|
||||||
|
y[i]=tanhf(a[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenVML_FUNCNAME_REF(vdTanh)(VML_INT n, const double * a, double * y){
|
||||||
|
VML_INT i;
|
||||||
|
if (n<=0) return;
|
||||||
|
if (a==NULL || y==NULL) return;
|
||||||
|
|
||||||
|
for(i=0; i<n; i++){
|
||||||
|
y[i]=tanh(a[i]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,8 @@ set(OpenVML_TESTSRC
|
||||||
test_add.c
|
test_add.c
|
||||||
test_sub.c
|
test_sub.c
|
||||||
test_pow.c
|
test_pow.c
|
||||||
|
test_exp.c
|
||||||
|
test_tanh.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(OpenVML_TEST_NAME run_vml_test)
|
set(OpenVML_TEST_NAME run_vml_test)
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
/* * Copyright (c) 2014, 2015 Zhang Xianyi
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vml_test.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <openvml_reference.h>
|
||||||
|
|
||||||
|
static char* funcname[4]={"vsExp", "vdExp", NULL,NULL};
|
||||||
|
static double flop_per_elem[4]={0.0, 0.0, 0.0, 0.0};
|
||||||
|
|
||||||
|
static a_y_func_t ref_vexp[] = {
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME_REF(vsExp),
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME_REF(vdExp),
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static a_y_func_t test_vexp[] = {
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME(vsExp),
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME(vdExp),
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CTEST2(check_result_s, exp){
|
||||||
|
run_test_a_y(data->parameter, funcname, test_vexp, ref_vexp, flop_per_elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTEST2(check_result_d, exp){
|
||||||
|
run_test_a_y(data->parameter, funcname, test_vexp, ref_vexp, flop_per_elem);
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/* * Copyright (c) 2014, 2015 Zhang Xianyi
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vml_test.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <openvml_reference.h>
|
||||||
|
|
||||||
|
static char* funcname[4]={"vsTanh", "vdTanh", NULL,NULL};
|
||||||
|
static double flop_per_elem[4]={0.0, 0.0, 0.0, 0.0};
|
||||||
|
|
||||||
|
static a_y_func_t ref_vtanh[] = {
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME_REF(vsTanh),
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME_REF(vdTanh),
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static a_y_func_t test_vtanh[] = {
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME(vsTanh),
|
||||||
|
(a_y_func_t)OpenVML_FUNCNAME(vdTanh),
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CTEST2(check_result_s, tanh){
|
||||||
|
run_test_a_y(data->parameter, funcname, test_vtanh, ref_vtanh, flop_per_elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTEST2(check_result_d, tanh){
|
||||||
|
run_test_a_y(data->parameter, funcname, test_vtanh, ref_vtanh, flop_per_elem);
|
||||||
|
}
|
|
@ -100,4 +100,8 @@ void init_rand(VML_INT n, void * a, int iscomplex, int isdouble);
|
||||||
typedef void (*ab_y_func_t)(VML_INT, const void *, const void *, void *);
|
typedef void (*ab_y_func_t)(VML_INT, const void *, const void *, void *);
|
||||||
void run_test_ab_y(perf_arg_t * para, char* funcname[], ab_y_func_t*test_func, ab_y_func_t* ref_func,
|
void run_test_ab_y(perf_arg_t * para, char* funcname[], ab_y_func_t*test_func, ab_y_func_t* ref_func,
|
||||||
double * flop_per_elem);
|
double * flop_per_elem);
|
||||||
|
|
||||||
|
typedef void (*a_y_func_t)(VML_INT, const void *, void *);
|
||||||
|
void run_test_a_y(perf_arg_t * para, char* funcname[], a_y_func_t*test_func, a_y_func_t* ref_func,
|
||||||
|
double * flop_per_elem);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -294,7 +294,7 @@ void init_rand(VML_INT n, void * a, int iscomplex, int isdouble)
|
||||||
void flush_cache(void * flushcache)
|
void flush_cache(void * flushcache)
|
||||||
{
|
{
|
||||||
if(flushcache!=NULL){
|
if(flushcache!=NULL){
|
||||||
memset(flushcache, 1, FLUSHCACHE_SIZE);
|
//memset(flushcache, 1, FLUSHCACHE_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ void run_test_ab_y(perf_arg_t * para, char* funcname[], ab_y_func_t test_func[],
|
||||||
mflops=flops_per_elem[para->fp_type] * i;
|
mflops=flops_per_elem[para->fp_type] * i;
|
||||||
|
|
||||||
//need to clean cache
|
//need to clean cache
|
||||||
//flush_cache(para->flushcache);
|
flush_cache(para->flushcache);
|
||||||
|
|
||||||
start_time=getRealTime();
|
start_time=getRealTime();
|
||||||
test_func[para->fp_type](i, para->a, para->b, para->y);
|
test_func[para->fp_type](i, para->a, para->b, para->y);
|
||||||
|
@ -361,3 +361,66 @@ void run_test_ab_y(perf_arg_t * para, char* funcname[], ab_y_func_t test_func[],
|
||||||
|
|
||||||
if(failed_count>0) CTEST_ERR("Result failed!\n");
|
if(failed_count>0) CTEST_ERR("Result failed!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void run_test_a_y(perf_arg_t * para, char* funcname[], a_y_func_t test_func[], a_y_func_t ref_func[],
|
||||||
|
double * flops_per_elem)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
VML_INT start=para->start;
|
||||||
|
VML_INT end=para->end;
|
||||||
|
VML_INT step=para->step;
|
||||||
|
|
||||||
|
double mflops=0.0;
|
||||||
|
double time=0.0, start_time, end_time;
|
||||||
|
|
||||||
|
int iscomplex = (para->fp_type & 0x2) >> 1;
|
||||||
|
int isdouble = (para->fp_type & 0x1);
|
||||||
|
int result=0;
|
||||||
|
char * result_str;
|
||||||
|
int failed_count=0;
|
||||||
|
|
||||||
|
VML_INT i;
|
||||||
|
|
||||||
|
VML_TEST_LOG("\n");
|
||||||
|
VML_TEST_LOG("Func\tN\tMFlops\t\tTime(s)\t\tResult\n");
|
||||||
|
|
||||||
|
init_rand(end, para->a, iscomplex, isdouble);
|
||||||
|
|
||||||
|
memcpy(para->ref_a, para->a, end * para->element_size * para->compose_size);
|
||||||
|
|
||||||
|
for(i=start; i<=end; i+=step) {
|
||||||
|
|
||||||
|
mflops=flops_per_elem[para->fp_type] * i;
|
||||||
|
|
||||||
|
//need to clean cache
|
||||||
|
flush_cache(para->flushcache);
|
||||||
|
|
||||||
|
start_time=getRealTime();
|
||||||
|
test_func[para->fp_type](i, para->a, para->y);
|
||||||
|
end_time=getRealTime();
|
||||||
|
time=end_time-start_time;
|
||||||
|
|
||||||
|
mflops=mflops/(double)(1000000)/time;
|
||||||
|
|
||||||
|
ref_func[para->fp_type](i, para->ref_a, para->ref_y);
|
||||||
|
|
||||||
|
//check
|
||||||
|
result=check_vector(i, para->ref_y, para->y, para->eps, iscomplex, isdouble);
|
||||||
|
|
||||||
|
if(result==0){
|
||||||
|
result_str=STR_PASS;
|
||||||
|
}else if(result==1){
|
||||||
|
result_str=STR_WARN;
|
||||||
|
}else{
|
||||||
|
result_str=STR_ERR;
|
||||||
|
failed_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
VML_TEST_LOG("%s\t%d\t%lf\t%lf\t%s\n", funcname[para->fp_type], i, mflops, time, result_str);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(failed_count>0) CTEST_ERR("Result failed!\n");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue