| @@ -47,6 +47,7 @@ config_last.h | |||||
| getarch | getarch | ||||
| getarch_2nd | getarch_2nd | ||||
| utest/openblas_utest | utest/openblas_utest | ||||
| utest/openblas_utest_ext | |||||
| ctest/xccblat1 | ctest/xccblat1 | ||||
| ctest/xccblat2 | ctest/xccblat2 | ||||
| ctest/xccblat3 | ctest/xccblat3 | ||||
| @@ -21,6 +21,70 @@ else () | |||||
| ) | ) | ||||
| endif () | endif () | ||||
| set(DIR_EXT test_extensions) | |||||
| set(OpenBLAS_utest_ext_src | |||||
| utest_main.c | |||||
| ${DIR_EXT}/common.c | |||||
| ${DIR_EXT}/xerbla.c | |||||
| ${DIR_EXT}/test_isamin.c | |||||
| ${DIR_EXT}/test_idamin.c | |||||
| ${DIR_EXT}/test_icamin.c | |||||
| ${DIR_EXT}/test_izamin.c | |||||
| ${DIR_EXT}/test_ssum.c | |||||
| ${DIR_EXT}/test_dsum.c | |||||
| ${DIR_EXT}/test_scsum.c | |||||
| ${DIR_EXT}/test_dzsum.c | |||||
| ${DIR_EXT}/test_samin.c | |||||
| ${DIR_EXT}/test_damin.c | |||||
| ${DIR_EXT}/test_scamin.c | |||||
| ${DIR_EXT}/test_dzamin.c | |||||
| ${DIR_EXT}/test_scamax.c | |||||
| ${DIR_EXT}/test_dzamax.c | |||||
| ${DIR_EXT}/test_zrotg.c | |||||
| ${DIR_EXT}/test_crotg.c | |||||
| ${DIR_EXT}/test_drotmg.c | |||||
| ${DIR_EXT}/test_srotmg.c | |||||
| ${DIR_EXT}/test_zscal.c | |||||
| ${DIR_EXT}/test_cscal.c | |||||
| ${DIR_EXT}/test_domatcopy.c | |||||
| ${DIR_EXT}/test_somatcopy.c | |||||
| ${DIR_EXT}/test_zomatcopy.c | |||||
| ${DIR_EXT}/test_comatcopy.c | |||||
| ${DIR_EXT}/test_simatcopy.c | |||||
| ${DIR_EXT}/test_dimatcopy.c | |||||
| ${DIR_EXT}/test_cimatcopy.c | |||||
| ${DIR_EXT}/test_zimatcopy.c | |||||
| ${DIR_EXT}/test_sgeadd.c | |||||
| ${DIR_EXT}/test_dgeadd.c | |||||
| ${DIR_EXT}/test_cgeadd.c | |||||
| ${DIR_EXT}/test_zgeadd.c | |||||
| ${DIR_EXT}/test_saxpby.c | |||||
| ${DIR_EXT}/test_daxpby.c | |||||
| ${DIR_EXT}/test_caxpby.c | |||||
| ${DIR_EXT}/test_zaxpby.c | |||||
| ${DIR_EXT}/test_caxpyc.c | |||||
| ${DIR_EXT}/test_zaxpyc.c | |||||
| ${DIR_EXT}/test_cgemv_t.c | |||||
| ${DIR_EXT}/test_zgemv_t.c | |||||
| ${DIR_EXT}/test_cgemv_n.c | |||||
| ${DIR_EXT}/test_zgemv_n.c | |||||
| ${DIR_EXT}/test_crot.c | |||||
| ${DIR_EXT}/test_zrot.c | |||||
| ${DIR_EXT}/test_cgbmv.c | |||||
| ${DIR_EXT}/test_zgbmv.c | |||||
| ${DIR_EXT}/test_dgemmt.c | |||||
| ${DIR_EXT}/test_sgemmt.c | |||||
| ${DIR_EXT}/test_cgemmt.c | |||||
| ${DIR_EXT}/test_zgemmt.c | |||||
| ${DIR_EXT}/test_ztrmv.c | |||||
| ${DIR_EXT}/test_ctrmv.c | |||||
| ${DIR_EXT}/test_ztrsv.c | |||||
| ${DIR_EXT}/test_ctrsv.c | |||||
| ${DIR_EXT}/test_zgemm.c | |||||
| ${DIR_EXT}/test_cgemm.c | |||||
| ) | |||||
| # crashing on travis cl with an error code suggesting resource not found | # crashing on travis cl with an error code suggesting resource not found | ||||
| if (NOT MSVC) | if (NOT MSVC) | ||||
| set(OpenBLAS_utest_src | set(OpenBLAS_utest_src | ||||
| @@ -49,6 +113,13 @@ set(OpenBLAS_utest_src | |||||
| ${OpenBLAS_utest_src} | ${OpenBLAS_utest_src} | ||||
| test_potrs.c | test_potrs.c | ||||
| ) | ) | ||||
| set(OpenBLAS_utest_ext_src | |||||
| ${OpenBLAS_utest_ext_src} | |||||
| ${DIR_EXT}/test_cspmv.c | |||||
| ${DIR_EXT}/test_zspmv.c | |||||
| ${DIR_EXT}/test_csbmv.c | |||||
| ${DIR_EXT}/test_zsbmv.c | |||||
| ) | |||||
| if (NOT NO_CBLAS AND NOT NO_LAPACKE) | if (NOT NO_CBLAS AND NOT NO_LAPACKE) | ||||
| set(OpenBLAS_utest_src | set(OpenBLAS_utest_src | ||||
| ${OpenBLAS_utest_src} | ${OpenBLAS_utest_src} | ||||
| @@ -60,7 +131,11 @@ endif() | |||||
| set(OpenBLAS_utest_bin openblas_utest) | set(OpenBLAS_utest_bin openblas_utest) | ||||
| add_executable(${OpenBLAS_utest_bin} ${OpenBLAS_utest_src}) | add_executable(${OpenBLAS_utest_bin} ${OpenBLAS_utest_src}) | ||||
| set(OpenBLAS_utest_ext_bin openblas_utest_ext) | |||||
| add_executable(${OpenBLAS_utest_ext_bin} ${OpenBLAS_utest_ext_src}) | |||||
| target_link_libraries(${OpenBLAS_utest_bin} ${OpenBLAS_LIBNAME}) | target_link_libraries(${OpenBLAS_utest_bin} ${OpenBLAS_LIBNAME}) | ||||
| target_link_libraries(${OpenBLAS_utest_ext_bin} ${OpenBLAS_LIBNAME}) | |||||
| if(${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "QNX" ) | if(${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "QNX" ) | ||||
| target_link_libraries(${OpenBLAS_utest_bin} m) | target_link_libraries(${OpenBLAS_utest_bin} m) | ||||
| @@ -85,3 +160,4 @@ add_custom_command(TARGET ${OpenBLAS_utest_bin} | |||||
| endif() | endif() | ||||
| add_test(${OpenBLAS_utest_bin} ${CMAKE_CURRENT_BINARY_DIR}/${OpenBLAS_utest_bin}) | add_test(${OpenBLAS_utest_bin} ${CMAKE_CURRENT_BINARY_DIR}/${OpenBLAS_utest_bin}) | ||||
| add_test(${OpenBLAS_utest_ext_bin} ${CMAKE_CURRENT_BINARY_DIR}/${OpenBLAS_utest_bin}) | |||||
| @@ -1,22 +1,39 @@ | |||||
| UTEST_CHECK = 1 | UTEST_CHECK = 1 | ||||
| TOPDIR = .. | TOPDIR = .. | ||||
| DIR_EXT=test_extensions | |||||
| override TARGET_ARCH= | override TARGET_ARCH= | ||||
| override TARGET_MACH= | override TARGET_MACH= | ||||
| UTESTBIN=openblas_utest | UTESTBIN=openblas_utest | ||||
| UTESTEXTBIN=openblas_utest_ext | |||||
| .PHONY : all | .PHONY : all | ||||
| .NOTPARALLEL : all run_test $(UTESTBIN) | |||||
| .NOTPARALLEL : all run_test $(UTESTBIN) $(UTESTEXTBIN) | |||||
| include $(TOPDIR)/Makefile.system | include $(TOPDIR)/Makefile.system | ||||
| OBJS=utest_main.o test_min.o test_amax.o test_ismin.o test_rotmg.o test_axpy.o test_dotu.o test_dsdot.o test_swap.o test_rot.o test_dnrm2.o test_zscal.o \ | OBJS=utest_main.o test_min.o test_amax.o test_ismin.o test_rotmg.o test_axpy.o test_dotu.o test_dsdot.o test_swap.o test_rot.o test_dnrm2.o test_zscal.o \ | ||||
| test_amin.o test_axpby.o | test_amin.o test_axpby.o | ||||
| #test_rot.o test_swap.o test_axpy.o test_dotu.o test_dsdot.o test_fork.o | #test_rot.o test_swap.o test_axpy.o test_dotu.o test_dsdot.o test_fork.o | ||||
| OBJS_EXT=utest_main.o $(DIR_EXT)/xerbla.o $(DIR_EXT)/common.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_isamin.o $(DIR_EXT)/test_idamin.o $(DIR_EXT)/test_icamin.o $(DIR_EXT)/test_izamin.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_ssum.o $(DIR_EXT)/test_dsum.o $(DIR_EXT)/test_scsum.o $(DIR_EXT)/test_dzsum.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_saxpby.o $(DIR_EXT)/test_daxpby.o $(DIR_EXT)/test_caxpby.o $(DIR_EXT)/test_zaxpby.o $(DIR_EXT)/test_zaxpyc.o $(DIR_EXT)/test_caxpyc.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_samin.o $(DIR_EXT)/test_damin.o $(DIR_EXT)/test_scamin.o $(DIR_EXT)/test_dzamin.o $(DIR_EXT)/test_scamax.o $(DIR_EXT)/test_dzamax.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_drotmg.o $(DIR_EXT)/test_srotmg.o $(DIR_EXT)/test_zrotg.o $(DIR_EXT)/test_crotg.o $(DIR_EXT)/test_crot.o $(DIR_EXT)/test_zrot.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_zscal.o $(DIR_EXT)/test_cscal.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_domatcopy.o $(DIR_EXT)/test_somatcopy.o $(DIR_EXT)/test_zomatcopy.o $(DIR_EXT)/test_comatcopy.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_simatcopy.o $(DIR_EXT)/test_dimatcopy.o $(DIR_EXT)/test_cimatcopy.o $(DIR_EXT)/test_zimatcopy.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_sgeadd.o $(DIR_EXT)/test_dgeadd.o $(DIR_EXT)/test_cgeadd.o $(DIR_EXT)/test_zgeadd.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_cgemv_t.o $(DIR_EXT)/test_zgemv_t.o $(DIR_EXT)/test_cgemv_n.o $(DIR_EXT)/test_zgemv_n.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_sgemmt.o $(DIR_EXT)/test_dgemmt.o $(DIR_EXT)/test_cgemmt.o $(DIR_EXT)/test_zgemmt.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_ztrmv.o $(DIR_EXT)/test_ctrmv.o $(DIR_EXT)/test_ztrsv.o $(DIR_EXT)/test_ctrsv.o | |||||
| OBJS_EXT+=$(DIR_EXT)/test_zgemm.o $(DIR_EXT)/test_cgemm.o $(DIR_EXT)/test_zgbmv.o $(DIR_EXT)/test_cgbmv.o | |||||
| ifneq ($(NO_LAPACK), 1) | ifneq ($(NO_LAPACK), 1) | ||||
| OBJS += test_potrs.o | OBJS += test_potrs.o | ||||
| OBJS_EXT += $(DIR_EXT)/test_zspmv.o $(DIR_EXT)/test_cspmv.o $(DIR_EXT)/test_zsbmv.o $(DIR_EXT)/test_csbmv.o | |||||
| ifneq ($(NO_CBLAS), 1) | ifneq ($(NO_CBLAS), 1) | ||||
| ifneq ($(NO_LAPACKE), 1) | ifneq ($(NO_LAPACKE), 1) | ||||
| OBJS += test_kernel_regress.o | OBJS += test_kernel_regress.o | ||||
| @@ -58,12 +75,17 @@ $(UTESTBIN): $(OBJS) | |||||
| $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) | ||||
| endif | endif | ||||
| run_test: $(UTESTBIN) | |||||
| $(UTESTEXTBIN): $(OBJS_EXT) | |||||
| $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) | |||||
| run_test: $(UTESTBIN) $(UTESTEXTBIN) | |||||
| ifneq ($(CROSS), 1) | ifneq ($(CROSS), 1) | ||||
| ./$(UTESTBIN) | ./$(UTESTBIN) | ||||
| ./$(UTESTEXTBIN) | |||||
| endif | endif | ||||
| clean: | clean: | ||||
| -rm -f *.o $(UTESTBIN) | |||||
| -rm -f *.o $(UTESTBIN) $(UTESTEXTBIN) | |||||
| -rm -f $(DIR_EXT)/*.o | |||||
| libs: | |||||
| libs: | |||||
| @@ -0,0 +1,259 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "common.h" | |||||
| /** | |||||
| * Generate random array | |||||
| */ | |||||
| void srand_generate(float *alpha, blasint n) | |||||
| { | |||||
| blasint i; | |||||
| for (i = 0; i < n; i++) | |||||
| alpha[i] = (float)rand() / (float)RAND_MAX; | |||||
| } | |||||
| void drand_generate(double *alpha, blasint n) | |||||
| { | |||||
| blasint i; | |||||
| for (i = 0; i < n; i++) | |||||
| alpha[i] = (double)rand() / (double)RAND_MAX; | |||||
| } | |||||
| /** | |||||
| * Find difference between two rectangle matrix | |||||
| * return norm of differences | |||||
| */ | |||||
| float smatrix_difference(float *a, float *b, blasint cols, blasint rows, blasint ld) | |||||
| { | |||||
| blasint i = 0; | |||||
| blasint j = 0; | |||||
| blasint inc = 1; | |||||
| float norm = 0.0f; | |||||
| float *a_ptr = a; | |||||
| float *b_ptr = b; | |||||
| for(i = 0; i < rows; i++) | |||||
| { | |||||
| for (j = 0; j < cols; j++) { | |||||
| a_ptr[j] -= b_ptr[j]; | |||||
| } | |||||
| norm += cblas_snrm2(cols, a_ptr, inc); | |||||
| a_ptr += ld; | |||||
| b_ptr += ld; | |||||
| } | |||||
| return norm/(float)(rows); | |||||
| } | |||||
| double dmatrix_difference(double *a, double *b, blasint cols, blasint rows, blasint ld) | |||||
| { | |||||
| blasint i = 0; | |||||
| blasint j = 0; | |||||
| blasint inc = 1; | |||||
| double norm = 0.0; | |||||
| double *a_ptr = a; | |||||
| double *b_ptr = b; | |||||
| for(i = 0; i < rows; i++) | |||||
| { | |||||
| for (j = 0; j < cols; j++) { | |||||
| a_ptr[j] -= b_ptr[j]; | |||||
| } | |||||
| norm += cblas_dnrm2(cols, a_ptr, inc); | |||||
| a_ptr += ld; | |||||
| b_ptr += ld; | |||||
| } | |||||
| return norm/(double)(rows); | |||||
| } | |||||
| /** | |||||
| * Complex conjugate operation for vector | |||||
| * | |||||
| * param n specifies number of elements in vector x | |||||
| * param inc_x specifies increment of vector x | |||||
| * param x_ptr specifies buffer holding vector x | |||||
| */ | |||||
| void cconjugate_vector(blasint n, blasint inc_x, float *x_ptr) | |||||
| { | |||||
| blasint i; | |||||
| inc_x *= 2; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| x_ptr[1] *= (-1.0f); | |||||
| x_ptr += inc_x; | |||||
| } | |||||
| } | |||||
| void zconjugate_vector(blasint n, blasint inc_x, double *x_ptr) | |||||
| { | |||||
| blasint i; | |||||
| inc_x *= 2; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| x_ptr[1] *= (-1.0); | |||||
| x_ptr += inc_x; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Transpose matrix | |||||
| * | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param alpha specifies scaling factor for matrix A | |||||
| * param a_src - buffer holding input matrix A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param a_dst - buffer holding output matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| */ | |||||
| void stranspose(blasint rows, blasint cols, float alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst) | |||||
| { | |||||
| blasint i, j; | |||||
| for (i = 0; i != cols; i++) | |||||
| { | |||||
| for (j = 0; j != rows; j++) | |||||
| a_dst[i*lda_dst+j] = alpha*a_src[j*lda_src+i]; | |||||
| } | |||||
| } | |||||
| void dtranspose(blasint rows, blasint cols, double alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst) | |||||
| { | |||||
| blasint i, j; | |||||
| for (i = 0; i != cols; i++) | |||||
| { | |||||
| for (j = 0; j != rows; j++) | |||||
| a_dst[i*lda_dst+j] = alpha*a_src[j*lda_src+i]; | |||||
| } | |||||
| } | |||||
| void ctranspose(blasint rows, blasint cols, float *alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst, int conj) | |||||
| { | |||||
| blasint i, j; | |||||
| lda_dst *= 2; | |||||
| lda_src *= 2; | |||||
| for (i = 0; i != cols*2; i+=2) | |||||
| { | |||||
| for (j = 0; j != rows*2; j+=2){ | |||||
| a_dst[(i/2)*lda_dst+j] = alpha[0] * a_src[(j/2)*lda_src+i] + conj * alpha[1] * a_src[(j/2)*lda_src+i+1]; | |||||
| a_dst[(i/2)*lda_dst+j+1] = (-1.0f) * conj * alpha[0] * a_src[(j/2)*lda_src+i+1] + alpha[1] * a_src[(j/2)*lda_src+i]; | |||||
| } | |||||
| } | |||||
| } | |||||
| void ztranspose(blasint rows, blasint cols, double *alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst, int conj) | |||||
| { | |||||
| blasint i, j; | |||||
| lda_dst *= 2; | |||||
| lda_src *= 2; | |||||
| for (i = 0; i != cols*2; i+=2) | |||||
| { | |||||
| for (j = 0; j != rows*2; j+=2){ | |||||
| a_dst[(i/2)*lda_dst+j] = alpha[0] * a_src[(j/2)*lda_src+i] + conj * alpha[1] * a_src[(j/2)*lda_src+i+1]; | |||||
| a_dst[(i/2)*lda_dst+j+1] = (-1.0) * conj * alpha[0] * a_src[(j/2)*lda_src+i+1] + alpha[1] * a_src[(j/2)*lda_src+i]; | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Copy matrix from source A to destination A | |||||
| * | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param alpha specifies scaling factor for matrix A | |||||
| * param a_src - buffer holding input matrix A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param a_dst - buffer holding output matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * param conj specifies conjugation | |||||
| */ | |||||
| void scopy(blasint rows, blasint cols, float alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst) | |||||
| { | |||||
| blasint i, j; | |||||
| for (i = 0; i != rows; i++) | |||||
| { | |||||
| for (j = 0; j != cols; j++) | |||||
| a_dst[i*lda_dst+j] = alpha*a_src[i*lda_src+j]; | |||||
| } | |||||
| } | |||||
| void dcopy(blasint rows, blasint cols, double alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst) | |||||
| { | |||||
| blasint i, j; | |||||
| for (i = 0; i != rows; i++) | |||||
| { | |||||
| for (j = 0; j != cols; j++) | |||||
| a_dst[i*lda_dst+j] = alpha*a_src[i*lda_src+j]; | |||||
| } | |||||
| } | |||||
| void ccopy(blasint rows, blasint cols, float *alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst, int conj) | |||||
| { | |||||
| blasint i, j; | |||||
| lda_dst *= 2; | |||||
| lda_src *= 2; | |||||
| for (i = 0; i != rows; i++) | |||||
| { | |||||
| for (j = 0; j != cols*2; j+=2){ | |||||
| a_dst[i*lda_dst+j] = alpha[0] * a_src[i*lda_src+j] + conj * alpha[1] * a_src[i*lda_src+j+1]; | |||||
| a_dst[i*lda_dst+j+1] = (-1.0f) * conj *alpha[0] * a_src[i*lda_src+j+1] + alpha[1] * a_src[i*lda_src+j]; | |||||
| } | |||||
| } | |||||
| } | |||||
| void zcopy(blasint rows, blasint cols, double *alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst, int conj) | |||||
| { | |||||
| blasint i, j; | |||||
| lda_dst *= 2; | |||||
| lda_src *= 2; | |||||
| for (i = 0; i != rows; i++) | |||||
| { | |||||
| for (j = 0; j != cols*2; j+=2){ | |||||
| a_dst[i*lda_dst+j] = alpha[0] * a_src[i*lda_src+j] + conj * alpha[1] * a_src[i*lda_src+j+1]; | |||||
| a_dst[i*lda_dst+j+1] = (-1.0) * conj *alpha[0] * a_src[i*lda_src+j+1] + alpha[1] * a_src[i*lda_src+j]; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,76 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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. | |||||
| **********************************************************************************/ | |||||
| #ifndef _TEST_EXTENSION_COMMON_H_ | |||||
| #define _TEST_EXTENSION_COMMON_H_ | |||||
| #include <cblas.h> | |||||
| #include <ctype.h> | |||||
| #define TRUE 1 | |||||
| #define FALSE 0 | |||||
| #define INVALID -1 | |||||
| #define SINGLE_TOL 1e-02f | |||||
| #define DOUBLE_TOL 1e-10 | |||||
| extern int check_error(void); | |||||
| extern void set_xerbla(char* current_rout, int expected_info); | |||||
| extern int BLASFUNC(xerbla)(char *name, blasint *info, blasint length); | |||||
| extern void srand_generate(float *alpha, blasint n); | |||||
| extern void drand_generate(double *alpha, blasint n); | |||||
| extern float smatrix_difference(float *a, float *b, blasint cols, blasint rows, blasint ld); | |||||
| extern double dmatrix_difference(double *a, double *b, blasint cols, blasint rows, blasint ld); | |||||
| extern void cconjugate_vector(blasint n, blasint inc_x, float *x_ptr); | |||||
| extern void zconjugate_vector(blasint n, blasint inc_x, double *x_ptr); | |||||
| extern void stranspose(blasint rows, blasint cols, float alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst); | |||||
| extern void dtranspose(blasint rows, blasint cols, double alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst); | |||||
| extern void ctranspose(blasint rows, blasint cols, float *alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst, int conj); | |||||
| extern void ztranspose(blasint rows, blasint cols, double *alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst, int conj); | |||||
| extern void scopy(blasint rows, blasint cols, float alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst); | |||||
| extern void dcopy(blasint rows, blasint cols, double alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst); | |||||
| extern void ccopy(blasint rows, blasint cols, float *alpha, float *a_src, int lda_src, | |||||
| float *a_dst, blasint lda_dst, int conj); | |||||
| extern void zcopy(blasint rows, blasint cols, double *alpha, double *a_src, int lda_src, | |||||
| double *a_dst, blasint lda_dst, int conj); | |||||
| #endif | |||||
| @@ -0,0 +1,631 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CAXPBY { | |||||
| float x_test[DATASIZE * INCREMENT * 2]; | |||||
| float x_verify[DATASIZE * INCREMENT * 2]; | |||||
| float y_test[DATASIZE * INCREMENT * 2]; | |||||
| float y_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CAXPBY data_caxpby; | |||||
| /** | |||||
| * Fortran API specific function | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static float check_caxpby(blasint n, float *alpha, blasint incx, float *beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // cscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Fill vectors x, y | |||||
| srand_generate(data_caxpby.x_test, n * incx_abs * 2); | |||||
| srand_generate(data_caxpby.y_test, n * incy_abs * 2); | |||||
| // Copy vector x for caxpy | |||||
| for (i = 0; i < n * incx_abs * 2; i++) | |||||
| data_caxpby.x_verify[i] = data_caxpby.x_test[i]; | |||||
| // Copy vector y for cscal | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_caxpby.y_verify[i] = data_caxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| BLASFUNC(cscal)(&n, beta, data_caxpby.y_verify, &incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| BLASFUNC(caxpy)(&n, alpha, data_caxpby.x_verify, &incx, | |||||
| data_caxpby.y_verify, &incy); | |||||
| BLASFUNC(caxpby)(&n, alpha, data_caxpby.x_test, &incx, | |||||
| beta, data_caxpby.y_test, &incy); | |||||
| // Find the differences between output vector caculated by caxpby and caxpy | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_caxpby.y_test[i] -= data_caxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(scnrm2)(&n, data_caxpby.y_test, &incy_abs); | |||||
| } | |||||
| /** | |||||
| * C API specific function | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static float c_api_check_caxpby(blasint n, float *alpha, blasint incx, float *beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // cscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Fill vectors x, y | |||||
| srand_generate(data_caxpby.x_test, n * incx_abs * 2); | |||||
| srand_generate(data_caxpby.y_test, n * incy_abs * 2); | |||||
| // Copy vector x for caxpy | |||||
| for (i = 0; i < n * incx_abs * 2; i++) | |||||
| data_caxpby.x_verify[i] = data_caxpby.x_test[i]; | |||||
| // Copy vector y for cscal | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_caxpby.y_verify[i] = data_caxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| cblas_cscal(n, beta, data_caxpby.y_verify, incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| cblas_caxpy(n, alpha, data_caxpby.x_verify, incx, | |||||
| data_caxpby.y_verify, incy); | |||||
| cblas_caxpby(n, alpha, data_caxpby.x_test, incx, | |||||
| beta, data_caxpby.y_test, incy); | |||||
| // Find the differences between output vector caculated by caxpby and caxpy | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_caxpby.y_test[i] -= data_caxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return cblas_scnrm2(n, data_caxpby.y_test, incy_abs); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {2.0f, 1.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha[] = {3.0f, 1.0f}; | |||||
| float beta[] = {4.0f, 3.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| float alpha[] = {5.0f, 2.2f}; | |||||
| float beta[] = {4.0f, 5.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {6.0f, 3.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(caxpby, inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| float alpha[] = {7.0f, 2.0f}; | |||||
| float beta[] = {3.5f, 1.3f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(caxpby, inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(caxpby, inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(caxpby, inc_x_1_inc_y_1_N_100_a_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(caxpby, inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(caxpby, check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {2.0f, 2.1f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha[] = {3.0f, 2.0f}; | |||||
| float beta[] = {4.0f, 3.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| float alpha[] = {5.0f, 2.0f}; | |||||
| float beta[] = {4.0f, 3.1f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {6.0f, 2.3f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {3.5f, 1.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_1_inc_y_1_N_100_a_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test caxpby by comparing it with cscal and caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(caxpby, c_api_inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(caxpby, c_api_check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = c_api_check_caxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,158 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CAXPYC { | |||||
| float x_test[DATASIZE * INCREMENT * 2]; | |||||
| float x_verify[DATASIZE * INCREMENT * 2]; | |||||
| float y_test[DATASIZE * INCREMENT * 2]; | |||||
| float y_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CAXPYC data_caxpyc; | |||||
| /** | |||||
| * Test caxpyc by conjugating vector x and comparing with caxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static float check_caxpyc(blasint n, float *alpha, blasint incx, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| srand_generate(data_caxpyc.x_test, n * incx * 2); | |||||
| srand_generate(data_caxpyc.y_test, n * incy * 2); | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_caxpyc.x_verify[i] = data_caxpyc.x_test[i]; | |||||
| for (i = 0; i < n * incy * 2; i++) | |||||
| data_caxpyc.y_verify[i] = data_caxpyc.y_test[i]; | |||||
| cconjugate_vector(n, incx, data_caxpyc.x_verify); | |||||
| BLASFUNC(caxpy)(&n, alpha, data_caxpyc.x_verify, &incx, | |||||
| data_caxpyc.y_verify, &incy); | |||||
| BLASFUNC(caxpyc)(&n, alpha, data_caxpyc.x_test, &incx, | |||||
| data_caxpyc.y_test, &incy); | |||||
| for (i = 0; i < n * incy * 2; i++) | |||||
| data_caxpyc.y_verify[i] -= data_caxpyc.y_test[i]; | |||||
| return BLASFUNC(scnrm2)(&n, data_caxpyc.y_verify, &incy); | |||||
| } | |||||
| /** | |||||
| * Test caxpyc by conjugating vector x and comparing with caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(caxpyc, conj_strides_one) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha[] = {5.0f, 2.2f}; | |||||
| float norm = check_caxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test caxpyc by conjugating vector x and comparing with caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpyc, conj_incx_one) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha[] = {5.0f, 2.2f}; | |||||
| float norm = check_caxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test caxpyc by conjugating vector x and comparing with caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(caxpyc, conj_incy_one) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha[] = {5.0f, 2.2f}; | |||||
| float norm = check_caxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test caxpyc by conjugating vector x and comparing with caxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(caxpyc, conj_strides_two) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha[] = {5.0f, 2.2f}; | |||||
| float norm = check_caxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,279 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 1 | |||||
| struct DATA_CGBMV { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float a_band_storage[DATASIZE * DATASIZE * 2]; | |||||
| float matrix[DATASIZE * DATASIZE * 2]; | |||||
| float b_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CGBMV data_cgbmv; | |||||
| /** | |||||
| * Transform full-storage band matrix A to band-packed storage mode. | |||||
| * | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param kl - number of sub-diagonals of the matrix A | |||||
| * param ku - number of super-diagonals of the matrix A | |||||
| * output param a - buffer for holding band-packed matrix | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param matrix - buffer holding full-storage band matrix A | |||||
| * param ldm - specifies the leading full-storage band matrix A | |||||
| */ | |||||
| static void transform_to_band_storage(blasint m, blasint n, blasint kl, | |||||
| blasint ku, float* a, blasint lda, | |||||
| float* matrix, blasint ldm) | |||||
| { | |||||
| blasint i, j, k; | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| k = 2 * (ku - j); | |||||
| for (i = MAX(0, 2*(j - ku)); i < MIN(m, j + kl + 1) * 2; i+=2) | |||||
| { | |||||
| a[(k + i) + j * lda * 2] = matrix[i + j * ldm * 2]; | |||||
| a[(k + i) + j * lda * 2 + 1] = matrix[i + j * ldm * 2 + 1]; | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Generate full-storage band matrix A with kl sub-diagonals and ku super-diagonals | |||||
| * | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param kl - number of sub-diagonals of the matrix A | |||||
| * param ku - number of super-diagonals of the matrix A | |||||
| * output param band_matrix - buffer for full-storage band matrix. | |||||
| * param matrix - buffer holding input general matrix | |||||
| * param ldm - specifies the leading of input general matrix | |||||
| */ | |||||
| static void get_band_matrix(blasint m, blasint n, blasint kl, blasint ku, | |||||
| float *band_matrix, float *matrix, blasint ldm) | |||||
| { | |||||
| blasint i, j; | |||||
| blasint k = 0; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| for (j = 0; j < m * 2; j += 2) | |||||
| { | |||||
| if ((blasint)(j/2) > kl + i || i > ku + (blasint)(j/2)) | |||||
| { | |||||
| band_matrix[i * ldm * 2 + j] = 0.0f; | |||||
| band_matrix[i * ldm * 2 + j + 1] = 0.0f; | |||||
| continue; | |||||
| } | |||||
| band_matrix[i * ldm * 2 + j] = matrix[k++]; | |||||
| band_matrix[i * ldm * 2 + j + 1] = matrix[k++]; | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by cgbmv and cgemv | |||||
| * since gbmv is gemv for band matrix | |||||
| * | |||||
| * param trans specifies op(A), the transposition operation applied to A | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param kl - number of sub-diagonals of the matrix A | |||||
| * param ku - number of super-diagonals of the matrix A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param inc_c - stride of vector c | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_cgbmv(char trans, blasint m, blasint n, blasint kl, blasint ku, | |||||
| float *alpha, blasint lda, blasint inc_b, float *beta, blasint inc_c) | |||||
| { | |||||
| blasint i; | |||||
| blasint lenb, lenc; | |||||
| if(trans == 'T' || trans == 'C' || trans == 'D' || trans == 'U'){ | |||||
| lenb = m; | |||||
| lenc = n; | |||||
| } else { | |||||
| lenb = n; | |||||
| lenc = m; | |||||
| } | |||||
| srand_generate(data_cgbmv.matrix, m * n * 2); | |||||
| srand_generate(data_cgbmv.b_test, 2 * (1 + (lenb - 1) * inc_b)); | |||||
| srand_generate(data_cgbmv.c_test, 2 * (1 + (lenc - 1) * inc_c)); | |||||
| for (i = 0; i < 2 * (1 + (lenc - 1) * inc_c); i++) | |||||
| data_cgbmv.c_verify[i] = data_cgbmv.c_test[i]; | |||||
| get_band_matrix(m, n, kl, ku, data_cgbmv.a_test, data_cgbmv.matrix, m); | |||||
| transform_to_band_storage(m, n, kl, ku, data_cgbmv.a_band_storage, lda, data_cgbmv.a_test, m); | |||||
| BLASFUNC(cgemv)(&trans, &m, &n, alpha, data_cgbmv.a_test, &m, data_cgbmv.b_test, | |||||
| &inc_b, beta, data_cgbmv.c_verify, &inc_c); | |||||
| BLASFUNC(cgbmv)(&trans, &m, &n, &kl, &ku, alpha, data_cgbmv.a_band_storage, &lda, data_cgbmv.b_test, | |||||
| &inc_b, beta, data_cgbmv.c_test, &inc_c); | |||||
| for (i = 0; i < 2 * (1 + (lenc - 1) * inc_c); i++) | |||||
| data_cgbmv.c_verify[i] -= data_cgbmv.c_test[i]; | |||||
| return BLASFUNC(scnrm2)(&lenc, data_cgbmv.c_verify, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Test cgbmv by comparing it against cgemv | |||||
| * with param trans is D | |||||
| */ | |||||
| CTEST(cgbmv, trans_D) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 11; | |||||
| blasint lda = 50; | |||||
| char trans = 'D'; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {1.5f, -1.5f}; | |||||
| float norm = check_cgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgbmv by comparing it against cgemv | |||||
| * with param trans is O | |||||
| */ | |||||
| CTEST(cgbmv, trans_O) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 10; | |||||
| blasint lda = 50; | |||||
| char trans = 'O'; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {1.5f, -1.5f}; | |||||
| float norm = check_cgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgbmv by comparing it against cgemv | |||||
| * with param trans is S | |||||
| */ | |||||
| CTEST(cgbmv, trans_S) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 6, ku = 9; | |||||
| blasint lda = 50; | |||||
| char trans = 'S'; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {1.5f, -1.5f}; | |||||
| float norm = check_cgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgbmv by comparing it against cgemv | |||||
| * with param trans is U | |||||
| */ | |||||
| CTEST(cgbmv, trans_U) | |||||
| { | |||||
| blasint m = 25, n = 50; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 7, ku = 11; | |||||
| blasint lda = kl + ku + 1; | |||||
| char trans = 'U'; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {1.5f, -1.5f}; | |||||
| float norm = check_cgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgbmv by comparing it against cgemv | |||||
| * with param trans is C | |||||
| */ | |||||
| CTEST(cgbmv, trans_C) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 11; | |||||
| blasint lda = 50; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {1.5f, -1.5f}; | |||||
| float norm = check_cgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgbmv by comparing it against cgemv | |||||
| * with param trans is R | |||||
| */ | |||||
| CTEST(cgbmv, trans_R) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 11; | |||||
| blasint lda = 50; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {7.0f, 1.0f}; | |||||
| float beta[] = {1.5f, -1.5f}; | |||||
| float norm = check_cgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,880 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define N 100 | |||||
| #define M 100 | |||||
| struct DATA_CGEADD { | |||||
| float a_test[M * N * 2]; | |||||
| float c_test[M * N * 2]; | |||||
| float c_verify[M * N * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CGEADD data_cgeadd; | |||||
| /** | |||||
| * cgeadd reference implementation | |||||
| * | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param aptr - refer to matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param cptr - refer to matrix C | |||||
| * param ldc - leading dimension of C | |||||
| */ | |||||
| static void cgeadd_trusted(blasint m, blasint n, float *alpha, float *aptr, | |||||
| blasint lda, float *beta, float *cptr, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| lda *= 2; | |||||
| ldc *= 2; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| cblas_caxpby(m, alpha, aptr, 1, beta, cptr, 1); | |||||
| aptr += lda; | |||||
| cptr += ldc; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Test cgeadd by comparing it against reference | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param ldc - leading dimension of C | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_cgeadd(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, float *alpha, blasint lda, | |||||
| float *beta, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| blasint cols = m, rows = n; | |||||
| if (order == CblasRowMajor) | |||||
| { | |||||
| rows = m; | |||||
| cols = n; | |||||
| } | |||||
| // Fill matrix A, C | |||||
| srand_generate(data_cgeadd.a_test, lda * rows * 2); | |||||
| srand_generate(data_cgeadd.c_test, ldc * rows * 2); | |||||
| // Copy matrix C for cgeadd | |||||
| for (i = 0; i < ldc * rows * 2; i++) | |||||
| data_cgeadd.c_verify[i] = data_cgeadd.c_test[i]; | |||||
| cgeadd_trusted(cols, rows, alpha, data_cgeadd.a_test, lda, | |||||
| beta, data_cgeadd.c_verify, ldc); | |||||
| if (api == 'F') | |||||
| BLASFUNC(cgeadd)(&m, &n, alpha, data_cgeadd.a_test, &lda, | |||||
| beta, data_cgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_cgeadd(order, m, n, alpha, data_cgeadd.a_test, lda, | |||||
| beta, data_cgeadd.c_test, ldc); | |||||
| // Find the differences between output matrix caculated by cgeadd and sgemm | |||||
| return smatrix_difference(data_cgeadd.c_test, data_cgeadd.c_verify, cols, rows, ldc*2); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param lda - leading dimension of A | |||||
| * param ldc - leading dimension of C | |||||
| * param expected_info - expected invalid parameter number in cgeadd | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, blasint lda, | |||||
| blasint ldc, int expected_info) | |||||
| { | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| set_xerbla("CGEADD ", expected_info); | |||||
| if (api == 'F') | |||||
| BLASFUNC(cgeadd)(&m, &n, alpha, data_cgeadd.a_test, &lda, | |||||
| beta, data_cgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_cgeadd(order, m, n, alpha, data_cgeadd.a_test, lda, | |||||
| beta, data_cgeadd.c_test, ldc); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(cgeadd, matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {3.0f, 2.0f}; | |||||
| float beta[] = {1.0f, 3.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(cgeadd, matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {2.5f, 1.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(cgeadd, matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {3.0f, 1.5f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(cgeadd, matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(cgeadd, matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(cgeadd, xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(cgeadd, xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(cgeadd, xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(cgeadd, xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| */ | |||||
| CTEST(cgeadd, n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| */ | |||||
| CTEST(cgeadd, m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_cgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 3.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_100_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {4.0f, 1.5f}; | |||||
| float beta[] = {2.0f, 1.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_50_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N / 2; | |||||
| blasint m = M; | |||||
| blasint lda = n; | |||||
| blasint ldc = n; | |||||
| float alpha[] = {3.0f, 2.5f}; | |||||
| float beta[] = {1.0f, 2.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {3.0f, 1.5f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {0.0f, 0.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cgeadd by comparing it against sgemm | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(cgeadd, c_api_matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha[] = {2.0f, 3.0f}; | |||||
| float beta[] = {2.0f, 4.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param order - | |||||
| * specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_invalid_order) | |||||
| { | |||||
| CBLAS_ORDER order = INVALID; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 0; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_n_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_m_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_lda_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_xerbla_ldc_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(cgeadd, c_api_m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_cgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,273 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CGEMM { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float a_verify[DATASIZE * DATASIZE * 2]; | |||||
| float b_test[DATASIZE * DATASIZE * 2]; | |||||
| float b_verify[DATASIZE * DATASIZE * 2]; | |||||
| float c_test[DATASIZE * DATASIZE * 2]; | |||||
| float c_verify[DATASIZE * DATASIZE * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CGEMM data_cgemm; | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * | |||||
| * param transa specifies op(A), the transposition (conjugation) operation applied to A | |||||
| * param transb specifies op(B), the transposition (conjugation) operation applied to B | |||||
| * param m specifies the number of rows of the matrix op(A) and of the matrix C | |||||
| * param n specifies the number of columns of the matrix op(B) and the number of columns of the matrix C | |||||
| * param k specifies the number of columns of the matrix op(A) and the number of rows of the matrix op(B) | |||||
| * param alpha - scaling factor for the matrix-matrix product | |||||
| * param lda - leading dimension of matrix A | |||||
| * param ldb - leading dimension of matrix B | |||||
| * param beta - scaling factor for matrix C | |||||
| * param ldc - leading dimension of matrix C | |||||
| * return norm of difference | |||||
| */ | |||||
| static float check_cgemm(char transa, char transb, blasint m, blasint n, blasint k, | |||||
| float *alpha, blasint lda, blasint ldb, float *beta, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| float alpha_conj[] = {1.0f, 0.0f}; | |||||
| char transa_verify = transa; | |||||
| char transb_verify = transb; | |||||
| int arows = k, acols = m; | |||||
| int brows = n, bcols = k; | |||||
| if (transa == 'T' || transa == 'C'){ | |||||
| arows = m; acols = k; | |||||
| } | |||||
| if (transb == 'T' || transb == 'C'){ | |||||
| brows = k; bcols = n; | |||||
| } | |||||
| srand_generate(data_cgemm.a_test, arows * lda * 2); | |||||
| srand_generate(data_cgemm.b_test, brows * ldb * 2); | |||||
| srand_generate(data_cgemm.c_test, n * ldc * 2); | |||||
| for (i = 0; i < arows * lda * 2; i++) | |||||
| data_cgemm.a_verify[i] = data_cgemm.a_test[i]; | |||||
| for (i = 0; i < brows * ldb * 2; i++) | |||||
| data_cgemm.b_verify[i] = data_cgemm.b_test[i]; | |||||
| for (i = 0; i < n * ldc * 2; i++) | |||||
| data_cgemm.c_verify[i] = data_cgemm.c_test[i]; | |||||
| if (transa == 'R'){ | |||||
| cblas_cimatcopy(CblasColMajor, CblasConjNoTrans, arows, acols, alpha_conj, data_cgemm.a_verify, lda, lda); | |||||
| transa_verify = 'N'; | |||||
| } | |||||
| if (transb == 'R'){ | |||||
| cblas_cimatcopy(CblasColMajor, CblasConjNoTrans, brows, bcols, alpha_conj, data_cgemm.b_verify, ldb, ldb); | |||||
| transb_verify = 'N'; | |||||
| } | |||||
| BLASFUNC(cgemm)(&transa_verify, &transb_verify, &m, &n, &k, alpha, data_cgemm.a_verify, &lda, | |||||
| data_cgemm.b_verify, &ldb, beta, data_cgemm.c_verify, &ldc); | |||||
| BLASFUNC(cgemm)(&transa, &transb, &m, &n, &k, alpha, data_cgemm.a_test, &lda, | |||||
| data_cgemm.b_test, &ldb, beta, data_cgemm.c_test, &ldc); | |||||
| return smatrix_difference(data_cgemm.c_test, data_cgemm.c_verify, m, n, ldc*2); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(cgemm, conjtransa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'C'; | |||||
| char transb = 'R'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is not conjugate and not transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(cgemm, notransa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'N'; | |||||
| char transb = 'R'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is conjugate and transposed | |||||
| */ | |||||
| CTEST(cgemm, conjnotransa_conjtransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'C'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is not conjugate and not transposed | |||||
| */ | |||||
| CTEST(cgemm, conjnotransa_notransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'N'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(cgemm, conjnotransa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'R'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is transposed | |||||
| */ | |||||
| CTEST(cgemm, conjnotransa_transb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'T'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test cgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate cgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(cgemm, transa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'T'; | |||||
| char transb = 'R'; | |||||
| float alpha[] = {-2.0, 1.0f}; | |||||
| float beta[] = {1.0f, -1.0f}; | |||||
| float norm = check_cgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,340 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CSPMV_N { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float b_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CSPMV_N data_cgemv_n; | |||||
| /** | |||||
| * cgemv not transposed reference code | |||||
| * | |||||
| * param trans specifies whether matris A is conj or/and xconj | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param alpha - scaling factor for the matrib-vector product | |||||
| * param a - buffer holding input matrib A | |||||
| * param lda - leading dimension of matrix A | |||||
| * param b - Buffer holding input vector b | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param c - buffer holding input/output vector c | |||||
| * param inc_c - stride of vector c | |||||
| */ | |||||
| static void cgemv_n_trusted(char trans, blasint m, blasint n, float *alpha, float *a, | |||||
| blasint lda, float *b, blasint inc_b, float *beta, float *c, | |||||
| blasint inc_c) | |||||
| { | |||||
| blasint i, j; | |||||
| blasint i2 = 0; | |||||
| blasint ib = 0, ic = 0; | |||||
| float temp_r, temp_i; | |||||
| float *a_ptr = a; | |||||
| blasint lda2 = 2*lda; | |||||
| blasint inc_b2 = 2 * inc_b; | |||||
| blasint inc_c2 = 2 * inc_c; | |||||
| BLASFUNC(cscal)(&m, beta, c, &inc_c); | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| if (trans == 'N' || trans == 'R') { | |||||
| temp_r = alpha[0] * b[ib] - alpha[1] * b[ib+1]; | |||||
| temp_i = alpha[0] * b[ib+1] + alpha[1] * b[ib]; | |||||
| } else { | |||||
| temp_r = alpha[0] * b[ib] + alpha[1] * b[ib+1]; | |||||
| temp_i = alpha[0] * b[ib+1] - alpha[1] * b[ib]; | |||||
| } | |||||
| ic = 0; | |||||
| i2 = 0; | |||||
| for (i = 0; i < m; i++) | |||||
| { | |||||
| if (trans == 'N') { | |||||
| c[ic] += temp_r * a_ptr[i2] - temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] += temp_r * a_ptr[i2+1] + temp_i * a_ptr[i2]; | |||||
| } | |||||
| if (trans == 'O') { | |||||
| c[ic] += temp_r * a_ptr[i2] + temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] += temp_r * a_ptr[i2+1] - temp_i * a_ptr[i2]; | |||||
| } | |||||
| if (trans == 'R') { | |||||
| c[ic] += temp_r * a_ptr[i2] + temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] -= temp_r * a_ptr[i2+1] - temp_i * a_ptr[i2]; | |||||
| } | |||||
| if (trans == 'S') { | |||||
| c[ic] += temp_r * a_ptr[i2] - temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] -= temp_r * a_ptr[i2+1] + temp_i * a_ptr[i2]; | |||||
| } | |||||
| i2 += 2; | |||||
| ic += inc_c2; | |||||
| } | |||||
| a_ptr += lda2; | |||||
| ib += inc_b2; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by cgemv and cgemv_n_trusted | |||||
| * | |||||
| * param trans specifies whether matris A is conj or/and xconj | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param alpha - scaling factor for the matrib-vector product | |||||
| * param lda - leading dimension of matrix A | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param inc_c - stride of vector c | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_cgemv_n(char trans, blasint m, blasint n, float *alpha, blasint lda, | |||||
| blasint inc_b, float *beta, blasint inc_c) | |||||
| { | |||||
| blasint i; | |||||
| srand_generate(data_cgemv_n.a_test, n * lda); | |||||
| srand_generate(data_cgemv_n.b_test, 2 * n * inc_b); | |||||
| srand_generate(data_cgemv_n.c_test, 2 * m * inc_c); | |||||
| for (i = 0; i < m * 2 * inc_c; i++) | |||||
| data_cgemv_n.c_verify[i] = data_cgemv_n.c_test[i]; | |||||
| cgemv_n_trusted(trans, m, n, alpha, data_cgemv_n.a_test, lda, data_cgemv_n.b_test, | |||||
| inc_b, beta, data_cgemv_n.c_test, inc_c); | |||||
| BLASFUNC(cgemv)(&trans, &m, &n, alpha, data_cgemv_n.a_test, &lda, data_cgemv_n.b_test, | |||||
| &inc_b, beta, data_cgemv_n.c_verify, &inc_c); | |||||
| for (i = 0; i < m * 2 * inc_c; i++) | |||||
| data_cgemv_n.c_verify[i] -= data_cgemv_n.c_test[i]; | |||||
| return BLASFUNC(scnrm2)(&n, data_cgemv_n.c_verify, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cgemv, trans_o_square_matrix) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'O'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.4f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows of A is 50 | |||||
| * Number of colums of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cgemv, trans_o_rectangular_matrix_rows_less_then_cols) | |||||
| { | |||||
| blasint n = 100, m = 50, lda = 50; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'O'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.4f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows of A is 100 | |||||
| * Number of colums of A is 50 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cgemv, trans_o_rectangular_matrix_cols_less_then_rows) | |||||
| { | |||||
| blasint n = 50, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'O'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.4f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(cgemv, trans_o_double_strides) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 2, inc_c = 2; | |||||
| char trans = 'O'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.4f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cgemv, trans_s_square_matrix) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'S'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.4f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows of A is 50 | |||||
| * Number of colums of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cgemv, trans_s_rectangular_matrix_rows_less_then_cols) | |||||
| { | |||||
| blasint n = 100, m = 50, lda = 50; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'S'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.4f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows of A is 100 | |||||
| * Number of colums of A is 50 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cgemv, trans_s_rectangular_matrix_cols_less_then_rows) | |||||
| { | |||||
| blasint n = 50, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'S'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.4f, 0.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(cgemv, trans_s_double_strides) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 2, inc_c = 2; | |||||
| char trans = 'S'; | |||||
| float alpha[] = {2.0f, -1.0f}; | |||||
| float beta[] = {1.0f, 5.0f}; | |||||
| float norm = check_cgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,818 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_CIMATCOPY { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float a_verify[DATASIZE * DATASIZE * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CIMATCOPY data_cimatcopy; | |||||
| /** | |||||
| * Comapare results computed by cimatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param alpha specifies scaling factor for matrix A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static float check_cimatcopy(char api, char order, char trans, blasint rows, blasint cols, float *alpha, | |||||
| blasint lda_src, blasint lda_dst) | |||||
| { | |||||
| blasint m, n; | |||||
| blasint rows_out, cols_out; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| int conj = -1; | |||||
| if (order == 'C') { | |||||
| n = rows; m = cols; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| rows_out = n; cols_out = m*2; | |||||
| if (trans == 'C') | |||||
| conj = 1; | |||||
| } | |||||
| else { | |||||
| rows_out = m; cols_out = n*2; | |||||
| if (trans == 'R') | |||||
| conj = 1; | |||||
| } | |||||
| srand_generate(data_cimatcopy.a_test, lda_src*m*2); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| ctranspose(m, n, alpha, data_cimatcopy.a_test, lda_src, data_cimatcopy.a_verify, lda_dst, conj); | |||||
| } | |||||
| else { | |||||
| ccopy(m, n, alpha, data_cimatcopy.a_test, lda_src, data_cimatcopy.a_verify, lda_dst, conj); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(cimatcopy)(&order, &trans, &rows, &cols, alpha, data_cimatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_cimatcopy(corder, ctrans, rows, cols, alpha, data_cimatcopy.a_test, | |||||
| lda_src, lda_dst); | |||||
| } | |||||
| // Find the differences between output matrix computed by cimatcopy and reference func | |||||
| return smatrix_difference(data_cimatcopy.a_test, data_cimatcopy.a_verify, cols_out, rows_out, 2*lda_dst); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda_src, blasint lda_dst, int expected_info) | |||||
| { | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| set_xerbla("CIMATCOPY", expected_info); | |||||
| BLASFUNC(cimatcopy)(&order, &trans, &rows, &cols, alpha, data_cimatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = -3.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {-3.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_conjtrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, colmajor_conj_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = 2.0, alpha_i = 3.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {2.0f, 3.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_conj_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, rowmajor_conjtrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 3.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {3.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = 3.0, alpha_i = 1.5 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {3.0f, 1.5f}; | |||||
| float norm = check_cimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 3.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {3.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_colmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = 1.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float norm = check_cimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(cimatcopy, c_api_rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_cimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda_src must be at least n. | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda_src must be at least m. | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(cimatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,696 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_COMATCOPY { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float b_test[DATASIZE * DATASIZE * 2]; | |||||
| float b_verify[DATASIZE * DATASIZE * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_COMATCOPY data_comatcopy; | |||||
| /** | |||||
| * Comapare results computed by comatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param alpha - scaling factor for matrix B | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static float check_comatcopy(char api, char order, char trans, blasint rows, blasint cols, float* alpha, | |||||
| blasint lda, blasint ldb) | |||||
| { | |||||
| blasint b_rows, b_cols; | |||||
| blasint m, n; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| int conj = -1; | |||||
| if (order == 'C') { | |||||
| m = cols; n = rows; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| b_rows = n; b_cols = m*2; | |||||
| if (trans == 'C') | |||||
| conj = 1; | |||||
| } | |||||
| else { | |||||
| b_rows = m; b_cols = n*2; | |||||
| if (trans == 'R') | |||||
| conj = 1; | |||||
| } | |||||
| srand_generate(data_comatcopy.a_test, lda*m*2); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| ctranspose(m, n, alpha, data_comatcopy.a_test, lda, data_comatcopy.b_verify, ldb, conj); | |||||
| } | |||||
| else { | |||||
| ccopy(m, n, alpha, data_comatcopy.a_test, lda, data_comatcopy.b_verify, ldb, conj); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(comatcopy)(&order, &trans, &rows, &cols, alpha, data_comatcopy.a_test, | |||||
| &lda, data_comatcopy.b_test, &ldb); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_comatcopy(corder, ctrans, rows, cols, alpha, data_comatcopy.a_test, | |||||
| lda, data_comatcopy.b_test, ldb); | |||||
| } | |||||
| return smatrix_difference(data_comatcopy.b_test, data_comatcopy.b_verify, b_cols, b_rows, ldb*2); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda, blasint ldb, int expected_info) | |||||
| { | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| set_xerbla("COMATCOPY", expected_info); | |||||
| BLASFUNC(comatcopy)(&order, &trans, &rows, &cols, alpha, data_comatcopy.a_test, | |||||
| &lda, data_comatcopy.b_test, &ldb); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * alpha_r = -1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {-1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(comatcopy, colmajor_conjtrnas_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(comatcopy, rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(comatcopy, rowmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(comatcopy, rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * alpha_r = -1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {-1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_colmajor_conjtrnas_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_rowmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| float alpha[] = {1.5f, -1.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test comatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(comatcopy, c_api_rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| float alpha[] = {1.0f, 2.0f}; | |||||
| float norm = check_comatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda must be at least n. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda must be at least m. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_rowmajor_conj_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_rowmajor_transconj_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_colmajor_conj_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(comatcopy, xerbla_colmajor_transconj_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,792 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CROT { | |||||
| float x_test[DATASIZE * INCREMENT * 2]; | |||||
| float y_test[DATASIZE * INCREMENT * 2]; | |||||
| float x_verify[DATASIZE * INCREMENT * 2]; | |||||
| float y_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CROT data_crot; | |||||
| /** | |||||
| * Fortran API specific function | |||||
| * Comapare results computed by csrot and caxpby | |||||
| * | |||||
| * param n specifies size of vector x | |||||
| * param inc_x specifies increment of vector x | |||||
| * param inc_y specifies increment of vector y | |||||
| * param c specifies cosine | |||||
| * param s specifies sine | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_csrot(blasint n, blasint inc_x, blasint inc_y, float *c, float *s) | |||||
| { | |||||
| blasint i; | |||||
| float norm = 0; | |||||
| float s_neg[] = {-s[0], s[1]}; | |||||
| blasint inc_x_abs = labs(inc_x); | |||||
| blasint inc_y_abs = labs(inc_y); | |||||
| // Fill vectors x, y | |||||
| srand_generate(data_crot.x_test, n * inc_x_abs * 2); | |||||
| srand_generate(data_crot.y_test, n * inc_y_abs * 2); | |||||
| if (inc_x == 0 && inc_y == 0) { | |||||
| srand_generate(data_crot.x_test, n * 2); | |||||
| srand_generate(data_crot.y_test, n * 2); | |||||
| } | |||||
| // Copy vector x for caxpby | |||||
| for (i = 0; i < n * inc_x_abs * 2; i++) | |||||
| data_crot.x_verify[i] = data_crot.x_test[i]; | |||||
| // Copy vector y for caxpby | |||||
| for (i = 0; i < n * inc_y_abs * 2; i++) | |||||
| data_crot.y_verify[i] = data_crot.y_test[i]; | |||||
| // Find cx = c*x + s*y | |||||
| BLASFUNC(caxpby)(&n, s, data_crot.y_test, &inc_y, c, data_crot.x_verify, &inc_x); | |||||
| // Find cy = -conjg(s)*x + c*y | |||||
| BLASFUNC(caxpby)(&n, s_neg, data_crot.x_test, &inc_x, c, data_crot.y_verify, &inc_y); | |||||
| BLASFUNC(csrot)(&n, data_crot.x_test, &inc_x, data_crot.y_test, &inc_y, c, s); | |||||
| // Find the differences between vector x caculated by caxpby and csrot | |||||
| for (i = 0; i < n * 2 * inc_x_abs; i++) | |||||
| data_crot.x_test[i] -= data_crot.x_verify[i]; | |||||
| // Find the differences between vector y caculated by caxpby and csrot | |||||
| for (i = 0; i < n * 2 * inc_y_abs; i++) | |||||
| data_crot.y_test[i] -= data_crot.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| norm += BLASFUNC(scnrm2)(&n, data_crot.x_test, &inc_x_abs); | |||||
| norm += BLASFUNC(scnrm2)(&n, data_crot.y_test, &inc_y_abs); | |||||
| return (norm / 2); | |||||
| } | |||||
| /** | |||||
| * C API specific function | |||||
| * Comapare results computed by csrot and caxpby | |||||
| * | |||||
| * param n specifies size of vector x | |||||
| * param inc_x specifies increment of vector x | |||||
| * param inc_y specifies increment of vector y | |||||
| * param c specifies cosine | |||||
| * param s specifies sine | |||||
| * return norm of differences | |||||
| */ | |||||
| static float c_api_check_csrot(blasint n, blasint inc_x, blasint inc_y, float *c, float *s) | |||||
| { | |||||
| blasint i; | |||||
| float norm = 0; | |||||
| float s_neg[] = {-s[0], s[1]}; | |||||
| blasint inc_x_abs = labs(inc_x); | |||||
| blasint inc_y_abs = labs(inc_y); | |||||
| // Fill vectors x, y | |||||
| srand_generate(data_crot.x_test, n * inc_x_abs * 2); | |||||
| srand_generate(data_crot.y_test, n * inc_y_abs * 2); | |||||
| if (inc_x == 0 && inc_y == 0) { | |||||
| srand_generate(data_crot.x_test, n * 2); | |||||
| srand_generate(data_crot.y_test, n * 2); | |||||
| } | |||||
| // Copy vector x for caxpby | |||||
| for (i = 0; i < n * inc_x_abs * 2; i++) | |||||
| data_crot.x_verify[i] = data_crot.x_test[i]; | |||||
| // Copy vector y for caxpby | |||||
| for (i = 0; i < n * inc_y_abs * 2; i++) | |||||
| data_crot.y_verify[i] = data_crot.y_test[i]; | |||||
| // Find cx = c*x + s*y | |||||
| cblas_caxpby(n, s, data_crot.y_test, inc_y, c, data_crot.x_verify, inc_x); | |||||
| // Find cy = -conjg(s)*x + c*y | |||||
| cblas_caxpby(n, s_neg, data_crot.x_test, inc_x, c, data_crot.y_verify, inc_y); | |||||
| cblas_csrot(n, data_crot.x_test, inc_x, data_crot.y_test, inc_y, c[0], s[0]); | |||||
| // Find the differences between vector x caculated by caxpby and csrot | |||||
| for (i = 0; i < n * 2 * inc_x_abs; i++) | |||||
| data_crot.x_test[i] -= data_crot.x_verify[i]; | |||||
| // Find the differences between vector y caculated by caxpby and csrot | |||||
| for (i = 0; i < n * 2 * inc_y_abs; i++) | |||||
| data_crot.y_test[i] -= data_crot.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| norm += cblas_scnrm2(n, data_crot.x_test, inc_x_abs); | |||||
| norm += cblas_scnrm2(n, data_crot.y_test, inc_y_abs); | |||||
| return (norm / 2); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 0 | |||||
| * Stride of vector y is 0 | |||||
| * c = 1.0f | |||||
| * s = 2.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_0_inc_y_0) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 0; | |||||
| blasint inc_y = 0; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {2.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_1_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is -1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_neg_1_inc_y_neg_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -1; | |||||
| blasint inc_y = -1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 3.0f | |||||
| * s = 2.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {3.0f, 0.0f}; | |||||
| float s[] = {2.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_neg_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_1_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is -2 | |||||
| * c = 2.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_1_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {2.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 2.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_2_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {2.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_neg_2_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 0.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_2_inc_y_2_c_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {0.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 0.0f | |||||
| */ | |||||
| CTEST(crot, inc_x_2_inc_y_2_s_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {0.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 0 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, check_n_zero) | |||||
| { | |||||
| blasint n = 0; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 0 | |||||
| * Stride of vector y is 0 | |||||
| * c = 1.0f | |||||
| * s = 2.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_0_inc_y_0) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 0; | |||||
| blasint inc_y = 0; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {3.0f, 0.0f}; | |||||
| float s[] = {2.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_1_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is -1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_neg_1_inc_y_neg_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -1; | |||||
| blasint inc_y = -1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 3.0f | |||||
| * s = 2.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {3.0f, 0.0f}; | |||||
| float s[] = {2.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_neg_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_1_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is -2 | |||||
| * c = 2.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_1_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {2.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 2.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_2_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {2.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_neg_2_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 0.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_2_inc_y_2_c_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {0.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0f | |||||
| * s = 0.0f | |||||
| */ | |||||
| CTEST(crot, c_api_inc_x_2_inc_y_2_s_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {0.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crot by comparing it with caxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 0 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0f | |||||
| * s = 1.0f | |||||
| */ | |||||
| CTEST(crot, c_api_check_n_zero) | |||||
| { | |||||
| blasint n = 0; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for caxpby | |||||
| float c[] = {1.0f, 0.0f}; | |||||
| float s[] = {1.0f, 0.0f}; | |||||
| float norm = c_api_check_csrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,290 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #ifdef BUILD_COMPLEX | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, zero_a) | |||||
| { | |||||
| float sa[2] = {0.0f, 0.0f}; | |||||
| float sb[2] = {1.0f, 1.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70711f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.70711f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, zero_b) | |||||
| { | |||||
| float sa[2] = {1.0f, 1.0f}; | |||||
| float sb[2] = {0.0f, 0.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, zero_real) | |||||
| { | |||||
| float sa[2] = {0.0f, 1.0f}; | |||||
| float sb[2] = {0.0f, 1.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.70711f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70711f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, positive_real_positive_img) | |||||
| { | |||||
| float sa[2] = {3.0f, 4.0f}; | |||||
| float sb[2] = {4.0f, 6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, negative_real_positive_img) | |||||
| { | |||||
| float sa[2] = {-3.0f, 4.0f}; | |||||
| float sb[2] = {-4.0f, 6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, positive_real_negative_img) | |||||
| { | |||||
| float sa[2] = {3.0f, -4.0f}; | |||||
| float sb[2] = {4.0f, -6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, negative_real_negative_img) | |||||
| { | |||||
| float sa[2] = {-3.0f, -4.0f}; | |||||
| float sb[2] = {-4.0f, -6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| BLASFUNC(crotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_zero_a) | |||||
| { | |||||
| float sa[2] = {0.0f, 0.0f}; | |||||
| float sb[2] = {1.0f, 1.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70711f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.70711f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_zero_b) | |||||
| { | |||||
| float sa[2] = {1.0f, 1.0f}; | |||||
| float sb[2] = {0.0f, 0.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_zero_real) | |||||
| { | |||||
| float sa[2] = {0.0f, 1.0f}; | |||||
| float sb[2] = {0.0f, 1.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.70711f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70711f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_positive_real_positive_img) | |||||
| { | |||||
| float sa[2] = {3.0f, 4.0f}; | |||||
| float sb[2] = {4.0f, 6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_negative_real_positive_img) | |||||
| { | |||||
| float sa[2] = {-3.0f, 4.0f}; | |||||
| float sb[2] = {-4.0f, 6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_positive_real_negative_img) | |||||
| { | |||||
| float sa[2] = {3.0f, -4.0f}; | |||||
| float sb[2] = {4.0f, -6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test crotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(crotg, c_api_negative_real_negative_img) | |||||
| { | |||||
| float sa[2] = {-3.0f, -4.0f}; | |||||
| float sb[2] = {-4.0f, -6.0f}; | |||||
| float ss[2]; | |||||
| float sc; | |||||
| cblas_crotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.5698f, sc, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82052f, ss[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558f, ss[1], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26498f, sa[0], SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997f, sa[1], SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,606 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CSBMV { | |||||
| float sp_matrix[DATASIZE * (DATASIZE + 1)]; | |||||
| float sb_matrix[DATASIZE * DATASIZE * 2]; | |||||
| float b_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| // SINGLE_EPS_ZGEMV = MAX_VAL * NUMBER OF OPERATIONS * FLT_EPSILON | |||||
| // SINGLE_EPS_ZGEMV = 5.0 * O(100 * 100) * 1.19e-07 = 5*e-03 | |||||
| #define SINGLE_EPS_ZGEMV 5e-03 | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CSBMV data_csbmv; | |||||
| /** | |||||
| * Transform full-storage symmetric band matrix A to upper (U) or lower (L) | |||||
| * band-packed storage mode. | |||||
| * | |||||
| * param uplo specifies whether matrix a is upper or lower band-packed. | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| * output param a - buffer for holding symmetric band-packed matrix | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param sb_matrix - buffer holding full-storage symmetric band matrix A | |||||
| * param ldm - specifies the leading dimension of A | |||||
| */ | |||||
| static void transform_to_band_storage(char uplo, blasint n, blasint k, float* a, blasint lda, | |||||
| float* sb_matrix, blasint ldm) | |||||
| { | |||||
| blasint i, j, m; | |||||
| if (uplo == 'L') { | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| m = -j; | |||||
| for (i = 2 * j; i < MIN(2 * n, 2 * (j + k + 1)); i += 2) | |||||
| { | |||||
| a[(2*m + i) + j * lda * 2] = sb_matrix[i + j * ldm * 2]; | |||||
| a[(2*m + (i + 1)) + j * lda * 2] = sb_matrix[(i + 1) + j * ldm * 2]; | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| m = k - j; | |||||
| for (i = MAX(0, 2*(j - k)); i <= j*2; i += 2) | |||||
| { | |||||
| a[(2*m + i) + j * lda * 2] = sb_matrix[i + j * ldm * 2]; | |||||
| a[(2*m + (i + 1)) + j * lda * 2] = sb_matrix[(i + 1) + j * ldm * 2]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Generate full-storage symmetric band matrix A with k - super-diagonals | |||||
| * from input symmetric packed matrix in lower packed mode (L) | |||||
| * | |||||
| * output param sb_matrix - buffer for holding full-storage symmetric band matrix. | |||||
| * param sp_matrix - buffer holding input symmetric packed matrix | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| */ | |||||
| static void get_symmetric_band_matr(float *sb_matrix, float *sp_matrix, blasint n, blasint k) | |||||
| { | |||||
| blasint m; | |||||
| blasint i, j; | |||||
| m = 0; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| for (j = 0; j < n * 2; j += 2) | |||||
| { | |||||
| // Make matrix band with k super-diagonals | |||||
| if (fabs((i+1) - ceil((j+1)/2.0f)) > k) | |||||
| { | |||||
| sb_matrix[i * n * 2 + j] = 0.0f; | |||||
| sb_matrix[i * n * 2 + j + 1] = 0.0f; | |||||
| continue; | |||||
| } | |||||
| if (j / 2 < i) | |||||
| { | |||||
| sb_matrix[i * n * 2 + j] = | |||||
| sb_matrix[j * n + i * 2]; | |||||
| sb_matrix[i * n * 2 + j + 1] = | |||||
| sb_matrix[j * n + i * 2 + 1]; | |||||
| } | |||||
| else | |||||
| { | |||||
| sb_matrix[i * n * 2 + j] = sp_matrix[m++]; | |||||
| sb_matrix[i * n * 2 + j + 1] = sp_matrix[m++]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param uplo specifies whether matrix a is upper or lower band-packed. | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param inc_b - stride of vector b_test | |||||
| * param inc_c - stride of vector c_test | |||||
| * param expected_info - expected invalid parameter number in csbmv | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char uplo, blasint n, blasint k, blasint lda, blasint inc_b, | |||||
| blasint inc_c, int expected_info) | |||||
| { | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float a[2]; | |||||
| srand_generate(a, 2); | |||||
| set_xerbla("CSBMV ", expected_info); | |||||
| BLASFUNC(csbmv)(&uplo, &n, &k, alpha, a, &lda, data_csbmv.b_test, | |||||
| &inc_b, beta, data_csbmv.c_test, &inc_c); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by csbmv and cgemv | |||||
| * since csbmv is cgemv for symmetric band matrix | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param inc_b - stride of vector b_test | |||||
| * param beta - scaling factor for vector c_test | |||||
| * param inc_c - stride of vector c_test | |||||
| * param lda - specifies the leading dimension of a | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_csbmv(char uplo, blasint n, blasint k, float *alpha, blasint lda, | |||||
| blasint inc_b, float *beta, blasint inc_c, blasint ldm) | |||||
| { | |||||
| blasint i; | |||||
| // Trans param for gemv (can use any, since the input matrix is symmetric) | |||||
| char trans = 'N'; | |||||
| // Symmetric band packed matrix for sbmv | |||||
| float a[lda * n * 2]; | |||||
| // Fill symmetric packed matrix sp_matrix, vector b_test, vector c_test | |||||
| srand_generate(data_csbmv.sp_matrix, n * (n + 1)); | |||||
| srand_generate(data_csbmv.b_test, n * inc_b * 2); | |||||
| srand_generate(data_csbmv.c_test, n * inc_c * 2); | |||||
| // Copy vector c_test for cgemv | |||||
| for (i = 0; i < n * inc_c * 2; i++) | |||||
| data_csbmv.c_verify[i] = data_csbmv.c_test[i]; | |||||
| // Generate full-storage symmetric band matrix | |||||
| // with k super-diagonals from symmetric packed matrix | |||||
| get_symmetric_band_matr(data_csbmv.sb_matrix, data_csbmv.sp_matrix, n, k); | |||||
| // Transform symmetric band matrix from conventional | |||||
| // full matrix storage to band storage for csbmv | |||||
| transform_to_band_storage(uplo, n, k, a, lda, data_csbmv.sb_matrix, ldm); | |||||
| BLASFUNC(cgemv)(&trans, &n, &n, alpha, data_csbmv.sb_matrix, &ldm, data_csbmv.b_test, | |||||
| &inc_b, beta, data_csbmv.c_verify, &inc_c); | |||||
| BLASFUNC(csbmv)(&uplo, &n, &k, alpha, a, &lda, | |||||
| data_csbmv.b_test, &inc_b, beta, data_csbmv.c_test, &inc_c); | |||||
| // Find the differences between output vector caculated by csbmv and cgemv | |||||
| for (i = 0; i < n * inc_c * 2; i++) | |||||
| data_csbmv.c_test[i] -= data_csbmv.c_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(scnrm2)(&n, data_csbmv.c_test, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 0 | |||||
| */ | |||||
| CTEST(csbmv, upper_k_0_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 1 | |||||
| */ | |||||
| CTEST(csbmv, upper_k_1_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 1; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(csbmv, upper_k_2_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(csbmv, upper_k_2_inc_b_2_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {2.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 2 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(csbmv, upper_k_2_inc_b_2_inc_c_2_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {2.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 0 | |||||
| */ | |||||
| CTEST(csbmv, lower_k_0_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 1 | |||||
| */ | |||||
| CTEST(csbmv, lower_k_1_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 1; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(csbmv, lower_k_2_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(csbmv, lower_k_2_inc_b_2_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {2.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test csbmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 2 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(csbmv, lower_k_2_inc_b_2_inc_c_2_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {2.0f, 1.0f}; | |||||
| float beta[] = {2.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Check if output matrix a contains any NaNs | |||||
| */ | |||||
| CTEST(csbmv, check_for_NaN) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {1.0f, 1.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_TRUE(norm == norm); /* NaN == NaN is false */ | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param uplo. | |||||
| * Uplo specifies whether a is in upper (U) or lower (L) band-packed storage mode. | |||||
| */ | |||||
| CTEST(csbmv, xerbla_uplo_invalid) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'O'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param N - | |||||
| * number of rows and columns of A. Must be at least zero. | |||||
| */ | |||||
| CTEST(csbmv, xerbla_n_invalid) | |||||
| { | |||||
| blasint n = INVALID, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Check if n - number of rows and columns of A equal zero. | |||||
| */ | |||||
| CTEST(csbmv, check_n_zero) | |||||
| { | |||||
| blasint n = 0, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = 1; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_csbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_b - | |||||
| * stride of vector b_test. Can't be zero. | |||||
| */ | |||||
| CTEST(csbmv, xerbla_inc_b_zero) | |||||
| { | |||||
| blasint n = 1, inc_b = 0, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_c - | |||||
| * stride of vector c_test. Can't be zero. | |||||
| */ | |||||
| CTEST(csbmv, xerbla_inc_c_zero) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 0; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 11; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param k - | |||||
| * number of super-diagonals of A. Must be at least zero. | |||||
| */ | |||||
| CTEST(csbmv, xerbla_k_invalid) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = INVALID; | |||||
| blasint lda = 1; | |||||
| int expected_info = 3; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of a. Must be at least (k+1). | |||||
| */ | |||||
| CTEST(csbmv, xerbla_lda_invalid) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = INVALID; | |||||
| int expected_info = 6; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,164 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CSCAL { | |||||
| float x_test[DATASIZE * 2 * INCREMENT]; | |||||
| float x_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CSCAL data_cscal; | |||||
| /** | |||||
| * cscal reference code | |||||
| * | |||||
| * param n - number of elements of vector x | |||||
| * param alpha - scaling factor for the vector product | |||||
| * param x - buffer holding input vector x | |||||
| * param inc - stride of vector x | |||||
| */ | |||||
| static void cscal_trusted(blasint n, float *alpha, float* x, blasint inc){ | |||||
| blasint i, ip = 0; | |||||
| blasint inc_x2 = 2 * inc; | |||||
| float temp; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| temp = alpha[0] * x[ip] - alpha[1] * x[ip+1]; | |||||
| x[ip+1] = alpha[0] * x[ip+1] + alpha[1] * x[ip]; | |||||
| x[ip] = temp; | |||||
| ip += inc_x2; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by cscal and cscal_trusted | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param n - number of elements of vector x | |||||
| * param alpha - scaling factor for the vector product | |||||
| * param inc - stride of vector x | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_cscal(char api, blasint n, float *alpha, blasint inc) | |||||
| { | |||||
| blasint i; | |||||
| // Fill vectors a | |||||
| srand_generate(data_cscal.x_test, n * inc * 2); | |||||
| // Copy vector x for cscal_trusted | |||||
| for (i = 0; i < n * 2 * inc; i++) | |||||
| data_cscal.x_verify[i] = data_cscal.x_test[i]; | |||||
| cscal_trusted(n, alpha, data_cscal.x_verify, inc); | |||||
| if(api == 'F') | |||||
| BLASFUNC(cscal)(&n, alpha, data_cscal.x_test, &inc); | |||||
| else | |||||
| cblas_cscal(n, alpha, data_cscal.x_test, inc); | |||||
| // Find the differences between output vector computed by cscal and cscal_trusted | |||||
| for (i = 0; i < n * 2 * inc; i++) | |||||
| data_cscal.x_verify[i] -= data_cscal.x_test[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(scnrm2)(&n, data_cscal.x_verify, &inc); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cscal by comparing it against reference | |||||
| */ | |||||
| CTEST(cscal, alpha_r_zero_alpha_i_not_zero) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 1; | |||||
| float alpha[2] = {0.0f, 1.0f}; | |||||
| float norm = check_cscal('F', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test cscal by comparing it against reference | |||||
| */ | |||||
| CTEST(cscal, alpha_r_zero_alpha_i_zero_inc_2) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 2; | |||||
| float alpha[2] = {0.0f, 0.0f}; | |||||
| float norm = check_cscal('F', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cscal by comparing it against reference | |||||
| */ | |||||
| CTEST(cscal, c_api_alpha_r_zero_alpha_i_not_zero) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 1; | |||||
| float alpha[2] = {0.0f, 1.0f}; | |||||
| float norm = check_cscal('C', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test cscal by comparing it against reference | |||||
| */ | |||||
| CTEST(cscal, c_api_alpha_r_zero_alpha_i_zero_inc_2) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 2; | |||||
| float alpha[2] = {0.0f, 0.0f}; | |||||
| float norm = check_cscal('C', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,428 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CSPMV { | |||||
| float a_verify[DATASIZE * DATASIZE * 2]; | |||||
| float a_test[DATASIZE * (DATASIZE + 1)]; | |||||
| float b_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_test[DATASIZE * 2 * INCREMENT]; | |||||
| float c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CSPMV data_cspmv; | |||||
| /** | |||||
| * Compute spmv via gemv since spmv is gemv for symmetric packed matrix | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param a - buffer holding input matrix A | |||||
| * param b - Buffer holding input vector b | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param c - buffer holding input/output vector c | |||||
| * param inc_c - stride of vector c | |||||
| * output param data_cspmv.c_verify - matrix computed by gemv | |||||
| */ | |||||
| static void cspmv_trusted(char uplo, blasint n, float *alpha, float *a, | |||||
| float *b, blasint inc_b, float *beta, float *c, | |||||
| blasint inc_c) | |||||
| { | |||||
| blasint k; | |||||
| blasint i, j; | |||||
| // param for gemv (can use any, since the input matrix is symmetric) | |||||
| char trans = 'N'; | |||||
| // Unpack the input symmetric packed matrix | |||||
| if (uplo == 'L') | |||||
| { | |||||
| k = 0; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| for (j = 0; j < n * 2; j += 2) | |||||
| { | |||||
| if (j / 2 < i) | |||||
| { | |||||
| data_cspmv.a_verify[i * n * 2 + j] = | |||||
| data_cspmv.a_verify[j * n + i * 2]; | |||||
| data_cspmv.a_verify[i * n * 2 + j + 1] = | |||||
| data_cspmv.a_verify[j * n + i * 2 + 1]; | |||||
| } | |||||
| else | |||||
| { | |||||
| data_cspmv.a_verify[i * n * 2 + j] = a[k++]; | |||||
| data_cspmv.a_verify[i * n * 2 + j + 1] = a[k++]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| k = n * (n + 1) - 1; | |||||
| for (j = 2 * n - 1; j >= 0; j -= 2) | |||||
| { | |||||
| for (i = n - 1; i >= 0; i--) | |||||
| { | |||||
| if (j / 2 < i) | |||||
| { | |||||
| data_cspmv.a_verify[i * n * 2 + j] = | |||||
| data_cspmv.a_verify[(j - 1) * n + i * 2 + 1]; | |||||
| data_cspmv.a_verify[i * n * 2 + j - 1] = | |||||
| data_cspmv.a_verify[(j - 1) * n + i * 2]; | |||||
| } | |||||
| else | |||||
| { | |||||
| data_cspmv.a_verify[i * n * 2 + j] = a[k--]; | |||||
| data_cspmv.a_verify[i * n * 2 + j - 1] = a[k--]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| // Run gemv with the unpacked matrix | |||||
| BLASFUNC(cgemv)(&trans, &n, &n, alpha, data_cspmv.a_verify, &n, b, | |||||
| &inc_b, beta, data_cspmv.c_verify, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by cspmv and cspmv_trusted | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param inc_c - stride of vector c | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_cspmv(char uplo, blasint n, float *alpha, blasint inc_b, | |||||
| float *beta, blasint inc_c) | |||||
| { | |||||
| blasint i; | |||||
| // Fill symmetric packed maxtix a, vectors b and c | |||||
| srand_generate(data_cspmv.a_test, n * (n + 1)); | |||||
| srand_generate(data_cspmv.b_test, 2 * n * inc_b); | |||||
| srand_generate(data_cspmv.c_test, 2 * n * inc_c); | |||||
| // Copy vector c for cspmv_trusted | |||||
| for (i = 0; i < n * 2 * inc_c; i++) | |||||
| data_cspmv.c_verify[i] = data_cspmv.c_test[i]; | |||||
| cspmv_trusted(uplo, n, alpha, data_cspmv.a_test, data_cspmv.b_test, | |||||
| inc_b, beta, data_cspmv.c_verify, inc_c); | |||||
| BLASFUNC(cspmv)(&uplo, &n, alpha, data_cspmv.a_test, data_cspmv.b_test, | |||||
| &inc_b, beta, data_cspmv.c_test, &inc_c); | |||||
| // Find the differences between output vector computed by cspmv and cspmv_trusted | |||||
| for (i = 0; i < n * 2 * inc_c; i++) | |||||
| data_cspmv.c_test[i] -= data_cspmv.c_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(scnrm2)(&n, data_cspmv.c_test, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param inc_b - stride of vector b | |||||
| * param inc_c - stride of vector c | |||||
| * param expected_info - expected invalid parameter number in cspmv | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char uplo, blasint n, blasint inc_b, | |||||
| blasint inc_c, int expected_info) | |||||
| { | |||||
| float alpha[] = {1.0, 1.0}; | |||||
| float beta[] = {0.0, 0.0}; | |||||
| set_xerbla("CSPMV ", expected_info); | |||||
| BLASFUNC(cspmv)(&uplo, &n, alpha, data_cspmv.a_test, data_cspmv.b_test, | |||||
| &inc_b, beta, data_cspmv.c_test, &inc_c); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cspmv, upper_inc_b_1_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(cspmv, upper_inc_b_1_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 2; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cspmv, upper_inc_b_2_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 0.0f}; | |||||
| float beta[] = {1.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(cspmv, upper_inc_b_2_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {2.5, -2.1}; | |||||
| float beta[] = {0.0f, 1.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cspmv, lower_inc_b_1_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(cspmv, lower_inc_b_1_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 2; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(cspmv, lower_inc_b_2_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {1.0f, 0.0f}; | |||||
| float beta[] = {1.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test cspmv by comparing it against cgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(cspmv, lower_inc_b_2_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| char uplo = 'L'; | |||||
| float alpha[] = {2.5, -2.1}; | |||||
| float beta[] = {0.0f, 1.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Check if output matrix A contains any NaNs | |||||
| */ | |||||
| CTEST(cspmv, check_for_NaN) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| float alpha[] = {1.0f, 1.0f}; | |||||
| float beta[] = {0.0f, 0.0f}; | |||||
| float norm = check_cspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_TRUE(norm == norm); /* NaN == NaN is false */ | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param uplo. | |||||
| * uplo specifies whether A is upper or lower triangular. | |||||
| */ | |||||
| CTEST(cspmv, xerbla_uplo_invalid) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'O'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param N - | |||||
| * number of rows and columns of A. Must be at least zero. | |||||
| */ | |||||
| CTEST(cspmv, xerbla_N_invalid) | |||||
| { | |||||
| blasint N = INVALID, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_b - | |||||
| * stride of vector b. Can't be zero. | |||||
| */ | |||||
| CTEST(cspmv, xerbla_inc_b_zero) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 0, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| int expected_info = 6; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_c - | |||||
| * stride of vector c. Can't be zero. | |||||
| */ | |||||
| CTEST(cspmv, xerbla_inc_c_zero) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 0; | |||||
| char uplo = 'U'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,266 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 300 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CTRMV { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float a_verify[DATASIZE * DATASIZE * 2]; | |||||
| float x_test[DATASIZE * INCREMENT * 2]; | |||||
| float x_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CTRMV data_ctrmv; | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * | |||||
| * param uplo specifies whether A is upper or lower triangular | |||||
| * param trans specifies op(A), the transposition (conjugation) operation applied to A | |||||
| * param diag specifies whether the matrix A is unit triangular or not. | |||||
| * param n - numbers of rows and columns of A | |||||
| * param lda - leading dimension of matrix A | |||||
| * param incx - increment for the elements of x | |||||
| * return norm of difference | |||||
| */ | |||||
| static float check_ctrmv(char uplo, char trans, char diag, blasint n, blasint lda, blasint incx) | |||||
| { | |||||
| blasint i; | |||||
| float alpha_conj[] = {1.0f, 0.0f}; | |||||
| char trans_verify = trans; | |||||
| srand_generate(data_ctrmv.a_test, n * lda * 2); | |||||
| srand_generate(data_ctrmv.x_test, n * incx * 2); | |||||
| for (i = 0; i < n * lda * 2; i++) | |||||
| data_ctrmv.a_verify[i] = data_ctrmv.a_test[i]; | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ctrmv.x_verify[i] = data_ctrmv.x_test[i]; | |||||
| if (trans == 'R'){ | |||||
| cblas_cimatcopy(CblasColMajor, CblasConjNoTrans, n, n, alpha_conj, data_ctrmv.a_verify, lda, lda); | |||||
| trans_verify = 'N'; | |||||
| } | |||||
| BLASFUNC(ctrmv)(&uplo, &trans_verify, &diag, &n, data_ctrmv.a_verify, &lda, | |||||
| data_ctrmv.x_verify, &incx); | |||||
| BLASFUNC(ctrmv)(&uplo, &trans, &diag, &n, data_ctrmv.a_test, &lda, | |||||
| data_ctrmv.x_test, &incx); | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ctrmv.x_verify[i] -= data_ctrmv.x_test[i]; | |||||
| return BLASFUNC(scnrm2)(&n, data_ctrmv.x_verify, &incx); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_upper_not_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_upper_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_lower_not_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_lower_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_upper_not_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_upper_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_lower_not_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrmv, conj_notrans_lower_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,267 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 300 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_CTRSV { | |||||
| float a_test[DATASIZE * DATASIZE * 2]; | |||||
| float a_verify[DATASIZE * DATASIZE * 2]; | |||||
| float x_test[DATASIZE * INCREMENT * 2]; | |||||
| float x_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX | |||||
| static struct DATA_CTRSV data_ctrsv; | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * | |||||
| * param uplo specifies whether A is upper or lower triangular | |||||
| * param trans specifies op(A), the transposition (conjugation) operation applied to A | |||||
| * param diag specifies whether the matrix A is unit triangular or not. | |||||
| * param n - numbers of rows and columns of A | |||||
| * param lda - leading dimension of matrix A | |||||
| * param incx - increment for the elements of x | |||||
| * return norm of difference | |||||
| */ | |||||
| static float check_ctrsv(char uplo, char trans, char diag, blasint n, blasint lda, blasint incx) | |||||
| { | |||||
| blasint i; | |||||
| float alpha_conj[] = {1.0f, 0.0f}; | |||||
| char trans_verify = trans; | |||||
| srand_generate(data_ctrsv.a_test, n * lda * 2); | |||||
| srand_generate(data_ctrsv.x_test, n * incx * 2); | |||||
| for (i = 0; i < n * lda * 2; i++) | |||||
| data_ctrsv.a_verify[i] = data_ctrsv.a_test[i]; | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ctrsv.x_verify[i] = data_ctrsv.x_test[i]; | |||||
| if (trans == 'R'){ | |||||
| cblas_cimatcopy(CblasColMajor, CblasConjNoTrans, n, n, | |||||
| alpha_conj, data_ctrsv.a_verify, lda, lda); | |||||
| trans_verify = 'N'; | |||||
| } | |||||
| BLASFUNC(ctrsv)(&uplo, &trans_verify, &diag, &n, data_ctrsv.a_verify, | |||||
| &lda, data_ctrsv.x_verify, &incx); | |||||
| BLASFUNC(ctrsv)(&uplo, &trans, &diag, &n, data_ctrsv.a_test, &lda, | |||||
| data_ctrsv.x_test, &incx); | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ctrsv.x_verify[i] -= data_ctrsv.x_test[i]; | |||||
| return BLASFUNC(scnrm2)(&n, data_ctrsv.x_verify, &incx); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_upper_not_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_upper_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_lower_not_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_lower_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_upper_not_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_upper_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_lower_not_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ctrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ctrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ctrsv, conj_notrans_lower_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| float norm = check_ctrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,354 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 70 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_DOUBLE | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(x[0], amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.1}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.1, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, 1.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.1, 1.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 3.3}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2, -3.3}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 3.3, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0, -3.3, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 3.3, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2, -3.3, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 3.3, 0.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0, -3.3, 0.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, positive_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 1.0; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test damin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(damin, negative_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0; | |||||
| double amin = BLASFUNC(damin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,799 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_DAXPBY{ | |||||
| double x_test[DATASIZE * INCREMENT]; | |||||
| double x_verify[DATASIZE * INCREMENT]; | |||||
| double y_test[DATASIZE * INCREMENT]; | |||||
| double y_verify[DATASIZE * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_DOUBLE | |||||
| static struct DATA_DAXPBY data_daxpby; | |||||
| /** | |||||
| * Fortran API specific function | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static double check_daxpby(blasint n, double alpha, blasint incx, double beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // dscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Fill vectors x, y | |||||
| drand_generate(data_daxpby.x_test, n * incx_abs); | |||||
| drand_generate(data_daxpby.y_test, n * incy_abs); | |||||
| // Copy vector x for daxpy | |||||
| for (i = 0; i < n * incx_abs; i++) | |||||
| data_daxpby.x_verify[i] = data_daxpby.x_test[i]; | |||||
| // Copy vector y for dscal | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_daxpby.y_verify[i] = data_daxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| BLASFUNC(dscal)(&n, &beta, data_daxpby.y_verify, &incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| BLASFUNC(daxpy)(&n, &alpha, data_daxpby.x_verify, &incx, | |||||
| data_daxpby.y_verify, &incy); | |||||
| BLASFUNC(daxpby)(&n, &alpha, data_daxpby.x_test, &incx, | |||||
| &beta, data_daxpby.y_test, &incy); | |||||
| // Find the differences between output vector caculated by daxpby and daxpy | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_daxpby.y_test[i] -= data_daxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(dnrm2)(&n, data_daxpby.y_test, &incy_abs); | |||||
| } | |||||
| /** | |||||
| * C API specific function | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static double c_api_check_daxpby(blasint n, double alpha, blasint incx, double beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // dscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Copy vector x for daxpy | |||||
| for (i = 0; i < n * incx_abs; i++) | |||||
| data_daxpby.x_verify[i] = data_daxpby.x_test[i]; | |||||
| // Copy vector y for dscal | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_daxpby.y_verify[i] = data_daxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| cblas_dscal(n, beta, data_daxpby.y_verify, incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| cblas_daxpy(n, alpha, data_daxpby.x_verify, incx, | |||||
| data_daxpby.y_verify, incy); | |||||
| cblas_daxpby(n, alpha, data_daxpby.x_test, incx, | |||||
| beta, data_daxpby.y_test, incy); | |||||
| // Find the differences between output vector caculated by daxpby and daxpy | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_daxpby.y_test[i] -= data_daxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return cblas_dnrm2(n, data_daxpby.y_test, incy_abs); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha = 2.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 1.0; | |||||
| double beta = 2.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha = 3.0; | |||||
| double beta = 4.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| double alpha = 5.0; | |||||
| double beta = 4.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| double alpha = 1.0; | |||||
| double beta = 6.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(daxpby, inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| double alpha = 7.0; | |||||
| double beta = 3.5; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 0.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_2_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 0.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_2_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_2_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_1_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 0.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 0.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(daxpby, check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha = 2.0; | |||||
| double beta = 1.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 1.0; | |||||
| double beta = 2.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha = 3.0; | |||||
| double beta = 4.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| double alpha = 5.0; | |||||
| double beta = 4.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| double alpha = 1.0; | |||||
| double beta = 6.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| double alpha = 7.0; | |||||
| double beta = 3.5; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 0.0; | |||||
| double beta = 1.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_2_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 0.0; | |||||
| double beta = 1.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_2_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_2_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha = 1.0; | |||||
| double beta = 0.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha = 0.0; | |||||
| double beta = 0.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test daxpby by comparing it with dscal and daxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha = 0.0; | |||||
| double beta = 0.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(daxpby, c_api_check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = c_api_check_daxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,878 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define N 100 | |||||
| #define M 100 | |||||
| struct DATA_DGEADD{ | |||||
| double a_test[M * N]; | |||||
| double c_test[M * N]; | |||||
| double c_verify[M * N]; | |||||
| }; | |||||
| #ifdef BUILD_DOUBLE | |||||
| static struct DATA_DGEADD data_dgeadd; | |||||
| /** | |||||
| * dgeadd reference implementation | |||||
| * | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param aptr - refer to matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param cptr - refer to matrix C | |||||
| * param ldc - leading dimension of C | |||||
| */ | |||||
| static void dgeadd_trusted(blasint m, blasint n, double alpha, double *aptr, | |||||
| blasint lda, double beta, double *cptr, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| cblas_daxpby(m, alpha, aptr, 1, beta, cptr, 1); | |||||
| aptr += lda; | |||||
| cptr += ldc; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Test dgeadd by comparing it against reference | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param ldc - leading dimension of C | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_dgeadd(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, double alpha, blasint lda, | |||||
| double beta, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| blasint cols = m, rows = n; | |||||
| if (order == CblasRowMajor) | |||||
| { | |||||
| rows = m; | |||||
| cols = n; | |||||
| } | |||||
| // Fill matrix A, C | |||||
| drand_generate(data_dgeadd.a_test, lda * rows); | |||||
| drand_generate(data_dgeadd.c_test, ldc * rows); | |||||
| // Copy matrix C for dgeadd | |||||
| for (i = 0; i < ldc * rows; i++) | |||||
| data_dgeadd.c_verify[i] = data_dgeadd.c_test[i]; | |||||
| dgeadd_trusted(cols, rows, alpha, data_dgeadd.a_test, lda, | |||||
| beta, data_dgeadd.c_verify, ldc); | |||||
| if (api == 'F') | |||||
| BLASFUNC(dgeadd)(&m, &n, &alpha, data_dgeadd.a_test, &lda, | |||||
| &beta, data_dgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_dgeadd(order, m, n, alpha, data_dgeadd.a_test, lda, | |||||
| beta, data_dgeadd.c_test, ldc); | |||||
| // Find the differences between output matrix caculated by dgeadd and sgemm | |||||
| return dmatrix_difference(data_dgeadd.c_test, data_dgeadd.c_verify, cols, rows, ldc); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param lda - leading dimension of A | |||||
| * param ldc - leading dimension of C | |||||
| * param expected_info - expected invalid parameter number in dgeadd | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, blasint lda, | |||||
| blasint ldc, int expected_info) | |||||
| { | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| set_xerbla("DGEADD ", expected_info); | |||||
| if (api == 'F') | |||||
| BLASFUNC(dgeadd)(&m, &n, &alpha, data_dgeadd.a_test, &lda, | |||||
| &beta, data_dgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_dgeadd(order, m, n, alpha, data_dgeadd.a_test, lda, | |||||
| beta, data_dgeadd.c_test, ldc); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(dgeadd, matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 3.0; | |||||
| double beta = 3.0; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(dgeadd, matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 0.0; | |||||
| double beta = 2.5; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(dgeadd, matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 3.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(dgeadd, matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 0.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(dgeadd, matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(dgeadd, xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(dgeadd, xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(dgeadd, xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(dgeadd, xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| */ | |||||
| CTEST(dgeadd, n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| */ | |||||
| CTEST(dgeadd, m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 2.0; | |||||
| double beta = 3.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_100_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 4.0; | |||||
| double beta = 2.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_50_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N / 2; | |||||
| blasint m = M; | |||||
| blasint lda = n; | |||||
| blasint ldc = n; | |||||
| double alpha = 3.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 0.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 3.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 0.0; | |||||
| double beta = 0.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(dgeadd, c_api_matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha = 3.0; | |||||
| double beta = 4.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param order - | |||||
| * specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_invalid_order) | |||||
| { | |||||
| CBLAS_ORDER order = INVALID; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 0; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_n_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_m_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_lda_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_xerbla_ldc_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(dgeadd, c_api_m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha = 1.0; | |||||
| double beta = 1.0; | |||||
| double norm = check_dgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,915 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_DIMATCOPY { | |||||
| double a_test[DATASIZE* DATASIZE]; | |||||
| double a_verify[DATASIZE* DATASIZE]; | |||||
| }; | |||||
| #ifdef BUILD_DOUBLE | |||||
| static struct DATA_DIMATCOPY data_dimatcopy; | |||||
| /** | |||||
| * Comapare results computed by dimatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param alpha specifies scaling factor for matrix A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static double check_dimatcopy(char api, char order, char trans, blasint rows, blasint cols, double alpha, | |||||
| blasint lda_src, blasint lda_dst) | |||||
| { | |||||
| blasint m, n; | |||||
| blasint rows_out, cols_out; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| if (order == 'C') { | |||||
| n = rows; m = cols; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| rows_out = n; cols_out = m; | |||||
| } | |||||
| else { | |||||
| rows_out = m; cols_out = n; | |||||
| } | |||||
| drand_generate(data_dimatcopy.a_test, lda_src*m); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| dtranspose(m, n, alpha, data_dimatcopy.a_test, lda_src, data_dimatcopy.a_verify, lda_dst); | |||||
| } | |||||
| else { | |||||
| dcopy(m, n, alpha, data_dimatcopy.a_test, lda_src, data_dimatcopy.a_verify, lda_dst); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(dimatcopy)(&order, &trans, &rows, &cols, &alpha, data_dimatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_dimatcopy(corder, ctrans, rows, cols, alpha, data_dimatcopy.a_test, | |||||
| lda_src, lda_dst); | |||||
| } | |||||
| // Find the differences between output matrix computed by dimatcopy and reference func | |||||
| return dmatrix_difference(data_dimatcopy.a_test, data_dimatcopy.a_verify, cols_out, rows_out, lda_dst); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda_src, blasint lda_dst, int expected_info) | |||||
| { | |||||
| double alpha = 1.0; | |||||
| set_xerbla("DIMATCOPY", expected_info); | |||||
| BLASFUNC(dimatcopy)(&order, &trans, &rows, &cols, &alpha, data_dimatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_trans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_notrans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_trans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_notrans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_trans_col_50_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_notrans_col_50_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_trans_col_50_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_notrans_col_50_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_trans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_notrans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_trans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_notrans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_trans_col_100_row_50_alpha_one) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_notrans_col_100_row_50_alpha_one) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_trans_col_100_row_50_alpha_zero) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_notrans_col_100_row_50_alpha_zero) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, rowmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, c_api_colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, c_api_colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, c_api_rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(dimatcopy, c_api_rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_dimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda_src must be at least n. | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda_src must be at least m. | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(dimatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,640 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_DOMATCOPY { | |||||
| double a_test[DATASIZE * DATASIZE]; | |||||
| double b_test[DATASIZE * DATASIZE]; | |||||
| double b_verify[DATASIZE * DATASIZE]; | |||||
| }; | |||||
| #ifdef BUILD_DOUBLE | |||||
| static struct DATA_DOMATCOPY data_domatcopy; | |||||
| /** | |||||
| * Comapare results computed by domatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param alpha - scaling factor for matrix B | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static double check_domatcopy(char api, char order, char trans, blasint rows, blasint cols, double alpha, | |||||
| blasint lda, blasint ldb) | |||||
| { | |||||
| blasint b_rows, b_cols; | |||||
| blasint m, n; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| if (order == 'C') { | |||||
| m = cols; n = rows; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| b_rows = n; b_cols = m; | |||||
| } | |||||
| else { | |||||
| b_rows = m; b_cols = n; | |||||
| } | |||||
| drand_generate(data_domatcopy.a_test, lda*m); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| dtranspose(m, n, alpha, data_domatcopy.a_test, lda, data_domatcopy.b_verify, ldb); | |||||
| } | |||||
| else { | |||||
| dcopy(m, n, alpha, data_domatcopy.a_test, lda, data_domatcopy.b_verify, ldb); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(domatcopy)(&order, &trans, &rows, &cols, &alpha, data_domatcopy.a_test, | |||||
| &lda, data_domatcopy.b_test, &ldb); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_domatcopy(corder, ctrans, rows, cols, alpha, data_domatcopy.a_test, | |||||
| lda, data_domatcopy.b_test, ldb); | |||||
| } | |||||
| return dmatrix_difference(data_domatcopy.b_test, data_domatcopy.b_verify, b_cols, b_rows, ldb); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda, blasint ldb, int expected_info) | |||||
| { | |||||
| double alpha = 1.0; | |||||
| set_xerbla("DOMATCOPY", expected_info); | |||||
| BLASFUNC(domatcopy)(&order, &trans, &rows, &cols, &alpha, data_domatcopy.a_test, | |||||
| &lda, data_domatcopy.b_test, &ldb); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(domatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(domatcopy, colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(domatcopy, colmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(domatcopy, colmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(domatcopy, rowmajor_conjtrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| double alpha = 2.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(domatcopy, rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 2.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Matrix dimensions leave residues from 4 and 2 (specialize | |||||
| * for rt case) | |||||
| * alpha = 1.5 | |||||
| */ | |||||
| CTEST(domatcopy, rowmajor_trans_col_27_row_27) | |||||
| { | |||||
| blasint m = 27, n = 27; | |||||
| blasint lda = 27, ldb = 27; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.5; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(domatcopy, rowmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 0.0; | |||||
| double norm = check_domatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, c_api_colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, c_api_colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, c_api_rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test domatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(domatcopy, c_api_rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha = 1.0; | |||||
| double norm = check_domatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda must be at least n. | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda must be at least m. | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(domatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,414 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #ifdef BUILD_DOUBLE | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, y1_zero) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0; | |||||
| te_d2 = tr_d2 = 2.0; | |||||
| te_x1 = tr_x1 = 8.0; | |||||
| te_y1 = tr_y1 = 0.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0; | |||||
| tr_d2 = 2.0; | |||||
| tr_x1 = 8.0; | |||||
| tr_y1 = 0.0; | |||||
| tr_param[0] = -2.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, d1_negative) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = -1.0; | |||||
| te_d2 = tr_d2 = 2.0; | |||||
| te_x1 = tr_x1 = 8.0; | |||||
| te_y1 = tr_y1 = 8.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0; | |||||
| tr_d2 = 0.0; | |||||
| tr_x1 = 0.0; | |||||
| tr_y1 = 8.0; | |||||
| tr_param[0] = -1.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, d1_positive_d2_positive_x1_zero) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0; | |||||
| te_d2 = tr_d2 = 2.0; | |||||
| te_x1 = tr_x1 = 0.0; | |||||
| te_y1 = tr_y1 = 8.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0; | |||||
| tr_d2 = 2.0; | |||||
| tr_x1 = 8.0; | |||||
| tr_y1 = 8.0; | |||||
| tr_param[0] = 1.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, scaled_y_greater_than_scaled_x) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 1.0; | |||||
| te_d2 = tr_d2 = -2.0; | |||||
| te_x1 = tr_x1 = 8.0; | |||||
| te_y1 = tr_y1 = 8.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0; | |||||
| tr_d2 = 0.0; | |||||
| tr_x1 = 0.0; | |||||
| tr_y1 = 8.0; | |||||
| tr_param[0] = -1.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| BLASFUNC(drotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, c_api_y1_zero) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0; | |||||
| te_d2 = tr_d2 = 2.0; | |||||
| te_x1 = tr_x1 = 8.0; | |||||
| te_y1 = tr_y1 = 0.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0; | |||||
| tr_d2 = 2.0; | |||||
| tr_x1 = 8.0; | |||||
| tr_y1 = 0.0; | |||||
| tr_param[0] = -2.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| cblas_drotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, c_api_d1_negative) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = -1.0; | |||||
| te_d2 = tr_d2 = 2.0; | |||||
| te_x1 = tr_x1 = 8.0; | |||||
| te_y1 = tr_y1 = 8.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0; | |||||
| tr_d2 = 0.0; | |||||
| tr_x1 = 0.0; | |||||
| tr_y1 = 8.0; | |||||
| tr_param[0] = -1.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| cblas_drotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, c_api_d1_positive_d2_positive_x1_zero) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0; | |||||
| te_d2 = tr_d2 = 2.0; | |||||
| te_x1 = tr_x1 = 0.0; | |||||
| te_y1 = tr_y1 = 8.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0; | |||||
| tr_d2 = 2.0; | |||||
| tr_x1 = 8.0; | |||||
| tr_y1 = 8.0; | |||||
| tr_param[0] = 1.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| cblas_drotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test drotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(drotmg, c_api_scaled_y_greater_than_scaled_x) | |||||
| { | |||||
| double te_d1, tr_d1; | |||||
| double te_d2, tr_d2; | |||||
| double te_x1, tr_x1; | |||||
| double te_y1, tr_y1; | |||||
| double te_param[5]; | |||||
| double tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 1.0; | |||||
| te_d2 = tr_d2 = -2.0; | |||||
| te_x1 = tr_x1 = 8.0; | |||||
| te_y1 = tr_y1 = 8.0; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0; | |||||
| tr_d2 = 0.0; | |||||
| tr_x1 = 0.0; | |||||
| tr_y1 = 8.0; | |||||
| tr_param[0] = -1.0; | |||||
| tr_param[1] = 0.0; | |||||
| tr_param[2] = 0.0; | |||||
| tr_param[3] = 0.0; | |||||
| tr_param[4] = 0.0; | |||||
| //OpenBLAS | |||||
| cblas_drotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, DOUBLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], DOUBLE_EPS); | |||||
| } | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,403 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_DOUBLE | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, -1.0}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, -1.5, 1.0, 1.0}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.3, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, -1.0, -3.0, 2.2, 3.0}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, -2.2, 3.3}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.2, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 2.0, 2.2, 2.7, -3.3, -5.9}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {0.0, 1.0, 2.2, 3.3, 0.0}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {0.0, 3.0, 1.0, -2.2, 2.2, -1.7, 3.3, 14.5, 0.0, -9.0}; | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = BLASFUNC(dsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(50.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, -1.0}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, -1.5, 1.0, 1.0}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.3, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, -1.0, -3.0, 2.2, 3.0}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, -2.2, 3.3}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.2, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 2.0, 2.2, 2.7, -3.3, -5.9}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {0.0, 1.0, 2.2, 3.3, 0.0}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {0.0, 3.0, 1.0, -2.2, 2.2, -1.7, 3.3, 14.5, 0.0, -9.0}; | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dsum, c_api_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = cblas_dsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(50.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,293 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 70 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS * 2, inc = 0; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL((x[0] + x[1]), amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.0, 2.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.0, -2.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -3.0, -1.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 3.0, 1.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -3.0, -1.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0, -2.0, -2.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0, -2.0, -2.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0; | |||||
| x[7 * inc * 2 + 1] = 1000.0; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = -i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0; | |||||
| x[7 * inc * 2 + 1] = 1000.0; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, positive_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0; | |||||
| x[7 * inc * 2 + 1] = 1000.0; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamax, negative_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = -i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0; | |||||
| x[7 * inc * 2 + 1] = 1000.0; | |||||
| double amax = BLASFUNC(dzamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0, amax, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,310 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 70 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS * 2, inc = 0; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL((x[0] + x[1]), amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.0, 2.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.0, -2.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0, -2.0, -2.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0, -2.0, -2.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, positive_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test dzamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzamin, negative_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| double amin = BLASFUNC(dzamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, amin, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,403 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1, -1.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0, 2.3, -1.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, -1.0, 2.3, -1.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.4, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, -1.5, 1.1, -1.0, 1.0, 1.0, 1.1, -1.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.6, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 1.1, -1.0, 0.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.4, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, -1.0, 0.0, -1.0, -3.0, -1.0, 0.0, 2.2, 3.0, -1.0, 0.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, -2.2, 3.3, 1.1, 1.0, -2.2, 3.3}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.4, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.1, 1.0, 1.0, 2.0, 1.1, 1.0, 2.2, 2.7, 1.1, 1.0, -3.3, -5.9}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(-0.2, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {0.0, 1.0, 2.2, 3.3, 0.0, 0.0, 1.0, 2.2, 3.3, 0.0}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(13.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {0.0, 3.0, 1.0, 2.2, 1.0, -2.2, 1.0, 2.2, 2.2, -1.7, 1.0, 2.2, 3.3, 14.5, 1.0, 2.2, 0.0, -9.0, 1.0, 2.2}; | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(11.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = BLASFUNC(dzsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1, -1.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0, 2.3, -1.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, -1.0, 2.3, -1.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.4, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, -1.5, 1.1, -1.0, 1.0, 1.0, 1.1, -1.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.6, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 1.1, -1.0, 0.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.4, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, -1.0, 0.0, -1.0, -3.0, -1.0, 0.0, 2.2, 3.0, -1.0, 0.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, -2.2, 3.3, 1.1, 1.0, -2.2, 3.3}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.4, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.1, 1.0, 1.0, 2.0, 1.1, 1.0, 2.2, 2.7, 1.1, 1.0, -3.3, -5.9}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(-0.2, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {0.0, 1.0, 2.2, 3.3, 0.0, 0.0, 1.0, 2.2, 3.3, 0.0}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(13.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {0.0, 3.0, 1.0, 2.2, 1.0, -2.2, 1.0, 2.2, 2.2, -1.7, 1.0, 2.2, 3.3, 14.5, 1.0, 2.2, 0.0, -9.0, 1.0, 2.2}; | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(11.1, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test dzsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(dzsum, c_api_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0 : 1.0; | |||||
| } | |||||
| double sum = cblas_dzsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sum, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,625 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * 2; i ++) { | |||||
| x[i] = i - 1000; | |||||
| } | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.0f, 2.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f, -2.0f, -2.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f, -2.0f, -2.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc * 2] = 0.0f; | |||||
| x[(N - 1) * inc * 2 + 1] = 0.0f; | |||||
| blasint index = BLASFUNC(icamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(N, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * 2; i ++) { | |||||
| x[i] = i - 1000; | |||||
| } | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.0f, 2.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f, -2.0f, -2.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f, -2.0f, -2.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test icamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(icamin, c_api_min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc * 2] = 0.0f; | |||||
| x[(N - 1) * inc * 2 + 1] = 0.0f; | |||||
| blasint index = cblas_icamin(N, x, inc); | |||||
| ASSERT_EQUAL(N - 1, index); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,787 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_DOUBLE | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.1}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.1, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, 1.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.1, 1.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 3.3}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2, -3.3}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 3.3, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0, -3.3, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 3.3, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2, -3.3, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 3.3, 0.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0, -3.3, 0.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(N, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, min_idx_in_vec_tail_inc_1){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * inc]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0f; | |||||
| blasint index = BLASFUNC(idamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(N, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.1}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.1}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.1, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.1, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.1, 1.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.1, 1.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 3.3}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2, -3.3}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 3.3, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0, -3.3, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {1.1, 1.0, 2.2, 3.3, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| double x[] = {-1.1, 1.0, -2.2, -3.3, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 3.3, 0.0, 0.0, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| double x[] = {-1.1, 0.0, 1.0, 0.0, -2.2, 0.0, -3.3, 0.0, 0.0, 0.0}; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(N - 1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test idamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(idamin, c_api_min_idx_in_vec_tail_inc_1){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * inc]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0; | |||||
| blasint index = cblas_idamin(N, x, inc); | |||||
| ASSERT_EQUAL(N - 1, index); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,787 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_SINGLE | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.1f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, 1.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 3.3f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f, -3.3f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f, 3.3f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f, -3.3f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f, -3.3f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f, 3.3f, 0.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f, -3.3f, 0.0f, 0.0f, 0.0f}; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(5, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(9, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(N, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, min_idx_in_vec_tail_inc_1){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * inc]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0f; | |||||
| blasint index = BLASFUNC(isamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(N, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.1f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, 1.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 3.3f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f, -3.3f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f, 3.3f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f, -3.3f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f, -3.3f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f, 3.3f, 0.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f, -3.3f, 0.0f, 0.0f, 0.0f}; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(4, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(N - 1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test isamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(isamin, c_api_min_idx_in_vec_tail_inc_1){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * inc]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc] = 0.0f; | |||||
| blasint index = cblas_isamin(N, x, inc); | |||||
| ASSERT_EQUAL(N - 1, index); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,625 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * 2; i ++) { | |||||
| x[i] = i - 1000; | |||||
| } | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.0, 2.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.0, -2.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0, -2.0, -2.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0, -2.0, -2.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(2, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(8, index); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc * 2] = 0.0; | |||||
| x[(N - 1) * inc * 2 + 1] = 0.0; | |||||
| blasint index = BLASFUNC(izamin)(&N, x, &inc); | |||||
| ASSERT_EQUAL(N, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * 2; i ++) { | |||||
| x[i] = i - 1000; | |||||
| } | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {1.0, 2.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| double x[] = {-1.0, -2.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(0, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 2.0, 1.0, -2.0, -2.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -2.0, -1.0, -2.0, -2.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| double x[] = {-1.0, -2.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -2.0, -1.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0}; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(1, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| double x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_positive_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_negative_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0; | |||||
| x[7 * inc * 2 + 1] = 0.0; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(7, index); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test izamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(izamin, c_api_min_idx_in_vec_tail){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| double x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[(N - 1) * inc * 2] = 0.0; | |||||
| x[(N - 1) * inc * 2 + 1] = 0.0; | |||||
| blasint index = cblas_izamin(N, x, inc); | |||||
| ASSERT_EQUAL(N - 1, index); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,354 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 70 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_SINGLE | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(x[0], amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.1f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, 1.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 3.3f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f, -3.3f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f, 3.3f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f, -3.3f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {-1.1f, 1.0f, -2.2f, -3.3f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 0.0f, 2.2f, 0.0f, 3.3f, 0.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {-1.1f, 0.0f, 1.0f, 0.0f, -2.2f, 0.0f, -3.3f, 0.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 0.0f; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0f; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, positive_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8 * inc] = 1.0f; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test samin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(samin, negative_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[8 * inc] = -1.0f; | |||||
| float amin = BLASFUNC(samin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,794 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_SAXPBY { | |||||
| float x_test[DATASIZE * INCREMENT]; | |||||
| float x_verify[DATASIZE * INCREMENT]; | |||||
| float y_test[DATASIZE * INCREMENT]; | |||||
| float y_verify[DATASIZE * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_SINGLE | |||||
| static struct DATA_SAXPBY data_saxpby; | |||||
| /** | |||||
| * Fortran API specific function | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static float check_saxpby(blasint n, float alpha, blasint incx, float beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // sscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Fill vectors x, y | |||||
| srand_generate(data_saxpby.x_test, n * incx_abs); | |||||
| srand_generate(data_saxpby.y_test, n * incy_abs); | |||||
| // Copy vector x for saxpy | |||||
| for (i = 0; i < n * incx_abs; i++) | |||||
| data_saxpby.x_verify[i] = data_saxpby.x_test[i]; | |||||
| // Copy vector y for sscal | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_saxpby.y_verify[i] = data_saxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| BLASFUNC(sscal)(&n, &beta, data_saxpby.y_verify, &incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| BLASFUNC(saxpy)(&n, &alpha, data_saxpby.x_verify, &incx, | |||||
| data_saxpby.y_verify, &incy); | |||||
| BLASFUNC(saxpby)(&n, &alpha, data_saxpby.x_test, &incx, | |||||
| &beta, data_saxpby.y_test, &incy); | |||||
| // Find the differences between output vector caculated by saxpby and saxpy | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_saxpby.y_test[i] -= data_saxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(snrm2)(&n, data_saxpby.y_test, &incy_abs); | |||||
| } | |||||
| /** | |||||
| * C API specific function | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static float c_api_check_saxpby(blasint n, float alpha, blasint incx, float beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // sscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Copy vector x for saxpy | |||||
| for (i = 0; i < n * incx_abs; i++) | |||||
| data_saxpby.x_verify[i] = data_saxpby.x_test[i]; | |||||
| // Copy vector y for sscal | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_saxpby.y_verify[i] = data_saxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| cblas_sscal(n, beta, data_saxpby.y_verify, incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| cblas_saxpy(n, alpha, data_saxpby.x_verify, incx, | |||||
| data_saxpby.y_verify, incy); | |||||
| cblas_saxpby(n, alpha, data_saxpby.x_test, incx, | |||||
| beta, data_saxpby.y_test, incy); | |||||
| // Find the differences between output vector caculated by saxpby and saxpy | |||||
| for (i = 0; i < n * incy_abs; i++) | |||||
| data_saxpby.y_test[i] -= data_saxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return cblas_snrm2(n, data_saxpby.y_test, incy_abs); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha = 2.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 1.0f; | |||||
| float beta = 2.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha = 3.0f; | |||||
| float beta = 4.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| float alpha = 5.0f; | |||||
| float beta = 4.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 6.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(saxpby, inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| float alpha = 7.0f; | |||||
| float beta = 3.5f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 0.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_2_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 0.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_2_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_2_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_1_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 0.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 0.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(saxpby, check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha = 2.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 1.0f; | |||||
| float beta = 2.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha = 3.0f; | |||||
| float beta = 4.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| float alpha = 5.0f; | |||||
| float beta = 4.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 6.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| float alpha = 7.0f; | |||||
| float beta = 3.5f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 0.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_2_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 0.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_2_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_2_inc_y_2_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| float alpha = 1.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| float alpha = 0.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test saxpby by comparing it with sscal and saxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| float alpha = 0.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(saxpby, c_api_check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = c_api_check_saxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,293 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 70 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS * 2, inc = 0; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL((x[0] + x[1]), amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.0f, 2.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -3.0f, -1.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 3.0f, 1.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -3.0f, -1.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f, -2.0f, -2.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f, -2.0f, -2.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0f; | |||||
| x[7 * inc * 2 + 1] = 1000.0f; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = -i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0f; | |||||
| x[7 * inc * 2 + 1] = 1000.0f; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, positive_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0f; | |||||
| x[7 * inc * 2 + 1] = 1000.0f; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamax by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamax, negative_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = -i; | |||||
| } | |||||
| x[7 * inc * 2] = 1000.0f; | |||||
| x[7 * inc * 2 + 1] = 1000.0f; | |||||
| float amax = BLASFUNC(scamax)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2000.0f, amax, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,310 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 70 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS * 2, inc = 0; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL((x[0] + x[1]), amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.0f, 2.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 2.0f, 1.0f, -2.0f, -2.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -2.0f, -1.0f, -2.0f, -2.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.0f, 2.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {-1.0f, -2.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -2.0f, -1.0f, 0.0f, 0.0f, -2.0f, -2.0f, 0.0f, 0.0f}; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_1_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, positive_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test scamin by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scamin, negative_step_2_N_70){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = - i - 1000; | |||||
| } | |||||
| x[7 * inc * 2] = 0.0f; | |||||
| x[7 * inc * 2 + 1] = 0.0f; | |||||
| float amin = BLASFUNC(scamin)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, amin, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,403 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_COMPLEX | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f, -1.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 2.3f, -1.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, -1.0f, 2.3f, -1.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.4f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, -1.5f, 1.1f, -1.0f, 1.0f, 1.0f, 1.1f, -1.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.6f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 1.1f, -1.0f, 0.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.4f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, -1.0f, 0.0f, -1.0f, -3.0f, -1.0f, 0.0f, 2.2f, 3.0f, -1.0f, 0.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, -2.2f, 3.3f, 1.1f, 1.0f, -2.2f, 3.3f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.4f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.1f, 1.0f, 1.0f, 2.0f, 1.1f, 1.0f, 2.2f, 2.7f, 1.1f, 1.0f, -3.3f, -5.9f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(-0.2f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {0.0f, 1.0f, 2.2f, 3.3f, 0.0f, 0.0f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(13.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {0.0f, 3.0f, 1.0f, 2.2f, 1.0f, -2.2f, 1.0f, 2.2f, 2.2f, -1.7f, 1.0f, 2.2f, 3.3f, 14.5f, 1.0f, 2.2f, 0.0f, -9.0f, 1.0f, 2.2f}; | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(11.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = BLASFUNC(scsum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < ELEMENTS * inc * 2; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f, -1.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 2.3f, -1.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, -1.0f, 2.3f, -1.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.4f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, -1.5f, 1.1f, -1.0f, 1.0f, 1.0f, 1.1f, -1.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.6f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f, 1.1f, -1.0f, 0.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.4f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, -1.0f, 0.0f, -1.0f, -3.0f, -1.0f, 0.0f, 2.2f, 3.0f, -1.0f, 0.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, -2.2f, 3.3f, 1.1f, 1.0f, -2.2f, 3.3f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.4f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.1f, 1.0f, 1.0f, 2.0f, 1.1f, 1.0f, 2.2f, 2.7f, 1.1f, 1.0f, -3.3f, -5.9f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(-0.2f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {0.0f, 1.0f, 2.2f, 3.3f, 0.0f, 0.0f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(13.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {0.0f, 3.0f, 1.0f, 2.2f, 1.0f, -2.2f, 1.0f, 2.2f, 2.2f, -1.7f, 1.0f, 2.2f, 3.3f, 14.5f, 1.0f, 2.2f, 0.0f, -9.0f, 1.0f, 2.2f}; | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(11.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test scsum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(scsum, c_api_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT * 2]; | |||||
| for (i = 0; i < N * inc * 2; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = cblas_scsum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,880 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define N 100 | |||||
| #define M 100 | |||||
| struct DATA_SGEADD | |||||
| { | |||||
| float a_test[M * N]; | |||||
| float c_test[M * N]; | |||||
| float c_verify[M * N]; | |||||
| }; | |||||
| #ifdef BUILD_SINGLE | |||||
| static struct DATA_SGEADD data_sgeadd; | |||||
| /** | |||||
| * sgeadd reference implementation | |||||
| * | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param aptr - refer to matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param cptr - refer to matrix C | |||||
| * param ldc - leading dimension of C | |||||
| */ | |||||
| static void sgeadd_trusted(blasint m, blasint n, float alpha, float *aptr, | |||||
| blasint lda, float beta, float *cptr, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| cblas_saxpby(m, alpha, aptr, 1, beta, cptr, 1); | |||||
| aptr += lda; | |||||
| cptr += ldc; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Test sgeadd by comparing it against reference | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param ldc - leading dimension of C | |||||
| * return norm of differences | |||||
| */ | |||||
| static float check_sgeadd(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, float alpha, blasint lda, | |||||
| float beta, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| blasint cols = m, rows = n; | |||||
| if (order == CblasRowMajor) | |||||
| { | |||||
| rows = m; | |||||
| cols = n; | |||||
| } | |||||
| // Fill matrix A, C | |||||
| srand_generate(data_sgeadd.a_test, lda * rows); | |||||
| srand_generate(data_sgeadd.c_test, ldc * rows); | |||||
| // Copy matrix C for sgeadd | |||||
| for (i = 0; i < ldc * rows; i++) | |||||
| data_sgeadd.c_verify[i] = data_sgeadd.c_test[i]; | |||||
| sgeadd_trusted(cols, rows, alpha, data_sgeadd.a_test, lda, | |||||
| beta, data_sgeadd.c_verify, ldc); | |||||
| if (api == 'F') | |||||
| BLASFUNC(sgeadd) | |||||
| (&m, &n, &alpha, data_sgeadd.a_test, &lda, | |||||
| &beta, data_sgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_sgeadd(order, m, n, alpha, data_sgeadd.a_test, lda, | |||||
| beta, data_sgeadd.c_test, ldc); | |||||
| // Find the differences between output matrix caculated by sgeadd and sgemm | |||||
| return smatrix_difference(data_sgeadd.c_test, data_sgeadd.c_verify, cols, rows, ldc); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param lda - leading dimension of A | |||||
| * param ldc - leading dimension of C | |||||
| * param expected_info - expected invalid parameter number in sgeadd | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, blasint lda, | |||||
| blasint ldc, int expected_info) | |||||
| { | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| set_xerbla("SGEADD ", expected_info); | |||||
| if (api == 'F') | |||||
| BLASFUNC(sgeadd) | |||||
| (&m, &n, &alpha, data_sgeadd.a_test, &lda, | |||||
| &beta, data_sgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_sgeadd(order, m, n, alpha, data_sgeadd.a_test, lda, | |||||
| beta, data_sgeadd.c_test, ldc); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(sgeadd, matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 3.0f; | |||||
| float beta = 3.0f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(sgeadd, matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 0.0f; | |||||
| float beta = 2.5f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(sgeadd, matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 3.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(sgeadd, matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 0.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(sgeadd, matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(sgeadd, xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(sgeadd, xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(sgeadd, xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(sgeadd, xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| */ | |||||
| CTEST(sgeadd, n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| */ | |||||
| CTEST(sgeadd, m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 2.0f; | |||||
| float beta = 3.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_100_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 4.0f; | |||||
| float beta = 2.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_50_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N / 2; | |||||
| blasint m = M; | |||||
| blasint lda = n; | |||||
| blasint ldc = n; | |||||
| float alpha = 3.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 0.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 3.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 0.0f; | |||||
| float beta = 0.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test sgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(sgeadd, c_api_matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| float alpha = 3.0f; | |||||
| float beta = 4.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param order - | |||||
| * specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_invalid_order) | |||||
| { | |||||
| CBLAS_ORDER order = INVALID; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 0; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_n_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_m_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_lda_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_xerbla_ldc_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(sgeadd, c_api_m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| float alpha = 1.0f; | |||||
| float beta = 1.0f; | |||||
| float norm = check_sgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,915 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_SIMATCOPY { | |||||
| float a_test[DATASIZE* DATASIZE]; | |||||
| float a_verify[DATASIZE* DATASIZE]; | |||||
| }; | |||||
| #ifdef BUILD_SINGLE | |||||
| static struct DATA_SIMATCOPY data_simatcopy; | |||||
| /** | |||||
| * Comapare results computed by simatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param alpha specifies scaling factor for matrix A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static float check_simatcopy(char api, char order, char trans, blasint rows, blasint cols, float alpha, | |||||
| blasint lda_src, blasint lda_dst) | |||||
| { | |||||
| blasint m, n; | |||||
| blasint rows_out, cols_out; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| if (order == 'C') { | |||||
| n = rows; m = cols; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| rows_out = n; cols_out = m; | |||||
| } | |||||
| else { | |||||
| rows_out = m; cols_out = n; | |||||
| } | |||||
| srand_generate(data_simatcopy.a_test, lda_src*m); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| stranspose(m, n, alpha, data_simatcopy.a_test, lda_src, data_simatcopy.a_verify, lda_dst); | |||||
| } | |||||
| else { | |||||
| scopy(m, n, alpha, data_simatcopy.a_test, lda_src, data_simatcopy.a_verify, lda_dst); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(simatcopy)(&order, &trans, &rows, &cols, &alpha, data_simatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_simatcopy(corder, ctrans, rows, cols, alpha, data_simatcopy.a_test, | |||||
| lda_src, lda_dst); | |||||
| } | |||||
| // Find the differences between output matrix computed by simatcopy and reference func | |||||
| return smatrix_difference(data_simatcopy.a_test, data_simatcopy.a_verify, cols_out, rows_out, lda_dst); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda_src, blasint lda_dst, int expected_info) | |||||
| { | |||||
| float alpha = 1.0f; | |||||
| set_xerbla("SIMATCOPY", expected_info); | |||||
| BLASFUNC(simatcopy)(&order, &trans, &rows, &cols, &alpha, data_simatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_trans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_notrans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_trans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_notrans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_trans_col_50_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_notrans_col_50_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_trans_col_50_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_notrans_col_50_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_trans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_notrans_col_100_row_100_alpha_one) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_trans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_notrans_col_100_row_100_alpha_zero) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_trans_col_100_row_50_alpha_one) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 1.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_notrans_col_100_row_50_alpha_one) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_trans_col_100_row_50_alpha_zero) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_notrans_col_100_row_50_alpha_zero) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, rowmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, c_api_colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, c_api_colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, c_api_rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test simatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 2.0f | |||||
| */ | |||||
| CTEST(simatcopy, c_api_rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_simatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda_src must be at least n. | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda_src must be at least m. | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(simatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,640 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_SOMATCOPY { | |||||
| float a_test[DATASIZE * DATASIZE]; | |||||
| float b_test[DATASIZE * DATASIZE]; | |||||
| float b_verify[DATASIZE * DATASIZE]; | |||||
| }; | |||||
| #ifdef BUILD_SINGLE | |||||
| static struct DATA_SOMATCOPY data_somatcopy; | |||||
| /** | |||||
| * Comapare results computed by somatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param alpha - scaling factor for matrix B | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static float check_somatcopy(char api, char order, char trans, blasint rows, blasint cols, float alpha, | |||||
| blasint lda, blasint ldb) | |||||
| { | |||||
| blasint b_rows, b_cols; | |||||
| blasint m, n; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| if (order == 'C') { | |||||
| m = cols; n = rows; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| b_rows = n; b_cols = m; | |||||
| } | |||||
| else { | |||||
| b_rows = m; b_cols = n; | |||||
| } | |||||
| srand_generate(data_somatcopy.a_test, lda*m); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| stranspose(m, n, alpha, data_somatcopy.a_test, lda, data_somatcopy.b_verify, ldb); | |||||
| } | |||||
| else { | |||||
| scopy(m, n, alpha, data_somatcopy.a_test, lda, data_somatcopy.b_verify, ldb); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(somatcopy)(&order, &trans, &rows, &cols, &alpha, data_somatcopy.a_test, | |||||
| &lda, data_somatcopy.b_test, &ldb); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_somatcopy(corder, ctrans, rows, cols, alpha, data_somatcopy.a_test, | |||||
| lda, data_somatcopy.b_test, ldb); | |||||
| } | |||||
| return smatrix_difference(data_somatcopy.b_test, data_somatcopy.b_verify, b_cols, b_rows, ldb); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda, blasint ldb, int expected_info) | |||||
| { | |||||
| float alpha = 1.0; | |||||
| set_xerbla("SOMATCOPY", expected_info); | |||||
| BLASFUNC(somatcopy)(&order, &trans, &rows, &cols, &alpha, data_somatcopy.a_test, | |||||
| &lda, data_somatcopy.b_test, &ldb); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(somatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(somatcopy, colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(somatcopy, colmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(somatcopy, colmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(somatcopy, rowmajor_conjtrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; // same as trans for real matrix | |||||
| float alpha = 2.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 2.0 | |||||
| */ | |||||
| CTEST(somatcopy, rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 2.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Matrix dimensions leave residues from 4 and 2 (specialize | |||||
| * for rt case) | |||||
| * alpha = 1.5 | |||||
| */ | |||||
| CTEST(somatcopy, rowmajor_trans_col_27_row_27) | |||||
| { | |||||
| blasint m = 27, n = 27; | |||||
| blasint lda = 27, ldb = 27; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.5f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha = 0.0 | |||||
| */ | |||||
| CTEST(somatcopy, rowmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 0.0f; | |||||
| float norm = check_somatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, c_api_colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, c_api_colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, c_api_rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test somatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha = 1.0 | |||||
| */ | |||||
| CTEST(somatcopy, c_api_rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| float alpha = 1.0f; | |||||
| float norm = check_somatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda must be at least n. | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda must be at least m. | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(somatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,414 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #ifdef BUILD_SINGLE | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, y1_zero) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0f; | |||||
| te_d2 = tr_d2 = 2.0f; | |||||
| te_x1 = tr_x1 = 8.0f; | |||||
| te_y1 = tr_y1 = 0.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0f; | |||||
| tr_d2 = 2.0f; | |||||
| tr_x1 = 8.0f; | |||||
| tr_y1 = 0.0f; | |||||
| tr_param[0] = -2.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| BLASFUNC(srotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, d1_negative) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = -1.0f; | |||||
| te_d2 = tr_d2 = 2.0f; | |||||
| te_x1 = tr_x1 = 8.0f; | |||||
| te_y1 = tr_y1 = 8.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0f; | |||||
| tr_d2 = 0.0f; | |||||
| tr_x1 = 0.0f; | |||||
| tr_y1 = 8.0f; | |||||
| tr_param[0] = -1.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| BLASFUNC(srotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, d1_positive_d2_positive_x1_zero) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0f; | |||||
| te_d2 = tr_d2 = 2.0f; | |||||
| te_x1 = tr_x1 = 0.0f; | |||||
| te_y1 = tr_y1 = 8.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0f; | |||||
| tr_d2 = 2.0f; | |||||
| tr_x1 = 8.0f; | |||||
| tr_y1 = 8.0f; | |||||
| tr_param[0] = 1.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| BLASFUNC(srotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, scaled_y_greater_than_scaled_x) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 1.0f; | |||||
| te_d2 = tr_d2 = -2.0f; | |||||
| te_x1 = tr_x1 = 8.0f; | |||||
| te_y1 = tr_y1 = 8.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0f; | |||||
| tr_d2 = 0.0f; | |||||
| tr_x1 = 0.0f; | |||||
| tr_y1 = 8.0f; | |||||
| tr_param[0] = -1.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| BLASFUNC(srotmg)(&te_d1, &te_d2, &te_x1, &te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, c_api_y1_zero) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0f; | |||||
| te_d2 = tr_d2 = 2.0f; | |||||
| te_x1 = tr_x1 = 8.0f; | |||||
| te_y1 = tr_y1 = 0.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0f; | |||||
| tr_d2 = 2.0f; | |||||
| tr_x1 = 8.0f; | |||||
| tr_y1 = 0.0f; | |||||
| tr_param[0] = -2.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| cblas_srotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, c_api_d1_negative) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = -1.0f; | |||||
| te_d2 = tr_d2 = 2.0f; | |||||
| te_x1 = tr_x1 = 8.0f; | |||||
| te_y1 = tr_y1 = 8.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0f; | |||||
| tr_d2 = 0.0f; | |||||
| tr_x1 = 0.0f; | |||||
| tr_y1 = 8.0f; | |||||
| tr_param[0] = -1.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| cblas_srotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, c_api_d1_positive_d2_positive_x1_zero) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 2.0f; | |||||
| te_d2 = tr_d2 = 2.0f; | |||||
| te_x1 = tr_x1 = 0.0f; | |||||
| te_y1 = tr_y1 = 8.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 2.0f; | |||||
| tr_d2 = 2.0f; | |||||
| tr_x1 = 8.0f; | |||||
| tr_y1 = 8.0f; | |||||
| tr_param[0] = 1.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| cblas_srotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test srotmg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(srotmg, c_api_scaled_y_greater_than_scaled_x) | |||||
| { | |||||
| float te_d1, tr_d1; | |||||
| float te_d2, tr_d2; | |||||
| float te_x1, tr_x1; | |||||
| float te_y1, tr_y1; | |||||
| float te_param[5]; | |||||
| float tr_param[5]; | |||||
| int i = 0; | |||||
| te_d1 = tr_d1 = 1.0f; | |||||
| te_d2 = tr_d2 = -2.0f; | |||||
| te_x1 = tr_x1 = 8.0f; | |||||
| te_y1 = tr_y1 = 8.0f; | |||||
| for(i=0; i<5; i++){ | |||||
| te_param[i] = tr_param[i] = 0.0f; | |||||
| } | |||||
| //reference values as calculated by netlib blas | |||||
| tr_d1 = 0.0f; | |||||
| tr_d2 = 0.0f; | |||||
| tr_x1 = 0.0f; | |||||
| tr_y1 = 8.0f; | |||||
| tr_param[0] = -1.0f; | |||||
| tr_param[1] = 0.0f; | |||||
| tr_param[2] = 0.0f; | |||||
| tr_param[3] = 0.0f; | |||||
| tr_param[4] = 0.0f; | |||||
| //OpenBLAS | |||||
| cblas_srotmg(&te_d1, &te_d2, &te_x1, te_y1, te_param); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d1, te_d1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_d2, te_d2, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_x1, te_x1, SINGLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(tr_y1, te_y1, SINGLE_EPS); | |||||
| for(i=0; i<5; i++){ | |||||
| ASSERT_DBL_NEAR_TOL(tr_param[i], te_param[i], SINGLE_EPS); | |||||
| } | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,403 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #define ELEMENTS 50 | |||||
| #define INCREMENT 2 | |||||
| #ifdef BUILD_SINGLE | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, -1.0f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, -1.5f, 1.0f, 1.0f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.3f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, -1.0f, -3.0f, 2.2f, 3.0f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, -2.2f, 3.3f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.2f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 2.0f, 2.2f, 2.7f, -3.3f, -5.9f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {0.0f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {0.0f, 3.0f, 1.0f, -2.2f, 2.2f, -1.7f, 3.3f, 14.5f, 0.0f, -9.0f}; | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = BLASFUNC(ssum)(&N, x, &inc); | |||||
| ASSERT_DBL_NEAR_TOL(50.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_bad_args_N_0){ | |||||
| blasint i; | |||||
| blasint N = 0, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < ELEMENTS * inc; i ++) { | |||||
| x[i] = 1000 - i; | |||||
| } | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_zero){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 0; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = i + 1000; | |||||
| } | |||||
| x[8] = 0.0f; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_1_N_1){ | |||||
| blasint N = 1, inc = 1; | |||||
| float x[] = {1.1f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_2_N_1){ | |||||
| blasint N = 1, inc = 2; | |||||
| float x[] = {1.1f, 0.0f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_1_N_2){ | |||||
| blasint N = 2, inc = 1; | |||||
| float x[] = {1.1f, -1.0f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_2_N_2){ | |||||
| blasint N = 2, inc = 2; | |||||
| float x[] = {1.1f, -1.5f, 1.0f, 1.0f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.1f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_1_N_3){ | |||||
| blasint N = 3, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, 2.2f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(4.3f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_2_N_3){ | |||||
| blasint N = 3, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, -1.0f, -3.0f, 2.2f, 3.0f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(2.3f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_1_N_4){ | |||||
| blasint N = 4, inc = 1; | |||||
| float x[] = {1.1f, 1.0f, -2.2f, 3.3f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(3.2f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_2_N_4){ | |||||
| blasint N = 4, inc = 2; | |||||
| float x[] = {1.1f, 0.0f, 1.0f, 2.0f, 2.2f, 2.7f, -3.3f, -5.9f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(1.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_1_N_5){ | |||||
| blasint N = 5, inc = 1; | |||||
| float x[] = {0.0f, 1.0f, 2.2f, 3.3f, 0.0f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_2_N_5){ | |||||
| blasint N = 5, inc = 2; | |||||
| float x[] = {0.0f, 3.0f, 1.0f, -2.2f, 2.2f, -1.7f, 3.3f, 14.5f, 0.0f, -9.0f}; | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(6.5f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_1_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = 1; | |||||
| float x[ELEMENTS]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test ssum by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(ssum, c_api_step_2_N_50){ | |||||
| blasint i; | |||||
| blasint N = ELEMENTS, inc = INCREMENT; | |||||
| float x[ELEMENTS * INCREMENT]; | |||||
| for (i = 0; i < N * inc; i ++) { | |||||
| x[i] = (i & 1) ? -1.0f : 1.0f; | |||||
| } | |||||
| float sum = cblas_ssum(N, x, inc); | |||||
| ASSERT_DBL_NEAR_TOL(50.0f, sum, SINGLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,630 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZAXPBY { | |||||
| double x_test[DATASIZE * INCREMENT * 2]; | |||||
| double x_verify[DATASIZE * INCREMENT * 2]; | |||||
| double y_test[DATASIZE * INCREMENT * 2]; | |||||
| double y_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZAXPBY data_zaxpby; | |||||
| /** | |||||
| * Fortran API specific function | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static double check_zaxpby(blasint n, double *alpha, blasint incx, double *beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // zscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Fill vectors x, y | |||||
| drand_generate(data_zaxpby.x_test, n * incx_abs * 2); | |||||
| drand_generate(data_zaxpby.y_test, n * incy_abs * 2); | |||||
| // Copy vector x for zaxpy | |||||
| for (i = 0; i < n * incx_abs * 2; i++) | |||||
| data_zaxpby.x_verify[i] = data_zaxpby.x_test[i]; | |||||
| // Copy vector y for zscal | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_zaxpby.y_verify[i] = data_zaxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| BLASFUNC(zscal)(&n, beta, data_zaxpby.y_verify, &incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| BLASFUNC(zaxpy)(&n, alpha, data_zaxpby.x_verify, &incx, | |||||
| data_zaxpby.y_verify, &incy); | |||||
| BLASFUNC(zaxpby)(&n, alpha, data_zaxpby.x_test, &incx, | |||||
| beta, data_zaxpby.y_test, &incy); | |||||
| // Find the differences between output vector caculated by zaxpby and zaxpy | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_zaxpby.y_test[i] -= data_zaxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(dznrm2)(&n, data_zaxpby.y_test, &incy_abs); | |||||
| } | |||||
| /** | |||||
| * C API specific function | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param beta - scalar beta | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static double c_api_check_zaxpby(blasint n, double *alpha, blasint incx, double *beta, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| // zscal accept only positive increments | |||||
| blasint incx_abs = labs(incx); | |||||
| blasint incy_abs = labs(incy); | |||||
| // Fill vectors x, y | |||||
| drand_generate(data_zaxpby.x_test, n * incx_abs * 2); | |||||
| drand_generate(data_zaxpby.y_test, n * incy_abs * 2); | |||||
| // Copy vector x for zaxpy | |||||
| for (i = 0; i < n * incx_abs * 2; i++) | |||||
| data_zaxpby.x_verify[i] = data_zaxpby.x_test[i]; | |||||
| // Copy vector y for zscal | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_zaxpby.y_verify[i] = data_zaxpby.y_test[i]; | |||||
| // Find beta*y | |||||
| cblas_zscal(n, beta, data_zaxpby.y_verify, incy_abs); | |||||
| // Find sum of alpha*x and beta*y | |||||
| cblas_zaxpy(n, alpha, data_zaxpby.x_verify, incx, | |||||
| data_zaxpby.y_verify, incy); | |||||
| cblas_zaxpby(n, alpha, data_zaxpby.x_test, incx, | |||||
| beta, data_zaxpby.y_test, incy); | |||||
| // Find the differences between output vector caculated by zaxpby and zaxpy | |||||
| for (i = 0; i < n * incy_abs * 2; i++) | |||||
| data_zaxpby.y_test[i] -= data_zaxpby.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| return cblas_dznrm2(n, data_zaxpby.y_test, incy_abs); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {2.0, 1.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha[] = {3.0, 1.0}; | |||||
| double beta[] = {4.0, 3.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| double alpha[] = {5.0, 2.2}; | |||||
| double beta[] = {4.0, 5.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {6.0, 3.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| double alpha[] = {7.0, 2.0}; | |||||
| double beta[] = {3.5, 1.3}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_1_inc_y_1_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(zaxpby, inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(zaxpby, check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_1_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_2_inc_y_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {2.0, 2.1}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_2_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha[] = {3.0, 2.0}; | |||||
| double beta[] = {4.0, 3.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_neg_1_inc_y_2_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -1, incy = 2; | |||||
| double alpha[] = {5.0, 2.0}; | |||||
| double beta[] = {4.0, 3.1}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = -1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {6.0, 2.3}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is -1 | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_neg_2_inc_y_neg_1_N_100) | |||||
| { | |||||
| blasint n = DATASIZE, incx = -2, incy = -1; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {3.5, 1.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_1_inc_y_1_N_100_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_1_inc_y_1_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zaxpby by comparing it with zscal and zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * Scalar alpha is zero | |||||
| * Scalar beta is zero | |||||
| */ | |||||
| CTEST(zaxpby, c_api_inc_x_1_inc_y_2_N_100_alpha_beta_zero) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - size of vectors x, y is zero | |||||
| */ | |||||
| CTEST(zaxpby, c_api_check_n_zero) | |||||
| { | |||||
| blasint n = 0, incx = 1, incy = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = c_api_check_zaxpby(n, alpha, incx, beta, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,159 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZAXPYC { | |||||
| double x_test[DATASIZE * INCREMENT * 2]; | |||||
| double x_verify[DATASIZE * INCREMENT * 2]; | |||||
| double y_test[DATASIZE * INCREMENT * 2]; | |||||
| double y_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZAXPYC data_zaxpyc; | |||||
| /** | |||||
| * Test zaxpyc by conjugating vector x and comparing with zaxpy. | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param n - number of elements in vectors x and y | |||||
| * param alpha - scalar alpha | |||||
| * param incx - increment for the elements of x | |||||
| * param incy - increment for the elements of y | |||||
| * return norm of difference | |||||
| */ | |||||
| static double check_zaxpyc(blasint n, double *alpha, blasint incx, blasint incy) | |||||
| { | |||||
| blasint i; | |||||
| drand_generate(data_zaxpyc.x_test, n * incx * 2); | |||||
| drand_generate(data_zaxpyc.y_test, n * incy * 2); | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_zaxpyc.x_verify[i] = data_zaxpyc.x_test[i]; | |||||
| for (i = 0; i < n * incy * 2; i++) | |||||
| data_zaxpyc.y_verify[i] = data_zaxpyc.y_test[i]; | |||||
| zconjugate_vector(n, incx, data_zaxpyc.x_verify); | |||||
| BLASFUNC(zaxpy) | |||||
| (&n, alpha, data_zaxpyc.x_verify, &incx, | |||||
| data_zaxpyc.y_verify, &incy); | |||||
| BLASFUNC(zaxpyc) | |||||
| (&n, alpha, data_zaxpyc.x_test, &incx, | |||||
| data_zaxpyc.y_test, &incy); | |||||
| for (i = 0; i < n * incy * 2; i++) | |||||
| data_zaxpyc.y_verify[i] -= data_zaxpyc.y_test[i]; | |||||
| return BLASFUNC(dznrm2)(&n, data_zaxpyc.y_verify, &incy); | |||||
| } | |||||
| /** | |||||
| * Test zaxpyc by conjugating vector x and comparing with zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(zaxpyc, conj_strides_one) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 1; | |||||
| double alpha[] = {5.0, 2.2}; | |||||
| double norm = check_zaxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zaxpyc by conjugating vector x and comparing with zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpyc, conj_incx_one) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, incy = 2; | |||||
| double alpha[] = {5.0, 2.2}; | |||||
| double norm = check_zaxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zaxpyc by conjugating vector x and comparing with zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| */ | |||||
| CTEST(zaxpyc, conj_incy_one) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 1; | |||||
| double alpha[] = {5.0, 2.2}; | |||||
| double norm = check_zaxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zaxpyc by conjugating vector x and comparing with zaxpy. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| */ | |||||
| CTEST(zaxpyc, conj_strides_two) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, incy = 2; | |||||
| double alpha[] = {5.0, 2.2}; | |||||
| double norm = check_zaxpyc(n, alpha, incx, incy); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,280 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 1 | |||||
| struct DATA_ZGBMV { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double a_band_storage[DATASIZE * DATASIZE * 2]; | |||||
| double matrix[DATASIZE * DATASIZE * 2]; | |||||
| double b_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZGBMV data_zgbmv; | |||||
| /** | |||||
| * Transform full-storage band matrix A to band-packed storage mode. | |||||
| * | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param kl - number of sub-diagonals of the matrix A | |||||
| * param ku - number of super-diagonals of the matrix A | |||||
| * output param a - buffer for holding band-packed matrix | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param matrix - buffer holding full-storage band matrix A | |||||
| * param ldm - specifies the leading full-storage band matrix A | |||||
| */ | |||||
| static void transform_to_band_storage(blasint m, blasint n, blasint kl, | |||||
| blasint ku, double* a, blasint lda, | |||||
| double* matrix, blasint ldm) | |||||
| { | |||||
| blasint i, j, k; | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| k = 2 * (ku - j); | |||||
| for (i = MAX(0, 2*(j - ku)); i < MIN(m, j + kl + 1) * 2; i+=2) | |||||
| { | |||||
| a[(k + i) + j * lda * 2] = matrix[i + j * ldm * 2]; | |||||
| a[(k + i) + j * lda * 2 + 1] = matrix[i + j * ldm * 2 + 1]; | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Generate full-storage band matrix A with kl sub-diagonals and ku super-diagonals | |||||
| * | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param kl - number of sub-diagonals of the matrix A | |||||
| * param ku - number of super-diagonals of the matrix A | |||||
| * output param band_matrix - buffer for full-storage band matrix. | |||||
| * param matrix - buffer holding input general matrix | |||||
| * param ldm - specifies the leading of input general matrix | |||||
| */ | |||||
| static void get_band_matrix(blasint m, blasint n, blasint kl, blasint ku, | |||||
| double *band_matrix, double *matrix, blasint ldm) | |||||
| { | |||||
| blasint i, j; | |||||
| blasint k = 0; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| for (j = 0; j < m * 2; j += 2) | |||||
| { | |||||
| if ((blasint)(j/2) > kl + i || i > ku + (blasint)(j/2)) | |||||
| { | |||||
| band_matrix[i * ldm * 2 + j] = 0.0; | |||||
| band_matrix[i * ldm * 2 + j + 1] = 0.0; | |||||
| continue; | |||||
| } | |||||
| band_matrix[i * ldm * 2 + j] = matrix[k++]; | |||||
| band_matrix[i * ldm * 2 + j + 1] = matrix[k++]; | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by zgbmv and zgemv | |||||
| * since gbmv is gemv for band matrix | |||||
| * | |||||
| * param trans specifies op(A), the transposition operation applied to A | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param kl - number of sub-diagonals of the matrix A | |||||
| * param ku - number of super-diagonals of the matrix A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param inc_c - stride of vector c | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zgbmv(char trans, blasint m, blasint n, blasint kl, blasint ku, | |||||
| double *alpha, blasint lda, blasint inc_b, double *beta, blasint inc_c) | |||||
| { | |||||
| blasint i; | |||||
| blasint lenb, lenc; | |||||
| if(trans == 'T' || trans == 'C' || trans == 'D' || trans == 'U'){ | |||||
| lenb = m; | |||||
| lenc = n; | |||||
| } else { | |||||
| lenb = n; | |||||
| lenc = m; | |||||
| } | |||||
| drand_generate(data_zgbmv.matrix, m * n * 2); | |||||
| drand_generate(data_zgbmv.b_test, 2 * (1 + (lenb - 1) * inc_b)); | |||||
| drand_generate(data_zgbmv.c_test, 2 * (1 + (lenc - 1) * inc_c)); | |||||
| for (i = 0; i < 2 * (1 + (lenc - 1) * inc_c); i++) | |||||
| data_zgbmv.c_verify[i] = data_zgbmv.c_test[i]; | |||||
| get_band_matrix(m, n, kl, ku, data_zgbmv.a_test, data_zgbmv.matrix, m); | |||||
| transform_to_band_storage(m, n, kl, ku, data_zgbmv.a_band_storage, lda, data_zgbmv.a_test, m); | |||||
| BLASFUNC(zgemv)(&trans, &m, &n, alpha, data_zgbmv.a_test, &m, data_zgbmv.b_test, | |||||
| &inc_b, beta, data_zgbmv.c_verify, &inc_c); | |||||
| BLASFUNC(zgbmv)(&trans, &m, &n, &kl, &ku, alpha, data_zgbmv.a_band_storage, &lda, data_zgbmv.b_test, | |||||
| &inc_b, beta, data_zgbmv.c_test, &inc_c); | |||||
| for (i = 0; i < 2 * (1 + (lenc - 1) * inc_c); i++) | |||||
| data_zgbmv.c_verify[i] -= data_zgbmv.c_test[i]; | |||||
| return BLASFUNC(dznrm2)(&lenc, data_zgbmv.c_verify, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Test zgbmv by comparing it against zgemv | |||||
| * with param trans is D | |||||
| */ | |||||
| CTEST(zgbmv, trans_D) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 11; | |||||
| blasint lda = 50; | |||||
| char trans = 'D'; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {1.5, -1.5}; | |||||
| double norm = check_zgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgbmv by comparing it against zgemv | |||||
| * with param trans is O | |||||
| */ | |||||
| CTEST(zgbmv, trans_O) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 10; | |||||
| blasint lda = 50; | |||||
| char trans = 'O'; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {1.5, -1.5}; | |||||
| double norm = check_zgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgbmv by comparing it against zgemv | |||||
| * with param trans is S | |||||
| */ | |||||
| CTEST(zgbmv, trans_S) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 6, ku = 9; | |||||
| blasint lda = 50; | |||||
| char trans = 'S'; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {1.5, -1.5}; | |||||
| double norm = check_zgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgbmv by comparing it against zgemv | |||||
| * with param trans is U | |||||
| */ | |||||
| CTEST(zgbmv, trans_U) | |||||
| { | |||||
| blasint m = 25, n = 50; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 7, ku = 11; | |||||
| blasint lda = kl + ku + 1; | |||||
| char trans = 'U'; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {1.5, -1.5}; | |||||
| double norm = check_zgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgbmv by comparing it against zgemv | |||||
| * with param trans is C | |||||
| */ | |||||
| CTEST(zgbmv, trans_C) | |||||
| { | |||||
| blasint m = 50, n = 25; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 11; | |||||
| blasint lda = 50; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {1.5, -1.5}; | |||||
| double norm = check_zgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgbmv by comparing it against zgemv | |||||
| * with param trans is R | |||||
| */ | |||||
| CTEST(zgbmv, trans_R) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| blasint kl = 20, ku = 11; | |||||
| blasint lda = 50; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {7.0, 1.0}; | |||||
| double beta[] = {1.5, -1.5}; | |||||
| double norm = check_zgbmv(trans, m, n, kl, ku, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,880 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define N 100 | |||||
| #define M 100 | |||||
| struct DATA_ZGEADD { | |||||
| double a_test[M * N * 2]; | |||||
| double c_test[M * N * 2]; | |||||
| double c_verify[M * N * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZGEADD data_zgeadd; | |||||
| /** | |||||
| * zgeadd reference implementation | |||||
| * | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param aptr - refer to matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param cptr - refer to matrix C | |||||
| * param ldc - leading dimension of C | |||||
| */ | |||||
| static void zgeadd_trusted(blasint m, blasint n, double *alpha, double *aptr, | |||||
| blasint lda, double *beta, double *cptr, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| lda *= 2; | |||||
| ldc *= 2; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| cblas_zaxpby(m, alpha, aptr, 1, beta, cptr, 1); | |||||
| aptr += lda; | |||||
| cptr += ldc; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Test zgeadd by comparing it against reference | |||||
| * Compare with the following options: | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param alpha - scaling factor for matrix A | |||||
| * param lda - leading dimension of A | |||||
| * param beta - scaling factor for matrix C | |||||
| * param ldc - leading dimension of C | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zgeadd(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, double *alpha, blasint lda, | |||||
| double *beta, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| blasint cols = m, rows = n; | |||||
| if (order == CblasRowMajor) | |||||
| { | |||||
| rows = m; | |||||
| cols = n; | |||||
| } | |||||
| // Fill matrix A, C | |||||
| drand_generate(data_zgeadd.a_test, lda * rows * 2); | |||||
| drand_generate(data_zgeadd.c_test, ldc * rows * 2); | |||||
| // Copy matrix C for zgeadd | |||||
| for (i = 0; i < ldc * rows * 2; i++) | |||||
| data_zgeadd.c_verify[i] = data_zgeadd.c_test[i]; | |||||
| zgeadd_trusted(cols, rows, alpha, data_zgeadd.a_test, lda, | |||||
| beta, data_zgeadd.c_verify, ldc); | |||||
| if (api == 'F') | |||||
| BLASFUNC(zgeadd)(&m, &n, alpha, data_zgeadd.a_test, &lda, | |||||
| beta, data_zgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_zgeadd(order, m, n, alpha, data_zgeadd.a_test, lda, | |||||
| beta, data_zgeadd.c_test, ldc); | |||||
| // Find the differences between output matrix caculated by zgeadd and sgemm | |||||
| return dmatrix_difference(data_zgeadd.c_test, data_zgeadd.c_verify, cols, rows, ldc * 2); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param api - specifies Fortran or C API | |||||
| * param order - specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| * param m - number of rows of A and C | |||||
| * param n - number of columns of A and C | |||||
| * param lda - leading dimension of A | |||||
| * param ldc - leading dimension of C | |||||
| * param expected_info - expected invalid parameter number in zgeadd | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char api, OPENBLAS_CONST enum CBLAS_ORDER order, | |||||
| blasint m, blasint n, blasint lda, | |||||
| blasint ldc, int expected_info) | |||||
| { | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| set_xerbla("ZGEADD ", expected_info); | |||||
| if (api == 'F') | |||||
| BLASFUNC(zgeadd)(&m, &n, alpha, data_zgeadd.a_test, &lda, | |||||
| beta, data_zgeadd.c_test, &ldc); | |||||
| else | |||||
| cblas_zgeadd(order, m, n, alpha, data_zgeadd.a_test, lda, | |||||
| beta, data_zgeadd.c_test, ldc); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(zgeadd, matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {3.0, 2.0}; | |||||
| double beta[] = {1.0, 3.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(zgeadd, matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(zgeadd, matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {3.0, 1.5}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(zgeadd, matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(zgeadd, matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(zgeadd, xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| */ | |||||
| CTEST(zgeadd, xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(zgeadd, xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| */ | |||||
| CTEST(zgeadd, xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('F', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| */ | |||||
| CTEST(zgeadd, n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| */ | |||||
| CTEST(zgeadd, m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('F', order, m, n, alpha, lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_100_m_100) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {1.0, 3.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_100_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {4.0, 1.5}; | |||||
| double beta[] = {2.0, 1.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is row-major order | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_50_m_100_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = N / 2; | |||||
| blasint m = M; | |||||
| blasint lda = n; | |||||
| blasint ldc = n; | |||||
| double alpha[] = {3.0, 2.5}; | |||||
| double beta[] = {1.0, 2.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar alpha is zero (operation is C:=beta*C) | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_100_m_100_alpha_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalar beta is zero (operation is C:=alpha*A) | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_100_m_100_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {3.0, 1.5}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * c api option order is column-major order | |||||
| * For A number of rows is 100, number of colums is 100 | |||||
| * For C number of rows is 100, number of colums is 100 | |||||
| * Scalars alpha, beta is zero (operation is C:= 0) | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_100_m_100_alpha_beta_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {0.0, 0.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zgeadd by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * For A number of rows is 50, number of colums is 100 | |||||
| * For C number of rows is 50, number of colums is 100 | |||||
| */ | |||||
| CTEST(zgeadd, c_api_matrix_n_100_m_50) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = N; | |||||
| blasint m = M / 2; | |||||
| blasint lda = m; | |||||
| blasint ldc = m; | |||||
| double alpha[] = {2.0, 3.0}; | |||||
| double beta[] = {2.0, 4.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param order - | |||||
| * specifies whether A and C stored in | |||||
| * row-major order or column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_invalid_order) | |||||
| { | |||||
| CBLAS_ORDER order = INVALID; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 0; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_n_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param n - | |||||
| * number of columns of A and C. | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_n_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = INVALID; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_m_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param m - | |||||
| * number of rows of A and C | |||||
| * Must be at least zero. | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_m_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = INVALID; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_lda_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of A. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_lda_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = INVALID; | |||||
| blasint ldc = 1; | |||||
| int expected_info = 5; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_ldc_invalid) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test error function for an invalid param ldc - | |||||
| * specifies the leading dimension of C. Must be at least MAX(1, m). | |||||
| * | |||||
| * c api option order is row-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_xerbla_ldc_invalid_row_major) | |||||
| { | |||||
| CBLAS_ORDER order = CblasRowMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = INVALID; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs('C', order, m, n, lda, ldc, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if n - number of columns of A, C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_n_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 0; | |||||
| blasint m = 1; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Check if m - number of rows of A and C equal zero. | |||||
| * | |||||
| * c api option order is column-major order | |||||
| */ | |||||
| CTEST(zgeadd, c_api_m_zero) | |||||
| { | |||||
| CBLAS_ORDER order = CblasColMajor; | |||||
| blasint n = 1; | |||||
| blasint m = 0; | |||||
| blasint lda = 1; | |||||
| blasint ldc = 1; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zgeadd('C', order, m, n, alpha, | |||||
| lda, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,273 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZGEMM { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double a_verify[DATASIZE * DATASIZE * 2]; | |||||
| double b_test[DATASIZE * DATASIZE * 2]; | |||||
| double b_verify[DATASIZE * DATASIZE * 2]; | |||||
| double c_test[DATASIZE * DATASIZE * 2]; | |||||
| double c_verify[DATASIZE * DATASIZE * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZGEMM data_zgemm; | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * | |||||
| * param transa specifies op(A), the transposition (conjugation) operation applied to A | |||||
| * param transb specifies op(B), the transposition (conjugation) operation applied to B | |||||
| * param m specifies the number of rows of the matrix op(A) and of the matrix C | |||||
| * param n specifies the number of columns of the matrix op(B) and the number of columns of the matrix C | |||||
| * param k specifies the number of columns of the matrix op(A) and the number of rows of the matrix op(B) | |||||
| * param alpha - scaling factor for the matrix-matrix product | |||||
| * param lda - leading dimension of matrix A | |||||
| * param ldb - leading dimension of matrix B | |||||
| * param beta - scaling factor for matrix C | |||||
| * param ldc - leading dimension of matrix C | |||||
| * return norm of difference | |||||
| */ | |||||
| static double check_zgemm(char transa, char transb, blasint m, blasint n, blasint k, | |||||
| double *alpha, blasint lda, blasint ldb, double *beta, blasint ldc) | |||||
| { | |||||
| blasint i; | |||||
| double alpha_conj[] = {1.0, 0.0}; | |||||
| char transa_verify = transa; | |||||
| char transb_verify = transb; | |||||
| int arows = k, acols = m; | |||||
| int brows = n, bcols = k; | |||||
| if (transa == 'T' || transa == 'C'){ | |||||
| arows = m; acols = k; | |||||
| } | |||||
| if (transb == 'T' || transb == 'C'){ | |||||
| brows = k; bcols = n; | |||||
| } | |||||
| drand_generate(data_zgemm.a_test, arows * lda * 2); | |||||
| drand_generate(data_zgemm.b_test, brows * ldb * 2); | |||||
| drand_generate(data_zgemm.c_test, n * ldc * 2); | |||||
| for (i = 0; i < arows * lda * 2; i++) | |||||
| data_zgemm.a_verify[i] = data_zgemm.a_test[i]; | |||||
| for (i = 0; i < brows * ldb * 2; i++) | |||||
| data_zgemm.b_verify[i] = data_zgemm.b_test[i]; | |||||
| for (i = 0; i < n * ldc * 2; i++) | |||||
| data_zgemm.c_verify[i] = data_zgemm.c_test[i]; | |||||
| if (transa == 'R'){ | |||||
| cblas_zimatcopy(CblasColMajor, CblasConjNoTrans, arows, acols, alpha_conj, data_zgemm.a_verify, lda, lda); | |||||
| transa_verify = 'N'; | |||||
| } | |||||
| if (transb == 'R'){ | |||||
| cblas_zimatcopy(CblasColMajor, CblasConjNoTrans, brows, bcols, alpha_conj, data_zgemm.b_verify, ldb, ldb); | |||||
| transb_verify = 'N'; | |||||
| } | |||||
| BLASFUNC(zgemm)(&transa_verify, &transb_verify, &m, &n, &k, alpha, data_zgemm.a_verify, &lda, | |||||
| data_zgemm.b_verify, &ldb, beta, data_zgemm.c_verify, &ldc); | |||||
| BLASFUNC(zgemm)(&transa, &transb, &m, &n, &k, alpha, data_zgemm.a_test, &lda, | |||||
| data_zgemm.b_test, &ldb, beta, data_zgemm.c_test, &ldc); | |||||
| return dmatrix_difference(data_zgemm.c_test, data_zgemm.c_verify, m, n, ldc*2); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(zgemm, conjtransa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'C'; | |||||
| char transb = 'R'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is not conjugate and not transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(zgemm, notransa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'N'; | |||||
| char transb = 'R'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is conjugate and transposed | |||||
| */ | |||||
| CTEST(zgemm, conjnotransa_conjtransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'C'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is not conjugate and not transposed | |||||
| */ | |||||
| CTEST(zgemm, conjnotransa_notransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'N'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(zgemm, conjnotransa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'R'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not transposed | |||||
| * matrix B is transposed | |||||
| */ | |||||
| CTEST(zgemm, conjnotransa_transb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'R'; | |||||
| char transb = 'T'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test zgemm with the conjugate matrices by conjugating and not transposed matrices | |||||
| * and comparing it with the non-conjugate zgemm. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is transposed | |||||
| * matrix B is conjugate and not transposed | |||||
| */ | |||||
| CTEST(zgemm, transa_conjnotransb) | |||||
| { | |||||
| blasint n = DATASIZE, m = DATASIZE, k = DATASIZE; | |||||
| blasint lda = DATASIZE, ldb = DATASIZE, ldc = DATASIZE; | |||||
| char transa = 'T'; | |||||
| char transb = 'R'; | |||||
| double alpha[] = {-2.0, 1.0}; | |||||
| double beta[] = {1.0, -1.0}; | |||||
| double norm = check_zgemm(transa, transb, m, n, k, alpha, lda, ldb, beta, ldc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,341 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZSPMV_N { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double b_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZSPMV_N data_zgemv_n; | |||||
| /** | |||||
| * zgemv not transposed reference code | |||||
| * | |||||
| * param trans specifies whether matris A is conj or/and xconj | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param alpha - scaling factor for the matrib-vector product | |||||
| * param a - buffer holding input matrib A | |||||
| * param lda - leading dimension of matrix A | |||||
| * param b - Buffer holding input vector b | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param c - buffer holding input/output vector c | |||||
| * param inc_c - stride of vector c | |||||
| */ | |||||
| static void zgemv_n_trusted(char trans, blasint m, blasint n, double *alpha, double *a, | |||||
| blasint lda, double *b, blasint inc_b, double *beta, double *c, | |||||
| blasint inc_c) | |||||
| { | |||||
| blasint i, j; | |||||
| blasint i2 = 0; | |||||
| blasint ib = 0, ic = 0; | |||||
| double temp_r, temp_i; | |||||
| double *a_ptr = a; | |||||
| blasint lda2 = 2*lda; | |||||
| blasint inc_b2 = 2 * inc_b; | |||||
| blasint inc_c2 = 2 * inc_c; | |||||
| BLASFUNC(zscal)(&m, beta, c, &inc_c); | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| if (trans == 'N' || trans == 'R') { | |||||
| temp_r = alpha[0] * b[ib] - alpha[1] * b[ib+1]; | |||||
| temp_i = alpha[0] * b[ib+1] + alpha[1] * b[ib]; | |||||
| } else { | |||||
| temp_r = alpha[0] * b[ib] + alpha[1] * b[ib+1]; | |||||
| temp_i = alpha[0] * b[ib+1] - alpha[1] * b[ib]; | |||||
| } | |||||
| ic = 0; | |||||
| i2 = 0; | |||||
| for (i = 0; i < m; i++) | |||||
| { | |||||
| if (trans == 'N') { | |||||
| c[ic] += temp_r * a_ptr[i2] - temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] += temp_r * a_ptr[i2+1] + temp_i * a_ptr[i2]; | |||||
| } | |||||
| if (trans == 'O') { | |||||
| c[ic] += temp_r * a_ptr[i2] + temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] += temp_r * a_ptr[i2+1] - temp_i * a_ptr[i2]; | |||||
| } | |||||
| if (trans == 'R') { | |||||
| c[ic] += temp_r * a_ptr[i2] + temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] -= temp_r * a_ptr[i2+1] - temp_i * a_ptr[i2]; | |||||
| } | |||||
| if (trans == 'S') { | |||||
| c[ic] += temp_r * a_ptr[i2] - temp_i * a_ptr[i2+1]; | |||||
| c[ic+1] -= temp_r * a_ptr[i2+1] + temp_i * a_ptr[i2]; | |||||
| } | |||||
| i2 += 2; | |||||
| ic += inc_c2; | |||||
| } | |||||
| a_ptr += lda2; | |||||
| ib += inc_b2; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by zgemv and zgemv_n_trusted | |||||
| * | |||||
| * param trans specifies whether matris A is conj or/and xconj | |||||
| * param m - number of rows of A | |||||
| * param n - number of columns of A | |||||
| * param alpha - scaling factor for the matrib-vector product | |||||
| * param lda - leading dimension of matrix A | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param inc_c - stride of vector c | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zgemv_n(char trans, blasint m, blasint n, double *alpha, blasint lda, | |||||
| blasint inc_b, double *beta, blasint inc_c) | |||||
| { | |||||
| blasint i; | |||||
| drand_generate(data_zgemv_n.a_test, n * lda); | |||||
| drand_generate(data_zgemv_n.b_test, 2 * n * inc_b); | |||||
| drand_generate(data_zgemv_n.c_test, 2 * m * inc_c); | |||||
| for (i = 0; i < m * 2 * inc_c; i++) | |||||
| data_zgemv_n.c_verify[i] = data_zgemv_n.c_test[i]; | |||||
| zgemv_n_trusted(trans, m, n, alpha, data_zgemv_n.a_test, lda, data_zgemv_n.b_test, | |||||
| inc_b, beta, data_zgemv_n.c_test, inc_c); | |||||
| BLASFUNC(zgemv)(&trans, &m, &n, alpha, data_zgemv_n.a_test, &lda, data_zgemv_n.b_test, | |||||
| &inc_b, beta, data_zgemv_n.c_verify, &inc_c); | |||||
| for (i = 0; i < m * 2 * inc_c; i++) | |||||
| data_zgemv_n.c_verify[i] -= data_zgemv_n.c_test[i]; | |||||
| return BLASFUNC(dznrm2)(&n, data_zgemv_n.c_verify, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zgemv, trans_o_square_matrix) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'O'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.4, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows of A is 50 | |||||
| * Number of colums of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zgemv, trans_o_rectangular_matrix_rows_less_then_cols) | |||||
| { | |||||
| blasint n = 100, m = 50, lda = 50; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'O'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.4, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows of A is 100 | |||||
| * Number of colums of A is 50 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zgemv, trans_o_rectangular_matrix_cols_less_then_rows) | |||||
| { | |||||
| blasint n = 50, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'O'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.4, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(zgemv, trans_o_double_strides) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 2, inc_c = 2; | |||||
| char trans = 'O'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.4, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zgemv, trans_s_square_matrix) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'S'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.4, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows of A is 50 | |||||
| * Number of colums of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zgemv, trans_s_rectangular_matrix_rows_less_then_cols) | |||||
| { | |||||
| blasint n = 100, m = 50, lda = 50; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'S'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.4, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows of A is 100 | |||||
| * Number of colums of A is 50 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zgemv, trans_s_rectangular_matrix_cols_less_then_rows) | |||||
| { | |||||
| blasint n = 50, m = 100, lda = 100; | |||||
| blasint inc_b = 1, inc_c = 1; | |||||
| char trans = 'S'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.4, 0.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zgemv by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * A is xconj and conj | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(zgemv, trans_s_double_strides) | |||||
| { | |||||
| blasint n = 100, m = 100, lda = 100; | |||||
| blasint inc_b = 2, inc_c = 2; | |||||
| char trans = 'S'; | |||||
| double alpha[] = {2.0, -1.0}; | |||||
| double beta[] = {1.0, 5.0}; | |||||
| double norm = check_zgemv_n(trans, m, n, alpha, lda, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,818 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_ZIMATCOPY { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double a_verify[DATASIZE * DATASIZE * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZIMATCOPY data_zimatcopy; | |||||
| /** | |||||
| * Comapare results computed by zimatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param alpha specifies scaling factor for matrix A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static double check_zimatcopy(char api, char order, char trans, blasint rows, blasint cols, double *alpha, | |||||
| blasint lda_src, blasint lda_dst) | |||||
| { | |||||
| blasint m, n; | |||||
| blasint rows_out, cols_out; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| int conj = -1; | |||||
| if (order == 'C') { | |||||
| n = rows; m = cols; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| rows_out = n; cols_out = m*2; | |||||
| if (trans == 'C') | |||||
| conj = 1; | |||||
| } | |||||
| else { | |||||
| rows_out = m; cols_out = n*2; | |||||
| if (trans == 'R') | |||||
| conj = 1; | |||||
| } | |||||
| drand_generate(data_zimatcopy.a_test, lda_src*m*2); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| ztranspose(m, n, alpha, data_zimatcopy.a_test, lda_src, data_zimatcopy.a_verify, lda_dst, conj); | |||||
| } | |||||
| else { | |||||
| zcopy(m, n, alpha, data_zimatcopy.a_test, lda_src, data_zimatcopy.a_verify, lda_dst, conj); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(zimatcopy)(&order, &trans, &rows, &cols, alpha, data_zimatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_zimatcopy(corder, ctrans, rows, cols, alpha, data_zimatcopy.a_test, | |||||
| lda_src, lda_dst); | |||||
| } | |||||
| // Find the differences between output matrix computed by zimatcopy and reference func | |||||
| return dmatrix_difference(data_zimatcopy.a_test, data_zimatcopy.a_verify, cols_out, rows_out, lda_dst*2); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows specifies number of rows of A | |||||
| * param cols specifies number of columns of A | |||||
| * param lda_src - leading dimension of the matrix A | |||||
| * param lda_dst - leading dimension of output matrix A | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda_src, blasint lda_dst, int expected_info) | |||||
| { | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| set_xerbla("ZIMATCOPY", expected_info); | |||||
| BLASFUNC(zimatcopy)(&order, &trans, &rows, &cols, alpha, data_zimatcopy.a_test, | |||||
| &lda_src, &lda_dst); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = -3.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {-3.0, 1.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_notrans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_conjtrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, colmajor_conj_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = 2.0, alpha_i = 3.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {2.0, 3.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Rectangular matrix | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Rectangular matrix | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_conj_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, rowmajor_conjtrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('F', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 3.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_colmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {3.0, 2.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = 3.0, alpha_i = 1.5 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_colmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {3.0, 1.5}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * Square matrix | |||||
| * alpha_r = 3.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_rowmajor_trans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {3.0, 1.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_colmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * Square matrix | |||||
| * alpha_r = 1.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_rowmajor_notrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zimatcopy by comparing it against reference | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zimatcopy, c_api_rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm = check_zimatcopy('C', order, trans, m, n, alpha, lda_src, lda_dst); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda_src must be at least n. | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_src. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda_src must be at least m. | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 50, lda_dst = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, lda_dst must be at least m. | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda_dst. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, lda_dst must be at least n. | |||||
| */ | |||||
| CTEST(zimatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda_src = 100, lda_dst = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda_src, lda_dst, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,713 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| struct DATA_ZOMATCOPY { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double b_test[DATASIZE * DATASIZE * 2]; | |||||
| double b_verify[DATASIZE * DATASIZE * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZOMATCOPY data_zomatcopy; | |||||
| /** | |||||
| * Comapare results computed by zomatcopy and reference func | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param alpha - scaling factor for matrix B | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * return norm of difference between openblas and reference func | |||||
| */ | |||||
| static double check_zomatcopy(char api, char order, char trans, blasint rows, blasint cols, double* alpha, | |||||
| blasint lda, blasint ldb) | |||||
| { | |||||
| blasint b_rows, b_cols; | |||||
| blasint m, n; | |||||
| enum CBLAS_ORDER corder; | |||||
| enum CBLAS_TRANSPOSE ctrans; | |||||
| int conj = -1; | |||||
| if (order == 'C') { | |||||
| m = cols; n = rows; | |||||
| } | |||||
| else { | |||||
| m = rows; n = cols; | |||||
| } | |||||
| if(trans == 'T' || trans == 'C') { | |||||
| b_rows = n; b_cols = m*2; | |||||
| if (trans == 'C') | |||||
| conj = 1; | |||||
| } | |||||
| else { | |||||
| b_rows = m; b_cols = n*2; | |||||
| if (trans == 'R') | |||||
| conj = 1; | |||||
| } | |||||
| drand_generate(data_zomatcopy.a_test, lda*m*2); | |||||
| if (trans == 'T' || trans == 'C') { | |||||
| ztranspose(m, n, alpha, data_zomatcopy.a_test, lda, data_zomatcopy.b_verify, ldb, conj); | |||||
| } | |||||
| else { | |||||
| zcopy(m, n, alpha, data_zomatcopy.a_test, lda, data_zomatcopy.b_verify, ldb, conj); | |||||
| } | |||||
| if (api == 'F') { | |||||
| BLASFUNC(zomatcopy)(&order, &trans, &rows, &cols, alpha, data_zomatcopy.a_test, | |||||
| &lda, data_zomatcopy.b_test, &ldb); | |||||
| } | |||||
| else { | |||||
| if (order == 'C') corder = CblasColMajor; | |||||
| if (order == 'R') corder = CblasRowMajor; | |||||
| if (trans == 'T') ctrans = CblasTrans; | |||||
| if (trans == 'N') ctrans = CblasNoTrans; | |||||
| if (trans == 'C') ctrans = CblasConjTrans; | |||||
| if (trans == 'R') ctrans = CblasConjNoTrans; | |||||
| cblas_zomatcopy(corder, ctrans, rows, cols, alpha, data_zomatcopy.a_test, | |||||
| lda, data_zomatcopy.b_test, ldb); | |||||
| } | |||||
| return dmatrix_difference(data_zomatcopy.b_test, data_zomatcopy.b_verify, b_cols, b_rows, ldb*2); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param order specifies row or column major order | |||||
| * param trans specifies op(A), the transposition operation | |||||
| * applied to the matrix A | |||||
| * param rows - number of rows of A | |||||
| * param cols - number of columns of A | |||||
| * param lda - leading dimension of the matrix A | |||||
| * param ldb - leading dimension of the matrix B | |||||
| * param expected_info - expected invalid parameter number | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char order, char trans, blasint rows, blasint cols, | |||||
| blasint lda, blasint ldb, int expected_info) | |||||
| { | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| set_xerbla("ZOMATCOPY", expected_info); | |||||
| BLASFUNC(zomatcopy)(&order, &trans, &rows, &cols, alpha, data_zomatcopy.a_test, | |||||
| &lda, data_zomatcopy.b_test, &ldb); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * alpha_r = -1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {-1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, colmajor_conjtrnas_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, rowmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('F', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy only | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_colmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition | |||||
| * alpha_r = -1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_colmajor_trans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {-1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_colmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Column Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 2.0, alpha_i = 1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_colmajor_conjtrnas_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy only | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_rowmajor_notrans_col_50_row_100) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_rowmajor_trans_col_100_row_50) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Copy and conjugate | |||||
| * alpha_r = 1.5, alpha_i = -1.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_rowmajor_conj_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| double alpha[] = {1.5, -1.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zomatcopy by comparing it against refernce | |||||
| * with the following options: | |||||
| * | |||||
| * Row Major | |||||
| * Transposition and conjugate | |||||
| * alpha_r = 1.0, alpha_i = 2.0 | |||||
| */ | |||||
| CTEST(zomatcopy, c_api_rowmajor_conjtrans_col_100_row_100) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| double alpha[] = {1.0, 2.0}; | |||||
| double norm; | |||||
| norm = check_zomatcopy('C', order, trans, m, n, alpha, lda, ldb); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param order. | |||||
| * Must be column (C) or row major (R). | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_invalid_order) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'O'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param trans. | |||||
| * Must be trans (T/C) or no-trans (N/R). | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_invalid_trans) | |||||
| { | |||||
| blasint m = 100, n = 100; | |||||
| blasint lda = 100, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'O'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using row major layout, | |||||
| * lda must be at least n. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_rowmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda. | |||||
| * If matrices are stored using column major layout, | |||||
| * lda must be at least m. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_colmajor_invalid_lda) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 50, ldb = 100; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 7; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_rowmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_rowmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is no transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_rowmajor_conj_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'R'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using row major layout and | |||||
| * there is transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_rowmajor_transconj_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'R'; | |||||
| char trans = 'C'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_colmajor_notrans_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'N'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_colmajor_trans_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'T'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is no transposition, ldb must be at least m. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_colmajor_conj_invalid_ldb) | |||||
| { | |||||
| blasint m = 100, n = 50; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'R'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param ldb. | |||||
| * If matrices are stored using column major layout and | |||||
| * there is transposition, ldb must be at least n. | |||||
| */ | |||||
| CTEST(zomatcopy, xerbla_colmajor_transconj_invalid_ldb) | |||||
| { | |||||
| blasint m = 50, n = 100; | |||||
| blasint lda = 100, ldb = 50; | |||||
| char order = 'C'; | |||||
| char trans = 'C'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(order, trans, m, n, lda, ldb, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,790 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZROT { | |||||
| double x_test[DATASIZE * INCREMENT * 2]; | |||||
| double y_test[DATASIZE * INCREMENT * 2]; | |||||
| double x_verify[DATASIZE * INCREMENT * 2]; | |||||
| double y_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZROT data_zrot; | |||||
| /** | |||||
| * Comapare results computed by zdrot and zaxpby | |||||
| * | |||||
| * param n specifies size of vector x | |||||
| * param inc_x specifies increment of vector x | |||||
| * param inc_y specifies increment of vector y | |||||
| * param c specifies cosine | |||||
| * param s specifies sine | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zdrot(blasint n, blasint inc_x, blasint inc_y, double *c, double *s) | |||||
| { | |||||
| blasint i; | |||||
| double norm = 0; | |||||
| double s_neg[] = {-s[0], s[1]}; | |||||
| blasint inc_x_abs = labs(inc_x); | |||||
| blasint inc_y_abs = labs(inc_y); | |||||
| // Fill vectors x, y | |||||
| drand_generate(data_zrot.x_test, n * inc_x_abs * 2); | |||||
| drand_generate(data_zrot.y_test, n * inc_y_abs * 2); | |||||
| if (inc_x == 0 && inc_y == 0) { | |||||
| drand_generate(data_zrot.x_test, n * 2); | |||||
| drand_generate(data_zrot.y_test, n * 2); | |||||
| } | |||||
| // Copy vector x for zaxpby | |||||
| for (i = 0; i < n * inc_x_abs * 2; i++) | |||||
| data_zrot.x_verify[i] = data_zrot.x_test[i]; | |||||
| // Copy vector y for zaxpby | |||||
| for (i = 0; i < n * inc_y_abs * 2; i++) | |||||
| data_zrot.y_verify[i] = data_zrot.y_test[i]; | |||||
| // Find cx = c*x + s*y | |||||
| BLASFUNC(zaxpby)(&n, s, data_zrot.y_test, &inc_y, c, data_zrot.x_verify, &inc_x); | |||||
| // Find cy = -conjg(s)*x + c*y | |||||
| BLASFUNC(zaxpby)(&n, s_neg, data_zrot.x_test, &inc_x, c, data_zrot.y_verify, &inc_y); | |||||
| BLASFUNC(zdrot)(&n, data_zrot.x_test, &inc_x, data_zrot.y_test, &inc_y, c, s); | |||||
| // Find the differences between vector x caculated by zaxpby and zdrot | |||||
| for (i = 0; i < n * 2 * inc_x_abs; i++) | |||||
| data_zrot.x_test[i] -= data_zrot.x_verify[i]; | |||||
| // Find the differences between vector y caculated by zaxpby and zdrot | |||||
| for (i = 0; i < n * 2 * inc_y_abs; i++) | |||||
| data_zrot.y_test[i] -= data_zrot.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| norm += BLASFUNC(dznrm2)(&n, data_zrot.x_test, &inc_x_abs); | |||||
| norm += BLASFUNC(dznrm2)(&n, data_zrot.y_test, &inc_y_abs); | |||||
| return (norm / 2); | |||||
| } | |||||
| /** | |||||
| * C API specific function | |||||
| * Comapare results computed by zdrot and zaxpby | |||||
| * | |||||
| * param n specifies size of vector x | |||||
| * param inc_x specifies increment of vector x | |||||
| * param inc_y specifies increment of vector y | |||||
| * param c specifies cosine | |||||
| * param s specifies sine | |||||
| * return norm of differences | |||||
| */ | |||||
| static double c_api_check_zdrot(blasint n, blasint inc_x, blasint inc_y, double *c, double *s) | |||||
| { | |||||
| blasint i; | |||||
| double norm = 0; | |||||
| double s_neg[] = {-s[0], s[1]}; | |||||
| blasint inc_x_abs = labs(inc_x); | |||||
| blasint inc_y_abs = labs(inc_y); | |||||
| // Fill vectors x, y | |||||
| drand_generate(data_zrot.x_test, n * inc_x_abs * 2); | |||||
| drand_generate(data_zrot.y_test, n * inc_y_abs * 2); | |||||
| if (inc_x == 0 && inc_y == 0) { | |||||
| drand_generate(data_zrot.x_test, n * 2); | |||||
| drand_generate(data_zrot.y_test, n * 2); | |||||
| } | |||||
| // Copy vector x for zaxpby | |||||
| for (i = 0; i < n * inc_x_abs * 2; i++) | |||||
| data_zrot.x_verify[i] = data_zrot.x_test[i]; | |||||
| // Copy vector y for zaxpby | |||||
| for (i = 0; i < n * inc_y_abs * 2; i++) | |||||
| data_zrot.y_verify[i] = data_zrot.y_test[i]; | |||||
| // Find cx = c*x + s*y | |||||
| cblas_zaxpby(n, s, data_zrot.y_test, inc_y, c, data_zrot.x_verify, inc_x); | |||||
| // Find cy = -conjg(s)*x + c*y | |||||
| cblas_zaxpby(n, s_neg, data_zrot.x_test, inc_x, c, data_zrot.y_verify, inc_y); | |||||
| cblas_zdrot(n, data_zrot.x_test, inc_x, data_zrot.y_test, inc_y, c[0], s[0]); | |||||
| // Find the differences between vector x caculated by zaxpby and zdrot | |||||
| for (i = 0; i < n * 2 * inc_x_abs; i++) | |||||
| data_zrot.x_test[i] -= data_zrot.x_verify[i]; | |||||
| // Find the differences between vector y caculated by zaxpby and zdrot | |||||
| for (i = 0; i < n * 2 * inc_y_abs; i++) | |||||
| data_zrot.y_test[i] -= data_zrot.y_verify[i]; | |||||
| // Find the norm of differences | |||||
| norm += cblas_dznrm2(n, data_zrot.x_test, inc_x_abs); | |||||
| norm += cblas_dznrm2(n, data_zrot.y_test, inc_y_abs); | |||||
| return (norm / 2); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 0 | |||||
| * Stride of vector y is 0 | |||||
| * c = 1.0 | |||||
| * s = 2.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_0_inc_y_0) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 0; | |||||
| blasint inc_y = 0; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {2.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_1_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is -1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_neg_1_inc_y_neg_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -1; | |||||
| blasint inc_y = -1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 3.0 | |||||
| * s = 2.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {3.0, 0.0}; | |||||
| double s[] = {2.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_neg_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_1_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is -2 | |||||
| * c = 2.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_1_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {2.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 2.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_2_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {2.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_neg_2_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 0.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_2_inc_y_2_c_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {0.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 0.0 | |||||
| */ | |||||
| CTEST(zrot, inc_x_2_inc_y_2_s_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {0.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 0 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, check_n_zero) | |||||
| { | |||||
| blasint n = 0; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 0 | |||||
| * Stride of vector y is 0 | |||||
| * c = 1.0 | |||||
| * s = 2.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_0_inc_y_0) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 0; | |||||
| blasint inc_y = 0; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {3.0, 0.0}; | |||||
| double s[] = {2.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_1_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -1 | |||||
| * Stride of vector y is -1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_neg_1_inc_y_neg_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -1; | |||||
| blasint inc_y = -1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 3.0 | |||||
| * s = 2.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {3.0, 0.0}; | |||||
| double s[] = {2.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is -2 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_neg_2_inc_y_1) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_1_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is -2 | |||||
| * c = 2.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_1_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {2.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 2.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_2_inc_y_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {2.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_neg_2_inc_y_neg_2) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = -2; | |||||
| blasint inc_y = -2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 0.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_2_inc_y_2_c_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {0.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 100 | |||||
| * Stride of vector x is 2 | |||||
| * Stride of vector y is 2 | |||||
| * c = 1.0 | |||||
| * s = 0.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_inc_x_2_inc_y_2_s_zero) | |||||
| { | |||||
| blasint n = 100; | |||||
| blasint inc_x = 2; | |||||
| blasint inc_y = 2; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {0.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrot by comparing it with zaxpby. | |||||
| * Test with the following options: | |||||
| * | |||||
| * Size of vectors x, y is 0 | |||||
| * Stride of vector x is 1 | |||||
| * Stride of vector y is 1 | |||||
| * c = 1.0 | |||||
| * s = 1.0 | |||||
| */ | |||||
| CTEST(zrot, c_api_check_n_zero) | |||||
| { | |||||
| blasint n = 0; | |||||
| blasint inc_x = 1; | |||||
| blasint inc_y = 1; | |||||
| // Imaginary part for zaxpby | |||||
| double c[] = {1.0, 0.0}; | |||||
| double s[] = {1.0, 0.0}; | |||||
| double norm = c_api_check_zdrot(n, inc_x, inc_y, c, s); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,290 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, zero_a) | |||||
| { | |||||
| double sa[2] = {0.0, 0.0}; | |||||
| double sb[2] = {1.0, 1.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70710678118655, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.70710678118655, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421356237310, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific tests | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, zero_b) | |||||
| { | |||||
| double sa[2] = {1.0, 1.0}; | |||||
| double sb[2] = {0.0, 0.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, zero_real) | |||||
| { | |||||
| double sa[2] = {0.0, 1.0}; | |||||
| double sb[2] = {0.0, 1.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.70710678118654, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70710678118654, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421356237309, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, positive_real_positive_img) | |||||
| { | |||||
| double sa[2] = {3.0, 4.0}; | |||||
| double sb[2] = {4.0, 6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, negative_real_positive_img) | |||||
| { | |||||
| double sa[2] = {-3.0, 4.0}; | |||||
| double sb[2] = {-4.0, 6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, positive_real_negative_img) | |||||
| { | |||||
| double sa[2] = {3.0, -4.0}; | |||||
| double sb[2] = {4.0, -6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, negative_real_negative_img) | |||||
| { | |||||
| double sa[2] = {-3.0, -4.0}; | |||||
| double sb[2] = {-4.0, -6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| BLASFUNC(zrotg)(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_zero_a) | |||||
| { | |||||
| double sa[2] = {0.0, 0.0}; | |||||
| double sb[2] = {1.0, 1.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70710678118655, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.70710678118655, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421356237310, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_zero_b) | |||||
| { | |||||
| double sa[2] = {1.0, 1.0}; | |||||
| double sb[2] = {0.0, 0.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.0, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_zero_real) | |||||
| { | |||||
| double sa[2] = {0.0, 1.0}; | |||||
| double sb[2] = {0.0, 1.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.70710678118654, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.70710678118654, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(1.41421356237309, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_positive_real_positive_img) | |||||
| { | |||||
| double sa[2] = {3.0, 4.0}; | |||||
| double sb[2] = {4.0, 6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_negative_real_positive_img) | |||||
| { | |||||
| double sa[2] = {-3.0, 4.0}; | |||||
| double sb[2] = {-4.0, 6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_positive_real_negative_img) | |||||
| { | |||||
| double sa[2] = {3.0, -4.0}; | |||||
| double sb[2] = {4.0, -6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zrotg by comparing it against pre-calculated values | |||||
| */ | |||||
| CTEST(zrotg, c_api_negative_real_negative_img) | |||||
| { | |||||
| double sa[2] = {-3.0, -4.0}; | |||||
| double sb[2] = {-4.0, -6.0}; | |||||
| double ss[2]; | |||||
| double sc; | |||||
| cblas_zrotg(sa, sb, &sc, ss); | |||||
| ASSERT_DBL_NEAR_TOL(0.56980288229818, sc, DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(0.82051615050939, ss[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-0.04558423058385, ss[1], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-5.26497863243527, sa[0], DOUBLE_EPS); | |||||
| ASSERT_DBL_NEAR_TOL(-7.01997150991369, sa[1], DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,606 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZSBMV { | |||||
| double sp_matrix[DATASIZE * (DATASIZE + 1)]; | |||||
| double sb_matrix[DATASIZE * DATASIZE * 2]; | |||||
| double b_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| // DOUBLE_EPS_ZGEMV = MAX_VAL * NUMBER OF OPERATIONS * DBL_EPSILON | |||||
| // DOUBLE_EPS_ZGEMV = 5.0 * O(100 * 100) * 2.2e-16 = 1e-11 | |||||
| #define DOUBLE_EPS_ZGEMV 1e-11 | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZSBMV data_zsbmv; | |||||
| /** | |||||
| * Transform full-storage symmetric band matrix A to upper (U) or lower (L) | |||||
| * band-packed storage mode. | |||||
| * | |||||
| * param uplo specifies whether matrix a is upper or lower band-packed. | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| * output param a - buffer for holding symmetric band-packed matrix | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param sb_matrix - buffer holding full-storage symmetric band matrix A | |||||
| * param ldm - specifies the leading dimension of A | |||||
| */ | |||||
| static void transform_to_band_storage(char uplo, blasint n, blasint k, double* a, blasint lda, | |||||
| double* sb_matrix, blasint ldm) | |||||
| { | |||||
| blasint i, j, m; | |||||
| if (uplo == 'L') { | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| m = -j; | |||||
| for (i = 2 * j; i < MIN(2 * n, 2 * (j + k + 1)); i += 2) | |||||
| { | |||||
| a[(2*m + i) + j * lda * 2] = sb_matrix[i + j * ldm * 2]; | |||||
| a[(2*m + (i + 1)) + j * lda * 2] = sb_matrix[(i + 1) + j * ldm * 2]; | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| for (j = 0; j < n; j++) | |||||
| { | |||||
| m = k - j; | |||||
| for (i = MAX(0, 2*(j - k)); i <= j*2; i += 2) | |||||
| { | |||||
| a[(2*m + i) + j * lda * 2] = sb_matrix[i + j * ldm * 2]; | |||||
| a[(2*m + (i + 1)) + j * lda * 2] = sb_matrix[(i + 1) + j * ldm * 2]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Generate full-storage symmetric band matrix A with k - super-diagonals | |||||
| * from input symmetric packed matrix in lower packed mode (L) | |||||
| * | |||||
| * output param sb_matrix - buffer for holding full-storage symmetric band matrix. | |||||
| * param sp_matrix - buffer holding input symmetric packed matrix | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| */ | |||||
| static void get_symmetric_band_matr(double *sb_matrix, double *sp_matrix, blasint n, blasint k) | |||||
| { | |||||
| blasint m; | |||||
| blasint i, j; | |||||
| m = 0; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| for (j = 0; j < n * 2; j += 2) | |||||
| { | |||||
| // Make matrix band with k super-diagonals | |||||
| if (fabs((i+1) - ceil((j+1)/2.0)) > k) | |||||
| { | |||||
| sb_matrix[i * n * 2 + j] = 0.0; | |||||
| sb_matrix[i * n * 2 + j + 1] = 0.0; | |||||
| continue; | |||||
| } | |||||
| if (j / 2 < i) | |||||
| { | |||||
| sb_matrix[i * n * 2 + j] = | |||||
| sb_matrix[j * n + i * 2]; | |||||
| sb_matrix[i * n * 2 + j + 1] = | |||||
| sb_matrix[j * n + i * 2 + 1]; | |||||
| } | |||||
| else | |||||
| { | |||||
| sb_matrix[i * n * 2 + j] = sp_matrix[m++]; | |||||
| sb_matrix[i * n * 2 + j + 1] = sp_matrix[m++]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param uplo specifies whether matrix a is upper or lower band-packed. | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param inc_b - stride of vector b_test | |||||
| * param inc_c - stride of vector c_test | |||||
| * param expected_info - expected invalid parameter number in zsbmv | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char uplo, blasint n, blasint k, blasint lda, blasint inc_b, | |||||
| blasint inc_c, int expected_info) | |||||
| { | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double a[2]; | |||||
| drand_generate(a, 2); | |||||
| set_xerbla("ZSBMV ", expected_info); | |||||
| BLASFUNC(zsbmv)(&uplo, &n, &k, alpha, a, &lda, data_zsbmv.b_test, | |||||
| &inc_b, beta, data_zsbmv.c_test, &inc_c); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by zsbmv and zgemv | |||||
| * since zsbmv is zgemv for symmetric band matrix | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param k - number of super-diagonals of A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param lda - specifies the leading dimension of a | |||||
| * param inc_b - stride of vector b_test | |||||
| * param beta - scaling factor for vector c_test | |||||
| * param inc_c - stride of vector c_test | |||||
| * param lda - specifies the leading dimension of a | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zsbmv(char uplo, blasint n, blasint k, double *alpha, blasint lda, | |||||
| blasint inc_b, double *beta, blasint inc_c, blasint ldm) | |||||
| { | |||||
| blasint i; | |||||
| // Trans param for gemv (can use any, since the input matrix is symmetric) | |||||
| char trans = 'N'; | |||||
| // Symmetric band packed matrix for sbmv | |||||
| double a[lda * n * 2]; | |||||
| // Fill symmetric packed matrix sp_matrix, vector b_test, vector c_test | |||||
| drand_generate(data_zsbmv.sp_matrix, n * (n + 1)); | |||||
| drand_generate(data_zsbmv.b_test, n * inc_b * 2); | |||||
| drand_generate(data_zsbmv.c_test, n * inc_c * 2); | |||||
| // Copy vector c_test for zgemv | |||||
| for (i = 0; i < n * inc_c * 2; i++) | |||||
| data_zsbmv.c_verify[i] = data_zsbmv.c_test[i]; | |||||
| // Generate full-storage symmetric band matrix | |||||
| // with k super-diagonals from symmetric packed matrix | |||||
| get_symmetric_band_matr(data_zsbmv.sb_matrix, data_zsbmv.sp_matrix, n, k); | |||||
| // Transform symmetric band matrix from conventional | |||||
| // full matrix storage to band storage for zsbmv | |||||
| transform_to_band_storage(uplo, n, k, a, lda, data_zsbmv.sb_matrix, ldm); | |||||
| BLASFUNC(zgemv)(&trans, &n, &n, alpha, data_zsbmv.sb_matrix, &ldm, data_zsbmv.b_test, | |||||
| &inc_b, beta, data_zsbmv.c_verify, &inc_c); | |||||
| BLASFUNC(zsbmv)(&uplo, &n, &k, alpha, a, &lda, | |||||
| data_zsbmv.b_test, &inc_b, beta, data_zsbmv.c_test, &inc_c); | |||||
| // Find the differences between output vector caculated by zsbmv and zgemv | |||||
| for (i = 0; i < n * inc_c * 2; i++) | |||||
| data_zsbmv.c_test[i] -= data_zsbmv.c_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(dznrm2)(&n, data_zsbmv.c_test, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 0 | |||||
| */ | |||||
| CTEST(zsbmv, upper_k_0_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 1 | |||||
| */ | |||||
| CTEST(zsbmv, upper_k_1_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 1; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(zsbmv, upper_k_2_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(zsbmv, upper_k_2_inc_b_2_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {2.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is upper-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 2 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(zsbmv, upper_k_2_inc_b_2_inc_c_2_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {2.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 0 | |||||
| */ | |||||
| CTEST(zsbmv, lower_k_0_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 1 | |||||
| */ | |||||
| CTEST(zsbmv, lower_k_1_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 1; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 1 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(zsbmv, lower_k_2_inc_b_1_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 1 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(zsbmv, lower_k_2_inc_b_2_inc_c_1_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {2.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test zsbmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * a is lower-band-packed symmetric matrix | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b_test is 2 | |||||
| * Stride of vector c_test is 2 | |||||
| * Number of super-diagonals k is 2 | |||||
| */ | |||||
| CTEST(zsbmv, lower_k_2_inc_b_2_inc_c_2_n_100) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| blasint k = 2; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {2.0, 1.0}; | |||||
| double beta[] = {2.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Check if output matrix a contains any NaNs | |||||
| */ | |||||
| CTEST(zsbmv, check_for_NaN) | |||||
| { | |||||
| blasint n = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = n; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {1.0, 1.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_TRUE(norm == norm); /* NaN == NaN is false */ | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param uplo. | |||||
| * Uplo specifies whether a is in upper (U) or lower (L) band-packed storage mode. | |||||
| */ | |||||
| CTEST(zsbmv, xerbla_uplo_invalid) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'O'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param N - | |||||
| * number of rows and columns of A. Must be at least zero. | |||||
| */ | |||||
| CTEST(zsbmv, xerbla_n_invalid) | |||||
| { | |||||
| blasint n = INVALID, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Check if n - number of rows and columns of A equal zero. | |||||
| */ | |||||
| CTEST(zsbmv, check_n_zero) | |||||
| { | |||||
| blasint n = 0, inc_b = 1, inc_c = 1; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| blasint ldm = 1; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zsbmv(uplo, n, k, alpha, lda, inc_b, beta, inc_c, ldm); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS_ZGEMV); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_b - | |||||
| * stride of vector b_test. Can't be zero. | |||||
| */ | |||||
| CTEST(zsbmv, xerbla_inc_b_zero) | |||||
| { | |||||
| blasint n = 1, inc_b = 0, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 8; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_c - | |||||
| * stride of vector c_test. Can't be zero. | |||||
| */ | |||||
| CTEST(zsbmv, xerbla_inc_c_zero) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 0; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = k + 1; | |||||
| int expected_info = 11; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param k - | |||||
| * number of super-diagonals of A. Must be at least zero. | |||||
| */ | |||||
| CTEST(zsbmv, xerbla_k_invalid) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = INVALID; | |||||
| blasint lda = 1; | |||||
| int expected_info = 3; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param lda - | |||||
| * specifies the leading dimension of a. Must be at least (k+1). | |||||
| */ | |||||
| CTEST(zsbmv, xerbla_lda_invalid) | |||||
| { | |||||
| blasint n = 1, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| blasint k = 0; | |||||
| blasint lda = INVALID; | |||||
| int expected_info = 6; | |||||
| int passed = check_badargs(uplo, n, k, lda, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,165 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZSCAL { | |||||
| double x_test[DATASIZE * 2 * INCREMENT]; | |||||
| double x_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZSCAL data_zscal; | |||||
| /** | |||||
| * zscal reference code | |||||
| * | |||||
| * param n - number of elements of vector x | |||||
| * param alpha - scaling factor for the vector product | |||||
| * param x - buffer holding input vector x | |||||
| * param inc - stride of vector x | |||||
| */ | |||||
| static void zscal_trusted(blasint n, double *alpha, double* x, blasint inc){ | |||||
| blasint i, ip = 0; | |||||
| blasint inc_x2 = 2 * inc; | |||||
| double temp; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| temp = alpha[0] * x[ip] - alpha[1] * x[ip+1]; | |||||
| x[ip+1] = alpha[0] * x[ip+1] + alpha[1] * x[ip]; | |||||
| x[ip] = temp; | |||||
| ip += inc_x2; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by zscal and zscal_trusted | |||||
| * | |||||
| * param api specifies tested api (C or Fortran) | |||||
| * param n - number of elements of vector x | |||||
| * param alpha - scaling factor for the vector product | |||||
| * param inc - stride of vector x | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zscal(char api, blasint n, double *alpha, blasint inc) | |||||
| { | |||||
| blasint i; | |||||
| // Fill vectors x | |||||
| drand_generate(data_zscal.x_test, n * inc * 2); | |||||
| // Copy vector x for zscal_trusted | |||||
| for (i = 0; i < n * 2 * inc; i++) | |||||
| data_zscal.x_verify[i] = data_zscal.x_test[i]; | |||||
| zscal_trusted(n, alpha, data_zscal.x_verify, inc); | |||||
| if(api == 'F') | |||||
| BLASFUNC(zscal)(&n, alpha, data_zscal.x_test, &inc); | |||||
| else | |||||
| cblas_zscal(n, alpha, data_zscal.x_test, inc); | |||||
| // Find the differences between output vector computed by zscal and zscal_trusted | |||||
| for (i = 0; i < n * 2 * inc; i++) | |||||
| data_zscal.x_verify[i] -= data_zscal.x_test[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(dznrm2)(&n, data_zscal.x_verify, &inc); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zscal by comparing it against reference | |||||
| */ | |||||
| CTEST(zscal, alpha_r_zero_alpha_i_not_zero) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 1; | |||||
| double alpha[2] = {0.0, 1.0}; | |||||
| double norm = check_zscal('F', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Fortran API specific test | |||||
| * Test zscal by comparing it against reference | |||||
| */ | |||||
| CTEST(zscal, alpha_r_zero_alpha_i_zero_inc_2) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 2; | |||||
| double alpha[2] = {0.0, 0.0}; | |||||
| double norm = check_zscal('F', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zscal by comparing it against reference | |||||
| */ | |||||
| CTEST(zscal, c_api_alpha_r_zero_alpha_i_not_zero) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 1; | |||||
| double alpha[2] = {0.0, 1.0}; | |||||
| double norm = check_zscal('C', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * C API specific test | |||||
| * Test zscal by comparing it against reference | |||||
| */ | |||||
| CTEST(zscal, c_api_alpha_r_zero_alpha_i_zero_inc_2) | |||||
| { | |||||
| blasint N = DATASIZE; | |||||
| blasint inc = 2; | |||||
| double alpha[2] = {0.0, 0.0}; | |||||
| double norm = check_zscal('C', N, alpha, inc); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,427 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include "common.h" | |||||
| #define DATASIZE 100 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZSPMV { | |||||
| double a_verify[DATASIZE * DATASIZE * 2]; | |||||
| double a_test[DATASIZE * (DATASIZE + 1)]; | |||||
| double b_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_test[DATASIZE * 2 * INCREMENT]; | |||||
| double c_verify[DATASIZE * 2 * INCREMENT]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZSPMV data_zspmv; | |||||
| /** | |||||
| * Compute spmv via gemv since spmv is gemv for symmetric packed matrix | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param a - buffer holding input matrix A | |||||
| * param b - Buffer holding input vector b | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param c - buffer holding input/output vector c | |||||
| * param inc_c - stride of vector c | |||||
| * output param data_zspmv.c_verify - matrix computed by gemv | |||||
| */ | |||||
| static void zspmv_trusted(char uplo, blasint n, double *alpha, double *a, | |||||
| double *b, blasint inc_b, double *beta, double *c, | |||||
| blasint inc_c) | |||||
| { | |||||
| blasint k; | |||||
| blasint i, j; | |||||
| // param for gemv (can use any, since the input matrix is symmetric) | |||||
| char trans = 'N'; | |||||
| // Unpack the input symmetric packed matrix | |||||
| if (uplo == 'L') | |||||
| { | |||||
| k = 0; | |||||
| for (i = 0; i < n; i++) | |||||
| { | |||||
| for (j = 0; j < n * 2; j += 2) | |||||
| { | |||||
| if (j / 2 < i) | |||||
| { | |||||
| data_zspmv.a_verify[i * n * 2 + j] = | |||||
| data_zspmv.a_verify[j * n + i * 2]; | |||||
| data_zspmv.a_verify[i * n * 2 + j + 1] = | |||||
| data_zspmv.a_verify[j * n + i * 2 + 1]; | |||||
| } | |||||
| else | |||||
| { | |||||
| data_zspmv.a_verify[i * n * 2 + j] = a[k++]; | |||||
| data_zspmv.a_verify[i * n * 2 + j + 1] = a[k++]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| k = n * (n + 1) - 1; | |||||
| for (j = 2 * n - 1; j >= 0; j -= 2) | |||||
| { | |||||
| for (i = n - 1; i >= 0; i--) | |||||
| { | |||||
| if (j / 2 < i) | |||||
| { | |||||
| data_zspmv.a_verify[i * n * 2 + j] = | |||||
| data_zspmv.a_verify[(j - 1) * n + i * 2 + 1]; | |||||
| data_zspmv.a_verify[i * n * 2 + j - 1] = | |||||
| data_zspmv.a_verify[(j - 1) * n + i * 2]; | |||||
| } | |||||
| else | |||||
| { | |||||
| data_zspmv.a_verify[i * n * 2 + j] = a[k--]; | |||||
| data_zspmv.a_verify[i * n * 2 + j - 1] = a[k--]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| // Run gemv with unpacked matrix | |||||
| BLASFUNC(zgemv)(&trans, &n, &n, alpha, data_zspmv.a_verify, &n, b, | |||||
| &inc_b, beta, c, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Comapare results computed by zspmv and zspmv_trusted | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param alpha - scaling factor for the matrix-vector product | |||||
| * param inc_b - stride of vector b | |||||
| * param beta - scaling factor for vector c | |||||
| * param inc_c - stride of vector c | |||||
| * return norm of differences | |||||
| */ | |||||
| static double check_zspmv(char uplo, blasint n, double *alpha, blasint inc_b, | |||||
| double *beta, blasint inc_c) | |||||
| { | |||||
| blasint i; | |||||
| // Fill symmetric packed maxtix a, vectors b and c | |||||
| drand_generate(data_zspmv.a_test, n * (n + 1)); | |||||
| drand_generate(data_zspmv.b_test, 2 * n * inc_b); | |||||
| drand_generate(data_zspmv.c_test, 2 * n * inc_c); | |||||
| // Copy vector c for zspmv_trusted | |||||
| for (i = 0; i < n * 2 * inc_c; i++) | |||||
| data_zspmv.c_verify[i] = data_zspmv.c_test[i]; | |||||
| zspmv_trusted(uplo, n, alpha, data_zspmv.a_test, data_zspmv.b_test, | |||||
| inc_b, beta, data_zspmv.c_verify, inc_c); | |||||
| BLASFUNC(zspmv)(&uplo, &n, alpha, data_zspmv.a_test, data_zspmv.b_test, | |||||
| &inc_b, beta, data_zspmv.c_test, &inc_c); | |||||
| // Find the differences between output vector caculated by zspmv and zspmv_trusted | |||||
| for (i = 0; i < n * 2 * inc_c; i++) | |||||
| data_zspmv.c_test[i] -= data_zspmv.c_verify[i]; | |||||
| // Find the norm of differences | |||||
| return BLASFUNC(dznrm2)(&n, data_zspmv.c_test, &inc_c); | |||||
| } | |||||
| /** | |||||
| * Check if error function was called with expected function name | |||||
| * and param info | |||||
| * | |||||
| * param uplo specifies whether matrix A is upper or lower triangular | |||||
| * param n - number of rows and columns of A | |||||
| * param inc_b - stride of vector b | |||||
| * param inc_c - stride of vector c | |||||
| * param expected_info - expected invalid parameter number in zspmv | |||||
| * return TRUE if everything is ok, otherwise FALSE | |||||
| */ | |||||
| static int check_badargs(char uplo, blasint n, blasint inc_b, | |||||
| blasint inc_c, int expected_info) | |||||
| { | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| set_xerbla("ZSPMV ", expected_info); | |||||
| BLASFUNC(zspmv)(&uplo, &n, alpha, data_zspmv.a_test, data_zspmv.b_test, | |||||
| &inc_b, beta, data_zspmv.c_test, &inc_c); | |||||
| return check_error(); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zspmv, upper_inc_b_1_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(zspmv, upper_inc_b_1_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 2; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zspmv, upper_inc_b_2_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 0.0}; | |||||
| double beta[] = {1.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is upper triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(zspmv, upper_inc_b_2_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {2.5, -2.1}; | |||||
| double beta[] = {0.0, 1.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zspmv, lower_inc_b_1_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 1 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(zspmv, lower_inc_b_1_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 2; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 1 | |||||
| */ | |||||
| CTEST(zspmv, lower_inc_b_2_inc_c_1_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 1; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {1.0, 0.0}; | |||||
| double beta[] = {1.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Test zspmv by comparing it against zgemv | |||||
| * with the following options: | |||||
| * | |||||
| * A is lower triangular | |||||
| * Number of rows and columns of A is 100 | |||||
| * Stride of vector b is 2 | |||||
| * Stride of vector c is 2 | |||||
| */ | |||||
| CTEST(zspmv, lower_inc_b_2_inc_c_2_N_100) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 2, inc_c = 2; | |||||
| char uplo = 'L'; | |||||
| double alpha[] = {2.5, -2.1}; | |||||
| double beta[] = {0.0, 1.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_TOL); | |||||
| } | |||||
| /** | |||||
| * Check if output matrix A contains any NaNs | |||||
| */ | |||||
| CTEST(zspmv, check_for_NaN) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| double alpha[] = {1.0, 1.0}; | |||||
| double beta[] = {0.0, 0.0}; | |||||
| double norm = check_zspmv(uplo, N, alpha, inc_b, beta, inc_c); | |||||
| ASSERT_TRUE(norm == norm); /* NaN == NaN is false */ | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param uplo. | |||||
| * uplo specifies whether A is upper or lower triangular. | |||||
| */ | |||||
| CTEST(zspmv, xerbla_uplo_invalid) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'O'; | |||||
| int expected_info = 1; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param N - | |||||
| * number of rows and columns of A. Must be at least zero. | |||||
| */ | |||||
| CTEST(zspmv, xerbla_N_invalid) | |||||
| { | |||||
| blasint N = INVALID, inc_b = 1, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| int expected_info = 2; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_b - | |||||
| * stride of vector b. Can't be zero. | |||||
| */ | |||||
| CTEST(zspmv, xerbla_inc_b_zero) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 0, inc_c = 1; | |||||
| char uplo = 'U'; | |||||
| int expected_info = 6; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| /** | |||||
| * Test error function for an invalid param inc_c - | |||||
| * stride of vector c. Can't be zero. | |||||
| */ | |||||
| CTEST(zspmv, xerbla_inc_c_zero) | |||||
| { | |||||
| blasint N = DATASIZE, inc_b = 1, inc_c = 0; | |||||
| char uplo = 'U'; | |||||
| int expected_info = 9; | |||||
| int passed = check_badargs(uplo, N, inc_b, inc_c, expected_info); | |||||
| ASSERT_EQUAL(TRUE, passed); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,266 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 300 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZTRMV { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double a_verify[DATASIZE * DATASIZE * 2]; | |||||
| double x_test[DATASIZE * INCREMENT * 2]; | |||||
| double x_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZTRMV data_ztrmv; | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * | |||||
| * param uplo specifies whether A is upper or lower triangular | |||||
| * param trans specifies op(A), the transposition (conjugation) operation applied to A | |||||
| * param diag specifies whether the matrix A is unit triangular or not. | |||||
| * param n - numbers of rows and columns of A | |||||
| * param lda - leading dimension of matrix A | |||||
| * param incx - increment for the elements of x | |||||
| * return norm of difference | |||||
| */ | |||||
| static double check_ztrmv(char uplo, char trans, char diag, blasint n, blasint lda, blasint incx) | |||||
| { | |||||
| blasint i; | |||||
| double alpha_conj[] = {1.0, 0.0}; | |||||
| char trans_verify = trans; | |||||
| drand_generate(data_ztrmv.a_test, n * lda * 2); | |||||
| drand_generate(data_ztrmv.x_test, n * incx * 2); | |||||
| for (i = 0; i < n * lda * 2; i++) | |||||
| data_ztrmv.a_verify[i] = data_ztrmv.a_test[i]; | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ztrmv.x_verify[i] = data_ztrmv.x_test[i]; | |||||
| if (trans == 'R'){ | |||||
| cblas_zimatcopy(CblasColMajor, CblasConjNoTrans, n, n, alpha_conj, data_ztrmv.a_verify, lda, lda); | |||||
| trans_verify = 'N'; | |||||
| } | |||||
| BLASFUNC(ztrmv)(&uplo, &trans_verify, &diag, &n, data_ztrmv.a_verify, &lda, | |||||
| data_ztrmv.x_verify, &incx); | |||||
| BLASFUNC(ztrmv)(&uplo, &trans, &diag, &n, data_ztrmv.a_test, &lda, | |||||
| data_ztrmv.x_test, &incx); | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ztrmv.x_verify[i] -= data_ztrmv.x_test[i]; | |||||
| return BLASFUNC(dznrm2)(&n, data_ztrmv.x_verify, &incx); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_upper_not_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_upper_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_lower_not_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_lower_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_upper_not_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_upper_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_lower_not_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrmv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrmv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrmv, conj_notrans_lower_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrmv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,267 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "utest/openblas_utest.h" | |||||
| #include <cblas.h> | |||||
| #include "common.h" | |||||
| #define DATASIZE 300 | |||||
| #define INCREMENT 2 | |||||
| struct DATA_ZTRSV { | |||||
| double a_test[DATASIZE * DATASIZE * 2]; | |||||
| double a_verify[DATASIZE * DATASIZE * 2]; | |||||
| double x_test[DATASIZE * INCREMENT * 2]; | |||||
| double x_verify[DATASIZE * INCREMENT * 2]; | |||||
| }; | |||||
| #ifdef BUILD_COMPLEX16 | |||||
| static struct DATA_ZTRSV data_ztrsv; | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * | |||||
| * param uplo specifies whether A is upper or lower triangular | |||||
| * param trans specifies op(A), the transposition (conjugation) operation applied to A | |||||
| * param diag specifies whether the matrix A is unit triangular or not. | |||||
| * param n - numbers of rows and columns of A | |||||
| * param lda - leading dimension of matrix A | |||||
| * param incx - increment for the elements of x | |||||
| * return norm of difference | |||||
| */ | |||||
| static double check_ztrsv(char uplo, char trans, char diag, blasint n, blasint lda, blasint incx) | |||||
| { | |||||
| blasint i; | |||||
| double alpha_conj[] = {1.0, 0.0}; | |||||
| char trans_verify = trans; | |||||
| drand_generate(data_ztrsv.a_test, n * lda * 2); | |||||
| drand_generate(data_ztrsv.x_test, n * incx * 2); | |||||
| for (i = 0; i < n * lda * 2; i++) | |||||
| data_ztrsv.a_verify[i] = data_ztrsv.a_test[i]; | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ztrsv.x_verify[i] = data_ztrsv.x_test[i]; | |||||
| if (trans == 'R'){ | |||||
| cblas_zimatcopy(CblasColMajor, CblasConjNoTrans, n, n, | |||||
| alpha_conj, data_ztrsv.a_verify, lda, lda); | |||||
| trans_verify = 'N'; | |||||
| } | |||||
| BLASFUNC(ztrsv)(&uplo, &trans_verify, &diag, &n, data_ztrsv.a_verify, | |||||
| &lda, data_ztrsv.x_verify, &incx); | |||||
| BLASFUNC(ztrsv)(&uplo, &trans, &diag, &n, data_ztrsv.a_test, &lda, | |||||
| data_ztrsv.x_test, &incx); | |||||
| for (i = 0; i < n * incx * 2; i++) | |||||
| data_ztrsv.x_verify[i] -= data_ztrsv.x_test[i]; | |||||
| return BLASFUNC(dznrm2)(&n, data_ztrsv.x_verify, &incx); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_upper_not_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_upper_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_lower_not_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_lower_unit_triangular) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 1, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_upper_not_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is upper triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_upper_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'U'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is not unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_lower_not_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'N'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| /** | |||||
| * Test ztrsv with the conjugate and not-transposed matrix A by conjugating matrix A | |||||
| * and comparing it with the non-conjugate ztrsv. | |||||
| * Test with the following options: | |||||
| * | |||||
| * matrix A is conjugate and not-trans | |||||
| * matrix A is lower triangular | |||||
| * matrix A is unit triangular | |||||
| * vector x stride is 2 | |||||
| */ | |||||
| CTEST(ztrsv, conj_notrans_lower_unit_triangular_incx_2) | |||||
| { | |||||
| blasint n = DATASIZE, incx = 2, lda = DATASIZE; | |||||
| char uplo = 'L'; | |||||
| char diag = 'U'; | |||||
| char trans = 'R'; | |||||
| double norm = check_ztrsv(uplo, trans, diag, n, lda, incx); | |||||
| ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS); | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,88 @@ | |||||
| /***************************************************************************** | |||||
| Copyright (c) 2023, The OpenBLAS Project | |||||
| All rights reserved. | |||||
| Redistribution and use in source and binary forms, with or without | |||||
| modification, are permitted provided that the following conditions are | |||||
| met: | |||||
| 1. Redistributions of source code must retain the above copyright | |||||
| notice, this list of conditions and the following disclaimer. | |||||
| 2. 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. | |||||
| 3. Neither the name of the OpenBLAS project nor the names of | |||||
| its contributors may be used to endorse or promote products | |||||
| derived from this software without specific prior written | |||||
| permission. | |||||
| 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 OWNER 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 "common.h" | |||||
| static int link_xerbla=TRUE; | |||||
| static int lerr, _info, ok; | |||||
| static char *rout; | |||||
| static void F77_xerbla(char *srname, void *vinfo) | |||||
| { | |||||
| int info=*(int*)vinfo; | |||||
| if (link_xerbla) | |||||
| { | |||||
| link_xerbla = 0; | |||||
| return; | |||||
| } | |||||
| if (rout != NULL && strcmp(rout, srname) != 0){ | |||||
| printf("***** XERBLA WAS CALLED WITH SRNAME = <%s> INSTEAD OF <%s> *******\n", srname, rout); | |||||
| ok = FALSE; | |||||
| } | |||||
| if (info != _info){ | |||||
| printf("***** XERBLA WAS CALLED WITH INFO = %d INSTEAD OF %d in %s *******\n",info, _info, srname); | |||||
| lerr = TRUE; | |||||
| ok = FALSE; | |||||
| } else lerr = FALSE; | |||||
| } | |||||
| /** | |||||
| * error function redefinition | |||||
| */ | |||||
| int BLASFUNC(xerbla)(char *name, blasint *info, blasint length) | |||||
| { | |||||
| F77_xerbla(name, info); | |||||
| return 0; | |||||
| } | |||||
| int check_error(void) { | |||||
| if (lerr == TRUE ) { | |||||
| printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", _info, rout); | |||||
| ok = FALSE; | |||||
| } | |||||
| lerr = TRUE; | |||||
| return ok; | |||||
| } | |||||
| void set_xerbla(char* current_rout, int expected_info){ | |||||
| if (link_xerbla) /* call these first to link */ | |||||
| F77_xerbla(rout, &_info); | |||||
| ok = TRUE; | |||||
| lerr = TRUE; | |||||
| _info = expected_info; | |||||
| rout = current_rout; | |||||
| } | |||||