Actual source code: blas_cyclic.h
1: #pragma once
3: #include <petscvec.h>
4: #include <petscmat.h>
6: /*
7: Dense linear algebra for vectors and matrices that are _cyclically indexed_.
9: For a Vec, this means that it has a fixed size m, but it is for storing data from a sliding window of _history
10: indices_. Rather than rearranging the vector as the window slides, we insert the value v_i for history index i in the
11: location v[i % m].
13: This has the following effects on linear algebra:
15: - Sometimes we are dealing with a window that is smaller than m, e.g. doing y[i % m] <- alpha x[i % m], but not all
16: values in [0, m) are active. We want the linear algebra routines to leave the inactive indices
17: untouched.
19: - We sometimes need operations that work on the upper triangle of a matrix _with respect to history indices_, i.e.
20: operating on the values
22: A[i % m, j % m], i <= j
24: The functions defined here dispatch linear algebra operations, described by the range of history indices [oldest, next) that
25: they act on, to the appropriate backend blas-like (BLAS, cuBLAS, hipBLAS) libraries.
26: */
28: PETSC_INTERN PetscLogEvent AXPBY_Cyc;
29: PETSC_INTERN PetscLogEvent DMV_Cyc;
30: PETSC_INTERN PetscLogEvent DSV_Cyc;
31: PETSC_INTERN PetscLogEvent TRSV_Cyc;
32: PETSC_INTERN PetscLogEvent GEMV_Cyc;
33: PETSC_INTERN PetscLogEvent HEMV_Cyc;
35: /* These methods are intended for small vectors / dense matrices that are either sequential or have all of their entries on the first rank */
36: // y <- alpha * x + beta * y
37: PETSC_INTERN PetscErrorCode VecAXPBYCyclic(PetscInt, PetscInt, PetscScalar, Vec, PetscScalar, Vec);
38: // y <- alpha * (A .* x) + beta * y
39: PETSC_INTERN PetscErrorCode VecDMVCyclic(PetscBool, PetscInt, PetscInt, PetscScalar, Vec, Vec, PetscScalar, Vec);
40: // y <- (x ./ A)
41: PETSC_INTERN PetscErrorCode VecDSVCyclic(PetscBool, PetscInt, PetscInt, Vec, Vec, Vec);
42: // y <- (triu(A) \ x)
43: PETSC_INTERN PetscErrorCode MatSeqDenseTRSVCyclic(PetscBool, PetscInt, PetscInt, Mat, Vec, Vec);
44: // y <- alpha * A * x + beta * y
45: PETSC_INTERN PetscErrorCode MatSeqDenseGEMVCyclic(PetscBool, PetscInt, PetscInt, PetscScalar, Mat, Vec, PetscScalar, Vec);
46: // y <- alpha * symm(A) * x + beta * y [sym(A) = triu(A) + striu(A)^H]
47: PETSC_INTERN PetscErrorCode MatSeqDenseHEMVCyclic(PetscInt, PetscInt, PetscScalar, Mat, Vec, PetscScalar, Vec);
48: // A[i,:] <- alpha * x + beta * A[i,:]
49: PETSC_INTERN PetscErrorCode MatSeqDenseRowAXPBYCyclic(PetscInt, PetscInt, PetscScalar, Vec, PetscScalar, Mat, PetscInt);
51: /* These methods are intended for for tall matrices of column vectors where we would like to compute products with ranges of the
52: vectors. The column layout should place all columns on the first rank. Because they may involve MPI communication,
53: they rely on implementations from the dense matrix backends */
54: PETSC_INTERN PetscErrorCode MatMultColumnRange(Mat, Vec, Vec, PetscInt, PetscInt);
55: PETSC_INTERN PetscErrorCode MatMultAddColumnRange(Mat, Vec, Vec, Vec, PetscInt, PetscInt);
56: PETSC_INTERN PetscErrorCode MatMultHermitianTransposeColumnRange(Mat, Vec, Vec, PetscInt, PetscInt);
57: PETSC_INTERN PetscErrorCode MatMultHermitianTransposeAddColumnRange(Mat, Vec, Vec, Vec, PetscInt, PetscInt);