-
-
Notifications
You must be signed in to change notification settings - Fork 433
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
Latency blog, installment #2: snoopi_deep and flamegraphs #1120
Conversation
Once the build has completed, you can preview your PR at this URL: https://julialang.netlify.app/previews/PR1120/ in ~15 minutes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
😻 I love it! :) Thanks so much for writing this all up, @timholy! I've left a few small comments, but what you have so far is fantastic, and exactly the same things I would have covered 👍 👍
blog/2021/01/snoopi_deep.md
Outdated
module SnoopDemo | ||
struct MyType{T} x::T end | ||
|
||
extract(y::MyType) = y.x | ||
|
||
function domath(x) | ||
y = x + x | ||
return y*x + 2*x + 5 | ||
end | ||
|
||
dostuff(y) = domath(extract(y)) | ||
|
||
function packintype(x) | ||
y = MyType(x) | ||
return dostuff(y) | ||
end | ||
end | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It might be nice in your demo to also include a type unstable function, to show the separate invocations to inference in the profile?
For example, when i was working on snoopi_deep, i usually used this example:
julia> module M
i(x) = x+5
h(a::Array) = i(a[1]::Integer) + 2
g(y::Integer) = h(Any[y])
end;
which has this cute little bump where you can see it coming back to infer i()
at runtime, as a result of dispatch:
It takes a bit more explanation to get at what's going on with the ::Integer
part - but maybe you could comee up with a less contrived example of type instability..
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(I see now that you reference this a bit later, and so maybe this would over-complicate things to include it this early... Up to you!) :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I want to keep it simple initially.
`staleinstances` extracts `MethodInstances` that have some "stale" (no longer callable) generated code. | ||
In our case, it returns an empty list, meaning that it found no stale instances, which guarantees that no invalidation occurred. | ||
There's nothing "funny" going on behind the scenes that will influence our results. | ||
|
||
@@note | ||
**Box 2** Unlike `@snoopr`, another macro exported by SnoopCompile, `staleinstances` does not distinguish between whether that stale code existed before you ran the `@snoopi_deep` block, or whether it got invalidated during the running of that block. | ||
For detailed analysis of invalidations, `@snoopr` is the recommended tool. | ||
@@ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔥 this is super cool! You've made these changes after I stopped paying attention. thanks for all of this; it's neat! :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
😂 I see Nathan and I had similar sentiments!
(0.009381595, ROOT() in Core.Compiler.Timings at compiler/typeinfer.jl:75) | ||
``` | ||
|
||
This shows the cost of each `Method`, summing across all specific `MethodInstance`s. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We've found ourselves issuing queries like this, quite a bit:
julia> fs = [t for t in flattened if occursin("merge_sorted!", repr(t[2].mi.def.name));
julia> sum(first.(fs)) # what is the total time inferring all specializations of all methods of merge_sorted!
341.62921501600005
julia> length(fs) # how many specializations are there?
5968
Or using this to plot a distribution of the specialization times for this function:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure if it's worth mentioning things like this since we don't have standard built-in functions for things like this, and also hopefully most people are better off than we are, but 🤷 i thought i'd mention it :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pgdsgui
will get at such issues, I favor leaving it for later.
Co-authored-by: Nathan Daly <NHDaly@gmail.com>
Also, CC: @Sacha0 |
…alizing the output (#1126) Expand a bit on how to use PProf for visualizing inference profiles.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Last couple of changes and I think this is ready to go? I'll adjust the date once we're sure.
blog/2021/01/snoopi_deep.md
Outdated
|
||
Here's a screenshot of the Top view, again with `ROOT()` hidden: `http://localhost:57599/ui/top?h=ROOT` | ||
|
||
<img src="/assets/blog/2021-latency/pprof-top-no-root.png" width="600" title="PProf Top view" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't displaying properly in the preview.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hrmm.. bummer. it looked okay through the github page, when i looked here:
https://github.com/JuliaLang/www.julialang.org/blob/teh/inference_flamegraphs/blog/2021/01/snoopi_deep.md
Maybe I should just shrink down the size of the image first and then put the smaller image into the repo?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That sounds expedient if there's no better solution.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, okay, this look good to go:
https://github.com/NHDaly/www.julialang.org/blob/nhd/inference_flamegraphs-pprof/blog/2021/01/snoopi_deep.md#pprofjl
I've created another PR. if you can merge it, it looks ready to me! :) thanks
#1128
Co-authored-by: Nathan Daly <NHDaly@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Awesome! :) thanks!
SnoopCompileCore.InferenceTiming[] | ||
``` | ||
|
||
`staleinstances` extracts `MethodInstances` that have some "stale" (no longer callable) generated code. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wow nice!
Can you all hold off on merging (till tomorrow)? I need to fix one of the integrations with our blog so the new post gets blasted out across our social media pages. |
**Box 3** Generally we speak of [call graphs](https://en.wikipedia.org/wiki/Call_graph) rather than call trees. | ||
But because inference results are cached (a.k.a., we only "visit" each node once), we obtain a tree as a depth-first-search of the full call graph. | ||
|
||
Keep in mind that this can sometimes lead to surprising results when trying to improve inference times. You may delete a node in the graph, expecting to |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This pain: familiar to @NHDaly and I 😂.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
haha yeah, i added that line... 😂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
He wrote that!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was a lovely read. Thanks Tim and Nathan! :)
Glad you liked it! More goodies to come. |
@logankilpatrick, just let us know when it's good to go. No rush though, this can sit as needed. |
Should be good to go now! Thanks for waiting |
* Update juliacon-2020-open-source-bof-follow-up.md Fix typo * Update gsoc-2020-wrapup.md Add Blog Post link * Update diversity.md * Redo hackathon page to support multiple events. * Update diffeq.md for next JSoC (JuliaLang#994) * Update "powered by" line to be shorter Also to what Franklin itself uses. * Fix JuliaLang#996 * Fix URL in MIT announcement banner * Use Franklin 0.10 * fix issue mentioned in JuliaLang#998 (JuliaLang#1000) * Create hacktoberfest.html Add re-direct for Hacktoberfest * Set stable release to 1.5.2 (JuliaLang#1003) * Add blogpost about the rr memory debugging saga (JuliaLang#1002) * Add blogpost about the rr memory debugging saga * Address Elliot's feedback * Fredrik's review * Stefan's review * fixing meta tags + hfun (JuliaLang#1005) * fixing meta tags + hfun * whitespaces * comment improvement * Add more twitter integration (JuliaLang#1006) - If the blog author's twitter ID is specified, add a small twitter bird after the author's name - Add the @JuliaLanguage twitter handle for the twitter site metadata * using local vars as defaults if defined (JuliaLang#1007) * Tweak rr post blog title (JuliaLang#1008) I was told the old title was boring - try to do better. * Allow large image preview in Google (JuliaLang#1011) * In dubio pro populo (JuliaLang#1010) https://twitter.com/KenoFischer/status/1309287103675719680 * Update organizations.md Add Algebraic Julia Applied Category Theory * Fix diffeq training example for newer Julia Julia v1.3+ builds longer stacks, which makes it easier for Tracker.jl to cause a spurious stackoverflow, so I just chopped the example down a bit. * sitemap generation (JuliaLang#1016) * Update index.md Changed 'has' to 'have' to match 'members'. * A couple extra rr post typos (JuliaLang#1020) * Add new D&I Page * Update index.md Add sign up link! * added header links for community page retained styling by reusing css classes * update link: MIT policy on conflict resolution * remove double negative in community/stewards.md Co-authored-by: Mason Protter <mason.protter@icloud.com> * add paper published at Computação Brasil journal * Create stickers.md Add stickers page. * Update index.html Switch alert to Hacktoberfest * Update index.html * Update classes.md Include Marzieh Khakifirooz course centered on JuMP Linear Optimization. * Fix link for Hacktoberfest Hackathon/Meetup 2020 Hello! The old link was giving me a 404 error even when I was logged in to MLH. I think I fixed it by putting in the correct link from [Logan Kilpatrick's Discourse post for the hackathon/meetup](https://discourse.julialang.org/t/julia-language-hacktoberfest-meetup-hackathon-t-shirts/47645). Old Link: https://organize.mlh.io/events/4574-hacktoberfest-online-global-julia-meetup New Link: https://organize.mlh.io/participants/events/4574-hacktoberfest-online-global-julia-meetup The new link in this PR works for me now. Let me know if this is the correct fix! No worries if not, in that case feel free to disregard. * Update organizations.md Closes JuliaLang#995 * Update organizations.md * Fix for deploy script (JuliaLang#1033) * fixing deploy to avoid using ssh * other attempt * Update classes of Abel Siqueira at UFPR * Add JuliaSmoothOptimizers organization (JuliaLang#1034) * Add JuliaSmoothOptimizers organization * Sort organization list * Update organizations.md JuliaAttic is not really relevant in this list... Co-authored-by: Viral B. Shah <ViralBShah@users.noreply.github.com> * Create shop.md WIP Shop page * Update index.html * Update index.html * Bad link for Algebraic Julia Correct link is https://github.com/AlgebraicJulia * add Julia High Performance, 2nd Edition * add teaching activities at the University of Basel * Add "Train Your Brain" book * add Julia language companion * Add Recent UAI 2020 Paper The paper and its package: https://github.com/BGU-CS-VIL/VersatileHDPMixtureModels.j * The "Packages" header should link to the "Julia Packages" page (JuliaLang#1046) * Add a link to the General registry (JuliaLang#1045) * Add a link to the General registry * Update index.md Co-authored-by: Viral B. Shah <ViralBShah@users.noreply.github.com> * Update Emacs logo to current one Emacs logo taken from the offical GNU website: https://www.gnu.org/software/emacs/ * updating courses in University of South Florida. * Add RL algorithms section in GSoC project list * JetBrains => Pluto (JuliaLang#1052) * Update deploy.yml * Adds IROS 2020 paper * some ecosystem updates * Update index.html * Update index.html * Update index.html * Update index.html * Create slack.md * Fix PR comments * Update foot_general.html * Switch all Slack Invite links to the new URL. * Fix typo index.md (JuliaLang#1062) Fix 2 typos calander -> calendar * Broken link (JuliaLang#1064) * Broken link Best way to fix? * Link only name * Fix placeholder expansions in downloads/platform, fixes JuliaLang#1065. (JuliaLang#1066) * adding explicit language for shell blocks (JuliaLang#1067) * Update index.md * Update index.md * Add courses at Universidad del Norte, Colombia (JuliaLang#1068) * Adding example project ModulePlay.jl (JuliaLang#1069) Project example and getting started with Julia tools. * Update slack.md cc @DilumAluthge Added note on generating new Slack Invite link. * Update organizations.md (JuliaLang#1074) * JSoC projects for DeepChem.jl * the legal data page is no longer needed (JuliaLang#1072) * Update current stable release to 1.5.3 (JuliaLang#1076) * Add entry for Modia. * Add JuliaControl. * Add queryverse. * Add JuliaTelecom. * Update organizations.md Add JuliaActors * advertise jill.py in Downloads as a command-line installation tool (JuliaLang#926) * advertise jill.py in Downloads as a command-line installation tool jill.py is a command-line tool (written in Python) that downloads and extracts official binaries, and makes symlinks for all platforms. This could serve as a recommended alternatives to package managers such as `apt`, `brew` and `choco` * move jill.py after linux and freebsd section * Add a few more organizations. (JuliaLang#1083) * Make all dashes the same character. * Add a few more organizations. Also create new categories to keep Scientific more manageable: - Astronomy/Space - Physics/Quantum mechanics * Fix broken link to MLJ projects, caps error * add Flux to orgs * Update organizations.md Update more orgs per JuliaLang#1085 * Update research.md * Update research.md * Update Pluto description (JuliaLang#1089) * Add DFTK JSOC project (JuliaLang#1090) * Fix the build * Update shop.md * Update Slack Link * Update index.html * Update meta.html * Update index.html * Add files via upload * Update research.md I messed up the new reference the other day, sorry for the noise. * Create greet.yml * Update greet.yml * Update greet.yml Update greeting from the default. * Update greet.yml * remove some links from diversity pages that lead nowhere * Clarify that windows LTS link is (installer) * use a Project + Manifest to record the dependencies used (JuliaLang#1098) * adding author blurb JuliaLang#1009 * Explain the vertical axis of the benchmark timing graph (JuliaLang#1102) As discussed in https://discourse.julialang.org/t/julia-micro-benchmarks-graph/50005 * downloads: Add link to versions.json (JuliaLang#1101) * downloads: Add link to versions.json This file contains info on all published Julia versions (see JuliaLang/julia#33817 for more context). It's currently not easy to find but may be useful for people who build Julia tooling. Generation script: https://github.com/SaschaMann/Julia-versions.json/blob/main/build_json_map.jl (written by `@staticfloat`) Repo that builds and deploys it: https://github.com/SaschaMann/Julia-versions.json * Add link to schema * downloads: Update link to JSON schema (JuliaLang#1103) See JuliaLang#1101 * Fix misplaced formatting in the rendered website (JuliaLang#1104) The `_` in `Java 1.8.0_17` triggers formatting in the rendered website. * Update classes.md (JuliaLang#1105) Adding classes at Universidad Adolfo Ibáñez, Chile. * Add nightly portable builds for Windows (JuliaLang#1106) * Add nightly portable builds for Windows * Update nightlies.md * Update nightlies.md * Update index.html Update the homepage alert. * Update index.html * Update guidelines.md * Update platform.md Some missing dashes and an equal sign make the CentOS (version 7 or higher) install commands incorrect. I fixed the formatting, and the commands work. The main place to look is at "-add-repo " should have been "--add-repo=" incorrect: sudo yum-config-manager –add-repo https://copr.fedorainfracloud.org/coprs/nalimilan/julia/repo/epel-7/nalimilan-julia-epel-7.repo corrected: sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/nalimilan/julia/repo/epel-7/nalimilan-julia-epel-7.repo * Update platform.md Changed "--add-repo" to "--add " under the CentOS 7 section. * Fix the welcome message * Update platform.md Add back in "-repo" * Update Slack invite URL * Update pr_comment.yml Add note that PR previews take ~15 to deploy. * BioStructures.jl paper citation * Update mooc.md added 2 new courses in Julia * Update books.md added a book * Update tutorials.md added a tutorial with instructions on how to access :) * Add a blog post on precompilation (JuliaLang#1111) * Add download links for v1.6.0-beta1 (JuliaLang#1116) Including the return of Linux PowerPC * Fix typo (JuliaLang#1117) * Add link to the JuliaPackages project Also add a space in the name of the "Julia Observer" project, matching how the project presents itself. * Update deploy.yml Switch to main * Update greet.yml Update to main * Industry Julia Users Contributhon follow-up blog post (JuliaLang#1119) Co-authored-by: mattBrzezinski <matt.brzezinski@invenia.ca> Co-authored-by: Nathan Daly <44379820+rai-nhdaly@users.noreply.github.com> * Ammendment to 2021 Industry Users Contributhon * Update index.md * Update index.md Fix initial library script * Add files via upload * Update index.md * Delete orglogos.png * Add image and fix path. * Update slack.md * Blogpost about Julia Arrow support * Update books.md (JuliaLang#1127) * Update alert to show JuliaCon registration * Update books.md (JuliaLang#1130) * Address review and add a bit more content * Latency blog, installment JuliaLang#2: snoopi_deep and flamegraphs (JuliaLang#1120) * Latency blog, installment JuliaLang#2: snoopi_deep and flamegraphs Co-authored-by: Nathan Daly <NHDaly@gmail.com> * Fix date on "profiling inference" blog post (JuliaLang#1131) * A few wording improvements (JuliaLang#1132) * Update arrow.md * Update platform.md Was helping someone debug installing on a Mac. They were a bit confused about the symlink step. Overall, I think we should just be as radically simple and to-the-point as possible here. Also for uninstallation, can we just say to nuke `~/.julia`? For most users, it probably doesn't make sense to tell them to delete specific subdirectories within. * Update platform.md * Update platform.md * Update platform.md * [ImgBot] Optimize images *Total -- 9,540.21kb -> 7,029.86kb (26.31%) /_assets/infra/pluto_jl.svg -- 2.57kb -> 0.76kb (70.21%) /_assets/images/juliaastro.svg -- 4.61kb -> 1.58kb (65.6%) /_assets/blog/2020-invalidations/invalidation_backedge_analysis.png -- 23.86kb -> 9.10kb (61.86%) /assets/blog/2021-latency/pprof-top-no-root.png -- 131.57kb -> 56.44kb (57.1%) /_assets/blog/2018-04-01-tetris-and-you/green_tetris.gif -- 1,328.00kb -> 616.73kb (53.56%) /_assets/blog/2020-05-02-rr/arch.svg -- 37.53kb -> 20.32kb (45.86%) /assets/blog/2021-latency/pprof-flamegraph-full-1.png -- 58.07kb -> 31.92kb (45.04%) /assets/blog/2021-latency/pprof-flamepgraph-no-root-highlight.png -- 90.67kb -> 53.74kb (40.73%) /learning/assets/JA-3.png -- 912.74kb -> 545.63kb (40.22%) /learning/assets/JA-2.png -- 372.21kb -> 251.43kb (32.45%) /community/assets/orglogos.png -- 1,715.55kb -> 1,188.69kb (30.71%) /_assets/blog/2020-08-10-JuliaCon/JuliaCon2020Sponsors.png -- 286.65kb -> 198.85kb (30.63%) /_assets/images/juliaopt.svg -- 103.96kb -> 73.65kb (29.15%) /learning/assets/JA-1.png -- 422.10kb -> 308.79kb (26.84%) /_assets/images/el.png -- 2.66kb -> 2.05kb (22.87%) /_assets/images/logo_yao.png -- 602.38kb -> 468.98kb (22.15%) /_assets/blog/2020-invalidations/SIMD_ascend.png -- 45.68kb -> 35.59kb (22.09%) /_assets/blog/2020-05-02-rr/data/overhead.svg -- 107.60kb -> 84.97kb (21.03%) /_assets/blog/2020-invalidations/SIMD_invalidations.png -- 155.37kb -> 124.01kb (20.18%) /_assets/images/juliacloud.svg -- 3.74kb -> 3.07kb (17.94%) /learning/assets/books.png -- 385.99kb -> 320.84kb (16.88%) /_assets/infra/emacs.png -- 13.15kb -> 11.06kb (15.87%) /learning/assets/schools.png -- 615.75kb -> 523.30kb (15.01%) /assets/blog/2021-latency/flamegraph-flatten-demo.png -- 12.03kb -> 11.14kb (7.37%) /assets/blog/2021-latency/flamegraph-complex.png -- 12.10kb -> 11.27kb (6.88%) /_assets/blog/2020-09-23-rr-memory/faulty-mem.jpg -- 187.18kb -> 175.98kb (5.99%) /_assets/infra/logo.svg -- 6.81kb -> 6.69kb (1.84%) /_assets/images/cartpole.gif -- 189.58kb -> 187.34kb (1.18%) /_assets/infra/cartpole.gif -- 189.58kb -> 187.34kb (1.18%) /_assets/infra/lorenz.gif -- 190.46kb -> 190.00kb (0.24%) /_assets/images/lorenz.gif -- 190.46kb -> 190.00kb (0.24%) /_assets/infra/edit_icon.svg -- 0.41kb -> 0.41kb (0.24%) /_assets/images/onlinestats.gif -- 497.73kb -> 497.22kb (0.1%) /_assets/infra/onlinestats.gif -- 497.73kb -> 497.22kb (0.1%) /_assets/infra/backsplash-3.svg -- 35.49kb -> 35.48kb (0.02%) /_assets/benchmarks/benchmarks.svg -- 34.04kb -> 34.04kb (0%) /_assets/blog/2017-08-23-native-julia-implementations-of-iterative-solvers-for-numerical-linear-algebra/resnorm.svg -- 74.23kb -> 74.23kb (0%) Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com> * Update Manifest.toml (JuliaLang#1136) * Remove 'soc' directory * added a potential project, put my name on more specific items * clarify CCSA * Add difficulty and project type for DFTK * Update ideas under the RL Algorithms section Update the ideas under the RL Algorithms section to meet new requirements. * Update science.md * Update projects.md * Delete science.md * Update flux.md * Update tooling.md * Added two time series projects for GSOC * Update organizations.md * added Pythia GSOC to website * Update slack.md * Set upcoming release to 1.6.0-rc1 (JuliaLang#1167) * Add some projects, remove some. (JuliaLang#1164) * Remove UCX topic from HPC GSoC @vchuravy has already implemented functional UCX support * Update Parquet.jl GSoC entry (JuliaLang#1168) Re-word Parquet.jl GSoC entry focussing on Tables.jl/Arrow.jl integration for large/out-of-core data, performance and support for missing encodings. * Add me as mentor for "Distributed Training" GSoC (JuliaLang#1170) * add two publications and update packages links * Update the Images GSOC projects Closes JuliaLang#1148 Co-authored-by: Eric Hanson <5846501+ericphanson@users.noreply.github.com> Co-authored-by: Logan Kilpatrick <23kilpatrick23@gmail.com> Co-authored-by: Christopher Rackauckas <accounts@chrisrackauckas.com> Co-authored-by: Viral B. Shah <ViralBShah@users.noreply.github.com> Co-authored-by: Sascha Mann <git@mail.saschamann.eu> Co-authored-by: tlienart <tlienart@me.com> Co-authored-by: Alex Arslan <ararslan@comcast.net> Co-authored-by: Keno Fischer <keno@juliacomputing.com> Co-authored-by: vapid babble <vapidbabble@gmail.com> Co-authored-by: wchoston <wchoston@users.noreply.github.com> Co-authored-by: pseudocodenerd <shekharmadhav03@gmail.com> Co-authored-by: James <jpfairbanks@gmail.com> Co-authored-by: Mason Protter <mason.protter@icloud.com> Co-authored-by: André Lage <prof.alage@gmail.com> Co-authored-by: Valentin Martinez Gama <70444148+valenmgama@users.noreply.github.com> Co-authored-by: Kim Laberinto <kim.laberinto@gmail.com> Co-authored-by: Abel <abel.s.siqueira@gmail.com> Co-authored-by: Avik Sengupta <avik@sengupta.net> Co-authored-by: Frank Schaefer <frank.schaefer@unibas.ch> Co-authored-by: Bogumił Kamiński <bkamins@sgh.waw.pl> Co-authored-by: dinarior <dinari.or@gmail.com> Co-authored-by: Dilum Aluthge <dilum@aluthge.com> Co-authored-by: Thomas Ingram <taingram@mtu.edu> Co-authored-by: Changhyun Kwon <chkwon@users.noreply.github.com> Co-authored-by: Jun Tian <find_my_way@foxmail.com> Co-authored-by: Jerry Ling <proton@jling.dev> Co-authored-by: Henrique Ferrolho <henriqueferrolho@gmail.com> Co-authored-by: Marie-Helene Burle <marie.burle@westgrid.ca> Co-authored-by: Páll Haraldsson <Pall.Haraldsson@gmail.com> Co-authored-by: Fredrik Ekre <ekrefredrik@gmail.com> Co-authored-by: Diego A. Casas <35376194+dact221@users.noreply.github.com> Co-authored-by: robbyriverside <3100924+robbyriverside@users.noreply.github.com> Co-authored-by: Marcelo Forets <mforets@gmail.com> Co-authored-by: Rachel Kurchin <rkurchin@cmu.edu> Co-authored-by: Stefan Karpinski <stefan@karpinski.org> Co-authored-by: MA Laforge <ma.laforge.49@gmail.com> Co-authored-by: Paul Bayer <Paul.Bayer@gleichsam.de> Co-authored-by: Johnny Chen <johnnychen94@hotmail.com> Co-authored-by: Jacek <jpnski@protonmail.ch> Co-authored-by: Dhairya Gandhi <dhairya@juliacopmuting.com> Co-authored-by: Fons van der Plas <fonsvdplas@gmail.com> Co-authored-by: Michael F. Herbst <info@michael-herbst.com> Co-authored-by: KristofferC <kcarlsson89@gmail.com> Co-authored-by: Thibaut Lienart <ltib@me.com> Co-authored-by: Robin Deits <robin.deits@gmail.com> Co-authored-by: Sukera <11753998+Seelengrab@users.noreply.github.com> Co-authored-by: Rodolfo Carvajal <rodolfo.carvajal@gmail.com> Co-authored-by: Mustafa M <mus-m@outlook.com> Co-authored-by: Jason Nicholson <1058191+jasonnicholson@users.noreply.github.com> Co-authored-by: Joe Greener <jgreener@hotmail.co.uk> Co-authored-by: rajraomichigan <rajnrao@umich.edu> Co-authored-by: Tim Holy <tim.holy@gmail.com> Co-authored-by: Benoit Pasquier <4486578+briochemc@users.noreply.github.com> Co-authored-by: Waldir Pimenta <waldyrious@gmail.com> Co-authored-by: Jarrett Revels <jarrettrevels@gmail.com> Co-authored-by: mattBrzezinski <matt.brzezinski@invenia.ca> Co-authored-by: Nathan Daly <44379820+rai-nhdaly@users.noreply.github.com> Co-authored-by: Jacob Quinn <quinn.jacobd@gmail.com> Co-authored-by: azev77 <azev77@users.noreply.github.com> Co-authored-by: Nathan Daly <NHDaly@gmail.com> Co-authored-by: Travis DePrato <773453+travigd@users.noreply.github.com> Co-authored-by: ImgBotApp <ImgBotHelp@gmail.com> Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com> Co-authored-by: Steven G. Johnson <stevenj@alum.mit.edu> Co-authored-by: Sebastian Pfitzner <pfitzseb@gmail.com> Co-authored-by: Andrii Babii <babii.andrii@gmail.com> Co-authored-by: Julian Samaroo <jpsamaroo@jpsamaroo.me> Co-authored-by: Tanmay Mohapatra <tanmaykm@gmail.com> Co-authored-by: Marek Kaluba <kalmar@amu.edu.pl>
CC @NHDaly. Please add to this freely!