From ea59a5c93cde1467a3715abc53dda4aecf961873 Mon Sep 17 00:00:00 2001 From: "Field G. Van Zee" Date: Tue, 22 Jul 2014 14:36:02 -0500 Subject: [PATCH] Added new level-1d operation: setid. Details: - Defined a new level-1d operation, setid, which sets the imaginary elements of an object's diagonal to a single scalar. This can be useful, for example, when trying to make the diagonal of a Hermitian matrix real-valued. --- frame/1d/setid/bli_setid.c | 88 +++++++++++++++++++ frame/1d/setid/bli_setid.h | 61 +++++++++++++ frame/1d/setid/bli_setid_check.c | 66 ++++++++++++++ frame/1d/setid/bli_setid_check.h | 36 ++++++++ frame/1d/setid/bli_setid_unb_var1.c | 129 ++++++++++++++++++++++++++++ frame/1d/setid/bli_setid_unb_var1.h | 51 +++++++++++ frame/include/blis.h | 1 + 7 files changed, 432 insertions(+) create mode 100644 frame/1d/setid/bli_setid.c create mode 100644 frame/1d/setid/bli_setid.h create mode 100644 frame/1d/setid/bli_setid_check.c create mode 100644 frame/1d/setid/bli_setid_check.h create mode 100644 frame/1d/setid/bli_setid_unb_var1.c create mode 100644 frame/1d/setid/bli_setid_unb_var1.h diff --git a/frame/1d/setid/bli_setid.c b/frame/1d/setid/bli_setid.c new file mode 100644 index 000000000..c87a605e5 --- /dev/null +++ b/frame/1d/setid/bli_setid.c @@ -0,0 +1,88 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of The University of Texas at Austin 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 + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "blis.h" + + +// +// Define object-based interface. +// +void bli_setid( obj_t* beta, + obj_t* x ) +{ + num_t dt_xr; + obj_t beta_local; + + if ( bli_error_checking_is_enabled() ) + bli_setid_check( beta, x ); + + // Use the real projection of the datatype of x as the target type + // for beta (since we do not assume mixed domain/type support is + // enabled). + dt_xr = bli_obj_datatype_proj_to_real( *x ); + + // Create an object to hold a copy-cast of alpha. + bli_obj_scalar_init_detached_copy_of( dt_xr, + BLIS_NO_CONJUGATE, + beta, + &beta_local ); + + bli_setid_unb_var1( &beta_local, + x ); +} + + +// +// Define BLAS-like interfaces with homogeneous-typed operands. +// +#undef GENTFUNCR +#define GENTFUNCR( ctype_x, ctype_r, chx, chr, opname, varname ) \ +\ +void PASTEMAC(chx,opname)( \ + doff_t diagoffx, \ + dim_t m, \ + dim_t n, \ + ctype_r* beta, \ + ctype_x* x, inc_t rs_x, inc_t cs_x \ + ) \ +{ \ + PASTEMAC(chx,varname)( diagoffx, \ + m, \ + n, \ + beta, \ + x, rs_x, cs_x ); \ +} + +INSERT_GENTFUNCR_BASIC( setid, setid_unb_var1 ) + diff --git a/frame/1d/setid/bli_setid.h b/frame/1d/setid/bli_setid.h new file mode 100644 index 000000000..bef6eac8e --- /dev/null +++ b/frame/1d/setid/bli_setid.h @@ -0,0 +1,61 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of The University of Texas at Austin 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 + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "bli_setid_check.h" +#include "bli_setid_unb_var1.h" + + +// +// Define object-based interface. +// +void bli_setid( obj_t* beta, + obj_t* x ); + + +// +// Define BLAS-like interfaces with homogeneous-typed operands. +// +#undef GENTPROTR +#define GENTPROTR( ctype_x, ctype_r, chx, chr, opname ) \ +\ +void PASTEMAC(chx,opname)( \ + doff_t diagoffx, \ + dim_t m, \ + dim_t n, \ + ctype_r* beta, \ + ctype_x* x, inc_t rs_x, inc_t cs_x \ + ); + +INSERT_GENTPROTR_BASIC( setid ) + diff --git a/frame/1d/setid/bli_setid_check.c b/frame/1d/setid/bli_setid_check.c new file mode 100644 index 000000000..2282020a3 --- /dev/null +++ b/frame/1d/setid/bli_setid_check.c @@ -0,0 +1,66 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of The University of Texas at Austin 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 + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "blis.h" + +void bli_setid_check( obj_t* beta, + obj_t* x ) +{ + err_t e_val; + + // Check object datatypes. + + e_val = bli_check_noninteger_object( beta ); + bli_check_error_code( e_val ); + + e_val = bli_check_floating_object( x ); + bli_check_error_code( e_val ); + + // Check object dimensions. + + e_val = bli_check_scalar_object( beta ); + bli_check_error_code( e_val ); + + e_val = bli_check_matrix_object( x ); + bli_check_error_code( e_val ); + + // Check object buffers (for non-NULLness). + + e_val = bli_check_object_buffer( beta ); + bli_check_error_code( e_val ); + + e_val = bli_check_object_buffer( x ); + bli_check_error_code( e_val ); +} + diff --git a/frame/1d/setid/bli_setid_check.h b/frame/1d/setid/bli_setid_check.h new file mode 100644 index 000000000..c2cd0ec54 --- /dev/null +++ b/frame/1d/setid/bli_setid_check.h @@ -0,0 +1,36 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of The University of Texas at Austin 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 + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +void bli_setid_check( obj_t* beta, + obj_t* x ); diff --git a/frame/1d/setid/bli_setid_unb_var1.c b/frame/1d/setid/bli_setid_unb_var1.c new file mode 100644 index 000000000..f03c434e3 --- /dev/null +++ b/frame/1d/setid/bli_setid_unb_var1.c @@ -0,0 +1,129 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of The University of Texas at Austin 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 + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "blis.h" + +#define FUNCPTR_T setid_fp + +typedef void (*FUNCPTR_T)( + doff_t diagoffx, + dim_t m, + dim_t n, + void* beta, + void* x, inc_t rs_x, inc_t cs_x + ); + +static FUNCPTR_T GENARRAY(ftypes,setid_unb_var1); + + +void bli_setid_unb_var1( obj_t* beta, + obj_t* x ) +{ + num_t dt_xr = bli_obj_datatype_proj_to_real( *x ); + num_t dt_x = bli_obj_datatype( *x ); + + doff_t diagoffx = bli_obj_diag_offset( *x ); + + dim_t m = bli_obj_length( *x ); + dim_t n = bli_obj_width( *x ); + + void* buf_beta = bli_obj_buffer_for_1x1( dt_xr, *beta ); + + void* buf_x = bli_obj_buffer_at_off( *x ); + inc_t rs_x = bli_obj_row_stride( *x ); + inc_t cs_x = bli_obj_col_stride( *x ); + + FUNCPTR_T f; + + // Index into the type combination array to extract the correct + // function pointer. + f = ftypes[dt_x]; + + // Invoke the function. + f( diagoffx, + m, + n, + buf_beta, + buf_x, rs_x, cs_x ); +} + + +#undef GENTFUNCR +#define GENTFUNCR( ctype_x, ctype_r, chx, chr, varname, kername ) \ +\ +void PASTEMAC(chx,varname)( \ + doff_t diagoffx, \ + dim_t m, \ + dim_t n, \ + void* beta, \ + void* x, inc_t rs_x, inc_t cs_x \ + ) \ +{ \ + ctype_r* beta_cast = beta; \ + ctype_x* x_cast = x; \ + ctype_x* x1; \ + ctype_x* chi11; \ + dim_t n_elem; \ + dim_t offx; \ + inc_t incx; \ + dim_t i; \ +\ + /* Eliminate unused variable warnings. */ \ + ( void )beta_cast; \ + ( void )chi11; \ +\ + if ( bli_zero_dim2( m, n ) ) return; \ +\ + if ( bli_is_outside_diag( diagoffx, BLIS_NO_TRANSPOSE, m, n ) ) return; \ +\ + /* Determine the distance to the diagonal, the number of diagonal + elements, and the diagonal increment. */ \ + bli_set_dims_incs_1d( diagoffx, \ + m, n, rs_x, cs_x, \ + offx, n_elem, incx ); \ +\ + x1 = x_cast + offx; \ +\ + for ( i = 0; i < n_elem; ++i ) \ + { \ + chi11 = x1 + (i )*incx; \ +\ + PASTEMAC(chx,setis)( *beta_cast, *chi11 ); \ + } \ +} + +// Define the basic set of functions unconditionally, and then also some +// mixed datatype functions if requested. +INSERT_GENTFUNCR_BASIC( setid_unb_var1, NULL ) + diff --git a/frame/1d/setid/bli_setid_unb_var1.h b/frame/1d/setid/bli_setid_unb_var1.h new file mode 100644 index 000000000..a39aae5d7 --- /dev/null +++ b/frame/1d/setid/bli_setid_unb_var1.h @@ -0,0 +1,51 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of The University of Texas at Austin 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 + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +void bli_setid_unb_var1( obj_t* beta, + obj_t* x ); + + +#undef GENTPROTR +#define GENTPROTR( ctype_x, ctype_r, chx, chr, varname ) \ +\ +void PASTEMAC(chx,varname)( \ + doff_t diagoffx, \ + dim_t m, \ + dim_t n, \ + void* beta, \ + void* x, inc_t rs_x, inc_t cs_x \ + ); + +INSERT_GENTPROTR_BASIC( setid_unb_var1 ) + diff --git a/frame/include/blis.h b/frame/include/blis.h index e112b0be7..935a806be 100644 --- a/frame/include/blis.h +++ b/frame/include/blis.h @@ -158,6 +158,7 @@ extern "C" { #include "bli_invertd.h" #include "bli_scald.h" #include "bli_setd.h" +#include "bli_setid.h" // two diagonal operands #include "bli_addd.h" #include "bli_axpyd.h"