.. _onemkl_blas_sbmv:

sbmv
====

Computes a matrix-vector product with a symmetric band matrix.

Description
***********

The ``sbmv`` routines compute a scalar-matrix-vector product and add the result to a scalar-vector product, with a symmetric band matrix. The operation is defined as:

.. math::

      y \leftarrow alpha*A*x + beta*y

where:

- ``alpha`` and ``beta`` are scalars

- ``A`` is ``n`` x ``n`` symmetric matrix with ``k`` super-diagonals

- ``x`` and ``y`` are vectors of length ``n``

``sbmv`` supports the following precisions:

.. list-table::
   :header-rows: 1

   * -  T
   * -  ``float``
   * -  ``double``


sbmv (Buffer Version)
*********************

Syntax
------

.. code-block:: cpp

   namespace oneapi::mkl::blas::column_major {
       void sbmv(sycl::queue &queue,
                 oneapi::mkl::uplo upper_lower,
                 std::int64_t n,
                 std::int64_t k,
                 T alpha,
                 sycl::buffer<T,1> &a,
                 std::int64_t lda,
                 sycl::buffer<T,1> &x,
                 std::int64_t incx,
                 T beta,
                 sycl::buffer<T,1> &y,
                 std::int64_t incy)
   }

.. code-block:: cpp

   namespace oneapi::mkl::blas::row_major {
       void sbmv(sycl::queue &queue,
                 oneapi::mkl::uplo upper_lower,
                 std::int64_t n,
                 std::int64_t k,
                 T alpha,
                 sycl::buffer<T,1> &a,
                 std::int64_t lda,
                 sycl::buffer<T,1> &x,
                 std::int64_t incx,
                 T beta,
                 sycl::buffer<T,1> &y,
                 std::int64_t incy)
   }

Input Parameters
----------------

queue
   The queue where the routine should be executed.

upper_lower
   Specifies whether matrix ``A`` is upper or lower triangular. See :ref:`data-types` for more details.

n
   Number of rows and columns of matrix ``A``. Must be at least zero.

k
   Number of super-diagonals of matrix ``A``. Must be at least zero.

alpha
   Scaling factor for the matrix-vector product.

a
   Buffer holding input matrix ``A``. Size of the buffer must be at least
   ``lda`` * ``n``. See ref:`matrix-storage` for more details.

lda
   Leading dimension of matrix ``A``. Must be at least (``k`` + 1) and positive.

x
   Buffer holding input vector ``x``. Size of the buffer must be at
   least (1 + (``n`` - 1)\*abs(``incx``)). See ref:`matrix-storage` for more details.

incx
   Stride of vector ``x``.

beta
   Scaling factor for vector ``y``.

y
   Buffer holding input/output vector ``y``. Size of the buffer must be 
   at least (1 + (``n`` - 1)\*abs(``incy``)). See ref:`matrix-storage` for more details.

incy
   Stride of vector ``y``.

Output Parameters
-----------------

y
   Buffer holding updated vector ``y``.


sbmv (USM Version)
******************

Syntax
------

.. code-block:: cpp

   namespace oneapi::mkl::blas::column_major {
       sycl::event sbmv(sycl::queue &queue,
                        oneapi::mkl::uplo upper_lower,
                        std::int64_t n,
                        std::int64_t k,
                        T alpha,
                        const T *a,
                        std::int64_t lda,
                        const T *x,
                        std::int64_t incx,
                        T beta,
                        T *y,
                        std::int64_t incy,
                        const std::vector<sycl::event> &dependencies = {})
   }

.. code-block:: cpp

   namespace oneapi::mkl::blas::row_major {
       sycl::event sbmv(sycl::queue &queue,
                        oneapi::mkl::uplo upper_lower,
                        std::int64_t n,
                        std::int64_t k,
                        T alpha,
                        const T *a,
                        std::int64_t lda,
                        const T *x,
                        std::int64_t incx,
                        T beta,
                        T *y,
                        std::int64_t incy,
                        const std::vector<sycl::event> &dependencies = {})
   }

Input Parameters
----------------

queue
   The queue where the routine should be executed.

upper_lower
   Specifies whether matrix ``A`` is upper or lower triangular. See :ref:`data-types` for more details.

n
   Number of rows and columns of matrix ``A``. Must be at least zero.

k
   Number of super-diagonals of matrix ``A``. Must be at least zero.

alpha
   Scaling factor for the matrix-vector product.

a
   Pointer to input matrix ``A``. Size of the array holding input matrix
   ``A`` must be at least ``lda`` * ``n``. See ref:`matrix-storage` for more details.

lda
   Leading dimension of matrix ``A``. Must be at least (``k`` + 1) and positive.

x
   Pointer to input vector ``x``. Size of the array holding input vector
   ``x`` must be at least (1 + (``n`` - 1)\*abs(``incx``)). See ref:`matrix-storage` for more details.

incx
   Stride of vector ``x``.

beta
   Scaling factor for vector ``y``.

y
   Pointer to input/output vector ``y``. Size of the array holding
   input/output vector ``y`` must be at least (1 + (``n`` -
   1)\*abs(``incy``)). See ref:`matrix-storage` for more details.

incy
   Stride of vector ``y``.

dependencies
   List of events to wait for before starting computation, if any. If
   omitted, defaults to no dependencies.

Output Parameters
-----------------

y
   Pointer to updated vector ``y``.

Return Values
-------------

Output event to wait on to ensure computation is complete.