1 /*****************************************************************************
2 Copyright (c) 2011-2016, The OpenBLAS Project
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
9 1. Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in
14 the documentation and/or other materials provided with the
16 3. Neither the name of the OpenBLAS project nor the names of
17 its contributors may be used to endorse or promote products
18 derived from this software without specific prior written
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
30 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 **********************************************************************************/
38 #define CTEST_SEGFAULT
39 #define CTEST_ADD_TESTS_MANUALLY
41 #include "openblas_utest.h"
45 float te_max=0.0, tr_max=0.0;
46 float x[]={-1.1, 2.2, -3.3};
47 te_max=BLASFUNC(samax)(&N, x, &inc);
50 ASSERT_DBL_NEAR_TOL((double)(tr_max), (double)(te_max), SINGLE_EPS);
62 // original test case for libGoto bug fixed by feb2014 rewrite
63 te_d1= 0.21149573940783739;
64 te_d2= 0.046892057172954082;
65 te_x1= -0.42272687517106533;
66 te_y1= 0.42211309121921659;
70 te_param[i]=tr_param[i]=0.0;
73 //reference values as calculated by netlib blas
79 tr_d1= 0.17320483687975;
80 tr_d2= 0.03840233915037;
81 tr_x1= -0.51618034832329;
82 tr_y1= 0.42211309121922;
86 tr_param[2]= 0.99854803659786;
87 tr_param[3]= -0.22139439665872;
90 BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
91 ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS);
92 ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS);
93 ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS);
94 ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS);
97 ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS);
101 CTEST (drotmg,rotmg_issue1452)
118 te_param[i]=tr_param[i]=0.0;
120 te_param[3]=1./4096.;
121 //reference values as calculated by gonum blas with rotmg rewritten to Hopkins' algorithm
122 tr_d1= 0.99995592822897;
123 tr_d2= 0.98981219860583;
124 tr_x1= 0.03662270484346;
125 tr_y1= 150.000000000000;
128 tr_param[1]= 0.00000161109346;
129 tr_param[2]= -0.00024414062500;
130 tr_param[3]= 0.00024414062500;
131 tr_param[4]= 0.00000162760417;
134 BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
136 ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS);
137 ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS);
138 ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS);
139 ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS);
142 ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS);
147 CTEST(drotmg, rotmg_D1eqD2_X1eqX2)
162 te_param[i]=tr_param[i]=0.0;
165 //reference values as calculated by netlib blas
178 BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
180 ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS);
181 ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS);
182 ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS);
183 ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS);
186 ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS);
190 CTEST(drotmg, drotmg_D1_big_D2_big_flag_zero)
196 double te_param[5]={1.,4096.,-4096.,1.,4096.};
197 double tr_param[5]={-1.,4096.,-3584.,1792.,4096.};
199 te_d1= tr_d1=1600000000.;
200 te_d2= tr_d2=800000000.;
205 //reference values as calculated by gonum
206 tr_d1= 68.96627824858757;
207 tr_d2= 34.483139124293785;
213 BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param);
215 ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS);
216 ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS);
217 ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS);
218 ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS);
221 ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS);
225 CTEST(axpy,daxpy_inc_0)
228 blasint N=8,incX=0,incY=0;
230 double x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
231 double y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
233 double x2[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
234 double y2[]={4.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
237 BLASFUNC(daxpy)(&N,&a,x1,&incX,y1,&incY);
240 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
241 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
245 CTEST(axpy,zaxpy_inc_0)
248 blasint N=4,incX=0,incY=0;
249 double a[2]={0.25,0.5};
250 double x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
251 double y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
252 double x2[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
253 double y2[]={-3.0,9.0,6.0,8.0,2.0,4.0,6.0,8.0};
256 BLASFUNC(zaxpy)(&N,a,x1,&incX,y1,&incY);
258 for(i=0; i<2*N; i++){
259 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
260 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
264 CTEST(axpy,saxpy_inc_0)
267 blasint N=8,incX=0,incY=0;
269 float x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
270 float y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
271 float x2[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
272 float y2[]={4.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
275 BLASFUNC(saxpy)(&N,&a,x1,&incX,y1,&incY);
278 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
279 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
283 CTEST(axpy,caxpy_inc_0)
286 blasint N=4,incX=0,incY=0;
287 float a[2]={0.25,0.5};
288 float x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
289 float y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
290 float x2[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
291 float y2[]={-3.0,9.0,6.0,8.0,2.0,4.0,6.0,8.0};
294 BLASFUNC(caxpy)(&N,a,x1,&incX,y1,&incY);
296 for(i=0; i<2*N; i++){
297 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
298 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
302 CTEST( zdotu,zdotu_n_1)
304 blasint N=1,incX=1,incY=1;
305 double x1[]={1.0,1.0};
306 double y1[]={1.0,2.0};
307 openblas_complex_double result1=openblas_make_complex_double(0.0,0.0);
308 openblas_complex_double result2=openblas_make_complex_double(-1.0,3.0);
309 #ifdef RETURN_BY_STACK
310 BLASFUNC(zdotu)(&result1,&N,x1,&incX,y1,&incY);
312 result1=BLASFUNC(zdotu)(&N,x1,&incX,y1,&incY);
315 #ifdef OPENBLAS_COMPLEX_STRUCT
316 ASSERT_DBL_NEAR_TOL(result2.real, result1.real, DOUBLE_EPS);
317 ASSERT_DBL_NEAR_TOL(result2.imag, result1.imag, DOUBLE_EPS);
319 ASSERT_DBL_NEAR_TOL(creal(result2), creal(result1), DOUBLE_EPS);
320 ASSERT_DBL_NEAR_TOL(cimag(result2), cimag(result1), DOUBLE_EPS);
324 CTEST(zdotu, zdotu_offset_1)
326 blasint N=1,incX=1,incY=1;
327 double x1[]={1.0,2.0,3.0,4.0};
328 double y1[]={5.0,6.0,7.0,8.0};
329 openblas_complex_double result1=openblas_make_complex_double(0.0,0.0);
330 openblas_complex_double result2=openblas_make_complex_double(-9.0,32.0);
331 #ifdef RETURN_BY_STACK
332 BLASFUNC(zdotu)(&result1,&N,x1+1,&incX,y1+1,&incY);
334 result1=BLASFUNC(zdotu)(&N,x1+1,&incX,y1+1,&incY);
337 #ifdef OPENBLAS_COMPLEX_STRUCT
338 ASSERT_DBL_NEAR_TOL(result2.real, result1.real, DOUBLE_EPS);
339 ASSERT_DBL_NEAR_TOL(result2.imag, result1.imag, DOUBLE_EPS);
341 ASSERT_DBL_NEAR_TOL(creal(result2), creal(result1), DOUBLE_EPS);
342 ASSERT_DBL_NEAR_TOL(cimag(result2), cimag(result1), DOUBLE_EPS);
346 CTEST(dsdot,dsdot_n_1)
348 float x= 0.172555164F;
349 float y= -0.0138700781F;
354 double res1=0.0f, res2=-0.00239335360107;
356 res1=BLASFUNC(dsdot)(&n, &x, &incx, &y, &incy);
357 ASSERT_DBL_NEAR_TOL(res2, res1, DOUBLE_EPS);
361 CTEST(rot,drot_inc_0)
364 blasint N=4,incX=0,incY=0;
366 double x1[]={1.0,3.0,5.0,7.0};
367 double y1[]={2.0,4.0,6.0,8.0};
368 double x2[]={-0.21484375000000,3.0,5.0,7.0};
369 double y2[]={ 0.03906250000000,4.0,6.0,8.0};
373 BLASFUNC(drot)(&N,x1,&incX,y1,&incY,&c,&s);
376 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
377 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
381 CTEST(rot,zdrot_inc_0)
384 blasint N=4,incX=0,incY=0;
386 double x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
387 double y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
388 double x2[]={-0.21484375000000,-0.45703125000000 ,5.0,7.0,1.0,3.0,5.0,7.0};
389 double y2[]={ 0.03906250000000, 0.17187500000000 ,6.0,8.0,2.0,4.0,6.0,8.0};
393 BLASFUNC(zdrot)(&N,x1,&incX,y1,&incY,&c,&s);
395 for(i=0; i<2*N; i++){
396 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
397 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
401 CTEST(rot,srot_inc_0)
404 blasint N=4,incX=0,incY=0;
406 float x1[]={1.0,3.0,5.0,7.0};
407 float y1[]={2.0,4.0,6.0,8.0};
408 float x2[]={-0.21484375000000,3.0,5.0,7.0};
409 float y2[]={ 0.03906250000000,4.0,6.0,8.0};
412 BLASFUNC(srot)(&N,x1,&incX,y1,&incY,&c,&s);
415 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], SINGLE_EPS);
416 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], SINGLE_EPS);
420 CTEST(rot, csrot_inc_0)
423 blasint N=4,incX=0,incY=0;
425 float x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
426 float y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
427 float x2[]={-0.21484375000000,-0.45703125000000 ,5.0,7.0,1.0,3.0,5.0,7.0};
428 float y2[]={ 0.03906250000000, 0.17187500000000 ,6.0,8.0,2.0,4.0,6.0,8.0};
431 BLASFUNC(csrot)(&N,x1,&incX,y1,&incY,&c,&s);
433 for(i=0; i<2*N; i++){
434 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], SINGLE_EPS);
435 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], SINGLE_EPS);
439 CTEST(swap,dswap_inc_0)
442 blasint N=4,incX=0,incY=0;
443 double x1[]={1.0,3.0,5.0,7.0};
444 double y1[]={2.0,4.0,6.0,8.0};
445 double x2[]={1.0,3.0,5.0,7.0};
446 double y2[]={2.0,4.0,6.0,8.0};
449 BLASFUNC(dswap)(&N,x1,&incX,y1,&incY);
452 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
453 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
457 CTEST(swap,zswap_inc_0)
460 blasint N=4,incX=0,incY=0;
461 double x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
462 double y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
463 double x2[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
464 double y2[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
467 BLASFUNC(zswap)(&N,x1,&incX,y1,&incY);
469 for(i=0; i<2*N; i++){
470 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], DOUBLE_EPS);
471 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], DOUBLE_EPS);
475 CTEST(swap,sswap_inc_0)
478 blasint N=4,incX=0,incY=0;
479 float x1[]={1.0,3.0,5.0,7.0};
480 float y1[]={2.0,4.0,6.0,8.0};
481 float x2[]={1.0,3.0,5.0,7.0};
482 float y2[]={2.0,4.0,6.0,8.0};
485 BLASFUNC(sswap)(&N,x1,&incX,y1,&incY);
488 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], SINGLE_EPS);
489 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], SINGLE_EPS);
493 CTEST(swap,cswap_inc_0)
496 blasint N=4,incX=0,incY=0;
497 float x1[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
498 float y1[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
499 float x2[]={1.0,3.0,5.0,7.0,1.0,3.0,5.0,7.0};
500 float y2[]={2.0,4.0,6.0,8.0,2.0,4.0,6.0,8.0};
503 BLASFUNC(cswap)(&N,x1,&incX,y1,&incY);
505 for(i=0; i<2*N; i++){
506 ASSERT_DBL_NEAR_TOL(x2[i], x1[i], SINGLE_EPS);
507 ASSERT_DBL_NEAR_TOL(y2[i], y1[i], SINGLE_EPS);
511 int main(int argc, const char ** argv){
513 CTEST_ADD(amax, samax);
514 CTEST_ADD (drotmg,rotmg);
515 CTEST_ADD (drotmg,rotmg_issue1452);
516 CTEST_ADD (drotmg,rotmg_D1eqD2_X1eqX2);
517 CTEST_ADD (drotmg,drotmg_D1_big_D2_big_flag_zero);
518 CTEST_ADD (axpy,daxpy_inc_0);
519 CTEST_ADD (axpy,zaxpy_inc_0);
520 CTEST_ADD (axpy,saxpy_inc_0);
521 CTEST_ADD (axpy,caxpy_inc_0);
522 CTEST_ADD (zdotu,zdotu_n_1);
523 CTEST_ADD (zdotu,zdotu_offset_1);
524 CTEST_ADD (dsdot,dsdot_n_1);
525 CTEST_ADD (rot,drot_inc_0);
526 CTEST_ADD (rot,zdrot_inc_0);
527 CTEST_ADD (rot,srot_inc_0);
528 CTEST_ADD (rot,csrot_inc_0);
529 CTEST_ADD (swap,dswap_inc_0);
530 CTEST_ADD (swap,zswap_inc_0);
531 CTEST_ADD (swap,sswap_inc_0);
532 CTEST_ADD (swap,cswap_inc_0);
536 num_fail=ctest_main(argc, argv);