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

fix the additional residual computation when passing residual criterion #1307

Merged
merged 5 commits into from
Apr 8, 2023

Conversation

yhmtsai
Copy link
Member

@yhmtsai yhmtsai commented Mar 22, 2023

In #981, splitting the criterion for iteration and the residual check when users only pass the iteration criterion.
However, it will compute the residual norm from the solution in the iteration update when users pass the residual check.

It fixes the issue by only computing the residual from the solution in the finalized ste

@yhmtsai yhmtsai added the 1:ST:ready-for-review This PR is ready for review label Mar 22, 2023
@yhmtsai yhmtsai self-assigned this Mar 22, 2023
@ginkgo-bot ginkgo-bot added mod:core This is related to the core module. type:solver This is related to the solvers type:stopping-criteria This is related to the stopping criteria labels Mar 22, 2023
Copy link
Member

@MarcelKoch MarcelKoch left a comment

Choose a reason for hiding this comment

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

LGTM. I guess this could lead to infinite loops in user code, if they created their own solver, but used set_finalized incorrectly. But I think that is highly unlikely.
Alternatively, you could throw (some special error) in the if(!set_finalized) case and use a try-catch block in IR. But I think that might be too much overhead.

@@ -302,7 +302,7 @@ void Gmres<ValueType>::apply_dense_impl(const VectorType* dense_b,
.residual(residual)
.residual_norm(residual_norm)
.solution(dense_x)
.check(RelativeStoppingId, false, &stop_status, &one_changed)) {
.check(RelativeStoppingId, true, &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.

Any idea, why that was false in the first place?

Copy link
Member

@upsj upsj Mar 22, 2023

Choose a reason for hiding this comment

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

This was changed in #861 , since now the restart kernel takes care of the finalization status. We only have an accurate residual vector after a restart

Copy link
Member Author

Choose a reason for hiding this comment

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

okay, so I think I can not change it here

b_ != nullptr) {
} else if (set_finalized && updater.solution_ != nullptr &&
system_matrix_ != nullptr && b_ != nullptr) {
// Only compute the residual from solution in the finalized step
Copy link
Member

Choose a reason for hiding this comment

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

nit:

Suggested change
// Only compute the residual from solution in the finalized step
// Only compute the residual from the solution in the finalized step

@@ -209,6 +210,10 @@ bool ResidualNormBase<ValueType>::check_impl(
},
b_.get(), updater.solution_);
dense_tau = u_dense_tau_.get();
} else if (!set_finalized) {
// If it is not the finalized step and does not contain residual, we
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
// If it is not the finalized step and does not contain residual, we
// If this is not the finalized step and the updater does not contain residual, we

@yhmtsai yhmtsai force-pushed the fix_additional_rescomp branch from 81c2633 to e3d9aae Compare March 22, 2023 16:02
@yhmtsai
Copy link
Member Author

yhmtsai commented Mar 22, 2023

@MarcelKoch you are right, it may lead an infinite loop in some cases. I use another parameter to indicate whether we can skip the residual check

Copy link
Member

@MarcelKoch MarcelKoch left a comment

Choose a reason for hiding this comment

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

Still fine with me.

@yhmtsai yhmtsai force-pushed the fix_additional_rescomp branch 2 times, most recently from 490c2e1 to 81fab18 Compare March 23, 2023 08:43
@upsj upsj requested review from upsj and pratikvn April 6, 2023 15:52
Copy link
Member

@pratikvn pratikvn left a comment

Choose a reason for hiding this comment

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

LGTM!

Copy link
Member

@upsj upsj left a comment

Choose a reason for hiding this comment

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

LGTM! Is it possible to add a regression test based on a logger counting the number of norm2 operations the criterion performs? (and check that it fails on develop)

@yhmtsai yhmtsai force-pushed the fix_additional_rescomp branch 2 times, most recently from ced2ab4 to 859b657 Compare April 7, 2023 09:42
Copy link
Member

@pratikvn pratikvn left a comment

Choose a reason for hiding this comment

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

Minor typo

@yhmtsai
Copy link
Member Author

yhmtsai commented Apr 7, 2023

@upsj good idea.
failed test in https://gitlab.com/ginkgo-project/ginkgo-public-ci/-/pipelines/831036678

Expected equality of these values:
  count_occurrance(out.str(), "make_residual_norm")
    Which is: 5
  3

three iteration:
two additional residual norm (2nd, 3rd) in the develop.
4th iteration does not have it because it exits the iteration check in criterion combine (not due to splitting in IR)

yhmtsai and others added 3 commits April 7, 2023 12:08
Co-authored-by: Tobias Ribizel <ribizel@kit.edu>
Co-authored-by: Pratik Nayak <pratikvn@protonmail.com>
@yhmtsai yhmtsai force-pushed the fix_additional_rescomp branch from 859b657 to 23dc74a Compare April 7, 2023 10:09
@yhmtsai yhmtsai added 1:ST:ready-to-merge This PR is ready to merge. and removed 1:ST:ready-for-review This PR is ready for review labels Apr 7, 2023
@yhmtsai
Copy link
Member Author

yhmtsai commented Apr 7, 2023

I need to change stream logger to profilerhook summary because MSVC does not contain enough function infomation.

  • MSVC: class gko::detail::RegisteredOperation<class <lambda_0ccdc7866f99fbdf308616cae4f60c00> >
  • others with cxxabi demangle: gko::detail::RegisteredOperation<gko::stop::residual_norm::(anonymous namespace)::make_residual_norm<gko::matrix::Dense<double> const*&, gko::matrix::Dense<double>*, double&, unsigned char&, bool&, gko::array<gko::stopping_status>*&, gko::array<bool>*, bool*, bool*&>(gko::matrix::Dense<double> const*&, gko::matrix::Dense<double>*&&, double&, unsigned char&, bool&, gko::array<gko::stopping_status>*&, gko::array<bool>*&&, bool*&&, bool*&)::{lambda(auto:1)#1}>
  • other without cxxabie demangle: N3gko6detail19RegisteredOperationIZNS_4stop13residual_norm12_GLOBAL__N_118make_residual_normIJRPKNS_6matrix5DenseIdEEPS8_RdRhRbRPNS_5arrayINS_15stopping_statusEEEPNSG_IbEEPbRSN_EEEDaDpOT_EUlT_E_EE,0x7ffe591e4c60

@yhmtsai yhmtsai force-pushed the fix_additional_rescomp branch from 7067b39 to 3f03803 Compare April 7, 2023 19:46
yhmtsai and others added 2 commits April 7, 2023 23:00
Co-authored-by: Pratik Nayak <pratikvn@protonmail.com>
MSVC does not contain enough function information.
@yhmtsai yhmtsai force-pushed the fix_additional_rescomp branch from 3f03803 to d986dbb Compare April 7, 2023 21:00
@ginkgo-bot
Copy link
Member

Note: This PR changes the Ginkgo ABI:

Functions changes summary: 0 Removed, 301 Changed (57318 filtered out), 1 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

For details check the full ABI diff under Artifacts here

@sonarqubecloud
Copy link

sonarqubecloud bot commented Apr 8, 2023

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 1 Code Smell

92.9% 92.9% Coverage
0.0% 0.0% Duplication

@codecov
Copy link

codecov bot commented Apr 8, 2023

Codecov Report

Patch coverage: 97.14% and no project coverage change.

Comparison is base (a5469a8) 91.26% compared to head (d986dbb) 91.27%.

Additional details and impacted files
@@           Coverage Diff            @@
##           develop    #1307   +/-   ##
========================================
  Coverage    91.26%   91.27%           
========================================
  Files          584      584           
  Lines        49450    49483   +33     
========================================
+ Hits         45129    45164   +35     
+ Misses        4321     4319    -2     
Impacted Files Coverage Δ
reference/test/stop/residual_norm_kernels.cpp 97.26% <88.88%> (-0.22%) ⬇️
core/solver/ir.cpp 88.00% <100.00%> (+0.90%) ⬆️
core/stop/residual_norm.cpp 97.67% <100.00%> (+0.05%) ⬆️
core/test/solver/ir.cpp 96.36% <100.00%> (+0.25%) ⬆️
core/test/stop/criterion.cpp 100.00% <100.00%> (ø)
include/ginkgo/core/stop/criterion.hpp 93.10% <100.00%> (+0.24%) ⬆️
test/stop/residual_norm_kernels.cpp 99.00% <100.00%> (+0.03%) ⬆️

... and 4 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

@yhmtsai yhmtsai merged commit 914def9 into develop Apr 8, 2023
@yhmtsai yhmtsai deleted the fix_additional_rescomp branch April 8, 2023 09:55
tcojean added a commit that referenced this pull request Jun 16, 2023
Release 1.6.0 of Ginkgo.

The Ginkgo team is proud to announce the new Ginkgo minor release 1.6.0. This release brings new features such as:
- Several building blocks for GPU-resident sparse direct solvers like symbolic
  and numerical LU and Cholesky factorization, ...,
- A distributed Schwarz preconditioner,
- New FGMRES and GCR solvers,
- Distributed benchmarks for the SpMV operation, solvers, ...
- Support for non-default streams in the CUDA and HIP backends,
- Mixed precision support for the CSR SpMV,
- A new profiling logger which integrates with NVTX, ROCTX, TAU and VTune to
  provide internal Ginkgo knowledge to most HPC profilers!

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 Clang: 14.0 is tested. Earlier versions might also work.
  + NVHPC: 22.7+
  + Cray Compiler: 14.0.1+
  + CUDA module: CUDA 9.2+ or NVHPC 22.7+
  + HIP module: ROCm 4.5+
  + DPC++ module: Intel OneAPI 2021.3+ with oneMKL and oneDPL. Set the CXX compiler to `dpcpp`.
+ Windows
  + MinGW: GCC 5.5+
  + Microsoft Visual Studio: VS 2019+
  + CUDA module: CUDA 9.2+, Microsoft Visual Studio
  + OpenMP module: MinGW.

### Version Support Changes
+ ROCm 4.0+ -> 4.5+ after [#1303](#1303)
+ Removed Cygwin pipeline and support [#1283](#1283)

### Interface Changes
+ Due to internal changes, `ConcreteExecutor::run` will now always throw if the corresponding module for the `ConcreteExecutor` is not build [#1234](#1234)
+ The constructor of `experimental::distributed::Vector` was changed to only accept local vectors as `std::unique_ptr` [#1284](#1284)
+ The default parameters for the `solver::MultiGrid` were improved. In particular, the smoother defaults to one iteration of `Ir` with `Jacobi` preconditioner, and the coarse grid solver uses the new direct solver with LU factorization. [#1291](#1291) [#1327](#1327)
+ The `iteration_complete` event gained a more expressive overload with additional parameters, the old overloads were deprecated. [#1288](#1288) [#1327](#1327)

### Deprecations
+ Deprecated less expressive `iteration_complete` event. Users are advised to now implement the function `void iteration_complete(const LinOp* solver, const LinOp* b, const LinOp* x, const size_type& it, const LinOp* r, const LinOp* tau, const LinOp* implicit_tau_sq, const array<stopping_status>* status, bool stopped)` [#1288](#1288)

### Added Features
+ A distributed Schwarz preconditioner. [#1248](#1248)
+ A GCR solver [#1239](#1239)
+ Flexible Gmres solver [#1244](#1244)
+ Enable Gmres solver for distributed matrices and vectors [#1201](#1201)
+ An example that uses Kokkos to assemble the system matrix [#1216](#1216)
+ A symbolic LU factorization allowing the `gko::experimental::factorization::Lu` and `gko::experimental::solver::Direct` classes to be used for matrices with non-symmetric sparsity pattern [#1210](#1210)
+ A numerical Cholesky factorization [#1215](#1215)
+ Symbolic factorizations in host-side operations are now wrapped in a host-side `Operation` to make their execution visible to loggers. This means that profiling loggers and benchmarks are no longer missing a separate entry for their runtime [#1232](#1232)
+ Symbolic factorization benchmark [#1302](#1302)
+ The `ProfilerHook` logger allows annotating the Ginkgo execution (apply, operations, ...) for profiling frameworks like NVTX, ROCTX and TAU. [#1055](#1055)
+ `ProfilerHook::created_(nested_)summary` allows the generation of a lightweight runtime profile over all Ginkgo functions written to a user-defined stream [#1270](#1270) for both host and device timing functionality [#1313](#1313)
+ It is now possible to enable host buffers for MPI communications at runtime even if the compile option `GINKGO_FORCE_GPU_AWARE_MPI` is set. [#1228](#1228)
+ A stencil matrices generator (5-pt, 7-pt, 9-pt, and 27-pt) for benchmarks [#1204](#1204)
+ Distributed benchmarks (multi-vector blas, SpMV, solver) [#1204](#1204)
+ Benchmarks for CSR sorting and lookup [#1219](#1219)
+ A timer for MPI benchmarks that reports the longest time [#1217](#1217)
+ A `timer_method=min|max|average|median` flag for benchmark timing summary [#1294](#1294)
+ Support for non-default streams in CUDA and HIP executors [#1236](#1236)
+ METIS integration for nested dissection reordering [#1296](#1296)
+ SuiteSparse AMD integration for fillin-reducing reordering [#1328](#1328)
+ Csr mixed-precision SpMV support [#1319](#1319)
+ A `with_loggers` function for all `Factory` parameters [#1337](#1337)

### Improvements
+ Improve naming of kernel operations for loggers [#1277](#1277)
+ Annotate solver iterations in `ProfilerHook` [#1290](#1290)
+ Allow using the profiler hooks and inline input strings in benchmarks [#1342](#1342)
+ Allow passing smart pointers in place of raw pointers to most matrix functions. This means that things like `vec->compute_norm2(x.get())` or `vec->compute_norm2(lend(x))` can be simplified to `vec->compute_norm2(x)` [#1279](#1279) [#1261](#1261)
+ Catch overflows in prefix sum operations, which makes Ginkgo's operations much less likely to crash. This also improves the performance of the prefix sum kernel [#1303](#1303)
+ Make the installed GinkgoConfig.cmake file relocatable and follow more best practices [#1325](#1325)

### Fixes
+ Fix OpenMPI version check [#1200](#1200)
+ Fix the mpi cxx type binding by c binding [#1306](#1306)
+ Fix runtime failures for one-sided MPI wrapper functions observed on some OpenMPI versions [#1249](#1249)
+ Disable thread pinning with GPU executors due to poor performance [#1230](#1230)
+ Fix hwloc version detection [#1266](#1266)
+ Fix PAPI detection in non-implicit include directories [#1268](#1268)
+ Fix PAPI support for newer PAPI versions: [#1321](#1321)
+ Fix pkg-config file generation for library paths outside prefix [#1271](#1271)
+ Fix various build failures with ROCm 5.4, CUDA 12, and OneAPI 6 [#1214](#1214), [#1235](#1235), [#1251](#1251)
+ Fix incorrect read for skew-symmetric MatrixMarket files with explicit diagonal entries [#1272](#1272)
+ Fix handling of missing diagonal entries in symbolic factorizations [#1263](#1263)
+ Fix segmentation fault in benchmark matrix construction [#1299](#1299)
+ Fix the stencil matrix creation for benchmarking [#1305](#1305)
+ Fix the additional residual check in IR [#1307](#1307)
+ Fix the cuSPARSE CSR SpMM issue on single strided vector when cuda >= 11.6 [#1322](#1322) [#1331](#1331)
+ Fix Isai generation for large sparsity powers [#1327](#1327)
+ Fix Ginkgo compilation and test with NVHPC >= 22.7 [#1331](#1331)
+ Fix Ginkgo compilation of 32 bit binaries with MSVC [#1349](#1349)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
1:ST:ready-to-merge This PR is ready to merge. mod:core This is related to the core module. type:solver This is related to the solvers type:stopping-criteria This is related to the stopping criteria
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants