Reference documentation for deal.II version 9.5.0
|
#include <deal.II/lac/cuda_sparse_matrix.h>
Public Types | |
using | size_type = int |
using | value_type = Number |
using | real_type = Number |
Public Member Functions | |
template<class Archive > | |
void | serialize (Archive &ar, const unsigned int version) |
Constructors and initialization | |
SparseMatrix () | |
SparseMatrix (Utilities::CUDA::Handle &handle, const ::SparseMatrix< Number > &sparse_matrix_host) | |
SparseMatrix (CUDAWrappers::SparseMatrix< Number > &&) | |
SparseMatrix (const CUDAWrappers::SparseMatrix< Number > &)=delete | |
~SparseMatrix () | |
SparseMatrix & | operator= (CUDAWrappers::SparseMatrix< Number > &&) |
SparseMatrix & | operator= (const CUDAWrappers::SparseMatrix< Number > &)=delete |
void | reinit (Utilities::CUDA::Handle &handle, const ::SparseMatrix< Number > &sparse_matrix_host) |
Information on the matrix | |
size_type | m () const |
size_type | n () const |
std::size_t | n_nonzero_elements () const |
template<class StreamType > | |
void | print (StreamType &out, const bool across=false, const bool diagonal_first=true) const |
void | print_formatted (std::ostream &out, const unsigned int precision=3, const bool scientific=true, const unsigned int width=0, const char *zero_string=" ", const double denominator=1.) const |
Modifying entries | |
SparseMatrix & | operator*= (const Number factor) |
SparseMatrix & | operator/= (const Number factor) |
Multiplications | |
void | vmult (LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const |
void | Tvmult (LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const |
void | vmult_add (LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const |
void | Tvmult_add (LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const |
Number | matrix_norm_square (const LinearAlgebra::CUDAWrappers::Vector< Number > &v) const |
Number | matrix_scalar_product (const LinearAlgebra::CUDAWrappers::Vector< Number > &u, const LinearAlgebra::CUDAWrappers::Vector< Number > &v) const |
Number | residual (LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &x, const LinearAlgebra::CUDAWrappers::Vector< Number > &b) const |
Matrix norms | |
Number | l1_norm () const |
Number | linfty_norm () const |
Number | frobenius_norm () const |
Access to underlying CUDA data | |
std::tuple< Number *, int *, int *, cusparseMatDescr_t, cusparseSpMatDescr_t > | get_cusparse_matrix () const |
Subscriptor functionality | |
Classes derived from Subscriptor provide a facility to subscribe to this object. This is mostly used by the SmartPointer class. | |
void | subscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
void | unsubscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
unsigned int | n_subscriptions () const |
template<typename StreamType > | |
void | list_subscribers (StreamType &stream) const |
void | list_subscribers () const |
Static Public Member Functions | |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
Private Types | |
using | map_value_type = decltype(counter_map)::value_type |
using | map_iterator = decltype(counter_map)::iterator |
Private Member Functions | |
void | check_no_subscribers () const noexcept |
Private Attributes | |
cusparseHandle_t | cusparse_handle |
int | nnz |
int | n_rows |
int | n_cols |
std::unique_ptr< Number[], void(*)(Number *)> | val_dev |
std::unique_ptr< int[], void(*)(int *)> | column_index_dev |
std::unique_ptr< int[], void(*)(int *)> | row_ptr_dev |
cusparseMatDescr_t | descr |
cusparseSpMatDescr_t | sp_descr |
std::atomic< unsigned int > | counter |
std::map< std::string, unsigned int > | counter_map |
std::vector< std::atomic< bool > * > | validity_pointers |
const std::type_info * | object_info |
Static Private Attributes | |
static std::mutex | mutex |
This class is a wrapper around cuSPARSE csr sparse matrix. Unlike deal.II's own SparseMatrix all elements within each row are stored in increasing column index order.
<float> and <double>
. Definition at line 48 of file cuda_sparse_matrix.h.
using CUDAWrappers::SparseMatrix< Number >::size_type = int |
Declare type for container size.
Definition at line 54 of file cuda_sparse_matrix.h.
using CUDAWrappers::SparseMatrix< Number >::value_type = Number |
Type of the matrix entries.
Definition at line 59 of file cuda_sparse_matrix.h.
using CUDAWrappers::SparseMatrix< Number >::real_type = Number |
Declare a type that holds real-valued numbers with the same precision as the template argument to this class.
Definition at line 65 of file cuda_sparse_matrix.h.
|
privateinherited |
The data type used in counter_map.
Definition at line 230 of file subscriptor.h.
|
privateinherited |
The iterator type used in counter_map.
Definition at line 235 of file subscriptor.h.
SparseMatrix< Number >::SparseMatrix |
Constructor. Initialize the matrix to be empty, without any structure, i.e., the matrix is not usable at all. This constructor is therefore only useful for matrices which are members of a class.
You have to initialize the matrix before usage with reinit.
Definition at line 287 of file cuda_sparse_matrix.cc.
SparseMatrix< Number >::SparseMatrix | ( | Utilities::CUDA::Handle & | handle, |
const ::SparseMatrix< Number > & | sparse_matrix_host | ||
) |
Constructor. Takes a Utilities::CUDA::Handle and a sparse matrix on the host. The sparse matrix on the host is copied on the device and the elements are reordered according to the format supported by cuSPARSE.
Definition at line 300 of file cuda_sparse_matrix.cc.
SparseMatrix< Number >::SparseMatrix | ( | CUDAWrappers::SparseMatrix< Number > && | other | ) |
Move constructor. Create a new SparseMatrix by stealing the internal data.
Definition at line 315 of file cuda_sparse_matrix.cc.
|
delete |
Copy constructor is deleted.
SparseMatrix< Number >::~SparseMatrix< Number > |
Destructor. Free all memory.
Definition at line 315 of file cuda_sparse_matrix.cc.
SparseMatrix< Number > & SparseMatrix< Number >::operator= | ( | CUDAWrappers::SparseMatrix< Number > && | other | ) |
Move assignment operator.
Definition at line 362 of file cuda_sparse_matrix.cc.
|
delete |
Copy assignment is deleted.
void SparseMatrix< Number >::reinit | ( | Utilities::CUDA::Handle & | handle, |
const ::SparseMatrix< Number > & | sparse_matrix_host | ||
) |
Reinitialize the sparse matrix. The sparse matrix on the host is copied to the device and the elementes are reordered according to the format supported by cuSPARSE.
Definition at line 387 of file cuda_sparse_matrix.cc.
|
inline |
Return the dimension of the codomain (or range) space. Note that the matrix is of dimension \(m \times n\).
Definition at line 381 of file cuda_sparse_matrix.h.
|
inline |
Return the dimension of the domain space. Note that the matrix is of dimension \(m \times n\).
Definition at line 390 of file cuda_sparse_matrix.h.
|
inline |
Return the number of nonzero elements of this matrix. Actually, it returns the number of entries in the sparsity pattern; if any of the entries should happen to be zero, it is counted anyway.
Definition at line 399 of file cuda_sparse_matrix.h.
|
inline |
Print the matrix to the given stream, using the format (row,column) value
, i.e. one nonzero entry of the matrix per line. If across
is true, print all entries on a single line, using the format row,column:value.
If the argument diagonal_first
is true, diagonal elements of quadratic matrices are printed first in their row. If it is false, the elements in a row are written in ascending column order.
Definition at line 409 of file cuda_sparse_matrix.h.
void SparseMatrix< Number >::print_formatted | ( | std::ostream & | out, |
const unsigned int | precision = 3 , |
||
const bool | scientific = true , |
||
const unsigned int | width = 0 , |
||
const char * | zero_string = " " , |
||
const double | denominator = 1. |
||
) | const |
Print the matrix in the usual format, i.e. as a matrix and not as a list of nonzero elements. For better readability, elements not in the matrix are displayed as empty space, while matrix elements which are explicitly set to zero are displayed as such.
The parameters allow for a flexible setting of the output format: precision
and scientific
are used to determine the number format, where scientific = false
means fixed point notation. A zero entry for width
makes the function compute a width, but it may be changed to a positive value, if output is crude.
Additionally, a character for an empty value may be specified.
Finally, the whole matrix can be multiplied with a common denominator to produce more readable output, even integers.
Definition at line 465 of file cuda_sparse_matrix.h.
SparseMatrix< Number > & SparseMatrix< Number >::operator*= | ( | const Number | factor | ) |
Multiply the entire matrix by a fixed factor.
Definition at line 481 of file cuda_sparse_matrix.cc.
SparseMatrix< Number > & SparseMatrix< Number >::operator/= | ( | const Number | factor | ) |
Divide the entire matrix by a fixed factor.
Definition at line 496 of file cuda_sparse_matrix.cc.
void SparseMatrix< Number >::vmult | ( | LinearAlgebra::CUDAWrappers::Vector< Number > & | dst, |
const LinearAlgebra::CUDAWrappers::Vector< Number > & | src | ||
) | const |
Matrix-vector multiplication: let \(dst = M \cdot src\) with \(M\) being this matrix.
Definition at line 512 of file cuda_sparse_matrix.cc.
void SparseMatrix< Number >::Tvmult | ( | LinearAlgebra::CUDAWrappers::Vector< Number > & | dst, |
const LinearAlgebra::CUDAWrappers::Vector< Number > & | src | ||
) | const |
Matrix-vector multiplication: let \(dst = M^T \cdot src\) with \(M\) being this matrix. This function does the same as vmult() but takes this transposed matrix.
Definition at line 530 of file cuda_sparse_matrix.cc.
void SparseMatrix< Number >::vmult_add | ( | LinearAlgebra::CUDAWrappers::Vector< Number > & | dst, |
const LinearAlgebra::CUDAWrappers::Vector< Number > & | src | ||
) | const |
Adding matrix-vector multiplication. Add \(M \cdot src\) on \(dst\) with \(M\) being this matrix.
Definition at line 548 of file cuda_sparse_matrix.cc.
void SparseMatrix< Number >::Tvmult_add | ( | LinearAlgebra::CUDAWrappers::Vector< Number > & | dst, |
const LinearAlgebra::CUDAWrappers::Vector< Number > & | src | ||
) | const |
Adding matrix-vector multiplication. Add \(M^T \cdot src\) to \(dst\) with \(M\) being this matrix. This function foes the same as vmult_add() but takes the transposed matrix.
Definition at line 566 of file cuda_sparse_matrix.cc.
Number SparseMatrix< Number >::matrix_norm_square | ( | const LinearAlgebra::CUDAWrappers::Vector< Number > & | v | ) | const |
Return the square of the norm of the vector \(v\) with respect to the norm induced by this matrix, i.e., \(\left(v,Mv\right)\). This is useful, e.g., in the finite context, where the \(L_2\) norm of a function equals the matrix norm with respect to the mass matrix of the vector representing the nodal values of the finite element function.
Obviously, the matrix needs to be quadratic for this operation.
Definition at line 584 of file cuda_sparse_matrix.cc.
Number SparseMatrix< Number >::matrix_scalar_product | ( | const LinearAlgebra::CUDAWrappers::Vector< Number > & | u, |
const LinearAlgebra::CUDAWrappers::Vector< Number > & | v | ||
) | const |
Compute the matrix scalar product \(\left(u,Mv\right)\).
Definition at line 597 of file cuda_sparse_matrix.cc.
Number SparseMatrix< Number >::residual | ( | LinearAlgebra::CUDAWrappers::Vector< Number > & | dst, |
const LinearAlgebra::CUDAWrappers::Vector< Number > & | x, | ||
const LinearAlgebra::CUDAWrappers::Vector< Number > & | b | ||
) | const |
Compute the residual of an equation \(M \cdot x=b\), where the residual is defined to be \(r=b-M \cdot x\). Write the residual into \(dst\). The \(l_2\) norm of the residual vector is returned.
Source \(x\) and destination \(dst\) must not be the same vector.
Definition at line 611 of file cuda_sparse_matrix.cc.
Number SparseMatrix< Number >::l1_norm |
Return the \(l_1\)-norm of the matrix, that is \(|M|_1=\max_{\mathrm{all\ columns\ }j}\sum_{\mathrm{all\ rows\ }i} |M_{ij}|\), (max. sum of columns). This is the natural matrix norm that is compatible to the \(l_1\)-norm for vectors, i.e., \(|Mv|_1\leq |M|_1 |v|_1\).
Definition at line 626 of file cuda_sparse_matrix.cc.
Number SparseMatrix< Number >::linfty_norm |
Return the \(l_\infty\)-norm of the matrix, that is \(|M|_\infty=\max_{\mathrm{all\ rows\ }i}\sum_{\mathrm{all\ columns\ }j} |M_{ij}|\), (max. sum of rows). This is the natural norm that is compatible to the \(l_\infty\)-norm of vectors, i.e., \(|Mv|_\infty \leq |M|_\infty |v|_\infty\).
Definition at line 645 of file cuda_sparse_matrix.cc.
Number SparseMatrix< Number >::frobenius_norm |
Return the frobenius norm of the matrix, i.e., the square root of the sum of squares of all entries in the matrix.
Definition at line 664 of file cuda_sparse_matrix.cc.
std::tuple< Number *, int *, int *, cusparseMatDescr_t, cusparseSpMatDescr_t > SparseMatrix< Number >::get_cusparse_matrix |
Return a tuple containing the pointer to the values of matrix, the pointer to the columns indices, the pointer to the rows pointer, the cuSPARSE matrix description, and the cuSPARSE SP matrix description.
Definition at line 680 of file cuda_sparse_matrix.cc.
|
inherited |
Subscribes a user of the object by storing the pointer validity
. The subscriber may be identified by text supplied as identifier
.
Definition at line 136 of file subscriptor.cc.
|
inherited |
Unsubscribes a user from the object.
identifier
and the validity
pointer must be the same as the one supplied to subscribe(). Definition at line 156 of file subscriptor.cc.
|
inlineinherited |
Return the present number of subscriptions to this object. This allows to use this class for reference counted lifetime determination where the last one to unsubscribe also deletes the object.
Definition at line 300 of file subscriptor.h.
|
inlineinherited |
List the subscribers to the input stream
.
Definition at line 317 of file subscriptor.h.
|
inherited |
List the subscribers to deallog
.
Definition at line 204 of file subscriptor.cc.
|
inlineinherited |
Read or write the data of this object to or from a stream for the purpose of serialization using the BOOST serialization library.
This function does not actually serialize any of the member variables of this class. The reason is that what this class stores is only who subscribes to this object, but who does so at the time of storing the contents of this object does not necessarily have anything to do with who subscribes to the object when it is restored. Consequently, we do not want to overwrite the subscribers at the time of restoring, and then there is no reason to write the subscribers out in the first place.
Definition at line 309 of file subscriptor.h.
|
privatenoexceptinherited |
Check that there are no objects subscribing to this object. If this check passes then it is safe to destroy the current object. It this check fails then this function will either abort or print an error message to deallog (by using the AssertNothrow mechanism), but will not throw an exception.
Definition at line 53 of file subscriptor.cc.
|
private |
cuSPARSE handle used to call cuSPARSE functions.
Definition at line 334 of file cuda_sparse_matrix.h.
|
private |
Number of non-zero elements in the sparse matrix.
Definition at line 339 of file cuda_sparse_matrix.h.
|
private |
Number of rows of the sparse matrix.
Definition at line 344 of file cuda_sparse_matrix.h.
|
private |
Number of columns of the sparse matrix.
Definition at line 349 of file cuda_sparse_matrix.h.
|
private |
Pointer to the values (on the device) of the sparse matrix.
Definition at line 354 of file cuda_sparse_matrix.h.
|
private |
Pointer to the column indices (on the device) of the sparse matrix.
Definition at line 359 of file cuda_sparse_matrix.h.
|
private |
Pointer to the row pointer (on the device) of the sparse matrix.
Definition at line 364 of file cuda_sparse_matrix.h.
|
private |
cuSPARSE description of the matrix.
Definition at line 369 of file cuda_sparse_matrix.h.
|
private |
cuSPARSE description of the sparse matrix.
Definition at line 374 of file cuda_sparse_matrix.h.
|
mutableprivateinherited |
Store the number of objects which subscribed to this object. Initially, this number is zero, and upon destruction it shall be zero again (i.e. all objects which subscribed should have unsubscribed again).
The creator (and owner) of an object is counted in the map below if HE manages to supply identification.
We use the mutable
keyword in order to allow subscription to constant objects also.
This counter may be read from and written to concurrently in multithreaded code: hence we use the std::atomic
class template.
Definition at line 219 of file subscriptor.h.
|
mutableprivateinherited |
In this map, we count subscriptions for each different identification string supplied to subscribe().
Definition at line 225 of file subscriptor.h.
|
mutableprivateinherited |
In this vector, we store pointers to the validity bool in the SmartPointer objects that subscribe to this class.
Definition at line 241 of file subscriptor.h.
|
mutableprivateinherited |
Pointer to the typeinfo object of this object, from which we can later deduce the class name. Since this information on the derived class is neither available in the destructor, nor in the constructor, we obtain it in between and store it here.
Definition at line 249 of file subscriptor.h.
|
staticprivateinherited |
A mutex used to ensure data consistency when printing out the list of subscribers.
Definition at line 271 of file subscriptor.h.