imate
C++/CUDA Reference
Loading...
Searching...
No Matches
cuVectorOperations< DataType > Class Template Reference

A static class for vector operations, similar to level-1 operations of the BLAS library. This class acts as a templated namespace, where all member methods are public and static. More...

#include <cu_vector_operations.h>

Static Public Member Functions

static void copy_vector (cublasHandle_t cublas_handle, const DataType *RESTRICT input_vector, const LongIndexType vector_size, DataType *RESTRICT output_vector)
 Copies a vector to a new vector. Result is written in-place.
 
static void copy_scaled_vector (cublasHandle_t cublas_handle, const DataType *RESTRICT input_vector, const LongIndexType vector_size, const DataType scale, DataType *RESTRICT output_vector)
 Scales a vector and stores to a new vector.
 
static void subtract_scaled_vector (cublasHandle_t cublas_handle, const DataType *RESTRICT input_vector, const LongIndexType vector_size, const DataType scale, DataType *RESTRICT output_vector)
 Subtracts the scaled input vector from the output vector.
 
static DataType inner_product (cublasHandle_t cublas_handle, const DataType *RESTRICT vector1, const DataType *RESTRICT vector2, const LongIndexType vector_size)
 Computes Euclidean inner product of two vectors.
 
static DataType euclidean_norm (cublasHandle_t cublas_handle, const DataType *RESTRICT vector, const LongIndexType vector_size)
 Computes the Euclidean 2-norm of a 1D array.
 
static DataType normalize_vector_in_place (cublasHandle_t cublas_handle, DataType *RESTRICT vector, const LongIndexType vector_size)
 Normalizes a vector based on Euclidean 2-norm. The result is written in-place.
 
static DataType normalize_vector_and_copy (cublasHandle_t cublas_handle, const DataType *RESTRICT vector, const LongIndexType vector_size, DataType *RESTRICT output_vector)
 Normalizes a vector based on Euclidean 2-norm. The result is written into another vector.
 

Detailed Description

template<typename DataType>
class cuVectorOperations< DataType >

A static class for vector operations, similar to level-1 operations of the BLAS library. This class acts as a templated namespace, where all member methods are public and static.

See also
MatrixOperations

Definition at line 64 of file cu_vector_operations.h.

Member Function Documentation

◆ copy_scaled_vector()

template<typename DataType >
void cuVectorOperations< DataType >::copy_scaled_vector ( cublasHandle_t  cublas_handle,
const DataType *RESTRICT  input_vector,
const LongIndexType  vector_size,
const DataType  scale,
DataType *RESTRICT  output_vector 
)
static

Scales a vector and stores to a new vector.

Parameters
[in]cublas_handleThe cuBLAS object handle.
[in]input_vectorA 1D array
[in]vector_sizeLength of vector array
[in]scaleScale coefficient to the input vector. If this is equal to one, the function effectively becomes the same as copy_vector.
[out]output_vectorOutput vector (written in place).

Definition at line 76 of file cu_vector_operations.cu.

82{
83 cublasStatus_t status;
84 int incx = 1;
85 int incy = 1;
86
87 // Copy input to output vector
88 status = cublas_api::cublasXcopy(cublas_handle, vector_size, input_vector,
89 incx, output_vector, incy);
90
91 assert(status == CUBLAS_STATUS_SUCCESS);
92
93 // Scale output vector
94 status = cublas_api::cublasXscal(cublas_handle, vector_size, &scale,
95 output_vector, incy);
96
97 assert(status == CUBLAS_STATUS_SUCCESS);
98}
cublasStatus_t cublasXscal(cublasHandle_t handle, int n, const DataType *RESTRICT alpha, DataType *RESTRICT x, int incx)
cublasStatus_t cublasXcopy(cublasHandle_t handle, int n, const DataType *RESTRICT x, int incx, DataType *RESTRICT y, int incy)

References cublas_api::cublasXcopy(), and cublas_api::cublasXscal().

Referenced by cu_lanczos_tridiagonalization(), and cuVectorOperations< DataType >::normalize_vector_and_copy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ copy_vector()

template<typename DataType >
void cuVectorOperations< DataType >::copy_vector ( cublasHandle_t  cublas_handle,
const DataType *RESTRICT  input_vector,
const LongIndexType  vector_size,
DataType *RESTRICT  output_vector 
)
static

Copies a vector to a new vector. Result is written in-place.

Parameters
[in]cublas_handleThe cuBLAS object handle.
[in]input_vectorA 1D array
[in]vector_sizeLength of vector array
[out]output_vectorOutput vector (written in place).

Definition at line 41 of file cu_vector_operations.cu.

46{
47 int incx = 1;
48 int incy = 1;
49
50 cublasStatus_t status = cublas_api::cublasXcopy(
51 cublas_handle, vector_size, input_vector, incx, output_vector,
52 incy);
53
54 assert(status == CUBLAS_STATUS_SUCCESS);
55}

References cublas_api::cublasXcopy().

Here is the call graph for this function:

◆ euclidean_norm()

template<typename DataType >
DataType cuVectorOperations< DataType >::euclidean_norm ( cublasHandle_t  cublas_handle,
const DataType *RESTRICT  vector,
const LongIndexType  vector_size 
)
static

Computes the Euclidean 2-norm of a 1D array.

Parameters
[in]cublas_handleThe cuBLAS object handle.
[in]vectorA pointer to 1D array
[in]vector_sizeLength of the array
Returns
Euclidean norm

Definition at line 204 of file cu_vector_operations.cu.

208{
209 DataType norm;
210 int incx = 1;
211
212 cublasStatus_t status = cublas_api::cublasXnrm2(
213 cublas_handle, vector_size, vector, incx, &norm);
214
215 assert(status == CUBLAS_STATUS_SUCCESS);
216
217 return norm;
218}
cublasStatus_t cublasXnrm2(cublasHandle_t handle, int n, const DataType *RESTRICT x, int incx, DataType *RESTRICT result)

References cublas_api::cublasXnrm2().

Referenced by cu_lanczos_tridiagonalization(), cuOrthogonalization< DataType >::gram_schmidt_process(), cuVectorOperations< DataType >::normalize_vector_and_copy(), cuVectorOperations< DataType >::normalize_vector_in_place(), and cuOrthogonalization< DataType >::orthogonalize_vectors().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inner_product()

template<typename DataType >
DataType cuVectorOperations< DataType >::inner_product ( cublasHandle_t  cublas_handle,
const DataType *RESTRICT  vector1,
const DataType *RESTRICT  vector2,
const LongIndexType  vector_size 
)
static

Computes Euclidean inner product of two vectors.

Parameters
[in]cublas_handleThe cuBLAS object handle.
[in]vector11D array
[in]vector21D array
[in]vector_sizeLength of array
Returns
Inner product of two vectors.

Definition at line 169 of file cu_vector_operations.cu.

174{
175 DataType inner_prod;
176 int incx = 1;
177 int incy = 1;
178
179 cublasStatus_t status = cublas_api::cublasXdot(
180 cublas_handle, vector_size, vector1, incx, vector2, incy,
181 &inner_prod);
182
183 assert(status == CUBLAS_STATUS_SUCCESS);
184
185 return inner_prod;
186}
cublasStatus_t cublasXdot(cublasHandle_t handle, int n, const DataType *RESTRICT x, int incx, const DataType *RESTRICT y, int incy, DataType *RESTRICT result)

References cublas_api::cublasXdot().

Referenced by cu_lanczos_tridiagonalization(), cuOrthogonalization< DataType >::gram_schmidt_process(), and cuOrthogonalization< DataType >::orthogonalize_vectors().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ normalize_vector_and_copy()

template<typename DataType >
DataType cuVectorOperations< DataType >::normalize_vector_and_copy ( cublasHandle_t  cublas_handle,
const DataType *RESTRICT  vector,
const LongIndexType  vector_size,
DataType *RESTRICT  output_vector 
)
static

Normalizes a vector based on Euclidean 2-norm. The result is written into another vector.

Parameters
[in]cublas_handleThe cuBLAS object handle.
[in]vectorInput vector.
[in]vector_sizeLength of the input vector
[out]output_vectorOutput vector, which is the normalization of the input vector.
Returns
2-norm of the input vector

Definition at line 278 of file cu_vector_operations.cu.

283{
284 // Norm of vector
286 cublas_handle, vector, vector_size);
287
288 // Normalize to output
289 DataType scale = cu_arithmetics::div(
291 norm);
293 vector_size, scale,
294 output_vector);
295
296 return norm;
297}
static void copy_scaled_vector(cublasHandle_t cublas_handle, const DataType *RESTRICT input_vector, const LongIndexType vector_size, const DataType scale, DataType *RESTRICT output_vector)
Scales a vector and stores to a new vector.
static DataType euclidean_norm(cublasHandle_t cublas_handle, const DataType *RESTRICT vector, const LongIndexType vector_size)
Computes the Euclidean 2-norm of a 1D array.
__host__ __device__ DataType abs(const DataType x)
Absolute value of a floating point number.
__host__ __device__ DataType div(const DataType x, const DataType y)
Divide two floating point numbers in round-to-nearest-even mode.

References cu_arithmetics::abs(), cuVectorOperations< DataType >::copy_scaled_vector(), cu_arithmetics::div(), and cuVectorOperations< DataType >::euclidean_norm().

Here is the call graph for this function:

◆ normalize_vector_in_place()

template<typename DataType >
DataType cuVectorOperations< DataType >::normalize_vector_in_place ( cublasHandle_t  cublas_handle,
DataType *RESTRICT  vector,
const LongIndexType  vector_size 
)
static

Normalizes a vector based on Euclidean 2-norm. The result is written in-place.

Parameters
[in]cublas_handleThe cuBLAS object handle.
[in,out]vectorInput vector to be normalized in-place.
[in]vector_sizeLength of the input vector
Returns
2-Norm of the input vector (before normalization)

Definition at line 237 of file cu_vector_operations.cu.

241{
242 // Norm of vector
244 cublas_handle, vector, vector_size);
245
246 // Normalize in place
247 DataType scale = cu_arithmetics::div(
249 norm);
250 int incx = 1;
251 cublasStatus_t status = cublas_api::cublasXscal(
252 cublas_handle, vector_size, &scale, vector, incx);
253
254 assert(status == CUBLAS_STATUS_SUCCESS);
255
256 return norm;
257}

References cu_arithmetics::abs(), cublas_api::cublasXscal(), cu_arithmetics::div(), and cuVectorOperations< DataType >::euclidean_norm().

Referenced by cu_golub_kahn_bidiagonalization().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ subtract_scaled_vector()

template<typename DataType >
void cuVectorOperations< DataType >::subtract_scaled_vector ( cublasHandle_t  cublas_handle,
const DataType *RESTRICT  input_vector,
const LongIndexType  vector_size,
const DataType  scale,
DataType *RESTRICT  output_vector 
)
static

Subtracts the scaled input vector from the output vector.

Performs the following operation:

\[ \boldsymbol{b} = \boldsymbol{b} - c \boldsymbol{a}, \]

where

  • \( \boldsymbol{a} \) is the input vector,
  • \( c \) is a scalar scale to the input vector, and
  • \( \boldsymbol{b} \) is the output vector that is written in-place.
Parameters
[in]cublas_handleThe cuBLAS object handle.
[in]input_vectorA 1D array
[in]vector_sizeLength of vector array
[in]scaleScale coefficient to the input vector.
[in,out]output_vectorOutput vector (written in place).

Definition at line 128 of file cu_vector_operations.cu.

134{
135 DataType zero = 0.0;
136 if (cu_arithmetics::is_equal(scale, zero))
137 {
138 return;
139 }
140
141 int incx = 1;
142 int incy = 1;
143
144 DataType neg_scale = -scale;
145 cublasStatus_t status = cublas_api::cublasXaxpy(
146 cublas_handle, vector_size, &neg_scale, input_vector, incx,
147 output_vector, incy);
148
149 assert(status == CUBLAS_STATUS_SUCCESS);
150}
bool is_equal(DataType x, DataType y)
Check if two floating point numbers are equal within a tolerance.
cublasStatus_t cublasXaxpy(cublasHandle_t handle, int n, const DataType *RESTRICT alpha, const DataType *RESTRICT x, int incx, DataType *RESTRICT y, int incy)

References cublas_api::cublasXaxpy(), and cu_arithmetics::is_equal().

Referenced by cuAffineMatrixFunction< DataType >::_add_scaled_vector(), cu_golub_kahn_bidiagonalization(), cu_lanczos_tridiagonalization(), cuOrthogonalization< DataType >::gram_schmidt_process(), and cuOrthogonalization< DataType >::orthogonalize_vectors().

Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following files: