http://git-wip-us.apache.org/repos/asf/mahout/blob/f7c1f802/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cpp ---------------------------------------------------------------------- diff --git a/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cpp b/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cpp new file mode 100644 index 0000000..a7319d5 --- /dev/null +++ b/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cpp @@ -0,0 +1,420 @@ +/* ========================================================================= + Copyright (c) 2010-2014, Institute for Microelectronics, + Institute for Analysis and Scientific Computing, + TU Wien. + Portions of this software are copyright by UChicago Argonne, LLC. + + ----------------- + ViennaCL - The Vienna Computing Library + ----------------- + + Project Head: Karl Rupp [email protected] + + (A list of authors and contributors can be found in the PDF manual) + + License: MIT (X11), see file LICENSE in the base directory +============================================================================= */ + +// include necessary system headers +#include <iostream> + +#include "viennacl.hpp" +#include "viennacl_private.hpp" + +#include "init_vector.hpp" + +//include basic scalar and vector types of ViennaCL +#include "viennacl/scalar.hpp" +#include "viennacl/vector.hpp" + +//include the generic inner product functions of ViennaCL +#include "viennacl/linalg/inner_prod.hpp" + +//include the generic norm functions of ViennaCL +#include "viennacl/linalg/norm_1.hpp" +#include "viennacl/linalg/norm_2.hpp" +#include "viennacl/linalg/norm_inf.hpp" + +// IxAMAX + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLiamax(ViennaCLInt *index, ViennaCLVector x) +{ + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + + + +// xASUM + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLasum(ViennaCLHostScalar *alpha, ViennaCLVector x) +{ + if ((*alpha)->precision != x->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_float = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_double = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLaxpy(ViennaCLHostScalar alpha, ViennaCLVector x, ViennaCLVector y) +{ + if (alpha->precision != x->precision) + return ViennaCLGenericFailure; + + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 += alpha->value_float * v1; + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 += alpha->value_double * v1; + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + +// xCOPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLcopy(ViennaCLVector x, ViennaCLVector y) +{ + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 = v1; + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 = v1; + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +// xDOT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLdot(ViennaCLHostScalar *alpha, ViennaCLVector x, ViennaCLVector y) +{ + if ((*alpha)->precision != x->precision) + return ViennaCLGenericFailure; + + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + (*alpha)->value_float = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + (*alpha)->value_double = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +// xNRM2 + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLnrm2(ViennaCLHostScalar *alpha, ViennaCLVector x) +{ + if ((*alpha)->precision != x->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_float = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_double = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + + +// xROT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLrot(ViennaCLVector x, ViennaCLVector y, + ViennaCLHostScalar c, ViennaCLHostScalar s) +{ + if (c->precision != x->precision) + return ViennaCLGenericFailure; + + if (s->precision != x->precision) + return ViennaCLGenericFailure; + + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::linalg::plane_rotation(v1, v2, c->value_float, s->value_float); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::linalg::plane_rotation(v1, v2, c->value_double, s->value_double); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +// xSCAL + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLscal(ViennaCLHostScalar alpha, ViennaCLVector x) +{ + if (alpha->precision != x->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + v1 *= alpha->value_float; + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + v1 *= alpha->value_double; + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + +// xSWAP + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLswap(ViennaCLVector x, ViennaCLVector y) +{ + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +
http://git-wip-us.apache.org/repos/asf/mahout/blob/f7c1f802/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cu ---------------------------------------------------------------------- diff --git a/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cu b/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cu new file mode 100644 index 0000000..a7319d5 --- /dev/null +++ b/native-viennaCL/src/main/cpp/libviennacl/src/blas1.cu @@ -0,0 +1,420 @@ +/* ========================================================================= + Copyright (c) 2010-2014, Institute for Microelectronics, + Institute for Analysis and Scientific Computing, + TU Wien. + Portions of this software are copyright by UChicago Argonne, LLC. + + ----------------- + ViennaCL - The Vienna Computing Library + ----------------- + + Project Head: Karl Rupp [email protected] + + (A list of authors and contributors can be found in the PDF manual) + + License: MIT (X11), see file LICENSE in the base directory +============================================================================= */ + +// include necessary system headers +#include <iostream> + +#include "viennacl.hpp" +#include "viennacl_private.hpp" + +#include "init_vector.hpp" + +//include basic scalar and vector types of ViennaCL +#include "viennacl/scalar.hpp" +#include "viennacl/vector.hpp" + +//include the generic inner product functions of ViennaCL +#include "viennacl/linalg/inner_prod.hpp" + +//include the generic norm functions of ViennaCL +#include "viennacl/linalg/norm_1.hpp" +#include "viennacl/linalg/norm_2.hpp" +#include "viennacl/linalg/norm_inf.hpp" + +// IxAMAX + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLiamax(ViennaCLInt *index, ViennaCLVector x) +{ + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + + + +// xASUM + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLasum(ViennaCLHostScalar *alpha, ViennaCLVector x) +{ + if ((*alpha)->precision != x->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_float = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_double = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLaxpy(ViennaCLHostScalar alpha, ViennaCLVector x, ViennaCLVector y) +{ + if (alpha->precision != x->precision) + return ViennaCLGenericFailure; + + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 += alpha->value_float * v1; + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 += alpha->value_double * v1; + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + +// xCOPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLcopy(ViennaCLVector x, ViennaCLVector y) +{ + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 = v1; + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + v2 = v1; + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +// xDOT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLdot(ViennaCLHostScalar *alpha, ViennaCLVector x, ViennaCLVector y) +{ + if ((*alpha)->precision != x->precision) + return ViennaCLGenericFailure; + + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + (*alpha)->value_float = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + (*alpha)->value_double = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +// xNRM2 + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLnrm2(ViennaCLHostScalar *alpha, ViennaCLVector x) +{ + if ((*alpha)->precision != x->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_float = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + (*alpha)->value_double = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + + +// xROT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLrot(ViennaCLVector x, ViennaCLVector y, + ViennaCLHostScalar c, ViennaCLHostScalar s) +{ + if (c->precision != x->precision) + return ViennaCLGenericFailure; + + if (s->precision != x->precision) + return ViennaCLGenericFailure; + + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::linalg::plane_rotation(v1, v2, c->value_float, s->value_float); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::linalg::plane_rotation(v1, v2, c->value_double, s->value_double); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + +// xSCAL + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLscal(ViennaCLHostScalar alpha, ViennaCLVector x) +{ + if (alpha->precision != x->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + v1 *= alpha->value_float; + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + + v1 *= alpha->value_double; + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + +// xSWAP + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLswap(ViennaCLVector x, ViennaCLVector y) +{ + if (x->precision != y->precision) + return ViennaCLGenericFailure; + + viennacl::backend::mem_handle v1_handle; + viennacl::backend::mem_handle v2_handle; + + if (init_vector(v1_handle, x) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + if (init_vector(v2_handle, y) != ViennaCLSuccess) + return ViennaCLGenericFailure; + + switch (x->precision) + { + case ViennaCLFloat: + { + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<float> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; + } + + case ViennaCLDouble: + { + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(v1_handle, static_cast<viennacl::vcl_size_t>(x->size), static_cast<viennacl::vcl_size_t>(x->offset), static_cast<difference_type>(x->inc)); + viennacl::vector_base<double> v2(v2_handle, static_cast<viennacl::vcl_size_t>(y->size), static_cast<viennacl::vcl_size_t>(y->offset), static_cast<difference_type>(y->inc)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; + } + + default: + return ViennaCLGenericFailure; + } +} + + http://git-wip-us.apache.org/repos/asf/mahout/blob/f7c1f802/native-viennaCL/src/main/cpp/libviennacl/src/blas1_cuda.cu ---------------------------------------------------------------------- diff --git a/native-viennaCL/src/main/cpp/libviennacl/src/blas1_cuda.cu b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_cuda.cu new file mode 100644 index 0000000..e6dddbb --- /dev/null +++ b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_cuda.cu @@ -0,0 +1,264 @@ +/* ========================================================================= + Copyright (c) 2010-2014, Institute for Microelectronics, + Institute for Analysis and Scientific Computing, + TU Wien. + Portions of this software are copyright by UChicago Argonne, LLC. + + ----------------- + ViennaCL - The Vienna Computing Library + ----------------- + + Project Head: Karl Rupp [email protected] + + (A list of authors and contributors can be found in the PDF manual) + + License: MIT (X11), see file LICENSE in the base directory +============================================================================= */ + +// include necessary system headers +#include <iostream> + +#include "viennacl.hpp" +#include "viennacl_private.hpp" + +//include basic scalar and vector types of ViennaCL +#include "viennacl/scalar.hpp" +#include "viennacl/vector.hpp" + +//include the generic inner product functions of ViennaCL +#include "viennacl/linalg/inner_prod.hpp" + +//include the generic norm functions of ViennaCL +#include "viennacl/linalg/norm_1.hpp" +#include "viennacl/linalg/norm_2.hpp" +#include "viennacl/linalg/norm_inf.hpp" + + +#ifdef VIENNACL_WITH_CUDA + + +// IxAMAX + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDAiSamax(ViennaCLBackend /*backend*/, ViennaCLInt n, + ViennaCLInt *index, + float *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDAiDamax(ViennaCLBackend /*backend*/, ViennaCLInt n, + ViennaCLInt *index, + double *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + + + +// xASUM + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASasum(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADasum(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASaxpy(ViennaCLBackend /*backend*/, ViennaCLInt n, + float alpha, + float *x, ViennaCLInt offx, ViennaCLInt incx, + float *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<float> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADaxpy(ViennaCLBackend /*backend*/, ViennaCLInt n, + double alpha, + double *x, ViennaCLInt offx, ViennaCLInt incx, + double *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<double> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + + +// xCOPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDAScopy(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, ViennaCLInt incx, + float *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<float> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + v2 = v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADcopy(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, ViennaCLInt incx, + double *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<double> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + v2 = v1; + return ViennaCLSuccess; +} + +// xDOT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASdot(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, ViennaCLInt incx, + float *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<float> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADdot(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, ViennaCLInt incx, + double *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<double> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +// xNRM2 + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASnrm2(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADnrm2(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + + + +// xROT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASrot(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, ViennaCLInt incx, + float *y, ViennaCLInt offy, ViennaCLInt incy, + float c, float s) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<float> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADrot(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, ViennaCLInt incx, + double *y, ViennaCLInt offy, ViennaCLInt incy, + double c, double s) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<double> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + + + +// xSCAL + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASscal(ViennaCLBackend /*backend*/, ViennaCLInt n, + float alpha, + float *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + v1 *= alpha; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADscal(ViennaCLBackend /*backend*/, ViennaCLInt n, + double alpha, + double *x, ViennaCLInt offx, ViennaCLInt incx) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + + v1 *= alpha; + return ViennaCLSuccess; +} + + +// xSWAP + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDASswap(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, ViennaCLInt incx, + float *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<float> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<float> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLCUDADswap(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, ViennaCLInt incx, + double *y, ViennaCLInt offy, ViennaCLInt incy) +{ + viennacl::vector_base<double> v1(x, viennacl::CUDA_MEMORY, n, offx, incx); + viennacl::vector_base<double> v2(y, viennacl::CUDA_MEMORY, n, offy, incy); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} +#endif + + http://git-wip-us.apache.org/repos/asf/mahout/blob/f7c1f802/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cpp ---------------------------------------------------------------------- diff --git a/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cpp b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cpp new file mode 100644 index 0000000..07a5097 --- /dev/null +++ b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cpp @@ -0,0 +1,293 @@ +/* ========================================================================= + Copyright (c) 2010-2014, Institute for Microelectronics, + Institute for Analysis and Scientific Computing, + TU Wien. + Portions of this software are copyright by UChicago Argonne, LLC. + + ----------------- + ViennaCL - The Vienna Computing Library + ----------------- + + Project Head: Karl Rupp [email protected] + + (A list of authors and contributors can be found in the PDF manual) + + License: MIT (X11), see file LICENSE in the base directory +============================================================================= */ + +// include necessary system headers +#include <iostream> + +#include "viennacl.hpp" +#include "viennacl_private.hpp" + +//include basic scalar and vector types of ViennaCL +#include "viennacl/scalar.hpp" +#include "viennacl/vector.hpp" + +//include the generic inner product functions of ViennaCL +#include "viennacl/linalg/inner_prod.hpp" + +//include the generic norm functions of ViennaCL +#include "viennacl/linalg/norm_1.hpp" +#include "viennacl/linalg/norm_2.hpp" +#include "viennacl/linalg/norm_inf.hpp" + + +// IxAMAX + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostiSamax(ViennaCLBackend /*backend*/, ViennaCLInt n, + ViennaCLInt *index, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostiDamax(ViennaCLBackend /*backend*/, ViennaCLInt n, + ViennaCLInt *index, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + + + +// xASUM + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSasum(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDasum(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + + + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSaxpy(ViennaCLBackend /*backend*/, ViennaCLInt n, + float alpha, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDaxpy(ViennaCLBackend /*backend*/, ViennaCLInt n, + double alpha, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + + +// xCOPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostScopy(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 = v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDcopy(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 = v1; + return ViennaCLSuccess; +} + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSdot(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDdot(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +// xNRM2 + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSnrm2(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDnrm2(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + + +// xROT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSrot(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy, + float c, float s) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDrot(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy, + double c, double s) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + + + +// xSCAL + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSscal(ViennaCLBackend /*backend*/, ViennaCLInt n, + float alpha, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + v1 *= alpha; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDscal(ViennaCLBackend /*backend*/, ViennaCLInt n, + double alpha, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + v1 *= alpha; + return ViennaCLSuccess; +} + +// xSWAP + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSswap(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDswap(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} http://git-wip-us.apache.org/repos/asf/mahout/blob/f7c1f802/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cu ---------------------------------------------------------------------- diff --git a/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cu b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cu new file mode 100644 index 0000000..07a5097 --- /dev/null +++ b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_host.cu @@ -0,0 +1,293 @@ +/* ========================================================================= + Copyright (c) 2010-2014, Institute for Microelectronics, + Institute for Analysis and Scientific Computing, + TU Wien. + Portions of this software are copyright by UChicago Argonne, LLC. + + ----------------- + ViennaCL - The Vienna Computing Library + ----------------- + + Project Head: Karl Rupp [email protected] + + (A list of authors and contributors can be found in the PDF manual) + + License: MIT (X11), see file LICENSE in the base directory +============================================================================= */ + +// include necessary system headers +#include <iostream> + +#include "viennacl.hpp" +#include "viennacl_private.hpp" + +//include basic scalar and vector types of ViennaCL +#include "viennacl/scalar.hpp" +#include "viennacl/vector.hpp" + +//include the generic inner product functions of ViennaCL +#include "viennacl/linalg/inner_prod.hpp" + +//include the generic norm functions of ViennaCL +#include "viennacl/linalg/norm_1.hpp" +#include "viennacl/linalg/norm_2.hpp" +#include "viennacl/linalg/norm_inf.hpp" + + +// IxAMAX + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostiSamax(ViennaCLBackend /*backend*/, ViennaCLInt n, + ViennaCLInt *index, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostiDamax(ViennaCLBackend /*backend*/, ViennaCLInt n, + ViennaCLInt *index, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + + + +// xASUM + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSasum(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDasum(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + + + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSaxpy(ViennaCLBackend /*backend*/, ViennaCLInt n, + float alpha, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDaxpy(ViennaCLBackend /*backend*/, ViennaCLInt n, + double alpha, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + + +// xCOPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostScopy(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 = v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDcopy(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + v2 = v1; + return ViennaCLSuccess; +} + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSdot(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDdot(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +// xNRM2 + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSnrm2(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *alpha, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDnrm2(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *alpha, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + + +// xROT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSrot(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy, + float c, float s) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDrot(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy, + double c, double s) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + + + +// xSCAL + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSscal(ViennaCLBackend /*backend*/, ViennaCLInt n, + float alpha, + float *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + v1 *= alpha; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDscal(ViennaCLBackend /*backend*/, ViennaCLInt n, + double alpha, + double *x, ViennaCLInt offx, int incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + + v1 *= alpha; + return ViennaCLSuccess; +} + +// xSWAP + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostSswap(ViennaCLBackend /*backend*/, ViennaCLInt n, + float *x, ViennaCLInt offx, int incx, + float *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<float> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLHostDswap(ViennaCLBackend /*backend*/, ViennaCLInt n, + double *x, ViennaCLInt offx, int incx, + double *y, ViennaCLInt offy, int incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, viennacl::MAIN_MEMORY, size_type(n), size_type(offx), difference_type(incx)); + viennacl::vector_base<double> v2(y, viennacl::MAIN_MEMORY, size_type(n), size_type(offy), difference_type(incy)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} http://git-wip-us.apache.org/repos/asf/mahout/blob/f7c1f802/native-viennaCL/src/main/cpp/libviennacl/src/blas1_opencl.cpp ---------------------------------------------------------------------- diff --git a/native-viennaCL/src/main/cpp/libviennacl/src/blas1_opencl.cpp b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_opencl.cpp new file mode 100644 index 0000000..617b128 --- /dev/null +++ b/native-viennaCL/src/main/cpp/libviennacl/src/blas1_opencl.cpp @@ -0,0 +1,297 @@ +/* ========================================================================= + Copyright (c) 2010-2014, Institute for Microelectronics, + Institute for Analysis and Scientific Computing, + TU Wien. + Portions of this software are copyright by UChicago Argonne, LLC. + + ----------------- + ViennaCL - The Vienna Computing Library + ----------------- + + Project Head: Karl Rupp [email protected] + + (A list of authors and contributors can be found in the PDF manual) + + License: MIT (X11), see file LICENSE in the base directory +============================================================================= */ + +// include necessary system headers +#include <iostream> + +#include "viennacl.hpp" +#include "viennacl_private.hpp" + +//include basic scalar and vector types of ViennaCL +#include "viennacl/scalar.hpp" +#include "viennacl/vector.hpp" + +//include the generic inner product functions of ViennaCL +#include "viennacl/linalg/inner_prod.hpp" + +//include the generic norm functions of ViennaCL +#include "viennacl/linalg/norm_1.hpp" +#include "viennacl/linalg/norm_2.hpp" +#include "viennacl/linalg/norm_inf.hpp" + +#ifdef VIENNACL_WITH_OPENCL + +// IxAMAX + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLiSamax(ViennaCLBackend backend, ViennaCLInt n, + ViennaCLInt *index, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLiDamax(ViennaCLBackend backend, ViennaCLInt n, + ViennaCLInt *index, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *index = static_cast<ViennaCLInt>(viennacl::linalg::index_norm_inf(v1)); + return ViennaCLSuccess; +} + + + + +// xASUM + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSasum(ViennaCLBackend backend, ViennaCLInt n, + float *alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDasum(ViennaCLBackend backend, ViennaCLInt n, + double *alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *alpha = viennacl::linalg::norm_1(v1); + return ViennaCLSuccess; +} + + + +// xAXPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSaxpy(ViennaCLBackend backend, ViennaCLInt n, + float alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<float> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDaxpy(ViennaCLBackend backend, ViennaCLInt n, + double alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<double> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + v2 += alpha * v1; + return ViennaCLSuccess; +} + + +// xCOPY + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLScopy(ViennaCLBackend backend, ViennaCLInt n, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<float> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + v2 = v1; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDcopy(ViennaCLBackend backend, ViennaCLInt n, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<double> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + v2 = v1; + return ViennaCLSuccess; +} + +// xDOT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSdot(ViennaCLBackend backend, ViennaCLInt n, + float *alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<float> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDdot(ViennaCLBackend backend, ViennaCLInt n, + double *alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<double> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *alpha = viennacl::linalg::inner_prod(v1, v2); + return ViennaCLSuccess; +} + + +// xNRM2 + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSnrm2(ViennaCLBackend backend, ViennaCLInt n, + float *alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDnrm2(ViennaCLBackend backend, ViennaCLInt n, + double *alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + *alpha = viennacl::linalg::norm_2(v1); + return ViennaCLSuccess; +} + + +// xROT + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSrot(ViennaCLBackend backend, ViennaCLInt n, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy, + float c, float s) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<float> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDrot(ViennaCLBackend backend, ViennaCLInt n, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy, + double c, double s) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<double> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + viennacl::linalg::plane_rotation(v1, v2, c, s); + return ViennaCLSuccess; +} + + + +// xSCAL + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSscal(ViennaCLBackend backend, ViennaCLInt n, + float alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + v1 *= alpha; + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDscal(ViennaCLBackend backend, ViennaCLInt n, + double alpha, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + v1 *= alpha; + return ViennaCLSuccess; +} + +// xSWAP + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLSswap(ViennaCLBackend backend, ViennaCLInt n, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<float>::size_type size_type; + typedef viennacl::vector_base<float>::size_type difference_type; + viennacl::vector_base<float> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<float> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} + +VIENNACL_EXPORTED_FUNCTION ViennaCLStatus ViennaCLOpenCLDswap(ViennaCLBackend backend, ViennaCLInt n, + cl_mem x, ViennaCLInt offx, ViennaCLInt incx, + cl_mem y, ViennaCLInt offy, ViennaCLInt incy) +{ + typedef viennacl::vector_base<double>::size_type size_type; + typedef viennacl::vector_base<double>::size_type difference_type; + viennacl::vector_base<double> v1(x, size_type(n), size_type(offx), difference_type(incx), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + viennacl::vector_base<double> v2(y, size_type(n), size_type(offy), difference_type(incy), viennacl::ocl::get_context(backend->opencl_backend.context_id)); + + viennacl::swap(v1, v2); + return ViennaCLSuccess; +} +#endif
