hipSPARSE precision support#
This section provides an overview of the numerical precision types supported by the hipSPARSE library for sparse matrix operations.
Supported precision types#
hipSPARSE supports the following precision types across its functions:
Type prefix |
C++ type |
Description |
---|---|---|
|
|
Single-precision real (32-bit) |
|
|
Double-precision real (64-bit) |
|
|
Single-precision complex (32-bit real, 32-bit imaginary) |
|
|
Double-precision complex (64-bit real, 64-bit imaginary) |
Function naming convention#
hipSPARSE follows a naming convention where the precision type is included in the function name:
Functions containing
hipsparseS
operate on single-precision real data.Functions containing
hipsparseD
operate on double-precision real data.Functions containing
hipsparseC
operate on single-precision complex data.Functions containing
hipsparseZ
operate on double-precision complex data.
For example, the dense matrix sparse vector multiplication function is implemented as:
hipsparseSgemvi
- For single-precision real sparse matrices.hipsparseDgemvi
- For double-precision real sparse matrices.hipsparseCgemvi
- For single-precision complex sparse matrices.hipsparseZgemvi
- For double-precision complex sparse matrices.
In the documentation, these functions are often represented generically as hipsparseXgemvi()
, where X
is a
placeholder for the precision type character.
Understanding precision in function signatures#
In the function signatures throughout the documentation, precision information is indicated directly in the parameter types. For example:
hipsparseStatus_t hipsparseSgemvi(hipsparseHandle_t handle,
hipsparseOperation_t transA,
int m,
int n,
const float *alpha,
const float *A,
int lda,
int nnz,
const float *x,
const int *xInd,
const float *beta,
float *y,
hipsparseIndexBase_t idxBase,
void *pBuffer)
The parameter types (float
, double
, hipFloatComplex
, or hipDoubleComplex
)
correspond to the function precision type character and indicate the precision used by that specific function
variant.
Generic functions and mixed precision#
hipSPARSE provides generic functions that allow for mixed-precision operations. These functions use data type enumerations to specify precision when creating matrix or vector descriptors and during computation.
For example, when creating a sparse matrix descriptor:
// Create CSR matrix with single-precision values
hipsparseCreateCsr(&matA, m, n, nnz,
rowPtr, colInd, values,
HIPSPARSE_INDEX_32I, HIPSPARSE_INDEX_32I,
HIPSPARSE_INDEX_BASE_ZERO, HIP_R_32F);
Or when creating a dense vector:
// Create dense vector with double-precision values
hipsparseCreateDnVec(&vecX, size, xValues, HIP_R_64F);
Functions like hipsparseSpMV
use a separate parameter for computation precision:
// Matrix-vector multiplication with computation in single precision
hipsparseSpMV(handle, transA, &alpha, matA, vecX, &beta, vecY,
HIP_R_32F, HIPSPARSE_MV_ALG_DEFAULT, buffer);
This approach enables:
Using different precision types for matrices and vectors.
Specifying computation precision independently of storage precision.
Supporting mixed-precision workflows with a unified API.
The advantage of using different data types is to save on memory bandwidth and storage when a user application allows for it while performing the actual computation in a higher precision.
Real versus complex precision#
Most sparse matrix operations in hipSPARSE support both real and complex precisions, however certain algorithms or optimizations might be specific to real or complex data:
Some functions might have different performance characteristics for complex data compared to real data.
Certain conversion routines might operate differently depending on whether the data is real or complex.
Core precision types#
The four core precision types (s, d, c, z) are supported across most functions in hipSPARSE. Some specialized functions might only support a subset of these types. See the specific function documentation to confirm which precision types are supported for a particular operation.