Repository: JuliaParallel/MPI.jl
Pull request #817 (2024-02-05 06:14:59)

Bump codecov/codecov-action from 3 to 4
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3 to 4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/codecov/codecov-action/releases">codecov/codecov-action's releases</a>.</em></p>
<blockquote>
<h2>v4.0.0</h2>
<p>v4 of the Codecov Action uses the <a href="https://docs.codecov.com/docs/the-codecov-cli">CLI</a> as the underlying upload. The CLI has helped to power new features including local upload, the global upload token, and new upcoming features.</p>
<h2>Breaking Changes</h2>
<ul>
<li>The Codecov Action runs as a <code>node20</code> action due to <code>node16</code> deprecation. See <a href="https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/">this post from GitHub</a> on how to migrate.</li>
<li>Tokenless uploading is unsupported. However, PRs made from forks to the upstream public repos will support tokenless (e.g. contributors to OS projects do not need the upstream repo's Codecov token). This <a href="https://docs.codecov.com/docs/adding-the-codecov-token#github-actions">doc</a> shows instructions on how to add the Codecov token.</li>
<li>OS platforms have been added, though some may not be automatically detected. To see a list of platforms, see our <a href="https://cli.codecov.io">CLI download page</a></li>
<li>Various arguments to the Action have been changed. Please be aware that the arguments match with the CLI's needs</li>
</ul>
<p><code>v3</code> versions and below will not have access to CLI features (e.g. global upload token, ATS).</p>
<h2>What's Changed</h2>
<ul>
<li>build(deps): bump openpgp from 5.8.0 to 5.9.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/985">codecov/codecov-action#985</a></li>
<li>build(deps): bump actions/checkout from 3.0.0 to 3.5.3 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1000">codecov/codecov-action#1000</a></li>
<li>build(deps): bump ossf/scorecard-action from 2.1.3 to 2.2.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1006">codecov/codecov-action#1006</a></li>
<li>build(deps): bump tough-cookie from 4.0.0 to 4.1.3 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1013">codecov/codecov-action#1013</a></li>
<li>build(deps-dev): bump word-wrap from 1.2.3 to 1.2.4 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1024">codecov/codecov-action#1024</a></li>
<li>build(deps): bump node-fetch from 3.3.1 to 3.3.2 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1031">codecov/codecov-action#1031</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.1.4 to 20.4.5 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1032">codecov/codecov-action#1032</a></li>
<li>build(deps): bump github/codeql-action from 1.0.26 to 2.21.2 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1033">codecov/codecov-action#1033</a></li>
<li>build commit,report and upload args based on codecovcli by <a href="https://github.com/dana-yaish"><code>@​dana-yaish</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/943">codecov/codecov-action#943</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.4.5 to 20.5.3 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1055">codecov/codecov-action#1055</a></li>
<li>build(deps): bump github/codeql-action from 2.21.2 to 2.21.4 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1051">codecov/codecov-action#1051</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.5.3 to 20.5.4 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1058">codecov/codecov-action#1058</a></li>
<li>chore(deps): update outdated deps by <a href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1059">codecov/codecov-action#1059</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.5.4 to 20.5.6 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1060">codecov/codecov-action#1060</a></li>
<li>build(deps-dev): bump <code>@​typescript-eslint/parser</code> from 6.4.1 to 6.5.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1065">codecov/codecov-action#1065</a></li>
<li>build(deps-dev): bump <code>@​typescript-eslint/eslint-plugin</code> from 6.4.1 to 6.5.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1064">codecov/codecov-action#1064</a></li>
<li>build(deps): bump actions/checkout from 3.5.3 to 3.6.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1063">codecov/codecov-action#1063</a></li>
<li>build(deps-dev): bump eslint from 8.47.0 to 8.48.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1061">codecov/codecov-action#1061</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.5.6 to 20.5.7 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1062">codecov/codecov-action#1062</a></li>
<li>build(deps): bump openpgp from 5.9.0 to 5.10.1 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1066">codecov/codecov-action#1066</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.5.7 to 20.5.9 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1070">codecov/codecov-action#1070</a></li>
<li>build(deps): bump github/codeql-action from 2.21.4 to 2.21.5 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1069">codecov/codecov-action#1069</a></li>
<li>build(deps-dev): bump <code>@​typescript-eslint/eslint-plugin</code> from 6.5.0 to 6.6.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1072">codecov/codecov-action#1072</a></li>
<li>Update README.md by <a href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1073">codecov/codecov-action#1073</a></li>
<li>build(deps-dev): bump <code>@​typescript-eslint/parser</code> from 6.5.0 to 6.6.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1071">codecov/codecov-action#1071</a></li>
<li>build(deps-dev): bump <code>@​vercel/ncc</code> from 0.36.1 to 0.38.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1074">codecov/codecov-action#1074</a></li>
<li>build(deps): bump <code>@​actions/core</code> from 1.10.0 to 1.10.1 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1081">codecov/codecov-action#1081</a></li>
<li>build(deps-dev): bump <code>@​typescript-eslint/eslint-plugin</code> from 6.6.0 to 6.7.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1080">codecov/codecov-action#1080</a></li>
<li>build(deps): bump actions/checkout from 3.6.0 to 4.0.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1078">codecov/codecov-action#1078</a></li>
<li>build(deps): bump actions/upload-artifact from 3.1.2 to 3.1.3 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1077">codecov/codecov-action#1077</a></li>
<li>build(deps-dev): bump <code>@​types/node</code> from 20.5.9 to 20.6.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1075">codecov/codecov-action#1075</a></li>
<li>build(deps-dev): bump <code>@​typescript-eslint/parser</code> from 6.6.0 to 6.7.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1079">codecov/codecov-action#1079</a></li>
<li>build(deps-dev): bump eslint from 8.48.0 to 8.49.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1076">codecov/codecov-action#1076</a></li>
<li>use cli instead of node uploader by <a href="https://github.com/dana-yaish"><code>@​dana-yaish</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1068">codecov/codecov-action#1068</a></li>
<li>chore(release): 4.0.0-beta.1 by <a href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1084">codecov/codecov-action#1084</a></li>
<li>not adding -n if empty to do-upload command by <a href="https://github.com/dana-yaish"><code>@​dana-yaish</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1085">codecov/codecov-action#1085</a></li>
<li>4.0.0-beta.2 by <a href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a> in <a href="https://redirect.github.com/codecov/codecov-action/pull/1086">codecov/codecov-action#1086</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md">codecov/codecov-action's changelog</a>.</em></p>
<blockquote>
<h2>4.0.0-beta.2</h2>
<h3>Fixes</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/1085">#1085</a> not adding -n if empty to do-upload command</li>
</ul>
<h2>4.0.0-beta.1</h2>
<p><code>v4</code> represents a move from the <a href="https://github.com/codecov/uploader">universal uploader</a> to the <a href="https://github.com/codecov/codecov-cli">Codecov CLI</a>. Although this will unlock new features for our users, the CLI is not yet at feature parity with the universal uploader.</p>
<h3>Breaking Changes</h3>
<ul>
<li>No current support for <code>aarch64</code> and <code>alpine</code> architectures.</li>
<li>Tokenless uploading is unsuported</li>
<li>Various arguments to the Action have been removed</li>
</ul>
<h2>3.1.4</h2>
<h3>Fixes</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/967">#967</a> Fix typo in README.md</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/971">#971</a> fix: add back in working dir</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/969">#969</a> fix: CLI option names for uploader</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/970">#970</a> build(deps-dev): bump <code>@​types/node</code> from 18.15.12 to 18.16.3</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/979">#979</a> build(deps-dev): bump <code>@​types/node</code> from 20.1.0 to 20.1.2</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/981">#981</a> build(deps-dev): bump <code>@​types/node</code> from 20.1.2 to 20.1.4</li>
</ul>
<h2>3.1.3</h2>
<h3>Fixes</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/960">#960</a> fix: allow for aarch64 build</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/957">#957</a> build(deps-dev): bump jest-junit from 15.0.0 to 16.0.0</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/958">#958</a> build(deps): bump openpgp from 5.7.0 to 5.8.0</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/959">#959</a> build(deps-dev): bump <code>@​types/node</code> from 18.15.10 to 18.15.12</li>
</ul>
<h2>3.1.2</h2>
<h3>Fixes</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/718">#718</a> Update README.md</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/851">#851</a> Remove unsupported path_to_write_report argument</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/898">#898</a> codeql-analysis.yml</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/901">#901</a> Update README to contain correct information - inputs and negate feature</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/955">#955</a> fix: add in all the extra arguments for uploader</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/819">#819</a> build(deps): bump openpgp from 5.4.0 to 5.5.0</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/835">#835</a> build(deps): bump node-fetch from 3.2.4 to 3.2.10</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/840">#840</a> build(deps): bump ossf/scorecard-action from 1.1.1 to 2.0.4</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/841">#841</a> build(deps): bump <code>@​actions/core</code> from 1.9.1 to 1.10.0</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/843">#843</a> build(deps): bump <code>@​actions/github</code> from 5.0.3 to 5.1.1</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/869">#869</a> build(deps): bump node-fetch from 3.2.10 to 3.3.0</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/872">#872</a> build(deps-dev): bump jest-junit from 13.2.0 to 15.0.0</li>
<li><a href="https://redirect.github.com/codecov/codecov-action/issues/879">#879</a> build(deps): bump decode-uri-component from 0.2.0 to 0.2.2</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/codecov/codecov-action/commit/e0b68c6749509c5f83f984dd99a76a1c1a231044"><code>e0b68c6</code></a> fix: show both token uses in readme (<a href="https://redirect.github.com/codecov/codecov-action/issues/1250">#1250</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/1f9f5573d12d0967fe14551018a4b25610226551"><code>1f9f557</code></a> Add all args (<a href="https://redirect.github.com/codecov/codecov-action/issues/1245">#1245</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/09686fcfcb6453414a5acd7f3a939670a7a77826"><code>09686fc</code></a> Update README.md (<a href="https://redirect.github.com/codecov/codecov-action/issues/1243">#1243</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/f30e4959ba63075080d4f7f90cacc18d9f3fafd7"><code>f30e495</code></a> fix: update action.yml (<a href="https://redirect.github.com/codecov/codecov-action/issues/1240">#1240</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/a7b945cea47ad44d8340fae2b004cb982191264f"><code>a7b945c</code></a> fix: allow for other archs (<a href="https://redirect.github.com/codecov/codecov-action/issues/1239">#1239</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/98ab2c591b94478f4c3606d68ff73601df85ec43"><code>98ab2c5</code></a> Update package.json (<a href="https://redirect.github.com/codecov/codecov-action/issues/1238">#1238</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/43235cc5aeeafd8aeb836fe7d647599acead161c"><code>43235cc</code></a> Update README.md (<a href="https://redirect.github.com/codecov/codecov-action/issues/1237">#1237</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/0cf8684c821546a4e0c8c9a4cf4f21a7a0c5014b"><code>0cf8684</code></a> chore(ci): bump to node20 (<a href="https://redirect.github.com/codecov/codecov-action/issues/1236">#1236</a>)</li>
<li><a href="https://github.com/codecov/codecov-action/commit/8e1e730371bf82c744e8ca9aa469e2b7011542ce"><code>8e1e730</code></a> build(deps-dev): bump <code>@​typescript-eslint/eslint-plugin</code> from 6.19.1 to 6.20.0 ...</li>
<li><a href="https://github.com/codecov/codecov-action/commit/61293af0e8288c75266030376a088c781ec81c18"><code>61293af</code></a> build(deps-dev): bump <code>@​typescript-eslint/parser</code> from 6.19.1 to 6.20.0 (<a href="https://redirect.github.com/codecov/codecov-action/issues/1235">#1235</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/codecov/codecov-action/compare/v3...v4">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=codecov/codecov-action&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has been open for over 30 days.



Patch:
diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml
index f386b6f..e890ab8 100644
--- a/.buildkite/pipeline.yml
+++ b/.buildkite/pipeline.yml
@@ -5,7 +5,7 @@
       key: "cuda-build-openmpi"
       agents:
         queue: "juliagpu"
-        cuda: "11.0"
+        cuda: "*"
       env:
         OPENMPI_VER: "4.1"
         OPENMPI_VER_FULL: "4.1.4"
@@ -44,61 +44,26 @@
 
     - wait
 
-    - label: "Tests -- Julia 1.6"
+    - label: "Tests -- Julia {{matrix.version}}"
+      matrix:
+        setup:
+          version:
+            - "1.6"
+            - "1.7"
+            - "1.8"
+            - "1.9"
+            - "1.10"
+      concurrency: 1
+      concurrency_group: mpi_cuda
       plugins:
         - JuliaCI/julia#v1:
-            version: "1.6"
+            version: "{{matrix.version}}"
             persist_depot_dirs: packages,artifacts,compiled
       agents:
         queue: "juliagpu"
-        cuda: "11.0"
+        cuda: "*"
       if: build.message !~ /\[skip tests\]/
-      timeout_in_minutes: 60
-      env:
-        JULIA_MPI_TEST_NPROCS: 2
-        JULIA_MPI_PATH: "${BUILDKITE_BUILD_CHECKOUT_PATH}/openmpi"
-        OMPI_ALLOW_RUN_AS_ROOT: 1
-        OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1
-        OMPI_MCA_btl_vader_single_copy_mechanism: 'none' # https://github.com/open-mpi/ompi/issues/4948
-        OPAL_PREFIX: "${BUILDKITE_BUILD_CHECKOUT_PATH}/openmpi" # Should we set this for the user?
-        JULIA_CUDA_MEMORY_POOL: "none"
-      commands: |
-        echo "--- Configure MPI"
-        buildkite-agent artifact download --step "cuda-build-openmpi" mpi-prefix.tar.gz .
-        mkdir -p $${JULIA_MPI_PATH}
-        tar -zxf mpi-prefix.tar.gz --strip-components 1 -C $${JULIA_MPI_PATH}
-        export PATH=$${JULIA_MPI_PATH}/bin:$${PATH}
-        export LD_LIBRARY_PATH=$${JULIA_MPI_PATH}/lib:$${LD_LIBRARY_PATH}
-
-        echo "--- Setup Julia packages"
-        julia --color=yes --project=. -e '
-            import Pkg
-            Pkg.develop(; path = joinpath(pwd(), "lib", "MPIPreferences"))
-            '
-        julia --color=yes --project=test -e '
-            using Pkg
-            Pkg.develop(path="lib/MPIPreferences")
-            using MPIPreferences
-            MPIPreferences.use_system_binary(export_prefs=true)
-            rm("test/Manifest.toml")
-            '
-
-        echo "+++ Run tests"
-        julia --color=yes --project=. -e '
-           import Pkg
-           Pkg.test("MPI"; test_args=["--backend=CUDA"])
-           '
-
-    - label: "Tests -- Julia latest"
-      plugins:
-        - JuliaCI/julia#v1:
-            version: "1"
-            persist_depot_dirs: packages,artifacts,compiled
-      agents:
-        queue: "juliagpu"
-        cuda: "11.0"
-      if: build.message !~ /\[skip tests\]/
-      timeout_in_minutes: 60
+      timeout_in_minutes: 90
       env:
         JULIA_MPI_TEST_NPROCS: 2
         JULIA_MPI_PATH: "${BUILDKITE_BUILD_CHECKOUT_PATH}/openmpi"
@@ -141,34 +106,38 @@
       key: "rocm-build-openmpi"
       agents:
         queue: "juliagpu"
-        rocm: "*" # todo fix ROCM version
+        rocm: "*"
       env:
-        OPENMPI_VER: "4.1"
-        OPENMPI_VER_FULL: "4.1.4"
-        UCX_VER: "1.13-rc1"
+        OPENMPI_VER: "5.0"
+        OPENMPI_VER_FULL: "5.0.3"
+        UCX_VER: "1.17.0"
         CCACHE_DIR: "/root/ccache"
       commands: |
         echo "--- Install packages"
         apt-get install --yes --no-install-recommends curl ccache
         export PATH="/usr/lib/ccache/:$$PATH"
+
         echo "--- Build UCX"
-        curl -L https://github.com/openucx/ucx/releases/download/v1.13.0-rc1/ucx-1.13.0.tar.gz --output ucx.tar.gz
+        curl -L https://github.com/openucx/ucx/releases/download/v$${UCX_VER}/ucx-$${UCX_VER}.tar.gz --output ucx.tar.gz
         tar -zxf ucx.tar.gz
         pushd ucx-*
         ./configure --with-rocm --enable-mt --prefix=$$(realpath ../mpi-prefix)
         make -j
         make install
         popd
+
         echo "--- Build OpenMPI"
         curl -L https://download.open-mpi.org/release/open-mpi/v$${OPENMPI_VER}/openmpi-$${OPENMPI_VER_FULL}.tar.gz --output openmpi.tar.gz
         tar -zxf openmpi.tar.gz
-        pushd openmpi-*
-        ./configure --with-ucx=$$(realpath ../mpi-prefix) --prefix=$$(realpath ../mpi-prefix)
+        pushd openmpi-$${OPENMPI_VER_FULL}
+        ./configure --with-ucx=$$(realpath ../mpi-prefix) --with-rocm --prefix=$$(realpath ../mpi-prefix)
         make -j
         make install
         popd
+
         echo "--- Package prefix"
         tar -zcf mpi-prefix.tar.gz mpi-prefix/
+
         echo "--- ccache stats"
         ccache -s
       artifact_paths:
@@ -176,18 +145,22 @@
 
     - wait
 
-    - label: "Tests -- Julia latest"
+    - label: "Tests -- Julia {{matrix.version}}"
+      matrix:
+        setup:
+          version:
+            - "1.10"
+      concurrency: 1
+      concurrency_group: mpi_rocm
       plugins:
         - JuliaCI/julia#v1:
-            version: "1" # failing on 1.8
+            version: "{{matrix.version}}"
             persist_depot_dirs: packages,artifacts,compiled
       agents:
         queue: "juliagpu"
-        rocm: "*" # todo fix ROCM version
+        rocm: "*"
       if: build.message !~ /\[skip tests\]/
-      timeout_in_minutes: 60
-      soft_fail:
-        - exit_status: 1
+      timeout_in_minutes: 90
       env:
         JULIA_MPI_TEST_NPROCS: 2
         JULIA_MPI_PATH: "${BUILDKITE_BUILD_CHECKOUT_PATH}/openmpi"
@@ -217,6 +190,7 @@
             '
 
         echo "+++ Run tests"
+        export JULIA_MPI_TEST_EXCLUDE="test_allreduce.jl,test_reduce.jl,test_scan.jl"
         julia --color=yes --project=. -e '
            import Pkg
            Pkg.test("MPI"; test_args=["--backend=AMDGPU"])
diff --git a/.github/workflows/Documenter.yml b/.github/workflows/Documenter.yml
index 5eed5fc..f5063e5 100644
--- a/.github/workflows/Documenter.yml
+++ b/.github/workflows/Documenter.yml
@@ -26,6 +26,10 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v4
+      - uses: julia-actions/setup-julia@v1
+        with:
+          version: '1'
+      - uses: julia-actions/cache@v1
       - name: Install dependencies
         shell: julia --color=yes --project=docs/ {0}
         run: |
diff --git a/Project.toml b/Project.toml
index 7d4ceb4..3d7abfb 100644
--- a/Project.toml
+++ b/Project.toml
@@ -1,7 +1,7 @@
 name = "MPI"
 uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195"
 authors = []
-version = "0.20.19"
+version = "0.20.20"
 
 [deps]
 Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
@@ -20,7 +20,7 @@ Sockets = "6462fe0b-24de-5631-8697-dd941f90decc"
 
 [compat]
 Distributed = "1"
-AMDGPU = "0.5.7, 0.6, 0.7, 0.8"
+AMDGPU = "0.6, 0.7, 0.8, 0.9"
 CUDA = "3, 4, 5"
 DocStringExtensions = "0.8, 0.9"
 Libdl = "1"
diff --git a/README.md b/README.md
index c057b50..c552dcc 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
 [![codecov.io](https://codecov.io/github/JuliaParallel/MPI.jl/coverage.svg?branch=master)](https://codecov.io/github/JuliaParallel/MPI.jl?branch=master)
 [![Coverage Status](https://coveralls.io/repos/JuliaParallel/MPI.jl/badge.svg?branch=master&service=github)](https://coveralls.io/github/JuliaParallel/MPI.jl?branch=master)
 
-This provides [Julia](http://julialang.org/) interface to the Message Passing Interface ([MPI](http://www.mpi-forum.org/)), roughly inspired by [mpi4py](https://github.com/mpi4py/mpi4py/).
+This provides [Julia](https://julialang.org/) interface to the Message Passing Interface ([MPI](https://www.mpi-forum.org/)), roughly inspired by [mpi4py](https://github.com/mpi4py/mpi4py/).
 
 Please see the [documentation](https://juliaparallel.github.io/MPI.jl/stable/) for instructions on [configuration](https://juliaparallel.github.io/MPI.jl/stable/configuration/) and [usage](https://juliaparallel.github.io/MPI.jl/stable/usage/).
 
diff --git a/bin/mpiexecjl b/bin/mpiexecjl
index 83c7f88..137c9b4 100755
--- a/bin/mpiexecjl
+++ b/bin/mpiexecjl
@@ -61,7 +61,12 @@ fi
 SCRIPT='
 using MPI
 ENV["JULIA_PROJECT"] = dirname(Base.active_project())
-mpiexec(exe -> run(`$exe $ARGS`))
+proc = run(pipeline(`$(mpiexec()) $(ARGS)`; stdout, stderr); wait=false)
+wait(proc)
+if !iszero(proc.exitcode)
+   @error "The MPI process failed" proc
+end
+exit(proc.exitcode)
 '
 
 if [ -n "${PROJECT_ARG}" ]; then
diff --git a/docs/src/configuration.md b/docs/src/configuration.md
index 215605f..9db9c9b 100644
--- a/docs/src/configuration.md
+++ b/docs/src/configuration.md
@@ -2,7 +2,7 @@
 
 By default, MPI.jl will download and link against the following MPI implementations:
 - [Microsoft MPI](https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi) on Windows
-- [MPICH](http://www.mpich.org/) on all other platforms
+- [MPICH](https://www.mpich.org/) on all other platforms
 
 This is suitable for most single-node use cases, but for larger systems, such as HPC
 clusters or multi-GPU machines, you will probably want to configure against a
@@ -30,12 +30,12 @@ julia --project -e 'using Pkg; Pkg.add("MPIPreferences")'
 MPI.jl requires a shared library installation of a C MPI library, supporting the MPI 3.0
 standard or later. The following MPI implementations should work out-of-the-box with MPI.jl:
 
-- [Open MPI](http://www.open-mpi.org/)
-- [MPICH](http://www.mpich.org/) (v3.1 or later)
+- [Open MPI](https://www.open-mpi.org/)
+- [MPICH](https://www.mpich.org/) (v3.1 or later)
 - [Intel MPI](https://software.intel.com/en-us/mpi-library)
 - [Microsoft MPI](https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi)
 - [IBM Spectrum MPI](https://www.ibm.com/us-en/marketplace/spectrum-mpi)
-- [MVAPICH](http://mvapich.cse.ohio-state.edu/)
+- [MVAPICH](https://mvapich.cse.ohio-state.edu/)
 - [Cray MPICH](https://docs.nersc.gov/development/compilers/wrappers/)
 - [Fujitsu MPI](https://www.fujitsu.com/global/about/resources/publications/technicalreview/2020-03/article07.html#cap-03)
 - [HPE MPT/HMPT](https://support.hpe.com/hpesc/public/docDisplay?docLocale=en_US&docId=a00105727en_us)
diff --git a/docs/src/index.md b/docs/src/index.md
index e195a3c..c8b992b 100644
--- a/docs/src/index.md
+++ b/docs/src/index.md
@@ -1,8 +1,8 @@
 # MPI.jl
 
-This is a basic [Julia](http://julialang.org/) wrapper for the portable message passing
-system Message Passing Interface ([MPI](http://www.mpi-forum.org/)). Inspiration is taken from
-[mpi4py](http://mpi4py.scipy.org), although we generally follow the C and not the C++ MPI API.
+This is a basic [Julia](https://julialang.org/) wrapper for the portable message passing
+system Message Passing Interface ([MPI](https://www.mpi-forum.org/)). Inspiration is taken from
+[mpi4py](https://mpi4py.readthedocs.io/en/stable/), although we generally follow the C and not the C++ MPI API.
 (The C++ MPI API is deprecated.)
 
 If you use MPI.jl in your work, please cite the following paper:
diff --git a/docs/src/knownissues.md b/docs/src/knownissues.md
index 80dc107..6fc71ed 100644
--- a/docs/src/knownissues.md
+++ b/docs/src/knownissues.md
@@ -63,6 +63,50 @@ export OMPI_MCA_coll_hcoll_enable="0"
 
 before starting the MPI process.
 
+## MPICH
+
+### `gethostbyname` failure in `internal_Init_thread`
+
+When your internal network stack/route is not correctly configured for the local loopback device, MPICH may fail to initialize with an error message which looks like the following:
+
+```
+Fatal error in internal_Init_thread: Other MPI error, error stack:
+internal_Init_thread(67)...........: MPI_Init_thread(argc=0x0, argv=0x0, required=2, provided=0x16db94160) failed
+MPII_Init_thread(234)..............:
+MPID_Init(67)......................:
+init_world(171)....................: channel initialization failed
+MPIDI_CH3_Init(84).................:
+MPID_nem_init(314).................:
+MPID_nem_tcp_init(175).............:
+MPID_nem_tcp_get_business_card(397):
+GetSockInterfaceAddr(370)..........: gethostbyname failed, bogon (errno 0)
+```
+
+A workaround is provided in the [documentation of the MOOSE framework](https://mooseframework.inl.gov/help/troubleshooting.html) and we report it here for reference:
+
+* obtain your hostname
+  ```console
+  $ hostname
+  mycoolname
+  ```
+* for both Linux and macOS systems, in your `/etc/hosts` file map the hostname you obtained at the previous step to the [localhost address `127.0.0.1`](https://en.wikipedia.org/wiki/Localhost), if not already present.
+  _**Note**_: this step requires root access, to modify the system configuration file `/etc/hosts`, if you don't have it talk to your system administrator.
+  For example, open the file `/etc/hosts` with `sudo` access with your favorite text editor (e.g. `sudo vi /etc/hosts`, or `sudo emacs /etc/hosts`) and add the line
+  ```
+  127.0.0.1  mycoolname
+  ```
+  to the end of the file
+* as an alternative to the previous step, only for macOS systems, run the command
+  ```
+  sudo scutil --set HostName mycoolname
+  ```
+  However it has been reported that this method may not always be effective.
+
+For further information see
+
+- [MPI.jl issue #824](https://github.com/JuliaParallel/MPI.jl/issues/824)
+- [MOOSE discussion #23610](https://github.com/idaholab/moose/discussions/23610)
+
 ## UCX
 
 [UCX](https://www.openucx.org/) is a communication framework used by several MPI implementations.
@@ -93,6 +137,11 @@ This signal interception can be controlled by setting the environment variable `
 ENV["UCX_ERROR_SIGNALS"] = "SIGILL,SIGBUS,SIGFPE"
 ```
 at `__init__`. If set externally, it should be modified to exclude `SIGSEGV` from the list.
+Note that in some cases even if `UCX_ERROR_SIGNALS` is not set explicitly, UCX might still take SIGSEGV as an error signal. In this case, it might be needed to explicitly set `UCX_ERROR_SIGNALS` with
+```
+export UCX_ERROR_SIGNALS="SIGILL,SIGBUS,SIGFPE"
+```
+before calling `mpiexec`.
 
 ## CUDA-aware MPI
 
@@ -131,7 +180,7 @@ Make sure to:
   ```
 - Then in Julia, upon loading MPI and CUDA modules, you can check
   - CUDA version: `CUDA.versioninfo()`
-  - If MPI has CUDA: `MPI.has_cuda()`
+  - If MPI has CUDA: [`MPI.has_cuda()`](@ref)
   - If you are using correct MPI library: `MPI.libmpi`
 
 After that, it may be preferred to run the Julia MPI script (as suggested [here](https://discourse.julialang.org/t/cuda-aware-mpi-works-on-system-but-not-for-julia/75060/11)) launching it from a shell script (as suggested [here](https://discourse.julialang.org/t/cuda-aware-mpi-works-on-system-but-not-for-julia/75060/4)).
@@ -148,6 +197,7 @@ Make sure to:
   ```
 - Then in Julia, upon loading MPI and CUDA modules, you can check
   - AMDGPU version: `AMDGPU.versioninfo()`
+  - If MPI has ROCm: [`MPI.has_rocm()`](@ref)
   - If you are using correct MPI implementation: `MPI.identify_implementation()`
 
 After that, [this script](https://gist.github.com/luraess/c228ec08629737888a18c6a1e397643c) can be used to verify if ROCm-aware MPI is functional (modified after the CUDA-aware version from [here](https://discourse.julialang.org/t/cuda-aware-mpi-works-on-system-but-not-for-julia/75060/11)). It may be preferred to run the Julia ROCm-aware MPI script launching it from a shell script (as suggested [here](https://discourse.julialang.org/t/cuda-aware-mpi-works-on-system-but-not-for-julia/75060/4)).
diff --git a/docs/src/reference/library.md b/docs/src/reference/library.md
index 94e3942..302015f 100644
--- a/docs/src/reference/library.md
+++ b/docs/src/reference/library.md
@@ -14,5 +14,7 @@ MPI.MPI_LIBRARY_VERSION_STRING
 ```@docs
 MPI.versioninfo
 MPI.has_cuda
+MPI.has_rocm
+MPI.has_gpu
 MPI.identify_implementation
 ```
diff --git a/docs/src/usage.md b/docs/src/usage.md
index 2b8ebe4..c57eae1 100644
--- a/docs/src/usage.md
+++ b/docs/src/usage.md
@@ -98,7 +98,8 @@ should confirm your MPI implementation to have the ROCm support (AMDGPU) enabled
 [alltoall\_test\_rocm\_multigpu.jl](https://gist.github.com/luraess/a47931d7fb668bd4348a2c730d5489f4) should confirm 
 your ROCm-aware MPI implementation to use multiple AMD GPUs (one GPU per rank).
 
-The status of ROCm (AMDGPU) support cannot currently be queried.
+If using OpenMPI, the status of ROCm support can be checked via the
+[`MPI.has_rocm()`](@ref) function.
 
 ## Writing MPI tests
 
diff --git a/lib/MPIPreferences/Project.toml b/lib/MPIPreferences/Project.toml
index 5a178bc..23cd2f7 100644
--- a/lib/MPIPreferences/Project.toml
+++ b/lib/MPIPreferences/Project.toml
@@ -1,7 +1,7 @@
 name = "MPIPreferences"
 uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
 authors = []
-version = "0.1.10"
+version = "0.1.11"
 
 [deps]
 Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
diff --git a/lib/MPIPreferences/src/MPIPreferences.jl b/lib/MPIPreferences/src/MPIPreferences.jl
index 847a14d..a65623c 100644
--- a/lib/MPIPreferences/src/MPIPreferences.jl
+++ b/lib/MPIPreferences/src/MPIPreferences.jl
@@ -66,7 +66,7 @@ Switches the underlying MPI implementation to one provided by JLL packages. A
 restart of Julia is required for the changes to take effect.
 
 Available options are:
-- `"MicrosoftMPI_jll"` (Only option and default on Winddows)
+- `"MicrosoftMPI_jll"` (Only option and default on Windows)
 - `"MPICH_jll"` (Default on all other platform)
 - `"OpenMPI_jll"`
 - `"MPItrampoline_jll"`
@@ -119,6 +119,7 @@ end
 """
     use_system_binary(;
         library_names = ["libmpi", "libmpi_ibm", "msmpi", "libmpich", "libmpi_cray", "libmpitrampoline"],
+        extra_paths = String[],
         mpiexec = "mpiexec",
         abi = nothing,
         vendor = nothing,
@@ -135,6 +136,9 @@ Options:
   If the library isn't in the library search path, you can specify the full path
   to the library.
 
+- `extra_paths`: indicate extra directories where to search for the MPI library,
+  besides the default ones of the dynamic linker.
+
 - `mpiexec`: the MPI launcher executable. The default is `mpiexec`, but some
   clusters require using the scheduler launcher interface (e.g. `srun` on Slurm,
   `aprun` on PBS). It is also possible to pass a [`Cmd`
@@ -159,6 +163,7 @@ Options:
 """
 function use_system_binary(;
         library_names=["libmpi", "libmpi_ibm", "msmpi", "libmpich", "libmpi_cray", "libmpitrampoline"],
+        extra_paths=String[],
         mpiexec="mpiexec",
         abi=nothing,
         vendor=nothing,
@@ -186,12 +191,14 @@ function use_system_binary(;
 
     # Set `ZES_ENABLE_SYSMAN` to work around https://github.com/open-mpi/ompi/issues/10142
     libmpi = withenv("ZES_ENABLE_SYSMAN" => "1") do
-        find_library(library_names)
+        find_library(library_names, extra_paths)
     end
     if libmpi == ""
         error("""
             MPI library could not be found with the following name(s):
                 $(library_names)
+            in the following extra directories (in addition to the default ones):
+                $(extra_paths)
             If you want to try different name(s) for the MPI library, use
                 MPIPreferences.use_system_binary(; library_names=[...])""")
     end
@@ -297,7 +304,7 @@ function identify_implementation_version_abi(version_string::AbstractString)
             end
         end
 
-    elseif startswith(version_string, "MVAPICH2")
+    elseif startswith(version_string, "MVAPICH")
         impl = "MVAPICH"
         # "MVAPICH2 Version      :\t%s\n")
         if (m = match(r"^MVAPICH2? Version\s*:\t(\S*)\n", version_string)) !== nothing
diff --git a/src/MPI.jl b/src/MPI.jl
index 7d74e49..7cadd33 100644
--- a/src/MPI.jl
+++ b/src/MPI.jl
@@ -112,6 +112,22 @@ function __init__()
         """ ENV["JULIA_MPI_BINARY"]=mpi_env_binary MPIPreferences.binary
     end
 
+    # Set environment variables before dlopen.
+
+    # disable UCX memory cache, since it doesn't work correctly
+    # https://github.com/openucx/ucx/issues/5061
+    if !haskey(ENV, "UCX_MEMTYPE_CACHE")
+        ENV["UCX_MEMTYPE_CACHE"] = "no"
+    end
+
+    # Julia multithreading uses SIGSEGV to sync threads
+    # https://docs.julialang.org/en/v1/devdocs/debuggingtips/#Dealing-with-signals-1
+    # By default, UCX will error if this occurs (issue #337)
+    if !haskey(ENV, "UCX_ERROR_SIGNALS")
+        # default is "SIGILL,SIGSEGV,SIGBUS,SIGFPE"
+        ENV["UCX_ERROR_SIGNALS"] = "SIGILL,SIGBUS,SIGFPE"
+    end
+
     # preload any dependencies of libmpi (if needed, eg. GTL on cray) before
     # dlopen'ing the MPI library: https://github.com/JuliaParallel/MPI.jl/pull/716
     MPIPreferences.dlopen_preloads()
@@ -133,20 +149,6 @@ function __init__()
     # calls don't trigger early `dlopen`-ing of the library.
     Base.invokelatest(API.init_consts)
 
-    # disable UCX memory cache, since it doesn't work correctly
-    # https://github.com/openucx/ucx/issues/5061
-    if !haskey(ENV, "UCX_MEMTYPE_CACHE")
-        ENV["UCX_MEMTYPE_CACHE"] = "no"
-    end
-
-    # Julia multithreading uses SIGSEGV to sync threads
-    # https://docs.julialang.org/en/v1/devdocs/debuggingtips/#Dealing-with-signals-1
-    # By default, UCX will error if this occurs (issue #337)
-    if !haskey(ENV, "UCX_ERROR_SIGNALS")
-        # default is "SIGILL,SIGSEGV,SIGBUS,SIGFPE"
-        ENV["UCX_ERROR_SIGNALS"] = "SIGILL,SIGBUS,SIGFPE"
-    end
-
     if MPIPreferences.binary == "MPItrampoline_jll" && !haskey(ENV, "MPITRAMPOLINE_MPIEXEC")
         ENV["MPITRAMPOLINE_MPIEXEC"] = API.MPItrampoline_jll.mpich_mpiexec_path
     end
diff --git a/src/collective.jl b/src/collective.jl
index 3dded32..9366fbf 100644
--- a/src/collective.jl
+++ b/src/collective.jl
@@ -782,8 +782,8 @@ Allreduce(obj::T, op, comm::Comm) where {T} =
     Scan!(sendbuf, recvbuf, op, comm::Comm)
     Scan!(sendrecvbuf, op, comm::Comm)
 
-Inclusive prefix reduction (analagous to `accumulate` in Julia): `recvbuf` on rank `i`
-will contain the the result of reducing `sendbuf` by `op` from ranks `0:i`.
+Inclusive prefix reduction (analogous to `accumulate` in Julia): `recvbuf` on rank `i`
+will contain the result of reducing `sendbuf` by `op` from ranks `0:i`.
 
 If only a single buffer `sendrecvbuf` is provided, then operations will be performed
 in-place.
@@ -813,8 +813,8 @@ Scan!(buf, op, comm::Comm) =
 """
     recvbuf = Scan(sendbuf, op, comm::Comm)
 
-Inclusive prefix reduction (analagous to `accumulate` in Julia): `recvbuf` on rank `i`
-will contain the the result of reducing `sendbuf` by `op` from ranks `0:i`.
+Inclusive prefix reduction (analogous to `accumulate` in Julia): `recvbuf` on rank `i`
+will contain the result of reducing `sendbuf` by `op` from ranks `0:i`.
 
 `sendbuf` can also be a scalar, in which case `recvbuf` will also be a scalar of the same
 type.
@@ -837,8 +837,8 @@ Scan(object::T, op, comm::Comm) where {T} = Scan!(Ref(object), Ref{T}(), op, com
     Exscan!(sendbuf, recvbuf, op, comm::Comm)
     Exscan!(sendrecvbuf, op, comm::Comm)
 
-Exclusive prefix reduction (analagous to `accumulate` in Julia): `recvbuf` on rank `i`
-will contain the the result of reducing `sendbuf` by `op` from ranks `0:i-1`. The
+Exclusive prefix reduction (analogous to `accumulate` in Julia): `recvbuf` on rank `i`
+will contain the result of reducing `sendbuf` by `op` from ranks `0:i-1`. The
 `recvbuf` on rank `0` is ignored, and the `recvbuf` on rank `1` will contain the contents
 of `sendbuf` on rank `0`.
 
@@ -869,8 +869,8 @@ Exscan!(buf, op, comm::Comm) = Exscan!(IN_PLACE, buf, op, comm)
 """
     recvbuf = Exscan(sendbuf, op, comm::Comm)
 
-Exclusive prefix reduction (analagous to `accumulate` in Julia): `recvbuf` on rank `i`
-will contain the the result of reducing `sendbuf` by `op` from ranks `0:i-1`. The
+Exclusive prefix reduction (analogous to `accumulate` in Julia): `recvbuf` on rank `i`
+will contain the result of reducing `sendbuf` by `op` from ranks `0:i-1`. The
 `recvbuf` on rank `0` is undefined, and the `recvbuf` on rank `1` will contain the contents
 of `sendbuf` on rank `0`.
 
diff --git a/src/environment.jl b/src/environment.jl
index b13e673..ed00683 100644
--- a/src/environment.jl
+++ b/src/environment.jl
@@ -287,7 +287,7 @@ It is unaffected by [`MPI.Finalize`](@ref), and is one of the few functions that
 called before [`MPI.Init`](@ref).
 
 # External links
-$(_doc_external("MPI_Intialized"))
+$(_doc_external("MPI_Initialized"))
 """
 function Initialized()
     flag = Ref{Cint}()
@@ -320,10 +320,15 @@ Wtime() = API.MPI_Wtime()
 
 Check if the MPI implementation is known to have CUDA support. Currently only Open MPI
 provides a mechanism to check, so it will return `false` with other implementations
-(unless overriden).
+(unless overridden). For "IBMSpectrumMPI" it will return `true`.
 
-This can be overriden by setting the `JULIA_MPI_HAS_CUDA` environment variable to `true`
+This can be overridden by setting the `JULIA_MPI_HAS_CUDA` environment variable to `true`
 or `false`.
+
+!!! note
+    For OpenMPI or OpenMPI-based implementations you first need to call [Init()](@ref).
+
+See also [`MPI.has_rocm`](@ref) for ROCm support.
 """
 function has_cuda()
     flag = get(ENV, "JULIA_MPI_HAS_CUDA", nothing)
@@ -331,7 +336,7 @@ function has_cuda()
         # Only Open MPI provides a function to check CUDA support
         @static if MPI_LIBRARY == "OpenMPI"
             # int MPIX_Query_cuda_support(void)
-            return 0 != ccall((:MPIX_Query_cuda_support, libmpi), Cint, ())
+            return @ccall libmpi.MPIX_Query_cuda_support()::Bool
         elseif MPI_LIBRARY == "IBMSpectrumMPI"
             return true
         else
@@ -341,3 +346,44 @@ function has_cuda()
         return parse(Bool, flag)
     end
 end
+
+"""
+    MPI.has_rocm()
+
+Check if the MPI implementation is known to have ROCm support. Currently only Open MPI
+provides a mechanism to check, so it will return `false` with other implementations
+(unless overridden).
+
+This can be overridden by setting the `JULIA_MPI_HAS_ROCM` environment variable to `true`
+or `false`.
+
+See also [`MPI.has_cuda`](@ref) for CUDA support.
+"""
+function has_rocm()
+    flag = get(ENV, "JULIA_MPI_HAS_ROCM", nothing)
+    if flag === nothing
+        # Only Open MPI provides a function to check ROCm support
+        @static if MPI_LIBRARY == "OpenMPI" && MPI_LIBRARY_VERSION ≥ v"5"
+            # int MPIX_Query_rocm_support(void)
+            return @ccall libmpi.MPIX_Query_rocm_support()::Bool
+        else
+            return false
+        end
+    else
+        return parse(Bool, flag)
+    end
+end
+
+"""
+    MPI.has_gpu()
+
+Checks if the MPI implementation is known to have GPU support. Currently this checks for the
+following GPUs:
+
+1. CUDA: via [`MPI.has_cuda`](@ref)
+2. ROCm: via [`MPI.has_rocm`](@ref)
+
+See also [`MPI.has_cuda`](@ref) and [`MPI.has_rocm`](@ref) for more fine-grained
+checks.
+"""
+has_gpu() = has_cuda() || has_rocm()
diff --git a/src/pointtopoint.jl b/src/pointtopoint.jl
index b41a2c7..36a2187 100644
--- a/src/pointtopoint.jl
+++ b/src/pointtopoint.jl
@@ -346,7 +346,7 @@ Matching non-blocking probe. Similar to [`MPI.Iprobe`](@ref), except that it
 also returns `msg`, an [`MPI.Message`](@ref) object. 
 
 Checks if there is a message that can be received matching `source`, `tag` and
-`comm`. If so, returns `ismsg = true`, and a [`Message`](@ref) objec `msg`,
+`comm`. If so, returns `ismsg = true`, and a [`Message`](@ref) object `msg`,
 which must be received by either [`MPI.Mrecv!`](@ref) or [`MPI.Imrecv!`](@ref).
 Otherwise `msg` is set to be a null `Message`.
     
@@ -380,7 +380,7 @@ Matching blocking probe. Similar to [`MPI.Probe`](@ref), except that it also
 returns `msg`, an [`MPI.Message`](@ref) object. 
 
 Blocks until a message that can be received matching `source`, `tag` and `comm`,
-returning a [`Message`](@ref) objec `msg`, which must be received by either
+returning a [`Message`](@ref) object `msg`, which must be received by either
 [`MPI.Mrecv!`](@ref) or [`MPI.Imrecv!`](@ref).
     
 The `Status` argument additionally returns the [`Status`](@ref) of the completed


Test patch:
diff --git a/.github/workflows/UnitTests.yml b/.github/workflows/UnitTests.yml
index 07f4fe7..887e7b0 100644
--- a/.github/workflows/UnitTests.yml
+++ b/.github/workflows/UnitTests.yml
@@ -33,7 +33,7 @@ jobs:
     strategy:
       matrix:
         os:
-          - macos-latest
+          - macos-13
           - ubuntu-latest
           - windows-latest
         julia_version:
@@ -42,8 +42,12 @@ jobs:
           - "nightly"
         julia_arch: [x64, x86]
         exclude:
-          - os: macos-latest
+          - os: macos-13
             julia_arch: x86
+        include:
+          - os: macos-14
+            julia_arch: "aarch64"
+            julia_version: "1"
 
       fail-fast: false
 
@@ -67,8 +71,9 @@ jobs:
 
     - uses: julia-actions/julia-runtest@v1
     - uses: julia-actions/julia-processcoverage@v1
-    - uses: codecov/codecov-action@v3
+    - uses: codecov/codecov-action@v4
       with:
+        token: ${{ secrets.CODECOV_TOKEN }}
         files: lcov.info
     - uses: julia-actions/julia-uploadcoveralls@v1
       continue-on-error: true
@@ -80,7 +85,7 @@ jobs:
     strategy:
       matrix:
         os:
-          - macos-latest
+          - macos-13
           - ubuntu-latest
         julia_version:
           - "1.6"
@@ -88,7 +93,7 @@ jobs:
           - "nightly"
         julia_arch: [x64, x86]
         exclude:
-          - os: macos-latest
+          - os: macos-13
             julia_arch: x86
 
       fail-fast: false
@@ -131,15 +136,26 @@ jobs:
     timeout-minutes: 20
     strategy:
       matrix:
+        os:
+          - macos-13
+          - macos-14
         mpi:
           - mpich
           - openmpi
         julia_version:
           - "1"
+        julia_arch:
+          - "x64"
+          - "aarch64"
+        exclude:
+          - os: macos-13
+            julia_arch: "aarch64"
+          - os: macos-14
+            julia_arch: "x64"
 
       fail-fast: false
 
-    runs-on: macos-latest
+    runs-on: ${{ matrix.os }}
     env:
       JULIA_MPI_TEST_BINARY: system
       ZES_ENABLE_SYSMAN: 1  # https://github.com/open-mpi/ompi/issues/10142
@@ -149,13 +165,13 @@ jobs:
       uses: actions/checkout@v4
 
     - name: Install MPI via homebrew
-      run: brew install $MPI
-      env:
-        MPI: ${{ matrix.mpi }}
+      run: |
+        brew install "${{ matrix.mpi }}"
 
     - uses: julia-actions/setup-julia@v1
       with:
         version: ${{ matrix.julia_version }}
+        arch: ${{ matrix.julia_arch }}
 
     - uses: julia-actions/cache@v1
     - name: add MPIPreferences
@@ -168,7 +184,9 @@ jobs:
       shell: julia --color=yes --project=. {0}
       run: |
         using MPIPreferences
-        MPIPreferences.use_system_binary()
+        mpi_prefix = readchomp(`brew --prefix ${{ matrix.mpi }}`)
+        libdir = joinpath(mpi_prefix, "lib")
+        MPIPreferences.use_system_binary(; extra_paths=[libdir])
 
     - uses: julia-actions/julia-runtest@v1
       env:
@@ -233,7 +251,7 @@ jobs:
           - container: ghcr.io/juliaparallel/github-actions-buildcache:intel-mpi-jq
             name: "Intel MPI 2019.9.304"
           - container: ghcr.io/juliaparallel/github-actions-buildcache:intel-oneapi-mpi-jq
-            name: "Intel oneAPI MPI 2021.7.0"
+            name: "Intel oneAPI MPI 2021.11.0"
 
       fail-fast: false
 
@@ -323,7 +341,7 @@ jobs:
     strategy:
       matrix:
         os:
-          - macos-latest
+          - macos-13
           - ubuntu-latest
         mpi: [mpitrampoline]
         julia_version:
@@ -334,7 +352,7 @@ jobs:
           - x64
           - x86
         exclude:
-          - os: macos-latest
+          - os: macos-13
             julia_arch: x86
 
       fail-fast: false
@@ -385,7 +403,7 @@ jobs:
           # - "1.7"
           # - "nightly"
         MPIWrapper:
-          - "2.10.3"
+          - "2.11.0"
 
       fail-fast: false
 
@@ -452,7 +470,7 @@ jobs:
         julia_version:
           - "1"
         MPIWrapper:
-          - "2.10.3"
+          - "2.11.0"
 
       fail-fast: false
 
@@ -519,6 +537,8 @@ jobs:
         include:
           - container: ghcr.io/juliaparallel/github-actions-buildcache:mvapich2-jq
             name: "MVAPICH 2.3.7"
+          - container: ghcr.io/juliaparallel/github-actions-buildcache:mvapich3-jq
+            name: "MVAPICH 3.0"
 
       fail-fast: false
 
@@ -530,6 +550,58 @@ jobs:
       JULIA_MPI_TEST_BINARY: system
       JULIA_MPI_TEST_EXCLUDE: test_spawn.jl
       MV2_SMP_USE_CMA: 0
+      # Work around issue with affinity not set.  Ref:
+      # https://github.com/JuliaParallel/MPI.jl/pull/810#issuecomment-1920255386
+      MVP_ENABLE_AFFINITY: 0
+
+    steps:
+    - name: Checkout
+      uses: actions/checkout@v4
+
+    - uses: julia-actions/setup-julia@v1
+      with:
+        version: "1"
+
+    - uses: julia-actions/cache@v1
+    - name: add MPIPreferences
+      shell: julia --color=yes --project=. {0}
+      run: |
+        using Pkg
+        Pkg.develop(path="lib/MPIPreferences")
+        Pkg.precompile()
+
+    - name: use system MPI
+      shell: julia --color=yes --project=. {0}
+      run: |
+        using MPIPreferences
+        MPIPreferences.use_system_binary()
+
+    - uses: julia-actions/julia-runtest@v1
+
+
+  # TODO: Can remove this once we can use OpenMPI_jll v5
+  test-spack-openmpi5:
+    timeout-minutes: 20
+    strategy:
+      matrix:
+        include:
+          - container: ghcr.io/juliaparallel/github-actions-buildcache:openmpi5-jq
+            name: "OpenMPI 5.0.2"
+
+      fail-fast: false
+
+    runs-on: ubuntu-22.04
+    container: ${{ matrix.container }}
+    name: "Test ${{ matrix.name }}"
+
+    env:
+      JULIA_MPI_TEST_BINARY: system
+      JULIA_MPI_TEST_ABI: OpenMPI
+      # Allow running as root
+      OMPI_ALLOW_RUN_AS_ROOT: 1
+      OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1
+      # Allow oversubscription
+      PRTE_MCA_rmaps_default_mapping_policy: :oversubscribe
 
     steps:
     - name: Checkout
diff --git a/test/Project.toml b/test/Project.toml
index 21702f8..10b4a85 100644
--- a/test/Project.toml
+++ b/test/Project.toml
@@ -15,5 +15,5 @@ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
 CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
 
 [compat]
-AMDGPU = "0.6, 0.7, 0.8"
+AMDGPU = "0.6, 0.7, 0.8, 0.9"
 CUDA = "3, 4, 5"
diff --git a/test/mpiexecjl.jl b/test/mpiexecjl.jl
index 388e58a..4d40bef 100644
--- a/test/mpiexecjl.jl
+++ b/test/mpiexecjl.jl
@@ -34,5 +34,10 @@ using MPI
         # Without arguments, or only with the `--project` option, the wrapper will fail
         @test !withenv(() -> success(`$(mpiexecjl) --project=$(dir)`), env...)
         @test !withenv(() -> success(`$(mpiexecjl)`), env...)
+        # Test that the wrapper exits with the same exit code as the MPI process
+        exit_code = 10
+        p = run(`$(mpiexecjl) -n $(nprocs) --project=$(dir) $(julia) --startup-file=no -e "exit($(exit_code))"`; wait=false)
+        wait(p)
+        @test p.exitcode == exit_code
     end
 end
diff --git a/test/runtests.jl b/test/runtests.jl
index 99b7d18..2a2fdd7 100644
--- a/test/runtests.jl
+++ b/test/runtests.jl
@@ -38,6 +38,11 @@ using DoubleFloats
     end
     CUDA.precompile_runtime()
     ArrayType = CUDA.CuArray
+
+    @info """
+    Running CUDA tests. Ensure that your MPI implementation is
+    CUDA-aware using `MPI.has_cuda` before reporting issues.
+    """
 elseif backend_name == "AMDGPU"
     Pkg.add("AMDGPU")
     ENV["JULIA_MPI_TEST_ARRAYTYPE"] = "ROCArray"
diff --git a/test/test_basic.jl b/test/test_basic.jl
index 495c9f8..3da0139 100644
--- a/test/test_basic.jl
+++ b/test/test_basic.jl
@@ -8,10 +8,22 @@ MPI.Init()
 
 @test MPI.has_cuda() isa Bool
 
-if get(ENV,"JULIA_MPI_TEST_ARRAYTYPE","") == "CuArray"
+if get(ENV, "JULIA_MPI_TEST_ARRAYTYPE", "") == "CuArray"
     @test MPI.has_cuda()
 end
 
+@test MPI.has_rocm() isa Bool
+
+if get(ENV, "JULIA_MPI_TEST_ARRAYTYPE", "") == "ROCArray"
+    @test MPI.has_rocm()
+end
+
+@test MPI.has_gpu() isa Bool
+
+if get(ENV, "JULIA_MPI_TEST_ARRAYTYPE", "") == "CuArray" || get(ENV, "JULIA_MPI_TEST_ARRAYTYPE", "") == "ROCArray"
+    @test MPI.has_gpu()
+end
+
 @test !MPI.Finalized()
 MPI.Finalize()
 @test MPI.Finalized()