Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify GMRES kernels #861

Merged
merged 7 commits into from
Nov 3, 2022
Merged

Simplify GMRES kernels #861

merged 7 commits into from
Nov 3, 2022

Conversation

upsj
Copy link
Member

@upsj upsj commented Aug 18, 2021

This PR separates the step1 and initialize2 kernels into individual reductions (norm and dot) and axpy/scale operations, which allows us to use the simple kernel setup for all of GMRES as well. This will also simplify the addition of CGS-Arnoldi to plain GMRES (and distributed GMRES later on)

The branch is based on simple_kernel_reduction, which is why the changes are a bit obscured. But the base isn't strictly necessary, so I could remove it.

TODO:

@upsj upsj self-assigned this Aug 18, 2021
@ginkgo-bot ginkgo-bot added mod:all This touches all Ginkgo modules. reg:build This is related to the build system. reg:ci-cd This is related to the continuous integration system. reg:helper-scripts This issue/PR is related to the helper scripts mainly concerned with development of Ginkgo. reg:testing This is related to testing. type:matrix-format This is related to the Matrix formats type:solver This is related to the solvers labels Aug 18, 2021
@upsj upsj requested a review from a team August 18, 2021 15:51
@upsj upsj added this to the Ginkgo 1.5.0 milestone Aug 18, 2021
@upsj upsj added this to In Progress in Ginkgo development Aug 22, 2021
@upsj upsj added the 1:ST:need-feedback The PR is somewhat ready but feedback on a blocking topic is required before a proper review. label Oct 6, 2021
@upsj upsj mentioned this pull request Feb 11, 2022
@upsj upsj mentioned this pull request Feb 22, 2022
1 task
@upsj upsj added 1:ST:WIP This PR is a work in progress. Not ready for review. and removed 1:ST:need-feedback The PR is somewhat ready but feedback on a blocking topic is required before a proper review. labels Mar 10, 2022
@upsj upsj force-pushed the gmres_simplify branch 2 times, most recently from 5ef2d18 to e6f49ac Compare May 9, 2022 12:07
@upsj upsj added 1:ST:ready-for-review This PR is ready for review and removed 1:ST:WIP This PR is a work in progress. Not ready for review. labels May 9, 2022
@upsj upsj requested review from a team and removed request for a team May 9, 2022 12:09
Copy link
Member

@yhmtsai yhmtsai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

about the performance check, do you also check for multiple right hand side?

core/solver/cb_gmres.cpp Outdated Show resolved Hide resolved
common/unified/solver/common_gmres_kernels.cpp Outdated Show resolved Hide resolved
common/unified/solver/gmres_kernels.cpp Show resolved Hide resolved
Comment on lines -201 to +241
.check(RelativeStoppingId, true, &stop_status, &one_changed)) {
.check(RelativeStoppingId, false, &stop_status, &one_changed)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why you change true to false?

core/solver/gmres.cpp Outdated Show resolved Hide resolved
reference/solver/common_gmres_kernels.cpp Show resolved Hide resolved
test/solver/gmres_kernels.cpp Outdated Show resolved Hide resolved

ref_solver->apply(b.get(), x.get());
exec_solver->apply(d_b.get(), d_x.get());

GKO_ASSERT_MTX_NEAR(d_x, x, r<value_type>::value * 100);
GKO_ASSERT_MTX_NEAR(d_b, b, 0);
GKO_ASSERT_MTX_NEAR(d_x, x, r<value_type>::value * 1e3);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you know which case needs larger criterion?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I just left the values in there it already had. I am also not sure why d_b and b is checked as it should be a direct copy.

@sonarcloud
Copy link

sonarcloud bot commented Nov 1, 2022

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 65 Code Smells

66.1% 66.1% Coverage
8.9% 8.9% Duplication

@thoasm
Copy link
Member

thoasm commented Nov 2, 2022

@yhmtsai I ran the same benchmark with 4 RHS:

Matrix name develop iters develop time [s] gmres_simplify iters gmres_simplify time [s]
G3_circuit 704 9.09 704 8.10
t2em 219 1.55 219 1.49
circuit5M_dc 42 0.65 42 0.55
audikw_1 17169 196.05 12747 140.18
Bump_2911 40862 1205.90 40368 1058.94
ecology1 1219 9.81 1219 9.28
ss 1089 16.14 1089 14.50
mc2depi 3345 13.10 3294 13.78

Only mc2depi seems to be slower, the rest is faster with this PR.

@tcojean
Copy link
Member

tcojean commented Nov 2, 2022

Nice results, thanks Thomas.

Copy link
Member

@yhmtsai yhmtsai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not review the answer of hessenbergqr yet.
should cb_gmres use workspace?
others look good to me

common/unified/solver/gmres_kernels.cpp Show resolved Hide resolved
Comment on lines +243 to +250
auto hessenberg =
Vector::create(exec, dim<2>{krylov_dim + 1, krylov_dim * num_rhs});
auto buffer = Vector::create(exec, dim<2>{krylov_dim + 1, num_rhs});
auto givens_sin = Vector::create(exec, dim<2>{krylov_dim, num_rhs});
auto givens_cos = Vector::create(exec, dim<2>{krylov_dim, num_rhs});
auto residual_norm_collection =
Vector::create(exec, dim<2>{krylov_dim + 1, num_rhs});
auto residual_norm = VectorNorms::create(exec, dim<2>{1, num_rhs});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

workspace?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I remember correctly, it was not added to the workspace because the at least the krylov_bases can't use the workspace (as the type is runtime dependent).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic behind not adopting CB-GMRES to the workspace was that it will be done when CB-GMRES is also getting the simplified kernels. Currently, only kernel names have been changed (and num_rhs is used instead of ->get_size()[1]).
I would like to adopt the workspace that in a separate PR (all at once including the krylov_bases).

reference/solver/common_gmres_kernels.cpp Outdated Show resolved Hide resolved
reference/test/solver/gmres_kernels.cpp Show resolved Hide resolved
reference/test/solver/gmres_kernels.cpp Outdated Show resolved Hide resolved
dpcpp/solver/cb_gmres_kernels.dp.cpp Outdated Show resolved Hide resolved
core/solver/gmres.cpp Outdated Show resolved Hide resolved
Copy link
Member

@yhmtsai yhmtsai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I finish the HessenbergQr answer check.
I am confusing of the documentation and updating iteration.
from the memory movement, it seems to d iteration for (0-(d-1) update + one restart).
from the updating iteration, it seems to 1 iteration contains (0-(d-1) update + one restart).?

reference/test/solver/gmres_kernels.cpp Show resolved Hide resolved
@thoasm
Copy link
Member

thoasm commented Nov 3, 2022

format-rebase!

@ginkgo-bot
Copy link
Member

Formatting rebase introduced changes, see Artifacts here to review them

@ginkgo-bot
Copy link
Member

Note: This PR changes the Ginkgo ABI:

Functions changes summary: 0 Removed, 0 Changed (16 filtered out), 6 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

For details check the full ABI diff under Artifacts here

Copy link
Member

@yhmtsai yhmtsai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The finalize is in multi_axpy now and the iteration count is still the same as develop.
LGTM.

Ginkgo development automation moved this from In Progress to Awaiting Merge Nov 3, 2022
@thoasm thoasm added the 1:ST:ready-to-merge This PR is ready to merge. label Nov 3, 2022
upsj and others added 7 commits November 3, 2022 20:15
Additionally, use temporary reduction array for norms in GMRES
Additionally, make the residual_norm parameter const in the restart
kernel (as it was never written to).
Fix GMRES reference test initialization and improve memory read
efficiency of hessenberg_qr.

Co-authored-by: Pratik Nayak <[email protected]>
Co-authored-by: Yuhsiang M. Tsai <[email protected]>
Add additional reference GMRES test, update parts of documentation

Co-authored-by: Yuhsiang M. Tsai <[email protected]>
@thoasm thoasm merged commit 3902b86 into develop Nov 3, 2022
@thoasm thoasm deleted the gmres_simplify branch November 3, 2022 19:32
@ginkgo-bot
Copy link
Member

Error: PR already merged!

tcojean added a commit that referenced this pull request Nov 12, 2022
Advertise release 1.5.0 and last changes

+ Add changelog,
+ Update third party libraries
+ A small fix to a CMake file

See PR: #1195

The Ginkgo team is proud to announce the new Ginkgo minor release 1.5.0. This release brings many important new features such as:
- MPI-based multi-node support for all matrix formats and most solvers;
- full DPC++/SYCL support,
- functionality and interface for GPU-resident sparse direct solvers,
- an interface for wrapping solvers with scaling and reordering applied,
- a new algebraic Multigrid solver/preconditioner,
- improved mixed-precision support,
- support for device matrix assembly,

and much more.

If you face an issue, please first check our [known issues page](https://github.com/ginkgo-project/ginkgo/wiki/Known-Issues) and the [open issues list](https://github.com/ginkgo-project/ginkgo/issues) and if you do not find a solution, feel free to [open a new issue](https://github.com/ginkgo-project/ginkgo/issues/new/choose) or ask a question using the [github discussions](https://github.com/ginkgo-project/ginkgo/discussions).

Supported systems and requirements:
+ For all platforms, CMake 3.13+
+ C++14 compliant compiler
+ Linux and macOS
  + GCC: 5.5+
  + clang: 3.9+
  + Intel compiler: 2018+
  + Apple LLVM: 8.0+
  + NVHPC: 22.7+
  + Cray Compiler: 14.0.1+
  + CUDA module: CUDA 9.2+ or NVHPC 22.7+
  + HIP module: ROCm 4.0+
  + DPC++ module: Intel OneAPI 2021.3 with oneMKL and oneDPL. Set the CXX compiler to `dpcpp`.
+ Windows
  + MinGW and Cygwin: GCC 5.5+
  + Microsoft Visual Studio: VS 2019
  + CUDA module: CUDA 9.2+, Microsoft Visual Studio
  + OpenMP module: MinGW or Cygwin.


Algorithm and important feature additions:
+ Add MPI-based multi-node for all matrix formats and solvers (except GMRES and IDR). ([#676](#676), [#908](#908), [#909](#909), [#932](#932), [#951](#951), [#961](#961), [#971](#971), [#976](#976), [#985](#985), [#1007](#1007), [#1030](#1030), [#1054](#1054), [#1100](#1100), [#1148](#1148))
+ Porting the remaining algorithms (preconditioners like ISAI, Jacobi, Multigrid, ParILU(T) and ParIC(T)) to DPC++/SYCL, update to SYCL 2020, and improve support and performance ([#896](#896), [#924](#924), [#928](#928), [#929](#929), [#933](#933), [#943](#943), [#960](#960), [#1057](#1057), [#1110](#1110),  [#1142](#1142))
+ Add a Sparse Direct interface supporting GPU-resident numerical LU factorization, symbolic Cholesky factorization, improved triangular solvers, and more ([#957](#957), [#1058](#1058), [#1072](#1072), [#1082](#1082))
+ Add a ScaleReordered interface that can wrap solvers and automatically apply reorderings and scalings ([#1059](#1059))
+ Add a Multigrid solver and improve the aggregation based PGM coarsening scheme ([#542](#542), [#913](#913), [#980](#980), [#982](#982),  [#986](#986))
+ Add infrastructure for unified, lambda-based, backend agnostic, kernels and utilize it for some simple kernels ([#833](#833), [#910](#910), [#926](#926))
+ Merge different CUDA, HIP, DPC++ and OpenMP tests under a common interface ([#904](#904), [#973](#973), [#1044](#1044), [#1117](#1117))
+ Add a device_matrix_data type for device-side matrix assembly ([#886](#886), [#963](#963), [#965](#965))
+ Add support for mixed real/complex BLAS operations ([#864](#864))
+ Add a FFT LinOp for all but DPC++/SYCL ([#701](#701))
+ Add FBCSR support for NVIDIA and AMD GPUs and CPUs with OpenMP ([#775](#775))
+ Add CSR scaling ([#848](#848))
+ Add array::const_view and equivalent to create constant matrices from non-const data ([#890](#890))
+ Add a RowGatherer LinOp supporting mixed precision to gather dense matrix rows ([#901](#901))
+ Add mixed precision SparsityCsr SpMV support ([#970](#970))
+ Allow creating CSR submatrix including from (possibly discontinuous) index sets ([#885](#885), [#964](#964))
+ Add a scaled identity addition (M <- aI + bM) feature interface and impls for Csr and Dense ([#942](#942))


Deprecations and important changes:
+ Deprecate AmgxPgm in favor of the new Pgm name. ([#1149](#1149)).
+ Deprecate specialized residual norm classes in favor of a common `ResidualNorm` class ([#1101](#1101))
+ Deprecate CamelCase non-polymorphic types in favor of snake_case versions (like array, machine_topology, uninitialized_array, index_set) ([#1031](#1031), [#1052](#1052))
+ Bug fix: restrict gko::share to rvalue references (*possible interface break*) ([#1020](#1020))
+ Bug fix: when using cuSPARSE's triangular solvers, specifying the factory parameter `num_rhs` is now required when solving for more than one right-hand side, otherwise an exception is thrown ([#1184](#1184)).
+ Drop official support for old CUDA < 9.2 ([#887](#887))


Improved performance additions:
+ Reuse tmp storage in reductions in solvers and add a mutable workspace to all solvers ([#1013](#1013), [#1028](#1028))
+ Add HIP unsafe atomic option for AMD ([#1091](#1091))
+ Prefer vendor implementations for Dense dot, conj_dot and norm2 when available ([#967](#967)).
+ Tuned OpenMP SellP, COO, and ELL SpMV kernels for a small number of RHS ([#809](#809))


Fixes:
+ Fix various compilation warnings ([#1076](#1076), [#1183](#1183), [#1189](#1189))
+ Fix issues with hwloc-related tests ([#1074](#1074))
+ Fix include headers for GCC 12 ([#1071](#1071))
+ Fix for simple-solver-logging example ([#1066](#1066))
+ Fix for potential memory leak in Logger ([#1056](#1056))
+ Fix logging of mixin classes ([#1037](#1037))
+ Improve value semantics for LinOp types, like moved-from state in cross-executor copy/clones ([#753](#753))
+ Fix some matrix SpMV and conversion corner cases ([#905](#905), [#978](#978))
+ Fix uninitialized data ([#958](#958))
+ Fix CUDA version requirement for cusparseSpSM ([#953](#953))
+ Fix several issues within bash-script ([#1016](#1016))
+ Fixes for `NVHPC` compiler support ([#1194](#1194))


Other additions:
+ Simplify and properly name GMRES kernels ([#861](#861))
+ Improve pkg-config support for non-CMake libraries ([#923](#923), [#1109](#1109))
+ Improve gdb pretty printer ([#987](#987), [#1114](#1114))
+ Add a logger highlighting inefficient allocation and copy patterns ([#1035](#1035))
+ Improved and optimized test random matrix generation ([#954](#954), [#1032](#1032))
+ Better CSR strategy defaults ([#969](#969))
+ Add `move_from` to `PolymorphicObject` ([#997](#997))
+ Remove unnecessary device_guard usage ([#956](#956))
+ Improvements to the generic accessor for mixed-precision ([#727](#727))
+ Add a naive lower triangular solver implementation for CUDA ([#764](#764))
+ Add support for int64 indices from CUDA 11 onward with SpMV and SpGEMM ([#897](#897))
+ Add a L1 norm implementation ([#900](#900))
+ Add reduce_add for arrays ([#831](#831))
+ Add utility to simplify Dense View creation from an existing Dense vector ([#1136](#1136)).
+ Add a custom transpose implementation for Fbcsr and Csr transpose for unsupported vendor types ([#1123](#1123))
+ Make IDR random initilization deterministic ([#1116](#1116))
+ Move the algorithm choice for triangular solvers from Csr::strategy_type to a factory parameter ([#1088](#1088))
+ Update CUDA archCoresPerSM ([#1175](#1116))
+ Add kernels for Csr sparsity pattern lookup ([#994](#994))
+ Differentiate between structural and numerical zeros in Ell/Sellp ([#1027](#1027))
+ Add a binary IO format for matrix data ([#984](#984))
+ Add a tuple zip_iterator implementation ([#966](#966))
+ Simplify kernel stubs and declarations ([#888](#888))
+ Simplify GKO_REGISTER_OPERATION with lambdas ([#859](#859))
+ Simplify copy to device in tests and examples ([#863](#863))
+ More verbose output to array assertions ([#858](#858))
+ Allow parallel compilation for Jacobi kernels ([#871](#871))
+ Change clang-format pointer alignment to left ([#872](#872))
+ Various improvements and fixes to the benchmarking framework ([#750](#750), [#759](#759), [#870](#870), [#911](#911), [#1033](#1033), [#1137](#1137))
+ Various documentation improvements ([#892](#892), [#921](#921), [#950](#950), [#977](#977), [#1021](#1021), [#1068](#1068), [#1069](#1069), [#1080](#1080), [#1081](#1081), [#1108](#1108), [#1153](#1153), [#1154](#1154))
+ Various CI improvements ([#868](#868), [#874](#874), [#884](#884), [#889](#889), [#899](#899), [#903](#903),  [#922](#922), [#925](#925), [#930](#930), [#936](#936), [#937](#937), [#958](#958), [#882](#882), [#1011](#1011), [#1015](#1015), [#989](#989), [#1039](#1039), [#1042](#1042), [#1067](#1067), [#1073](#1073), [#1075](#1075), [#1083](#1083), [#1084](#1084), [#1085](#1085), [#1139](#1139), [#1178](#1178), [#1187](#1187))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
1:ST:high-importance This issue/PR is of high importance and must be addressed as soon as possible. 1:ST:ready-for-review This PR is ready for review 1:ST:ready-to-merge This PR is ready to merge. 1:ST:run-full-test mod:all This touches all Ginkgo modules. reg:build This is related to the build system. reg:ci-cd This is related to the continuous integration system. reg:helper-scripts This issue/PR is related to the helper scripts mainly concerned with development of Ginkgo. reg:testing This is related to testing. type:matrix-format This is related to the Matrix formats type:solver This is related to the solvers
Projects
Ginkgo development
Awaiting Merge
Development

Successfully merging this pull request may close these issues.

None yet

7 participants