offtarget 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- offload/__init__.py +10 -0
- offload/__main__.py +5 -0
- offload/_bundle.py +74 -0
- offload/_root/catalog/acc/claims.yaml +197 -0
- offload/_root/catalog/acc/clauses.yaml +391 -0
- offload/_root/catalog/acc/no_oracle.yaml +89 -0
- offload/_root/catalog/acc/out_of_scope.yaml +17 -0
- offload/_root/catalog/acc/rules.yaml +433 -0
- offload/_root/catalog/acc/semantic_atoms.yaml +27 -0
- offload/_root/catalog/acc/skeleton.yaml +1567 -0
- offload/_root/catalog/acc/spec_overrides.yaml +72 -0
- offload/_root/catalog/later_forms.yaml +76 -0
- offload/_root/catalog/machines.yaml +218 -0
- offload/_root/catalog/omp/claims.yaml +2047 -0
- offload/_root/catalog/omp/clauses.yaml +914 -0
- offload/_root/catalog/omp/derivations.yaml +177 -0
- offload/_root/catalog/omp/memory_modes.yaml +40 -0
- offload/_root/catalog/omp/no_oracle.yaml +373 -0
- offload/_root/catalog/omp/omp50_delta.yaml +377 -0
- offload/_root/catalog/omp/out_of_scope.yaml +64 -0
- offload/_root/catalog/omp/port_equivalence.yaml +352 -0
- offload/_root/catalog/omp/rules.yaml +3131 -0
- offload/_root/catalog/omp/rules_coverage.yaml +9939 -0
- offload/_root/catalog/omp/semantic_atoms.yaml +34 -0
- offload/_root/catalog/omp/skeleton.yaml +9181 -0
- offload/_root/catalog/omp/spec_overrides.yaml +932 -0
- offload/_root/catalog/toolchains.yaml +472 -0
- offload/_root/catalog/vendor_claims_generic.yaml +40925 -0
- offload/_root/data/canuse/b.json +1 -0
- offload/_root/data/canuse/c.json +1 -0
- offload/_root/data/canuse/columns.json +1 -0
- offload/_root/data/canuse/d.json +1 -0
- offload/_root/data/canuse/f.json +1 -0
- offload/_root/data/canuse/index.json +1 -0
- offload/_root/data/canuse/p.json +1 -0
- offload/_root/data/compilers/afar.json +1 -0
- offload/_root/data/compilers/cce19.json +1 -0
- offload/_root/data/compilers/cce20.json +1 -0
- offload/_root/data/compilers/cce21.json +1 -0
- offload/_root/data/compilers/cce21_4.json +1 -0
- offload/_root/data/compilers/gcc.json +1 -0
- offload/_root/data/compilers/gcc_sm80.json +1 -0
- offload/_root/data/compilers/nvhpc.json +1 -0
- offload/_root/data/compilers/nvhpc269.json +1 -0
- offload/_root/data/findings/AUTHORING.md +107 -0
- offload/_root/data/findings/README.md +33 -0
- offload/_root/data/findings/afar-c-error-directive-in-target-link.c +37 -0
- offload/_root/data/findings/afar-c-lastprivate-distribute-parallel-for-small-type.c +56 -0
- offload/_root/data/findings/afar-c-teams-distribute-reduction-first-team.c +59 -0
- offload/_root/data/findings/afar-c-update-iterator-copy-mode.c +45 -0
- offload/_root/data/findings/afar-c-xnack1-target-is-present.c +31 -0
- offload/_root/data/findings/afar-cce19-character-defaultmap.f90 +27 -0
- offload/_root/data/findings/afar-cce19-task-in-target-ice.f90 +23 -0
- offload/_root/data/findings/afar-clang-requires-device-safesync-hang.c +24 -0
- offload/_root/data/findings/afar-flang-firstprivate-map-two-targets.f90 +34 -0
- offload/_root/data/findings/afar-flang-loop-bind-teams-reduction.f90 +27 -0
- offload/_root/data/findings/afar-flang-task-reduction-max.f90 +31 -0
- offload/_root/data/findings/afar-flang-thread-limit-target-parallel-do.f90 +22 -0
- offload/_root/data/findings/afar-linear-ref-omp50.f90 +29 -0
- offload/_root/data/findings/afar-loop-bind-thread-in-teams.f90 +44 -0
- offload/_root/data/findings/afar-nontemporal-assumed-shape-ice.f90 +38 -0
- offload/_root/data/findings/afar-udr-derived-type-link.f90 +41 -0
- offload/_root/data/findings/afar-xnack1-atomic-min-nested-parallel.f90 +53 -0
- offload/_root/data/findings/afar-xnack1-present-not-enforced.f90 +36 -0
- offload/_root/data/findings/afar-xnack1-target-is-present.f90 +47 -0
- offload/_root/data/findings/apps/afar-cce-teams-private-array-nested-parallel-wrong.f90 +100 -0
- offload/_root/data/findings/apps/cce20-device-link-infer-address-spaces-crash.f90 +159 -0
- offload/_root/data/findings/apps/cce21-device-link-agpr-copy-mfma-assert.f90 +343 -0
- offload/_root/data/findings/apps/cce21-private-array-loaded-subscript-wrong.f90 +113 -0
- offload/_root/data/findings/apps/controls/bubble-simple-rddot.f90 +284 -0
- offload/_root/data/findings/apps/controls/bubble-two-substeps.f90 +287 -0
- offload/_root/data/findings/apps/controls/cbc-inline.f90 +97 -0
- offload/_root/data/findings/apps/controls/cbc-integers.f90 +91 -0
- offload/_root/data/findings/apps/controls/cbc-only-density.f90 +97 -0
- offload/_root/data/findings/apps/controls/cbc-only-velocity.f90 +97 -0
- offload/_root/data/findings/apps/controls/gcc-acc-c-tile-control.c +26 -0
- offload/_root/data/findings/apps/controls/gcc-acc-tile-control.f90 +29 -0
- offload/_root/data/findings/apps/controls/private-array-subscript-probes.f90 +45 -0
- offload/_root/data/findings/apps/controls/teams-private-array-read-par.f90 +31 -0
- offload/_root/data/findings/apps/controls/teams-private-array-seq.f90 +30 -0
- offload/_root/data/findings/apps/controls/teams-private-array-shared.f90 +34 -0
- offload/_root/data/findings/apps/controls/teams-private-array-split.f90 +36 -0
- offload/_root/data/findings/apps/controls/teams-private-array-write-par.f90 +31 -0
- offload/_root/data/findings/apps/gcc-acc-c-tile-partial-tiles-wrong.c +60 -0
- offload/_root/data/findings/apps/gcc-acc-tile-partial-tiles-wrong.f90 +64 -0
- offload/_root/data/findings/catalog/afar-c-complex-reduction-link.c +66 -0
- offload/_root/data/findings/catalog/afar-c-critical-hint-link.c +68 -0
- offload/_root/data/findings/catalog/afar-c-ordered-doacross-link.c +62 -0
- offload/_root/data/findings/catalog/afar-c-reduction-task-link.c +81 -0
- offload/_root/data/findings/catalog/afar-flang-absent-optional-target-crash.f90 +76 -0
- offload/_root/data/findings/catalog/afar-flang-critical-target-parallel-wrong.f90 +74 -0
- offload/_root/data/findings/catalog/afar-flang-dist-schedule-chunk.f90 +80 -0
- offload/_root/data/findings/catalog/afar-flang-linear-parallel-ice.f90 +68 -0
- offload/_root/data/findings/catalog/afar-flang-named-critical-link.f90 +67 -0
- offload/_root/data/findings/catalog/afar-flang-ordered-wrong.f90 +78 -0
- offload/_root/data/findings/catalog/afar-flang-reduction-minus-rejected.f90 +77 -0
- offload/_root/data/findings/catalog/afar-flang-reduction-task-ice.f90 +68 -0
- offload/_root/data/findings/catalog/afar-flang-sections-in-target-ice.f90 +67 -0
- offload/_root/data/findings/catalog/afar-flang-workdistribute-ice.f90 +71 -0
- offload/_root/data/findings/catalog/c-allocate-const-mem-firstprivate-wrong.c +79 -0
- offload/_root/data/findings/catalog/cce-acc-allocate-in-compute-crash.f90 +65 -0
- offload/_root/data/findings/catalog/cce-acc-character-dummy-routine-ice.f90 +81 -0
- offload/_root/data/findings/catalog/cce-acc-loop-seq-in-routine-wrong.f90 +81 -0
- offload/_root/data/findings/catalog/cce-acc-stop-in-compute-crash.f90 +62 -0
- offload/_root/data/findings/catalog/cce-allocators-stack-ice.f90 +81 -0
- offload/_root/data/findings/catalog/cce-atomic-default-mem-order-acquire-release-rejected.f90 +61 -0
- offload/_root/data/findings/catalog/cce-c-allocate-align-link.c +83 -0
- offload/_root/data/findings/catalog/cce-c-allocate-allocator-modifier-rejected.c +77 -0
- offload/_root/data/findings/catalog/cce-c-device-type-directive-name-ice.c +70 -0
- offload/_root/data/findings/catalog/cce-c-dist-schedule-chunk.c +81 -0
- offload/_root/data/findings/catalog/cce-c-f-pointer-device-link.f90 +70 -0
- offload/_root/data/findings/catalog/cce-c-lastprivate-parallel-in-seq-loop-wrong.c +64 -0
- offload/_root/data/findings/catalog/cce-c-long-double-ice.c +61 -0
- offload/_root/data/findings/catalog/cce-c-map-iterator-ice.c +92 -0
- offload/_root/data/findings/catalog/cce-c-motion-iterator-rejected.c +68 -0
- offload/_root/data/findings/catalog/cce-c-ordered-doacross-link.c +64 -0
- offload/_root/data/findings/catalog/cce-c-ordered-link.c +77 -0
- offload/_root/data/findings/catalog/cce-c-recursive-function-ice.c +62 -0
- offload/_root/data/findings/catalog/cce-c-reduction-inscan-ice.c +67 -0
- offload/_root/data/findings/catalog/cce-c-reduction-task-link.c +73 -0
- offload/_root/data/findings/catalog/cce-c-sections-in-target-wrong.c +70 -0
- offload/_root/data/findings/catalog/cce-c-single-masked-task-link.c +66 -0
- offload/_root/data/findings/catalog/cce-c-task-in-target-link.c +75 -0
- offload/_root/data/findings/catalog/cce-c-uses-allocators-traits-rejected.c +71 -0
- offload/_root/data/findings/catalog/cce-flang-allocate-const-mem-ice.f90 +67 -0
- offload/_root/data/findings/catalog/cce-flang-allocate-in-target-crash.f90 +68 -0
- offload/_root/data/findings/catalog/cce-flang-lastprivate-parallel-in-seq-loop-wrong.f90 +83 -0
- offload/_root/data/findings/catalog/cce-flang-stop-in-target-crash.f90 +64 -0
- offload/_root/data/findings/catalog/cce-iterator-link.f90 +67 -0
- offload/_root/data/findings/catalog/cce-linear-lastprivate-ice.f90 +69 -0
- offload/_root/data/findings/catalog/cce-nohost-link.f90 +90 -0
- offload/_root/data/findings/catalog/cce-reduction-inscan-ice.f90 +66 -0
- offload/_root/data/findings/catalog/cce-reduction-task-link.f90 +76 -0
- offload/_root/data/findings/catalog/cce19-reduction-task-addrspacecast-ice.f90 +77 -0
- offload/_root/data/findings/catalog/cce20-c-defaultmap-private-storage-rejected.c +85 -0
- offload/_root/data/findings/catalog/cce20-map-self-rejected.f90 +64 -0
- offload/_root/data/findings/catalog/cce21-c-declare-target-local-rejected.c +73 -0
- offload/_root/data/findings/catalog/cce21-c-target-loop-ice.c +77 -0
- offload/_root/data/findings/catalog/defaultmap-present-private-array-abort.f90 +73 -0
- offload/_root/data/findings/catalog/nvhpc-acc-associate-illegal-address.f90 +66 -0
- offload/_root/data/findings/catalog/nvhpc-c-function-pointer-kernel-missing.c +68 -0
- offload/_root/data/findings/catalog/nvhpc-c-long-double-kernel-missing.c +64 -0
- offload/_root/data/findings/catalog/nvhpc-c-static-local-kernel-missing.c +73 -0
- offload/_root/data/findings/catalog/nvhpc-c-vla-kernel-missing.c +63 -0
- offload/_root/data/findings/catalog/nvhpc-flang-type-bound-kernel-missing.f90 +86 -0
- offload/_root/data/findings/cce-acc-init-set-runtime-assert.f90 +35 -0
- offload/_root/data/findings/cce-acc-reduction-200-int8-scalars-wrong.f90 +1278 -0
- offload/_root/data/findings/cce-acc-routine-bind-module-ice.f90 +35 -0
- offload/_root/data/findings/cce-acc-self-condition-ignored.f90 +17 -0
- offload/_root/data/findings/cce-c-dist-schedule-segv.c +34 -0
- offload/_root/data/findings/cce-c-map-delete-refcount.c +47 -0
- offload/_root/data/findings/cce-c-map-present-assert.c +45 -0
- offload/_root/data/findings/cce-c-openmp45-device-link.c +34 -0
- offload/_root/data/findings/cce-c-parallel-for-in-target.c +73 -0
- offload/_root/data/findings/cce-defaultmap-tofrom-explicit-map.f90 +92 -0
- offload/_root/data/findings/cce-mapper-next-map-copy-back.f90 +48 -0
- offload/_root/data/findings/cce-trim-merge-output-one-character.f90 +40 -0
- offload/_root/data/findings/cce-uses-allocators-traits-omp50.f90 +28 -0
- offload/_root/data/findings/cce19-acc-if-false-link.f90 +17 -0
- offload/_root/data/findings/cce19-c-reduction-63-scalars-one-wrong.c +235 -0
- offload/_root/data/findings/cce19-target-parallel-guarded-loop.f90 +35 -0
- offload/_root/data/findings/cce19-target-parallel-single-ice.f90 +38 -0
- offload/_root/data/findings/cce21-alloc-2e32-sum-wrong.f90 +68 -0
- offload/_root/data/findings/cce21-defaultmap-aggregate-flag.f90 +52 -0
- offload/_root/data/findings/cce21-in-reduction-assumed-shape-write-lost.f90 +61 -0
- offload/_root/data/findings/cce21-in-reduction-taskwait-link.f90 +59 -0
- offload/_root/data/findings/cce21-linear-modifier-default-none.f90 +59 -0
- offload/_root/data/findings/clang-c-declare-target-to-omp52.c +50 -0
- offload/_root/data/findings/clang-c-linear-directive-name-hang.c +30 -0
- offload/_root/data/findings/clang-c-map-iterator-omp51.c +51 -0
- offload/_root/data/findings/clang-c-shared-declare-target-combined.c +58 -0
- offload/_root/data/findings/dataenv/cce-value-dummy-target-write-visible.f90 +74 -0
- offload/_root/data/findings/defaultmap-none-loop-variable.f90 +69 -0
- offload/_root/data/findings/fortran-loop-bind-thread-in-parallel.f90 +53 -0
- offload/_root/data/findings/fortran-schedule-static-in-target.f90 +55 -0
- offload/_root/data/findings/fresh/cce-common-block-name-in-map-rejected.f90 +47 -0
- offload/_root/data/findings/fresh/cce-if-stop-in-target-ice-one-condition.f90 +38 -0
- offload/_root/data/findings/fresh/cce-if-stop-in-target-ice.f90 +43 -0
- offload/_root/data/findings/fresh/cce-list-directed-print-in-target-copy-crash.f90 +40 -0
- offload/_root/data/findings/fresh/cce19-acc-automatic-array-copyout-copy-crash.f90 +56 -0
- offload/_root/data/findings/fresh/cce21-combined-if-runtime-expr-loop-skipped.f90 +57 -0
- offload/_root/data/findings/fresh/nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.f90 +67 -0
- offload/_root/data/findings/fresh/nvhpc-teams-loop-module-allocatable-assign-fort2-crash.f90 +73 -0
- offload/_root/data/findings/fuzz/1131-afar.f90 +48 -0
- offload/_root/data/findings/fuzz/1391-cce20.f90 +40 -0
- offload/_root/data/findings/fuzz/14-cce20.f90 +36 -0
- offload/_root/data/findings/fuzz/1505-cce20.f90 +88 -0
- offload/_root/data/findings/fuzz/1540-afar.f90 +44 -0
- offload/_root/data/findings/fuzz/158-afar.f90 +63 -0
- offload/_root/data/findings/fuzz/16-cce20.f90 +39 -0
- offload/_root/data/findings/fuzz/1644-cce21.f90 +31 -0
- offload/_root/data/findings/fuzz/165-cce19.f90 +52 -0
- offload/_root/data/findings/fuzz/1749-cce20.f90 +34 -0
- offload/_root/data/findings/fuzz/1936-afar.f90 +61 -0
- offload/_root/data/findings/fuzz/1978-cce19.f90 +41 -0
- offload/_root/data/findings/fuzz/2014-cce19.f90 +46 -0
- offload/_root/data/findings/fuzz/2224-cce19.f90 +30 -0
- offload/_root/data/findings/fuzz/2334-cce19.f90 +57 -0
- offload/_root/data/findings/fuzz/536-cce19.f90 +38 -0
- offload/_root/data/findings/fuzz/591-cce19.f90 +54 -0
- offload/_root/data/findings/fuzz/650-afar.f90 +58 -0
- offload/_root/data/findings/fuzz/698-afar.f90 +68 -0
- offload/_root/data/findings/fuzz/700-afar.f90 +46 -0
- offload/_root/data/findings/fuzz/775-cce21.f90 +33 -0
- offload/_root/data/findings/fuzz/87-afar.f90 +47 -0
- offload/_root/data/findings/fuzz/916-afar.f90 +67 -0
- offload/_root/data/findings/fuzz/958-cce20.f90 +44 -0
- offload/_root/data/findings/fuzz/98-cce19.f90 +40 -0
- offload/_root/data/findings/fuzz/README.md +236 -0
- offload/_root/data/findings/fuzz/b1-121-afar.f90 +47 -0
- offload/_root/data/findings/fuzz/b1-183-afar.f90 +55 -0
- offload/_root/data/findings/fuzz/b1-22-cce20.f90 +38 -0
- offload/_root/data/findings/fuzz/b1-231-afar.f90 +56 -0
- offload/_root/data/findings/fuzz/b1-268-afar.f90 +46 -0
- offload/_root/data/findings/fuzz/b2-183-afar.f90 +57 -0
- offload/_root/data/findings/fuzz/b2-209-cce19.f90 +51 -0
- offload/_root/data/findings/fuzz/b2-213-afar.f90 +63 -0
- offload/_root/data/findings/fuzz/b2-52-afar.f90 +56 -0
- offload/_root/data/findings/fuzz/b2-68-afar.f90 +54 -0
- offload/_root/data/findings/fuzz/b2-85-cce20.f90 +55 -0
- offload/_root/data/findings/fuzz/b3-188-cce19.f90 +90 -0
- offload/_root/data/findings/fuzz/b3-190-cce21.f90 +88 -0
- offload/_root/data/findings/fuzz/b3-197-cce19.f90 +77 -0
- offload/_root/data/findings/fuzz/b3-250-cce20.f90 +89 -0
- offload/_root/data/findings/fuzz/b3-278-cce19.f90 +70 -0
- offload/_root/data/findings/fuzz/b3-45-cce21.f90 +83 -0
- offload/_root/data/findings/fuzz/b3-54-afar.f90 +67 -0
- offload/_root/data/findings/fuzz/b3-61-cce20.f90 +100 -0
- offload/_root/data/findings/fuzz/b3-9-afar.f90 +100 -0
- offload/_root/data/findings/fuzz/b3-9-cce21.f90 +103 -0
- offload/_root/data/findings/fuzz/b3-94-afar.f90 +80 -0
- offload/_root/data/findings/fuzz/b4-39-afar.f90 +141 -0
- offload/_root/data/findings/fuzz/b4-86-cce19.f90 +71 -0
- offload/_root/data/findings/fuzz/controls/gcc-complex-pointer-store-control.f90 +28 -0
- offload/_root/data/findings/fuzz/controls/gcc-declare-reduction-module-control.f90 +29 -0
- offload/_root/data/findings/fuzz/controls/gcc-target-simd-map-nontemporal-control.f90 +21 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-mapped-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-unreferenced-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-default-none-removed-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-default-shared-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-firstprivate-removed-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-reduction-mapped-control.f90 +17 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-removed-control.f90 +17 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-tofrom-lastprivate-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-depend-explicit-map-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-depend-removed-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-end-distribute-control.f90 +16 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-num-threads-removed-control.f90 +26 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-removed-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-simd-no-end-directive-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-explicit-length-character-dummy-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-array-value-control.f90 +23 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-distribute-control.f90 +20 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-map-always-first-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-map-always-removed-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-num-threads-removed-control.f90 +12 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-firstprivate-dropped-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-single-nowait-control.f90 +13 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-split-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-collapse-split-control.f90 +21 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-end-directive-control.f90 +14 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-no-collapse-control.f90 +19 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-split-no-end-directive-control.f90 +15 -0
- offload/_root/data/findings/fuzz/gcc-declare-reduction-module-not-found.f90 +66 -0
- offload/_root/data/findings/fuzz/gcc-strided-target-update-rejected.f90 +58 -0
- offload/_root/data/findings/fuzz/gcc-target-simd-map-nontemporal-rejected.f90 +54 -0
- offload/_root/data/findings/fuzz/nvhpc-allocatable-component-implicit-map-illegal-address.f90 +84 -0
- offload/_root/data/findings/fuzz/nvhpc-assumed-length-character-dummy-map-ice.f90 +69 -0
- offload/_root/data/findings/fuzz/nvhpc-default-none-reduction-lastprivate-fort1-crash.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-defaultmap-firstprivate-lastprivate-ice.f90 +71 -0
- offload/_root/data/findings/fuzz/nvhpc-defaultmap-to-scalar-reduction-lost.f90 +82 -0
- offload/_root/data/findings/fuzz/nvhpc-depend-implicit-map-illegal-address.f90 +81 -0
- offload/_root/data/findings/fuzz/nvhpc-distribute-parallel-num-threads-writes-lost.f90 +79 -0
- offload/_root/data/findings/fuzz/nvhpc-end-distribute-simd-rejected.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-loop-character-achar-unsupported.f90 +75 -0
- offload/_root/data/findings/fuzz/nvhpc-map-always-after-map-to-not-copied-back.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-num-threads-reduction-identity-lost.f90 +54 -0
- offload/_root/data/findings/fuzz/nvhpc-target-parallel-firstprivate-translate-failure.f90 +66 -0
- offload/_root/data/findings/fuzz/nvhpc-target-parallel-single-hang.f90 +68 -0
- offload/_root/data/findings/fuzz/nvhpc-target-simd-collapse-translate-failure.f90 +73 -0
- offload/_root/data/findings/fuzz/nvhpc-target-simd-no-end-directive-rejected.f90 +68 -0
- offload/_root/data/findings/fuzz/par-s1-2082-gcc_g90.f90 +71 -0
- offload/_root/data/findings/fuzz/s1-2370-cce21.f90 +67 -0
- offload/_root/data/findings/fuzz/s1-2592-cce21.f90 +56 -0
- offload/_root/data/findings/fuzz/s1-3463-cce21.f90 +92 -0
- offload/_root/data/findings/fuzz/s1-4339-afar.f90 +79 -0
- offload/_root/data/findings/fuzz/s1-6085-cce21.f90 +96 -0
- offload/_root/data/findings/fuzz/s1-6760-cce20.f90 +65 -0
- offload/_root/data/findings/fuzz/s1-6888-cce21.f90 +76 -0
- offload/_root/data/findings/fuzz/s1-7882-cce20.f90 +63 -0
- offload/_root/data/findings/fuzz/s1-8634-cce21.f90 +45 -0
- offload/_root/data/findings/fuzz/s1-91-cce21.f90 +92 -0
- offload/_root/data/findings/fuzz/s1-9443-afar.f90 +59 -0
- offload/_root/data/findings/fuzz/s1-9914-cce19.f90 +78 -0
- offload/_root/data/findings/gcc/controls/gcc-acc-c-detach-control.c +34 -0
- offload/_root/data/findings/gcc/controls/gcc-acc-detach-control.f90 +26 -0
- offload/_root/data/findings/gcc/controls/gcc-defaultmap-to-pointer-control.f90 +31 -0
- offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.c +26 -0
- offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.f90 +21 -0
- offload/_root/data/findings/gcc/gcc-acc-bind-device-type-rejected.f90 +71 -0
- offload/_root/data/findings/gcc/gcc-acc-c-bind-device-type-rejected.c +76 -0
- offload/_root/data/findings/gcc/gcc-acc-c-detach-delete-attach-underflow.c +74 -0
- offload/_root/data/findings/gcc/gcc-acc-c-gang-dim-rejected.c +79 -0
- offload/_root/data/findings/gcc/gcc-acc-c-link-in-routine-rejected.c +82 -0
- offload/_root/data/findings/gcc/gcc-acc-detach-delete-attach-underflow.f90 +66 -0
- offload/_root/data/findings/gcc/gcc-acc-gang-dim-collapse-force-rejected.f90 +69 -0
- offload/_root/data/findings/gcc/gcc-acc-init-set-shutdown-rejected.f90 +70 -0
- offload/_root/data/findings/gcc/gcc-acc-link-in-routine-rejected.f90 +82 -0
- offload/_root/data/findings/gcc/gcc-acc-use-device-allocatable-rejected.f90 +88 -0
- offload/_root/data/findings/gcc/gcc-c-motion-mapper-rejected.c +110 -0
- offload/_root/data/findings/gcc/gcc-c-omp60-undocumented-rejected.c +76 -0
- offload/_root/data/findings/gcc/gcc-c-omp60-unimplemented-rejected.c +119 -0
- offload/_root/data/findings/gcc/gcc-c-target-in-task-mandatory-device-not-found.c +87 -0
- offload/_root/data/findings/gcc/gcc-c-uses-allocators-traits-unimplemented.c +85 -0
- offload/_root/data/findings/gcc/gcc-declare-mapper-rejected.f90 +85 -0
- offload/_root/data/findings/gcc/gcc-defaultmap-to-pointer-copy-back.f90 +66 -0
- offload/_root/data/findings/gcc/gcc-loop-bind-default-none-rejected.f90 +93 -0
- offload/_root/data/findings/gcc/gcc-omp60-undocumented-rejected.f90 +72 -0
- offload/_root/data/findings/gcc/gcc-omp60-unimplemented-rejected.f90 +112 -0
- offload/_root/data/findings/gcc/gcc-target-in-task-mandatory-device-not-found.f90 +83 -0
- offload/_root/data/findings/gcc/gcc-uses-allocators-traits-unimplemented.f90 +78 -0
- offload/_root/data/findings/harvest/afar-flang-strided-target-update.f90 +96 -0
- offload/_root/data/findings/harvest/cce-acc-declare-create-module-allocatable-xnack1-fault.f90 +58 -0
- offload/_root/data/findings/harvest/cce-c-implicit-struct-map-partly-present.c +100 -0
- offload/_root/data/findings/harvest/cce-c-strided-target-update.c +74 -0
- offload/_root/data/findings/harvest/cce-ftn-target-parallel-thread-query-ice.f90 +67 -0
- offload/_root/data/findings/harvest/cce-named-constant-array-declare-target-routine-rejected.f90 +69 -0
- offload/_root/data/findings/harvest/cce-use-device-ptr-c-ptr-not-converted.f90 +64 -0
- offload/_root/data/findings/harvest/cce21-declare-target-link-module-variable-write-lost.f90 +63 -0
- offload/_root/data/findings/harvest/cce21-internal-procedure-calls-internal-in-target-fault.f90 +71 -0
- offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-target-only-control.c +22 -0
- offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-whole-control.c +23 -0
- offload/_root/data/findings/harvest/controls/gcc-acc-declare-create-allocatable-control.f90 +34 -0
- offload/_root/data/findings/harvest/controls/gcc-c-same-item-two-maps-control.c +17 -0
- offload/_root/data/findings/harvest/controls/gcc-c-target-data-struct-pointer-section-control.c +27 -0
- offload/_root/data/findings/harvest/controls/gcc-c-target-data-two-maps-control.c +20 -0
- offload/_root/data/findings/harvest/controls/gcc-same-item-two-maps-control.f90 +16 -0
- offload/_root/data/findings/harvest/controls/gcc-teams-simd-matmul-allocatable-control.f90 +27 -0
- offload/_root/data/findings/harvest/gcc-acc-declare-create-allocatable-not-mapped.f90 +66 -0
- offload/_root/data/findings/harvest/gcc-c-same-item-two-maps-rejected.c +45 -0
- offload/_root/data/findings/harvest/gcc-c-strided-section-rejected.c +70 -0
- offload/_root/data/findings/harvest/gcc-c-target-data-struct-pointer-section-ice.c +78 -0
- offload/_root/data/findings/harvest/gcc-c-target-data-two-maps-ice.c +49 -0
- offload/_root/data/findings/harvest/gcc-same-item-two-maps-rejected.f90 +46 -0
- offload/_root/data/findings/harvest/gcc-teams-simd-matmul-allocatable-ice.f90 +53 -0
- offload/_root/data/findings/harvest/nvhpc-c-target-data-if-false-use-device-ptr-garbage.c +49 -0
- offload/_root/data/findings/harvest/nvhpc-named-constant-array-declare-target-routine-rejected.f90 +65 -0
- offload/_root/data/findings/harvest/nvhpc-use-device-ptr-c-ptr-not-found.f90 +60 -0
- offload/_root/data/findings/harvest/nvhpc2511-target-nowait-in-parallel-for-ice.c +59 -0
- offload/_root/data/findings/hecbench/controls/f16-ctl-float-array.c +28 -0
- offload/_root/data/findings/hecbench/controls/pc-ctl-builtin-popcount.c +37 -0
- offload/_root/data/findings/hecbench/controls/pc-ctl-shift-sum.c +43 -0
- offload/_root/data/findings/hecbench/gcc-c-float16-array-in-target-lto-ice.c +65 -0
- offload/_root/data/findings/hecbench/gcc-c-swar-popcount-assembler-error.c +80 -0
- offload/_root/data/findings/index.yaml +2453 -0
- offload/_root/data/findings/malloc/afar-device-malloc-in-kernel-corrupts-records.c +371 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-direct.c +52 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-fence.c +57 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-flush.c +57 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-stack.c +52 -0
- offload/_root/data/findings/multithread-allocatable-section-maps.f90 +91 -0
- offload/_root/data/findings/nested/afar-cce-c-call-result-member-in-target-rejected.c +69 -0
- offload/_root/data/findings/nested/afar-cce-c-update-struct-and-member-rejected.c +92 -0
- offload/_root/data/findings/nested/afar-flang-pointer-root-allocatable-component-enter-data-fault.f90 +121 -0
- offload/_root/data/findings/nested/cce-c-struct-and-nested-pointee-sections-ice.c +79 -0
- offload/_root/data/findings/nested/cce-fortran-nested-allocatable-component-copy-fault.f90 +64 -0
- offload/_root/data/findings/nested/cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.f90 +93 -0
- offload/_root/data/findings/nested/cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.f90 +80 -0
- offload/_root/data/findings/nested/controls/c3-ctl-nested-data.c +27 -0
- offload/_root/data/findings/nested/controls/c5-acc-serial-struct-and-array.c +26 -0
- offload/_root/data/findings/nested/controls/e2-ctl-two-directives.c +42 -0
- offload/_root/data/findings/nested/controls/e3-ctl-attach-clause.c +42 -0
- offload/_root/data/findings/nested/controls/f3-pointer-array-only.c +33 -0
- offload/_root/data/findings/nested/controls/f5-ctl-copyout-exit.c +33 -0
- offload/_root/data/findings/nested/controls/f6-ctl-pointer-to-struct-array.c +28 -0
- offload/_root/data/findings/nested/controls/g2-ctl-allocatable.f90 +34 -0
- offload/_root/data/findings/nested/controls/g2-ctl-entered-to.f90 +34 -0
- offload/_root/data/findings/nested/controls/g3-ctl-from-struct-no-element.c +27 -0
- offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-to.c +27 -0
- offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-tofrom.c +27 -0
- offload/_root/data/findings/nested/controls/g5-ctl-element-pointers-only.f90 +36 -0
- offload/_root/data/findings/nested/controls/g5-ctl-root-pointer-only.f90 +36 -0
- offload/_root/data/findings/nested/controls/gp2-ctl-no-mapper-explicit-maps.c +24 -0
- offload/_root/data/findings/nested/controls/gt2-ctl-no-always.c +26 -0
- offload/_root/data/findings/nested/controls/gt3-ctl-always-on-structure-only.c +26 -0
- offload/_root/data/findings/nested/controls/j1-embedded-struct-pointer-to-struct.c +24 -0
- offload/_root/data/findings/nested/controls/j2-ctl-pointer-instead-of-embedded.c +24 -0
- offload/_root/data/findings/nested/controls/j6-ctl-struct-and-one-pointee-level.c +23 -0
- offload/_root/data/findings/nested/controls/j7-ctl-struct-and-embedded-pointee.c +24 -0
- offload/_root/data/findings/nested/controls/m2-ctl-variable-root.f90 +32 -0
- offload/_root/data/findings/nested/controls/m3-ctl-fixed-array-component.f90 +32 -0
- offload/_root/data/findings/nested/controls/m5-ctl-no-enter-data.f90 +33 -0
- offload/_root/data/findings/nested/controls/n8-ctl-fixed-array-in-component.f90 +33 -0
- offload/_root/data/findings/nested/controls/n9-ctl-allocatable-in-the-variable.f90 +33 -0
- offload/_root/data/findings/nested/controls/ns4-ctl-two-directives-struct-then-pointee.c +27 -0
- offload/_root/data/findings/nested/controls/ns8-ctl-enter-together-exit-split.c +26 -0
- offload/_root/data/findings/nested/controls/nu3-ctl-update-pointee-only.c +28 -0
- offload/_root/data/findings/nested/controls/p2-ctl-pointer-variable.c +27 -0
- offload/_root/data/findings/nested/controls/p3-ctl-direct-member.c +26 -0
- offload/_root/data/findings/nested/controls/q2-ctl-fixed-array.f90 +37 -0
- offload/_root/data/findings/nested/controls/q3-ctl-allocatable-component-of-the-variable.f90 +38 -0
- offload/_root/data/findings/nested/controls/ta2-ctl-no-allocatable-component.f90 +42 -0
- offload/_root/data/findings/nested/controls/ta3-ctl-allocatable-scalar-in-the-variable.f90 +38 -0
- offload/_root/data/findings/nested/controls/ta4-ctl-pointer-component-only.f90 +42 -0
- offload/_root/data/findings/nested/controls/u3-ctl-update-member-only.c +24 -0
- offload/_root/data/findings/nested/controls/u4-ctl-two-updates.c +25 -0
- offload/_root/data/findings/nested/controls/u5-ctl-same-list-in-map.c +25 -0
- offload/_root/data/findings/nested/controls/ua2-ctl-variable-root.f90 +37 -0
- offload/_root/data/findings/nested/controls/ua4-ctl-to-in-place-of-alloc-and-update.f90 +37 -0
- offload/_root/data/findings/nested/controls/v2-ctl-parent-first.c +25 -0
- offload/_root/data/findings/nested/controls/v4-ctl-embedded-member.c +24 -0
- offload/_root/data/findings/nested/gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.c +83 -0
- offload/_root/data/findings/nested/gcc-acc-c-parent-and-shared-pointee-one-directive.c +88 -0
- offload/_root/data/findings/nested/gcc-acc-c-struct-and-member-array-one-directive.c +84 -0
- offload/_root/data/findings/nested/gcc-c-always-on-pointer-member-section-ice.c +75 -0
- offload/_root/data/findings/nested/gcc-c-declare-mapper-pointer-member-section-gpu-fault.c +93 -0
- offload/_root/data/findings/nested/gcc-c-from-struct-and-pointee-section-rejected.c +83 -0
- offload/_root/data/findings/nested/gcc-fortran-pointer-component-alloc-bounds-lost.f90 +62 -0
- offload/_root/data/findings/nested/gcc-fortran-root-and-element-pointer-components-ice.f90 +77 -0
- offload/_root/data/findings/nested/nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.c +55 -0
- offload/_root/data/findings/nested/nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.c +86 -0
- offload/_root/data/findings/nvhpc-acc-atomic-update-sum-fort2-crash.f90 +53 -0
- offload/_root/data/findings/nvhpc-c-acc-atomic-update-sum-ice.c +43 -0
- offload/_root/data/findings/nvhpc-c-dist-schedule-chunk-compile-hang.c +41 -0
- offload/_root/data/findings/nvhpc-c-map-present-ignored.c +42 -0
- offload/_root/data/findings/nvhpc-c-ordered-in-target-nvcpfe-crash.c +92 -0
- offload/_root/data/findings/nvhpc-c-parallel-for-firstprivate-in-target.c +62 -0
- offload/_root/data/findings/nvhpc-c-parallel-if-in-target-nvvm-ice.c +56 -0
- offload/_root/data/findings/nvhpc-defaultmap-firstprivate-explicit-map.f90 +45 -0
- offload/_root/data/findings/nvhpc-defaultmap-from-allocatable-indexing.f90 +60 -0
- offload/_root/data/findings/nvhpc-depend-inoutset-ignored.f90 +64 -0
- offload/_root/data/findings/nvhpc-dist-schedule-chunk-illegal-address.f90 +52 -0
- offload/_root/data/findings/nvhpc-managed-acc-shutdown-host-access.f90 +42 -0
- offload/_root/data/findings/nvhpc-parallel-if-in-target-nvvm-ice.f90 +60 -0
- offload/_root/data/findings/oop/afar-final-dealloc-device-link.f90 +85 -0
- offload/_root/data/findings/oop/afar-pdt-length-parameter-not-implemented.f90 +65 -0
- offload/_root/data/findings/oop/cce-class-is-device-link.f90 +86 -0
- offload/_root/data/findings/oop/cce-copy-alloc-component-section-fault.f90 +73 -0
- offload/_root/data/findings/oop/cce-copy-parent-to-component-tofrom-lost.f90 +65 -0
- offload/_root/data/findings/oop/cce-copy-second-member-section-lost.f90 +65 -0
- offload/_root/data/findings/oop/cce-element-component-map-lost.f90 +64 -0
- offload/_root/data/findings/oop/cce-final-dealloc-device-abort.f90 +85 -0
- offload/_root/data/findings/oop/cce-pdt-default-mapper-rejected.f90 +71 -0
- offload/_root/data/findings/oop/cce-polymorphic-dispatch-device-link.f90 +100 -0
- offload/_root/data/findings/oop/cce-section-of-element-component-overlap.f90 +76 -0
- offload/_root/data/findings/oop/cce-select-type-guard-not-taken.f90 +91 -0
- offload/_root/data/findings/oop/cce-udr-derived-type-unsupported.f90 +69 -0
- offload/_root/data/findings/oop/cce21-element-component-map-lost.f90 +62 -0
- offload/_root/data/findings/oop/controls/alloccomp-comp-only.f90 +44 -0
- offload/_root/data/findings/oop/controls/alloccomp-whole-explicit-component.f90 +50 -0
- offload/_root/data/findings/oop/controls/alloccomp-whole.f90 +49 -0
- offload/_root/data/findings/oop/controls/elemsec-element.f90 +47 -0
- offload/_root/data/findings/oop/controls/final-local.f90 +64 -0
- offload/_root/data/findings/oop/controls/host-class-star-select-type.f90 +58 -0
- offload/_root/data/findings/oop/controls/host-firstprivate-defined-assignment.f90 +54 -0
- offload/_root/data/findings/oop/controls/host-lastprivate-defined-assignment.f90 +58 -0
- offload/_root/data/findings/oop/controls/host-private-finalization.f90 +51 -0
- offload/_root/data/findings/oop/controls/host-select-type.f90 +65 -0
- offload/_root/data/findings/oop/controls/parent-and-comp-component-only.f90 +45 -0
- offload/_root/data/findings/oop/controls/pdt-kind.f90 +46 -0
- offload/_root/data/findings/oop/controls/pdt-len-host.f90 +43 -0
- offload/_root/data/findings/oop/controls/pdt-len-unparameterized.f90 +46 -0
- offload/_root/data/findings/oop/controls/poly-dispatch-static.f90 +75 -0
- offload/_root/data/findings/oop/controls/section-alloc-whole-component.f90 +49 -0
- offload/_root/data/findings/oop/controls/section-element-whole-array.f90 +50 -0
- offload/_root/data/findings/oop/controls/section-element-whole-component.f90 +50 -0
- offload/_root/data/findings/oop/controls/section-fixed.f90 +43 -0
- offload/_root/data/findings/oop/controls/tbp-override.f90 +64 -0
- offload/_root/data/findings/oop/gcc-acc-parent-and-member-data-rejected.f90 +63 -0
- offload/_root/data/findings/oop/gcc-pdt-length-parameter-abort.f90 +68 -0
- offload/_root/data/findings/oop/gcc-polymorphic-dispatch-abort.f90 +97 -0
- offload/_root/data/findings/oop/gcc-vtab-not-marked-for-offload.f90 +94 -0
- offload/_root/data/findings/oop/nvhpc-copy-alloc-component-illegal-address.f90 +76 -0
- offload/_root/data/findings/oop/nvhpc-copy-pdt-length-parameter-illegal-address.f90 +69 -0
- offload/_root/data/findings/oop/nvhpc-named-mapper-rejected.f90 +65 -0
- offload/_root/data/findings/oop/nvhpc-polymorphic-dispatch-translate-failure.f90 +90 -0
- offload/_root/data/findings/oop/nvhpc-polymorphism-runtime-unsupported.f90 +94 -0
- offload/_root/data/findings/oop/nvhpc-type-bound-call-rejected.f90 +89 -0
- offload/_root/data/findings/oop/nvhpc-udr-derived-type-rejected.f90 +67 -0
- offload/_root/data/findings/reviews/afar-c-error-directive-in-target-link.json +217 -0
- offload/_root/data/findings/reviews/afar-c-lastprivate-distribute-parallel-for-small-type.json +113 -0
- offload/_root/data/findings/reviews/afar-c-teams-distribute-reduction-first-team.json +130 -0
- offload/_root/data/findings/reviews/afar-c-update-iterator-copy-mode.json +113 -0
- offload/_root/data/findings/reviews/afar-cce19-character-defaultmap.json +292 -0
- offload/_root/data/findings/reviews/afar-clang-requires-device-safesync-hang.json +191 -0
- offload/_root/data/findings/reviews/afar-flang-firstprivate-map-two-targets.json +130 -0
- offload/_root/data/findings/reviews/afar-flang-loop-bind-teams-reduction.json +126 -0
- offload/_root/data/findings/reviews/afar-flang-task-reduction-max.json +113 -0
- offload/_root/data/findings/reviews/afar-flang-thread-limit-target-parallel-do.json +113 -0
- offload/_root/data/findings/reviews/afar-loop-bind-thread-in-teams.json +191 -0
- offload/_root/data/findings/reviews/afar-nontemporal-assumed-shape-ice.json +113 -0
- offload/_root/data/findings/reviews/afar-udr-derived-type-link.json +113 -0
- offload/_root/data/findings/reviews/afar-xnack1-atomic-min-nested-parallel.json +113 -0
- offload/_root/data/findings/reviews/afar-xnack1-target-is-present.json +113 -0
- offload/_root/data/findings/reviews/apps--afar-cce-teams-private-array-nested-parallel-wrong.json +113 -0
- offload/_root/data/findings/reviews/apps--cce20-device-link-infer-address-spaces-crash.json +113 -0
- offload/_root/data/findings/reviews/apps--cce21-device-link-agpr-copy-mfma-assert.json +113 -0
- offload/_root/data/findings/reviews/apps--cce21-private-array-loaded-subscript-wrong.json +113 -0
- offload/_root/data/findings/reviews/apps--gcc-acc-c-tile-partial-tiles-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-c-ordered-doacross-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-c-reduction-task-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-absent-optional-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-critical-target-parallel-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-dist-schedule-chunk.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-linear-parallel-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-named-critical-link.json +126 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-ordered-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-reduction-minus-rejected.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-sections-in-target-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-workdistribute-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--c-allocate-const-mem-firstprivate-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-acc-character-dummy-routine-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-acc-loop-seq-in-routine-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-allocators-stack-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-allocate-align-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-allocate-allocator-modifier-rejected.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-dist-schedule-chunk.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-f-pointer-device-link.json +130 -0
- offload/_root/data/findings/reviews/catalog--cce-c-long-double-ice.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce-c-map-iterator-ice.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce-c-recursive-function-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-sections-in-target-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-allocate-in-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-lastprivate-parallel-in-seq-loop-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-stop-in-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-iterator-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-linear-lastprivate-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-reduction-inscan-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-reduction-task-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce19-reduction-task-addrspacecast-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce20-c-defaultmap-private-storage-rejected.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce20-map-self-rejected.json +204 -0
- offload/_root/data/findings/reviews/catalog--cce21-c-target-loop-ice.json +126 -0
- offload/_root/data/findings/reviews/catalog--defaultmap-present-private-array-abort.json +236 -0
- offload/_root/data/findings/reviews/catalog--nvhpc-acc-associate-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/catalog--nvhpc-c-function-pointer-kernel-missing.json +268 -0
- offload/_root/data/findings/reviews/cce-acc-init-set-runtime-assert.json +113 -0
- offload/_root/data/findings/reviews/cce-acc-reduction-200-int8-scalars-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce-acc-routine-bind-module-ice.json +113 -0
- offload/_root/data/findings/reviews/cce-c-dist-schedule-segv.json +113 -0
- offload/_root/data/findings/reviews/cce-c-map-delete-refcount.json +149 -0
- offload/_root/data/findings/reviews/cce-c-map-present-assert.json +126 -0
- offload/_root/data/findings/reviews/cce-c-openmp45-device-link.json +113 -0
- offload/_root/data/findings/reviews/cce-c-parallel-for-in-target.json +141 -0
- offload/_root/data/findings/reviews/cce-mapper-next-map-copy-back.json +208 -0
- offload/_root/data/findings/reviews/cce-uses-allocators-traits-omp50.json +191 -0
- offload/_root/data/findings/reviews/cce19-c-reduction-63-scalars-one-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce19-target-parallel-guarded-loop.json +113 -0
- offload/_root/data/findings/reviews/cce19-target-parallel-single-ice.json +113 -0
- offload/_root/data/findings/reviews/cce21-alloc-2e32-sum-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce21-defaultmap-aggregate-flag.json +210 -0
- offload/_root/data/findings/reviews/cce21-in-reduction-assumed-shape-write-lost.json +113 -0
- offload/_root/data/findings/reviews/cce21-in-reduction-taskwait-link.json +113 -0
- offload/_root/data/findings/reviews/clang-c-declare-target-to-omp52.json +113 -0
- offload/_root/data/findings/reviews/clang-c-linear-directive-name-hang.json +113 -0
- offload/_root/data/findings/reviews/clang-c-shared-declare-target-combined.json +132 -0
- offload/_root/data/findings/reviews/dataenv--cce-value-dummy-target-write-visible.json +113 -0
- offload/_root/data/findings/reviews/defaultmap-none-loop-variable.json +113 -0
- offload/_root/data/findings/reviews/fortran-schedule-static-in-target.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce-common-block-name-in-map-rejected.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce-list-directed-print-in-target-copy-crash.json +217 -0
- offload/_root/data/findings/reviews/fresh--cce19-acc-automatic-array-copyout-copy-crash.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce21-combined-if-runtime-expr-loop-skipped.json +113 -0
- offload/_root/data/findings/reviews/fresh--nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.json +113 -0
- offload/_root/data/findings/reviews/fresh--nvhpc-teams-loop-module-allocatable-assign-fort2-crash.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1505-cce20.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1540-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1978-cce19.json +130 -0
- offload/_root/data/findings/reviews/fuzz--2334-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--591-cce19.json +147 -0
- offload/_root/data/findings/reviews/fuzz--650-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--916-afar.json +130 -0
- offload/_root/data/findings/reviews/fuzz--98-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b1-121-afar.json +160 -0
- offload/_root/data/findings/reviews/fuzz--b2-209-cce19.json +141 -0
- offload/_root/data/findings/reviews/fuzz--b2-68-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b2-85-cce20.json +217 -0
- offload/_root/data/findings/reviews/fuzz--b3-188-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b3-278-cce19.json +212 -0
- offload/_root/data/findings/reviews/fuzz--b3-54-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b3-61-cce20.json +191 -0
- offload/_root/data/findings/reviews/fuzz--b4-86-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--gcc-declare-reduction-module-not-found.json +113 -0
- offload/_root/data/findings/reviews/fuzz--gcc-target-simd-map-nontemporal-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-allocatable-component-implicit-map-illegal-address.json +141 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-assumed-length-character-dummy-map-ice.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-default-none-reduction-lastprivate-fort1-crash.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-firstprivate-lastprivate-ice.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-to-scalar-reduction-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-depend-implicit-map-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-distribute-parallel-num-threads-writes-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-end-distribute-simd-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-loop-character-achar-unsupported.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-map-always-after-map-to-not-copied-back.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-num-threads-reduction-identity-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-firstprivate-translate-failure.json +191 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-single-hang.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-collapse-translate-failure.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-no-end-directive-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--par-s1-2082-gcc_g90.json +126 -0
- offload/_root/data/findings/reviews/fuzz--s1-2370-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-2592-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-3463-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-6760-cce20.json +130 -0
- offload/_root/data/findings/reviews/fuzz--s1-6888-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-7882-cce20.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-8634-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-91-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-9443-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-9914-cce19.json +141 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-bind-device-type-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-detach-delete-attach-underflow.json +314 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-gang-dim-collapse-force-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-init-set-shutdown-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-link-in-routine-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-use-device-allocatable-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-motion-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-omp60-undocumented-rejected.json +217 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-omp60-unimplemented-rejected.json +236 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-target-in-task-mandatory-device-not-found.json +236 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-uses-allocators-traits-unimplemented.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-declare-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-defaultmap-to-pointer-copy-back.json +217 -0
- offload/_root/data/findings/reviews/gcc--gcc-loop-bind-default-none-rejected.json +113 -0
- offload/_root/data/findings/reviews/harvest--afar-flang-strided-target-update.json +141 -0
- offload/_root/data/findings/reviews/harvest--cce-acc-declare-create-module-allocatable-xnack1-fault.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce-c-implicit-struct-map-partly-present.json +217 -0
- offload/_root/data/findings/reviews/harvest--cce-c-strided-target-update.json +141 -0
- offload/_root/data/findings/reviews/harvest--cce-ftn-target-parallel-thread-query-ice.json +130 -0
- offload/_root/data/findings/reviews/harvest--cce-named-constant-array-declare-target-routine-rejected.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce-use-device-ptr-c-ptr-not-converted.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce21-declare-target-link-module-variable-write-lost.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce21-internal-procedure-calls-internal-in-target-fault.json +158 -0
- offload/_root/data/findings/reviews/harvest--gcc-acc-declare-create-allocatable-not-mapped.json +204 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-same-item-two-maps-rejected.json +143 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-strided-section-rejected.json +164 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-target-data-struct-pointer-section-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-target-data-two-maps-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--gcc-teams-simd-matmul-allocatable-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-c-target-data-if-false-use-device-ptr-garbage.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-named-constant-array-declare-target-routine-rejected.json +126 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-use-device-ptr-c-ptr-not-found.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc2511-target-nowait-in-parallel-for-ice.json +130 -0
- offload/_root/data/findings/reviews/hecbench--gcc-c-float16-array-in-target-lto-ice.json +217 -0
- offload/_root/data/findings/reviews/hecbench--gcc-c-swar-popcount-assembler-error.json +126 -0
- offload/_root/data/findings/reviews/malloc--afar-device-malloc-in-kernel-corrupts-records.json +270 -0
- offload/_root/data/findings/reviews/multithread-allocatable-section-maps.json +191 -0
- offload/_root/data/findings/reviews/nested--afar-cce-c-call-result-member-in-target-rejected.json +113 -0
- offload/_root/data/findings/reviews/nested--afar-cce-c-update-struct-and-member-rejected.json +126 -0
- offload/_root/data/findings/reviews/nested--afar-flang-pointer-root-allocatable-component-enter-data-fault.json +191 -0
- offload/_root/data/findings/reviews/nested--cce-c-struct-and-nested-pointee-sections-ice.json +113 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-nested-allocatable-component-copy-fault.json +214 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.json +191 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.json +297 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.json +204 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-parent-and-shared-pointee-one-directive.json +130 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-struct-and-member-array-one-directive.json +141 -0
- offload/_root/data/findings/reviews/nested--gcc-c-always-on-pointer-member-section-ice.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-c-declare-mapper-pointer-member-section-gpu-fault.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-c-from-struct-and-pointee-section-rejected.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-fortran-pointer-component-alloc-bounds-lost.json +217 -0
- offload/_root/data/findings/reviews/nested--gcc-fortran-root-and-element-pointer-components-ice.json +217 -0
- offload/_root/data/findings/reviews/nested--nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.json +204 -0
- offload/_root/data/findings/reviews/nested--nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.json +191 -0
- offload/_root/data/findings/reviews/nvhpc-c-acc-atomic-update-sum-ice.json +277 -0
- offload/_root/data/findings/reviews/nvhpc-c-dist-schedule-chunk-compile-hang.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-map-present-ignored.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-ordered-in-target-nvcpfe-crash.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-parallel-for-firstprivate-in-target.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-defaultmap-firstprivate-explicit-map.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-defaultmap-from-allocatable-indexing.json +132 -0
- offload/_root/data/findings/reviews/nvhpc-depend-inoutset-ignored.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-dist-schedule-chunk-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-managed-acc-shutdown-host-access.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-parallel-if-in-target-nvvm-ice.json +113 -0
- offload/_root/data/findings/reviews/oop--afar-final-dealloc-device-link.json +132 -0
- offload/_root/data/findings/reviews/oop--afar-pdt-length-parameter-not-implemented.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-class-is-device-link.json +130 -0
- offload/_root/data/findings/reviews/oop--cce-copy-alloc-component-section-fault.json +217 -0
- offload/_root/data/findings/reviews/oop--cce-copy-parent-to-component-tofrom-lost.json +217 -0
- offload/_root/data/findings/reviews/oop--cce-copy-second-member-section-lost.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-element-component-map-lost.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-final-dealloc-device-abort.json +208 -0
- offload/_root/data/findings/reviews/oop--cce-pdt-default-mapper-rejected.json +191 -0
- offload/_root/data/findings/reviews/oop--cce-polymorphic-dispatch-device-link.json +247 -0
- offload/_root/data/findings/reviews/oop--cce-section-of-element-component-overlap.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-select-type-guard-not-taken.json +191 -0
- offload/_root/data/findings/reviews/oop--cce-udr-derived-type-unsupported.json +132 -0
- offload/_root/data/findings/reviews/oop--gcc-acc-parent-and-member-data-rejected.json +141 -0
- offload/_root/data/findings/reviews/oop--gcc-pdt-length-parameter-abort.json +141 -0
- offload/_root/data/findings/reviews/oop--gcc-polymorphic-dispatch-abort.json +217 -0
- offload/_root/data/findings/reviews/oop--gcc-vtab-not-marked-for-offload.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-copy-alloc-component-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-copy-pdt-length-parameter-illegal-address.json +236 -0
- offload/_root/data/findings/reviews/oop--nvhpc-named-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-polymorphic-dispatch-translate-failure.json +223 -0
- offload/_root/data/findings/reviews/oop--nvhpc-polymorphism-runtime-unsupported.json +126 -0
- offload/_root/data/findings/reviews/oop--nvhpc-type-bound-call-rejected.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-udr-derived-type-rejected.json +113 -0
- offload/_root/data/findings/reviews/stress--afar-c-lastprivate-combined-target-not-mapped.json +113 -0
- offload/_root/data/findings/reviews/stress--afar-target-scalar-implicit-firstprivate.json +175 -0
- offload/_root/data/findings/reviews/stress--cce-acc-declare-create-scalar-serial-firstprivate.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-c-distribute-lastprivate-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-c-flto-offload-dropped.json +204 -0
- offload/_root/data/findings/reviews/stress--cce-ftn-cif-record-split-abort.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-lastprivate-num-threads-collapse-simd.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-teams-reduction-many-teams-wrap.json +113 -0
- offload/_root/data/findings/reviews/stress--cce21-declare-target-scalar-map-write-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--gcc-declare-target-allocatable-component-ice.json +191 -0
- offload/_root/data/findings/reviews/stress--nvhpc-acc-derived-type-component-not-copied.json +126 -0
- offload/_root/data/findings/reviews/stress--nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-declare-target-scalar-write-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-lastprivate-combined-target-not-mapped.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-target-scalar-implicit-firstprivate.json +130 -0
- offload/_root/data/findings/reviews/target-update-sections-in-parallel.json +113 -0
- offload/_root/data/findings/stress/afar-c-lastprivate-combined-target-not-mapped.c +72 -0
- offload/_root/data/findings/stress/afar-target-scalar-implicit-firstprivate.f90 +47 -0
- offload/_root/data/findings/stress/cce-acc-declare-create-scalar-serial-firstprivate.f90 +43 -0
- offload/_root/data/findings/stress/cce-c-distribute-lastprivate-lost.c +52 -0
- offload/_root/data/findings/stress/cce-c-flto-offload-dropped.c +73 -0
- offload/_root/data/findings/stress/cce-ftn-cif-record-split-abort.f90 +109 -0
- offload/_root/data/findings/stress/cce-lastprivate-num-threads-collapse-simd.f90 +66 -0
- offload/_root/data/findings/stress/cce-teams-reduction-many-teams-wrap.f90 +55 -0
- offload/_root/data/findings/stress/cce21-declare-target-scalar-map-write-lost.f90 +58 -0
- offload/_root/data/findings/stress/controls/gcc-declare-target-allocatable-component-control.f90 +29 -0
- offload/_root/data/findings/stress/gcc-declare-target-allocatable-component-ice.f90 +61 -0
- offload/_root/data/findings/stress/nvhpc-acc-derived-type-component-not-copied.f90 +33 -0
- offload/_root/data/findings/stress/nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.c +62 -0
- offload/_root/data/findings/stress/nvhpc-declare-target-scalar-write-lost.f90 +43 -0
- offload/_root/data/findings/stress/nvhpc-lastprivate-combined-target-not-mapped.f90 +60 -0
- offload/_root/data/findings/stress/nvhpc-target-scalar-implicit-firstprivate.f90 +41 -0
- offload/_root/data/findings/target-update-sections-in-parallel.f90 +53 -0
- offload/_root/data/issues.json +1 -0
- offload/_root/data/search.json +1 -0
- offload/_root/data/vendor/checks/build.py +288 -0
- offload/_version.py +24 -0
- offload/canuse.py +88 -0
- offload/cli.py +52 -0
- offload/data.py +85 -0
- offload/engine/__init__.py +0 -0
- offload/engine/acc_c_gen.py +415 -0
- offload/engine/acc_gen.py +1104 -0
- offload/engine/acc_rules.py +656 -0
- offload/engine/apps.py +804 -0
- offload/engine/baseline.py +324 -0
- offload/engine/c_gen.py +883 -0
- offload/engine/c_program.py +913 -0
- offload/engine/c_rules.py +503 -0
- offload/engine/campaign.py +1180 -0
- offload/engine/campaigns/__init__.py +2 -0
- offload/engine/campaigns/hecbench.py +153 -0
- offload/engine/campaigns/nested.py +76 -0
- offload/engine/campaigns/oop.py +61 -0
- offload/engine/canary.py +275 -0
- offload/engine/catalog.py +860 -0
- offload/engine/citations.py +532 -0
- offload/engine/clang_oracle.py +208 -0
- offload/engine/combos.py +234 -0
- offload/engine/confirm/__init__.py +2 -0
- offload/engine/confirm/backlog.py +159 -0
- offload/engine/confirm/claims.py +423 -0
- offload/engine/confirm/collectors.py +665 -0
- offload/engine/confirm/decisions.py +202 -0
- offload/engine/confirm/draft.py +195 -0
- offload/engine/confirm/engine.py +157 -0
- offload/engine/confirm/execute.py +382 -0
- offload/engine/confirm/facts.py +467 -0
- offload/engine/confirm/findings.py +617 -0
- offload/engine/confirm/forms.py +145 -0
- offload/engine/confirm/ingest.py +372 -0
- offload/engine/confirm/jobs.py +215 -0
- offload/engine/confirm/legality.py +323 -0
- offload/engine/confirm/machines.py +254 -0
- offload/engine/confirm/minimize.py +268 -0
- offload/engine/confirm/model.py +249 -0
- offload/engine/confirm/ports.py +107 -0
- offload/engine/confirm/programs.py +222 -0
- offload/engine/confirm/registry.py +151 -0
- offload/engine/confirm/regress.py +278 -0
- offload/engine/confirm/rules.py +565 -0
- offload/engine/confirm/store.py +63 -0
- offload/engine/confirm/triage.py +838 -0
- offload/engine/confirm/validate.py +607 -0
- offload/engine/confirm/witness.py +355 -0
- offload/engine/corpus_check.py +388 -0
- offload/engine/coverage.py +318 -0
- offload/engine/dataenv_gen.py +1318 -0
- offload/engine/dataenv_rules.py +278 -0
- offload/engine/devtemps.py +146 -0
- offload/engine/expected.py +2559 -0
- offload/engine/f2c.py +1783 -0
- offload/engine/finding_claims.py +330 -0
- offload/engine/finding_header.py +229 -0
- offload/engine/finding_rows.py +382 -0
- offload/engine/flang_oracle.py +299 -0
- offload/engine/fsource.py +620 -0
- offload/engine/fuzz.py +2455 -0
- offload/engine/fuzz_base.py +2016 -0
- offload/engine/fuzz_campaign.py +592 -0
- offload/engine/fuzz_exec.py +798 -0
- offload/engine/fuzz_min.py +1049 -0
- offload/engine/fuzz_profile.py +340 -0
- offload/engine/fuzz_report.py +1270 -0
- offload/engine/fuzz_steer.py +181 -0
- offload/engine/gate.py +1013 -0
- offload/engine/gate_report.py +711 -0
- offload/engine/gate_run.py +118 -0
- offload/engine/gate_stored.py +466 -0
- offload/engine/gen.py +1114 -0
- offload/engine/gen_templates.py +2583 -0
- offload/engine/grammar.py +695 -0
- offload/engine/harness.py +1472 -0
- offload/engine/harvest/__init__.py +3 -0
- offload/engine/harvest/c_runtime.py +465 -0
- offload/engine/harvest/checks.py +534 -0
- offload/engine/harvest/convert.py +784 -0
- offload/engine/harvest/f_runtime.py +668 -0
- offload/engine/harvest/filters.py +338 -0
- offload/engine/harvest/history.py +122 -0
- offload/engine/harvest/inventory.py +399 -0
- offload/engine/harvest2/__init__.py +5 -0
- offload/engine/harvest2/aomp.py +119 -0
- offload/engine/harvest2/examples.py +116 -0
- offload/engine/harvest2/gomp.py +679 -0
- offload/engine/harvest2/hand.py +150 -0
- offload/engine/harvest2/split.py +78 -0
- offload/engine/harvest_known/__init__.py +2 -0
- offload/engine/harvest_known/apps.py +65 -0
- offload/engine/harvest_known/cases.py +128 -0
- offload/engine/harvest_known/centres.py +184 -0
- offload/engine/harvest_known/forum.py +180 -0
- offload/engine/harvest_known/relnotes.py +42 -0
- offload/engine/harvest_known/textscan.py +107 -0
- offload/engine/hdrwrap.py +42 -0
- offload/engine/hecbench.py +568 -0
- offload/engine/hecbench_report.py +265 -0
- offload/engine/hecbench_run.py +483 -0
- offload/engine/idioms.py +1427 -0
- offload/engine/kbody_cites.py +81 -0
- offload/engine/kbody_emit.py +949 -0
- offload/engine/kbody_gen.py +795 -0
- offload/engine/legality_review.py +236 -0
- offload/engine/localcfg.py +58 -0
- offload/engine/malloc_dd.py +267 -0
- offload/engine/mutate.py +1933 -0
- offload/engine/nested_cites.py +196 -0
- offload/engine/nested_emit.py +789 -0
- offload/engine/nested_gen.py +1721 -0
- offload/engine/offload_scope.py +197 -0
- offload/engine/ompvv.py +624 -0
- offload/engine/oop_gen.py +2249 -0
- offload/engine/prerun.py +1435 -0
- offload/engine/program_source.py +739 -0
- offload/engine/provenance.py +103 -0
- offload/engine/reduce.py +2098 -0
- offload/engine/report.py +3374 -0
- offload/engine/root.py +33 -0
- offload/engine/rules.py +4256 -0
- offload/engine/run_matrix.py +325 -0
- offload/engine/site/__init__.py +1 -0
- offload/engine/site/columns.py +53 -0
- offload/engine/site/data.py +648 -0
- offload/engine/site/header.py +228 -0
- offload/engine/site/inputs.py +115 -0
- offload/engine/site/matrix.py +434 -0
- offload/engine/site/scrub.py +294 -0
- offload/engine/skeleton.py +121 -0
- offload/engine/spec_text.py +242 -0
- offload/engine/stress.py +4122 -0
- offload/engine/stress_c.py +1000 -0
- offload/engine/stress_exec.py +805 -0
- offload/engine/stress_min.py +248 -0
- offload/engine/stress_report.py +552 -0
- offload/engine/textclean.py +97 -0
- offload/engine/toolchains.py +1070 -0
- offload/engine/transforms.py +511 -0
- offload/engine/usage.py +1252 -0
- offload/engine/widen.py +673 -0
- offload/engine/widen_progs.py +2396 -0
- offload/issues.py +146 -0
- offtarget-0.1.0.dist-info/METADATA +86 -0
- offtarget-0.1.0.dist-info/RECORD +886 -0
- offtarget-0.1.0.dist-info/WHEEL +4 -0
- offtarget-0.1.0.dist-info/entry_points.txt +2 -0
- offtarget-0.1.0.dist-info/licenses/LICENSE +21 -0
- offtarget-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +20 -0
|
@@ -0,0 +1,1070 @@
|
|
|
1
|
+
"""The toolchain registry: every compiler release the project measures, read
|
|
2
|
+
from catalog/toolchains.yaml. The matrix, gate, confirmer, support tables,
|
|
3
|
+
site and job scripts all ask this module for the list.
|
|
4
|
+
|
|
5
|
+
A toolchain has a family (releases and arch twins of one compiler share bugs),
|
|
6
|
+
a version, a machine and arch (catalog/machines.yaml), its memory modes, a
|
|
7
|
+
recipe (prelude, compilers, flags, environment) and its display names.
|
|
8
|
+
|
|
9
|
+
A twin is a toolchain's install on another GPU, named with the arch's
|
|
10
|
+
``twin_suffix`` (afar_g90) or after its machine (afar_mi300x).
|
|
11
|
+
|
|
12
|
+
NVHPC's memory mode is a compile flag (catalog/machines.yaml
|
|
13
|
+
``modes.<mode>.flags``), so ``for_mode`` returns a toolchain compiled for one
|
|
14
|
+
mode. AMD modes are run-time settings (HSA_XNACK), so it returns an AMD
|
|
15
|
+
toolchain unchanged. GCC 16.2 is ``under_test_only``."""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import dataclasses
|
|
19
|
+
import os
|
|
20
|
+
import re
|
|
21
|
+
import subprocess
|
|
22
|
+
from dataclasses import dataclass, field
|
|
23
|
+
from functools import lru_cache
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
import yaml
|
|
27
|
+
|
|
28
|
+
from offload.engine import localcfg
|
|
29
|
+
from offload.engine.root import ROOT # noqa: E402
|
|
30
|
+
CATALOG = ROOT / "catalog" / "toolchains.yaml"
|
|
31
|
+
# the environment variable that points the registry at another catalog
|
|
32
|
+
# (tests: a copy with a fake toolchain added)
|
|
33
|
+
CATALOG_ENV = "COMPLIANT_TOOLCHAINS"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _afar_bin(lustre: str, vast: str, isdir=os.path.isdir) -> str:
|
|
37
|
+
"""An install root with a fallback copy: the default install, or on a
|
|
38
|
+
host without it that has the copy (Tioga: /p/vast1) the copy, so its
|
|
39
|
+
front end (the legality checks, e.g. the fuzz minimizer's) runs there
|
|
40
|
+
too."""
|
|
41
|
+
return lustre if isdir(lustre) or not isdir(vast) else vast
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class Family:
|
|
46
|
+
"""A compiler family of catalog/toolchains.yaml."""
|
|
47
|
+
id: str
|
|
48
|
+
name: str # the short label ("CCE")
|
|
49
|
+
long_name: str # the site's method table ("Cray CCE")
|
|
50
|
+
site_name: str # the issue list's family button
|
|
51
|
+
vendor: str | None # the vendor packet (data/vendor/<vendor>)
|
|
52
|
+
kind: str # the recipe kind (Toolchain.kind)
|
|
53
|
+
message_table: str # offload.engine.harness PATTERNS key
|
|
54
|
+
compile_s: float # the gate's seconds per compile
|
|
55
|
+
flags: dict = field(default_factory=dict) # model -> lang -> template
|
|
56
|
+
unsupported: dict = field(default_factory=dict) # "acc" | "acc/c" -> why
|
|
57
|
+
prelude: str = ""
|
|
58
|
+
fc: str = ""
|
|
59
|
+
cc: str = ""
|
|
60
|
+
cxx: str = "" # the C++ driver (the hecbench campaign), "" when none
|
|
61
|
+
version_flags: dict = field(default_factory=dict) # OpenMP version -> flag
|
|
62
|
+
c_version_flag: bool = False
|
|
63
|
+
offload_targets: dict = field(default_factory=dict) # GCC: arch prefix -> target
|
|
64
|
+
latomic: dict = field(default_factory=dict) # GCC: target -> extra flag
|
|
65
|
+
under_test_only: str = "" # the reason it is never a legality witness
|
|
66
|
+
witness: str = "" # "other_families": its compilers witness other cases
|
|
67
|
+
site_gpus: str = "" # the method table's "GPUs and memory modes" text
|
|
68
|
+
site_public: dict = field(default_factory=dict) # path template -> public form
|
|
69
|
+
site_runtime_env: bool = False # the site's commands export LD_LIBRARY_PATH
|
|
70
|
+
|
|
71
|
+
def supports_model(self, model: str) -> bool:
|
|
72
|
+
"""Whether any language of the family compiles `model`."""
|
|
73
|
+
return model not in self.unsupported
|
|
74
|
+
|
|
75
|
+
def why_unsupported(self, model: str, lang: str) -> str | None:
|
|
76
|
+
return self.unsupported.get(model) or self.unsupported.get(f"{model}/{lang}")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@dataclass(frozen=True)
|
|
80
|
+
class Toolchain:
|
|
81
|
+
name: str
|
|
82
|
+
prelude: str # plain statement list (no pipes) run before compiling
|
|
83
|
+
fc: str # Fortran compiler command
|
|
84
|
+
extra: str = "" # extra flags of a non-baseline run (version, includes)
|
|
85
|
+
model: str = "omp" # "acc": compile OpenACC (CCE only)
|
|
86
|
+
cc: str = "" # C compiler command
|
|
87
|
+
lang: str = "f90" # "c": compile C (OpenMP only); "cpp": C++ (takes C's flags)
|
|
88
|
+
arch: str = "gfx942" # The offload target
|
|
89
|
+
machine: str = "tuolumne" # Where it runs
|
|
90
|
+
# Extra run-time environment (Tioga: AFAR's library path)
|
|
91
|
+
env: tuple[tuple[str, str], ...] = ()
|
|
92
|
+
xnack_modes: tuple[int, ...] = (0, 1) # Tioga runs X=0 only
|
|
93
|
+
# The compiler vendor of the recipe ("afar", "cce", "nvhpc");
|
|
94
|
+
# "" = by name (AFAR or, otherwise, CCE: the early toolchains)
|
|
95
|
+
vendor: str = ""
|
|
96
|
+
# The memory mode (row key) this toolchain is compiled for,
|
|
97
|
+
# on a machine whose modes are compile flags (for_mode); None elsewhere
|
|
98
|
+
mode: int | None = None
|
|
99
|
+
# --- catalog attributes (catalog/toolchains.yaml; "" for an ad-hoc
|
|
100
|
+
# test toolchain) ---
|
|
101
|
+
family_id: str = ""
|
|
102
|
+
version: str = ""
|
|
103
|
+
label: str = "" # the support tables' column name
|
|
104
|
+
site_version: str = "" # the version label the site shows
|
|
105
|
+
site_pill: str = "" # the issue list's version pill
|
|
106
|
+
site_targets: tuple[str, ...] = () # the site columns it has cells in ("" = all of its GPU kind)
|
|
107
|
+
site_plan_runs: bool = False
|
|
108
|
+
site_root_var: str = ""
|
|
109
|
+
site_gpus: str = ""
|
|
110
|
+
merged_key: str | None = None # its key in the merged result tables (dashboard, can-I-use)
|
|
111
|
+
report_column: bool = True
|
|
112
|
+
regression_of: str | None = None
|
|
113
|
+
twin_of: str | None = None
|
|
114
|
+
lane: str = ""
|
|
115
|
+
canaries: str = "" # its entry in catalog/canaries.yaml
|
|
116
|
+
mention_words: tuple[str, ...] = () # words near the family name that pick this install
|
|
117
|
+
install_root: str = "" # the resolved install root ({root})
|
|
118
|
+
install_roots: tuple[str, ...] = () # every root the recipe may name (default, fallback)
|
|
119
|
+
install_env: str = "" # the environment variable that overrides the root
|
|
120
|
+
cxx: str = "" # C++ compiler command (the hecbench campaign)
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def base(self) -> str:
|
|
124
|
+
"""The gfx942 toolchain name."""
|
|
125
|
+
return base_name(self.name)
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def kind(self) -> str:
|
|
129
|
+
"""The recipe's vendor."""
|
|
130
|
+
return self.vendor or ("afar" if self.base == "afar" else "cce")
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def family(self) -> Family:
|
|
134
|
+
"""The family of the recipe: the catalog's for a registered
|
|
135
|
+
toolchain, else the family of its ``kind`` (ad-hoc test toolchains
|
|
136
|
+
named like the AMD ones)."""
|
|
137
|
+
reg = registry()
|
|
138
|
+
if self.family_id in reg.families:
|
|
139
|
+
return reg.families[self.family_id]
|
|
140
|
+
return reg.family_of_kind(self.kind)
|
|
141
|
+
|
|
142
|
+
def _machine(self):
|
|
143
|
+
"""The toolchain's machine in catalog/machines.yaml, None for a
|
|
144
|
+
machine it does not list (ad-hoc test toolchains)."""
|
|
145
|
+
from offload.engine.confirm.machines import load
|
|
146
|
+
return load().get(self.machine)
|
|
147
|
+
|
|
148
|
+
def compile_time_modes(self) -> bool:
|
|
149
|
+
"""Whether the memory mode is a compile flag (NVHPC)."""
|
|
150
|
+
m = self._machine()
|
|
151
|
+
return m is not None and m.compile_time_modes
|
|
152
|
+
|
|
153
|
+
def for_mode(self, xnack: int) -> "Toolchain":
|
|
154
|
+
"""The toolchain compiled for mode `xnack` (a row key): itself when
|
|
155
|
+
the machine selects modes at run time (AMD); with ``mode`` set (its
|
|
156
|
+
compile flag added by ``flags``) when modes are compile flags."""
|
|
157
|
+
if not self.compile_time_modes():
|
|
158
|
+
return self
|
|
159
|
+
if xnack not in self.xnack_modes:
|
|
160
|
+
raise ValueError(f"{self.name} has no mode stored as {xnack} "
|
|
161
|
+
f"(its modes: {self.xnack_modes})")
|
|
162
|
+
return self if self.mode == xnack else \
|
|
163
|
+
dataclasses.replace(self, mode=xnack)
|
|
164
|
+
|
|
165
|
+
def mode_flag(self) -> str:
|
|
166
|
+
"""The compile flag of the selected mode ("" for AMD). A toolchain
|
|
167
|
+
whose modes are compile flags must have one selected."""
|
|
168
|
+
if not self.compile_time_modes():
|
|
169
|
+
return ""
|
|
170
|
+
if self.mode is None:
|
|
171
|
+
raise ValueError(f"{self.name}: its memory mode is a compile "
|
|
172
|
+
"flag: select one with for_mode(row key)")
|
|
173
|
+
m = self._machine()
|
|
174
|
+
return m.flags(m.mode_of_row_key(self.mode), self.kind)
|
|
175
|
+
|
|
176
|
+
def _template_fields(self) -> dict:
|
|
177
|
+
"""The values a family's flag template may name."""
|
|
178
|
+
fam = self.family
|
|
179
|
+
fields = {"arch": self.arch, "cc": "", "target": "", "latomic": ""}
|
|
180
|
+
if fam.kind == "nvhpc":
|
|
181
|
+
cc = re.fullmatch(r"sm_(\d+)", self.arch)
|
|
182
|
+
if cc is None:
|
|
183
|
+
raise ValueError(f"{self.name}: arch {self.arch} is not sm_NN")
|
|
184
|
+
fields["cc"] = cc.group(1)
|
|
185
|
+
if fam.offload_targets:
|
|
186
|
+
target = next((t for p, t in fam.offload_targets.items()
|
|
187
|
+
if self.arch.startswith(p)), None)
|
|
188
|
+
if target is None:
|
|
189
|
+
raise ValueError(f"{self.name}: no {fam.name} offload target "
|
|
190
|
+
f"for {self.arch}")
|
|
191
|
+
fields["target"] = target
|
|
192
|
+
fields["latomic"] = fam.latomic.get(target, "")
|
|
193
|
+
return fields
|
|
194
|
+
|
|
195
|
+
def flags(self) -> str:
|
|
196
|
+
"""The fixed compile flags (without the optimisation level): the
|
|
197
|
+
family's template for the model and language
|
|
198
|
+
(catalog/toolchains.yaml ``flags``), the memory mode's compile flag
|
|
199
|
+
where the mode is one, then `extra`. A (model, language)
|
|
200
|
+
the family does not compile is refused with the catalog's reason."""
|
|
201
|
+
fam = self.family
|
|
202
|
+
lang = "c" if self.lang == "cpp" else self.lang # C++ takes C's flags
|
|
203
|
+
why = fam.why_unsupported(self.model, lang)
|
|
204
|
+
if why:
|
|
205
|
+
raise ValueError(why)
|
|
206
|
+
tpl = (fam.flags.get(self.model) or {}).get(lang)
|
|
207
|
+
if tpl is None:
|
|
208
|
+
raise ValueError(f"{self.name}: {fam.name} has no flags for "
|
|
209
|
+
f"{self.model} {self.lang}")
|
|
210
|
+
base = tpl.format(**self._template_fields())
|
|
211
|
+
parts = [base, self.mode_flag(), self.extra]
|
|
212
|
+
return " ".join(p for p in parts if p)
|
|
213
|
+
|
|
214
|
+
def compiler(self) -> str:
|
|
215
|
+
"""The compiler command of the toolchain's language."""
|
|
216
|
+
if self.lang == "cpp":
|
|
217
|
+
if not self.cxx:
|
|
218
|
+
raise ValueError(f"toolchain {self.name} has no C++ compiler")
|
|
219
|
+
return self.cxx
|
|
220
|
+
if self.lang == "c":
|
|
221
|
+
if not self.cc:
|
|
222
|
+
raise ValueError(f"toolchain {self.name} has no C compiler")
|
|
223
|
+
return self.cc
|
|
224
|
+
return self.fc
|
|
225
|
+
|
|
226
|
+
def compile_cmd(self, src: str, out: str, opt: str = "-O2") -> str:
|
|
227
|
+
cmd = f"{self.compiler()} {self.flags()} {opt} {src} -o {out}"
|
|
228
|
+
return f"{self.prelude}\n{cmd}" if self.prelude else cmd
|
|
229
|
+
|
|
230
|
+
def run_env(self, xnack: int) -> dict[str, str]:
|
|
231
|
+
"""The run-time environment of mode `xnack` (a row key): the
|
|
232
|
+
machine's mode ``env`` (AMD: HSA_XNACK=<key>) and the toolchain's
|
|
233
|
+
own. On a machine whose modes are compile flags the
|
|
234
|
+
environment selects nothing, and a build for another mode is
|
|
235
|
+
refused."""
|
|
236
|
+
if xnack not in self.xnack_modes:
|
|
237
|
+
raise ValueError(f"{self.name} runs at HSA_XNACK="
|
|
238
|
+
f"{self.xnack_modes} only, not {xnack}")
|
|
239
|
+
m = self._machine()
|
|
240
|
+
if m is None or not m.compile_time_modes:
|
|
241
|
+
return {"HSA_XNACK": str(xnack), **dict(self.env)}
|
|
242
|
+
if self.mode is not None and self.mode != xnack:
|
|
243
|
+
raise ValueError(f"{self.name} was compiled for mode "
|
|
244
|
+
f"{self.mode}, not {xnack}")
|
|
245
|
+
return {**m.env(m.mode_of_row_key(xnack)), **dict(self.env)}
|
|
246
|
+
|
|
247
|
+
def targets(self) -> tuple[str, ...]:
|
|
248
|
+
"""The site's GPU/mode columns it has cells in: the catalog's
|
|
249
|
+
``site_targets``, else every target of its GPU vendor kind."""
|
|
250
|
+
if self.site_targets:
|
|
251
|
+
return self.site_targets
|
|
252
|
+
reg = registry()
|
|
253
|
+
gpu = reg.arches[self.arch]["gpu"]
|
|
254
|
+
return tuple(t for t, g in reg.target_kinds().items() if g == gpu)
|
|
255
|
+
|
|
256
|
+
def public(self, text: str) -> str:
|
|
257
|
+
"""`text` with the install paths in their public form (the site's
|
|
258
|
+
command lines: ``$AFAR/bin/``, a bare ``nvfortran``, ``$GCC_16_2``;
|
|
259
|
+
catalog/toolchains.yaml ``site_public``)."""
|
|
260
|
+
for root in self.install_roots:
|
|
261
|
+
fields = _root_fields(root)
|
|
262
|
+
fields["var"] = self.site_root_var
|
|
263
|
+
pairs = [(tpl.format(**fields), pub.format(**fields))
|
|
264
|
+
for tpl, pub in self.family.site_public.items()]
|
|
265
|
+
for path, pub in sorted(pairs, key=lambda kv: -len(kv[0])):
|
|
266
|
+
text = text.replace(path, pub)
|
|
267
|
+
return text
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _root_fields(root: str) -> dict:
|
|
271
|
+
"""The placeholders an install root fills in a recipe template."""
|
|
272
|
+
p = Path(root)
|
|
273
|
+
return {"root": root, "root_dir": str(p.parent),
|
|
274
|
+
"root_grandparent": str(p.parent.parent)}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class Registry:
|
|
278
|
+
"""The checked contents of catalog/toolchains.yaml."""
|
|
279
|
+
|
|
280
|
+
def __init__(self, data: dict, environ=None):
|
|
281
|
+
if data.get("version") != 1:
|
|
282
|
+
raise ValueError("toolchains: unknown version")
|
|
283
|
+
self.environ = os.environ if environ is None else environ
|
|
284
|
+
self.arches: dict[str, dict] = dict(data.get("arches") or {})
|
|
285
|
+
self.site: dict = dict(data.get("site") or {})
|
|
286
|
+
self.lane_docs: dict[str, str] = dict(data.get("lanes") or {})
|
|
287
|
+
# machine -> the directory a campaign's private copy of the tree
|
|
288
|
+
# goes under (tools/jobs/campaign_remote.sh)
|
|
289
|
+
self.campaign_lanes: dict[str, str] = dict(data.get("campaign_lanes") or {})
|
|
290
|
+
# machine -> {max_minutes, hosts}: the interactive-queue rules a
|
|
291
|
+
# foreground job of a campaign obeys (tools/campaign.py submit)
|
|
292
|
+
self.pdebug: dict[str, dict] = {k: dict(v) for k, v in
|
|
293
|
+
(data.get("pdebug") or {}).items()}
|
|
294
|
+
self.families: dict[str, Family] = {}
|
|
295
|
+
for fid, d in (data.get("families") or {}).items():
|
|
296
|
+
self.families[fid] = self._family(fid, d)
|
|
297
|
+
self.toolchains: dict[str, Toolchain] = {}
|
|
298
|
+
for name, d in (data.get("toolchains") or {}).items():
|
|
299
|
+
self.toolchains[name] = self._toolchain(name, d)
|
|
300
|
+
self._check()
|
|
301
|
+
|
|
302
|
+
# --- construction -------------------------------------------------
|
|
303
|
+
|
|
304
|
+
def _family(self, fid: str, d: dict) -> Family:
|
|
305
|
+
for key in ("name", "long_name", "kind", "message_table", "compile_s"):
|
|
306
|
+
if key not in d:
|
|
307
|
+
raise ValueError(f"toolchains: family {fid}: no {key}")
|
|
308
|
+
if not d.get("flags"):
|
|
309
|
+
raise ValueError(f"toolchains: family {fid}: no flags")
|
|
310
|
+
return Family(
|
|
311
|
+
fid, d["name"], d["long_name"], d.get("site_name") or d["long_name"],
|
|
312
|
+
d.get("vendor"), d["kind"], d["message_table"], float(d["compile_s"]),
|
|
313
|
+
{m: dict(v) for m, v in d["flags"].items()},
|
|
314
|
+
dict(d.get("unsupported") or {}), d.get("prelude") or "",
|
|
315
|
+
d.get("fc") or "", d.get("cc") or "", d.get("cxx") or "",
|
|
316
|
+
{int(k): v for k, v in (d.get("version_flags") or {}).items()},
|
|
317
|
+
bool(d.get("c_version_flag")), dict(d.get("offload_targets") or {}),
|
|
318
|
+
dict(d.get("latomic") or {}), d.get("under_test_only") or "",
|
|
319
|
+
d.get("witness") or "", d.get("site_gpus") or "",
|
|
320
|
+
dict(d.get("site_public") or {}), bool(d.get("site_runtime_env")))
|
|
321
|
+
|
|
322
|
+
def _toolchain(self, name: str, d: dict) -> Toolchain:
|
|
323
|
+
for key in ("family", "version", "machine", "arch", "modes"):
|
|
324
|
+
if key not in d:
|
|
325
|
+
raise ValueError(f"toolchains: {name}: no {key}")
|
|
326
|
+
fam = self.families.get(d["family"])
|
|
327
|
+
if fam is None:
|
|
328
|
+
raise ValueError(f"toolchains: {name}: unknown family {d['family']}")
|
|
329
|
+
if d["arch"] not in self.arches:
|
|
330
|
+
raise ValueError(f"toolchains: {name}: unknown arch {d['arch']}")
|
|
331
|
+
inst = d.get("install") or {}
|
|
332
|
+
roots = []
|
|
333
|
+
root = ""
|
|
334
|
+
if inst:
|
|
335
|
+
default = str(inst["default"])
|
|
336
|
+
roots.append(default)
|
|
337
|
+
root = default
|
|
338
|
+
if inst.get("fallback"):
|
|
339
|
+
roots.append(str(inst["fallback"]))
|
|
340
|
+
root = _afar_bin(default, str(inst["fallback"]))
|
|
341
|
+
if inst.get("env"):
|
|
342
|
+
root = self.environ.get(inst["env"], root)
|
|
343
|
+
fields = _root_fields(root) if root else {}
|
|
344
|
+
mods = {k: str(v) for k, v in (d.get("modules") or {}).items()}
|
|
345
|
+
fields.update(mods)
|
|
346
|
+
fields["arch"] = d["arch"]
|
|
347
|
+
|
|
348
|
+
def fill(s: str) -> str:
|
|
349
|
+
try:
|
|
350
|
+
return s.format(**fields) if s else s
|
|
351
|
+
except KeyError as e:
|
|
352
|
+
raise ValueError(f"toolchains: {name}: the recipe names {{{e.args[0]}}}: "
|
|
353
|
+
"give it in `modules` (or `install`)") from None
|
|
354
|
+
prelude = d.get("prelude") if "prelude" in d else fam.prelude
|
|
355
|
+
fc = d.get("fc") or fam.fc
|
|
356
|
+
cc = d.get("cc") or fam.cc
|
|
357
|
+
cxx = d.get("cxx") or fam.cxx
|
|
358
|
+
env = tuple((k, fill(str(v))) for k, v in (d.get("env") or {}).items())
|
|
359
|
+
modes = tuple(d["modes"])
|
|
360
|
+
row_keys = self._row_keys(name, d["machine"], modes)
|
|
361
|
+
return Toolchain(
|
|
362
|
+
name, fill(prelude or ""), fill(fc), cc=fill(cc), cxx=fill(cxx), arch=d["arch"],
|
|
363
|
+
machine=d["machine"], env=env, xnack_modes=row_keys,
|
|
364
|
+
vendor=fam.kind, family_id=fam.id, version=str(d["version"]),
|
|
365
|
+
label=d.get("label") or "", site_version=str(d.get("site_version") or d["version"]),
|
|
366
|
+
site_pill=str(d.get("site_pill") or d.get("site_version") or d["version"]),
|
|
367
|
+
site_targets=tuple(d.get("site_targets") or ()),
|
|
368
|
+
site_plan_runs=bool(d.get("site_plan_runs")),
|
|
369
|
+
site_root_var=d.get("site_root_var") or "",
|
|
370
|
+
site_gpus=d.get("site_gpus") or fam.site_gpus,
|
|
371
|
+
merged_key=d.get("merged_key"), report_column=d.get("report_column", True),
|
|
372
|
+
regression_of=d.get("regression_of"), twin_of=d.get("twin_of"),
|
|
373
|
+
lane=d.get("lane") or "", canaries=d.get("canaries") or name,
|
|
374
|
+
mention_words=tuple(d.get("mention_words") or ()),
|
|
375
|
+
install_root=root, install_roots=tuple(roots),
|
|
376
|
+
install_env=inst.get("env") or "")
|
|
377
|
+
|
|
378
|
+
def _row_keys(self, name: str, machine: str, modes: tuple) -> tuple[int, ...]:
|
|
379
|
+
"""The stored row keys of the machine's modes, ascending."""
|
|
380
|
+
from offload.engine.confirm.machines import load
|
|
381
|
+
m = load().get(machine)
|
|
382
|
+
if m is None: # reported by check_registry
|
|
383
|
+
return ()
|
|
384
|
+
for mode in modes:
|
|
385
|
+
if not m.has(mode):
|
|
386
|
+
raise ValueError(f"toolchains: {name}: {machine} has no "
|
|
387
|
+
f"{mode} mode")
|
|
388
|
+
return tuple(sorted(m.row_key(x) for x in modes))
|
|
389
|
+
|
|
390
|
+
def _check(self) -> None:
|
|
391
|
+
for name, tc in self.toolchains.items():
|
|
392
|
+
if tc.twin_of is not None and tc.twin_of not in self.toolchains:
|
|
393
|
+
raise ValueError(f"toolchains: {name}: twin_of {tc.twin_of} "
|
|
394
|
+
"is not a toolchain")
|
|
395
|
+
if tc.regression_of is not None and \
|
|
396
|
+
tc.regression_of not in self.toolchains:
|
|
397
|
+
raise ValueError(f"toolchains: {name}: regression_of "
|
|
398
|
+
f"{tc.regression_of} is not a toolchain")
|
|
399
|
+
if tc.twin_of is not None and name not in self._twin_names(tc):
|
|
400
|
+
raise ValueError(f"toolchains: {name}: a twin of {tc.twin_of} on "
|
|
401
|
+
f"{tc.machine} is named "
|
|
402
|
+
f"{' or '.join(self._twin_names(tc))}")
|
|
403
|
+
if tc.twin_of is None and tc.regression_of is None and not tc.label:
|
|
404
|
+
raise ValueError(f"toolchains: {name}: no label")
|
|
405
|
+
if tc.lane and tc.lane not in self.lane_docs:
|
|
406
|
+
raise ValueError(f"toolchains: {name}: lane {tc.lane} is not described "
|
|
407
|
+
f"under `lanes:` (known: {', '.join(self.lane_docs)})")
|
|
408
|
+
|
|
409
|
+
def _twin_names(self, tc: Toolchain) -> tuple[str, ...]:
|
|
410
|
+
"""The names a twin may have: its base and the arch's suffix (gfx90a), or its base
|
|
411
|
+
and its machine (an arch without a suffix, or another machine of the arch)."""
|
|
412
|
+
suffix = self.arches[tc.arch].get("twin_suffix")
|
|
413
|
+
return tuple(f"{tc.twin_of}{s}" for s in (suffix, f"_{tc.machine}") if s)
|
|
414
|
+
|
|
415
|
+
# --- the lists --------------------------------------------------------
|
|
416
|
+
|
|
417
|
+
def family_of(self, name: str) -> Family | None:
|
|
418
|
+
tc = self.toolchains.get(name)
|
|
419
|
+
return self.families.get(tc.family_id) if tc is not None else None
|
|
420
|
+
|
|
421
|
+
def family_of_kind(self, kind: str) -> Family:
|
|
422
|
+
for fam in self.families.values():
|
|
423
|
+
if fam.kind == kind:
|
|
424
|
+
return fam
|
|
425
|
+
raise KeyError(f"no compiler family of kind {kind}")
|
|
426
|
+
|
|
427
|
+
def message_table(self, name: str) -> str:
|
|
428
|
+
"""The message-table key of a toolchain (``family()``): its
|
|
429
|
+
family's; for a name the catalog does not know, the family whose
|
|
430
|
+
id prefixes the name (test toolchains named like the real ones),
|
|
431
|
+
else the name itself."""
|
|
432
|
+
base = base_name(name)
|
|
433
|
+
fam = self.family_of(base)
|
|
434
|
+
if fam is None:
|
|
435
|
+
fam = next((f for f in self.families.values()
|
|
436
|
+
if base.startswith(f.id)), None)
|
|
437
|
+
return fam.message_table if fam is not None else base
|
|
438
|
+
|
|
439
|
+
def label(self, name: str) -> str:
|
|
440
|
+
"""The support-table column name: the catalog's label, a twin's
|
|
441
|
+
``<base label> <arch>``."""
|
|
442
|
+
tc = self.toolchains[name]
|
|
443
|
+
if tc.label:
|
|
444
|
+
return tc.label
|
|
445
|
+
if tc.twin_of:
|
|
446
|
+
if self.twin_tag(name) == tc.arch:
|
|
447
|
+
return f"{self.label(tc.twin_of)} {tc.arch}"
|
|
448
|
+
from offload.engine.confirm.machines import load
|
|
449
|
+
return f"{self.label(tc.twin_of)} {load()[tc.machine].device.split()[-1]}"
|
|
450
|
+
return name
|
|
451
|
+
|
|
452
|
+
def headline(self) -> tuple[str, ...]:
|
|
453
|
+
"""The toolchains that are neither a twin nor a regression release,
|
|
454
|
+
in catalog order (the site's toolchains)."""
|
|
455
|
+
return tuple(n for n, t in self.toolchains.items()
|
|
456
|
+
if t.twin_of is None and t.regression_of is None)
|
|
457
|
+
|
|
458
|
+
def site_toolchains(self) -> tuple[str, ...]:
|
|
459
|
+
"""The toolchains the site has cells for: every one that is not an
|
|
460
|
+
arch twin (the site keys cells by machine)."""
|
|
461
|
+
return tuple(n for n, t in self.toolchains.items() if t.twin_of is None)
|
|
462
|
+
|
|
463
|
+
def of_arch(self, arch: str) -> tuple[str, ...]:
|
|
464
|
+
"""The toolchains of `arch` that are neither twins on another machine of the arch
|
|
465
|
+
nor regression releases."""
|
|
466
|
+
return tuple(n for n, t in self.toolchains.items() if t.arch == arch
|
|
467
|
+
and t.regression_of is None
|
|
468
|
+
and not (t.twin_of and self.toolchains[t.twin_of].arch == arch))
|
|
469
|
+
|
|
470
|
+
def of_gpu(self, gpu: str) -> tuple[str, ...]:
|
|
471
|
+
"""The report columns of the machines with GPUs of `gpu` (amd,
|
|
472
|
+
nvidia), twins and regression releases left out."""
|
|
473
|
+
return tuple(n for n, t in self.toolchains.items()
|
|
474
|
+
if self.arches[t.arch]["gpu"] == gpu and t.report_column
|
|
475
|
+
and t.twin_of is None and t.regression_of is None)
|
|
476
|
+
|
|
477
|
+
def of_family(self, fid: str) -> tuple[str, ...]:
|
|
478
|
+
return tuple(n for n, t in self.toolchains.items() if t.family_id == fid)
|
|
479
|
+
|
|
480
|
+
def of_machine(self, machine: str) -> tuple[str, ...]:
|
|
481
|
+
"""The measured toolchains of a machine (a regression release is
|
|
482
|
+
not one): catalog/machines.yaml's former ``toolchains`` lists."""
|
|
483
|
+
return tuple(n for n, t in self.toolchains.items()
|
|
484
|
+
if t.machine == machine and t.regression_of is None)
|
|
485
|
+
|
|
486
|
+
def of_lane(self, lane: str) -> tuple[str, ...]:
|
|
487
|
+
return tuple(n for n, t in self.toolchains.items() if t.lane == lane)
|
|
488
|
+
|
|
489
|
+
def lanes(self) -> tuple[str, ...]:
|
|
490
|
+
return tuple(dict.fromkeys(t.lane for t in self.toolchains.values() if t.lane))
|
|
491
|
+
|
|
492
|
+
def lane_doc(self, lane: str) -> str:
|
|
493
|
+
"""Which scripts run a lane (catalog ``lanes``); a lane the catalog
|
|
494
|
+
does not describe is refused by the check below."""
|
|
495
|
+
return self.lane_docs.get(lane, "")
|
|
496
|
+
|
|
497
|
+
def regression(self) -> dict[str, str]:
|
|
498
|
+
return {n: t.regression_of for n, t in self.toolchains.items()
|
|
499
|
+
if t.regression_of is not None}
|
|
500
|
+
|
|
501
|
+
def twins(self) -> dict[str, str]:
|
|
502
|
+
return {n: t.twin_of for n, t in self.toolchains.items() if t.twin_of}
|
|
503
|
+
|
|
504
|
+
def twins_of(self, name: str) -> tuple[str, ...]:
|
|
505
|
+
"""The twins of `name`, in catalog order."""
|
|
506
|
+
return tuple(n for n, t in self.toolchains.items() if t.twin_of == name)
|
|
507
|
+
|
|
508
|
+
def base_of(self, name: str) -> str:
|
|
509
|
+
"""The toolchain a twin is the twin of (a name the catalog does not
|
|
510
|
+
know: ``base_name``'s suffix rule)."""
|
|
511
|
+
t = self.toolchains.get(name)
|
|
512
|
+
if t is None:
|
|
513
|
+
return base_name(name)
|
|
514
|
+
return t.twin_of or name
|
|
515
|
+
|
|
516
|
+
def twin_key(self, name: str) -> str:
|
|
517
|
+
"""What a twin's name adds to its base's ("_g90", "_mi300x"; "" for a
|
|
518
|
+
toolchain that is no twin)."""
|
|
519
|
+
t = self.toolchains[name]
|
|
520
|
+
return name[len(t.twin_of):] if t.twin_of else ""
|
|
521
|
+
|
|
522
|
+
def twin_tag(self, name: str) -> str:
|
|
523
|
+
"""How the support tables name a twin's GPU: the arch for a twin named
|
|
524
|
+
with the arch's suffix (gfx90a), else its machine (mi300x)."""
|
|
525
|
+
t = self.toolchains[name]
|
|
526
|
+
suffix = self.arches[t.arch].get("twin_suffix")
|
|
527
|
+
return t.arch if suffix and self.twin_key(name) == suffix else t.machine
|
|
528
|
+
|
|
529
|
+
def machine_twins(self) -> frozenset:
|
|
530
|
+
"""The twins named after their machine (afar_mi300x, gcc_mi350x): support-table cells
|
|
531
|
+
only, outside the evidence machines (MI300A, MI250X, the A100)."""
|
|
532
|
+
return frozenset(n for n, t in self.toolchains.items()
|
|
533
|
+
if t.twin_of and self.twin_tag(n) == t.machine)
|
|
534
|
+
|
|
535
|
+
def table_only(self) -> frozenset:
|
|
536
|
+
"""The toolchains whose rows are support-table cells only, never
|
|
537
|
+
evidence (the confirmer, the expected values): the machine twins
|
|
538
|
+
and the toolchains of a family under test only (GCC)."""
|
|
539
|
+
return self.machine_twins() | frozenset(
|
|
540
|
+
n for n, t in self.toolchains.items() if t.family_id in self.under_test_only())
|
|
541
|
+
|
|
542
|
+
def twin(self, name: str, arch: str) -> str | None:
|
|
543
|
+
"""The twin of `name` on `arch`, if the catalog has one."""
|
|
544
|
+
return next((n for n, t in self.toolchains.items()
|
|
545
|
+
if t.twin_of == name and t.arch == arch), None)
|
|
546
|
+
|
|
547
|
+
def merged(self) -> tuple[str, ...]:
|
|
548
|
+
"""The headline toolchains with a key in the merged result tables."""
|
|
549
|
+
return tuple(n for n in self.headline() if self.toolchains[n].merged_key)
|
|
550
|
+
|
|
551
|
+
def in_merged(self, name: str) -> bool:
|
|
552
|
+
"""Whether a toolchain's rows are in the merged result files: it,
|
|
553
|
+
or the toolchain it is the twin of, has a ``merged_key``."""
|
|
554
|
+
t = self.toolchains[name]
|
|
555
|
+
base = self.toolchains[t.twin_of] if t.twin_of else t
|
|
556
|
+
return bool(base.merged_key)
|
|
557
|
+
|
|
558
|
+
def under_test_only(self) -> dict[str, str]:
|
|
559
|
+
return {f.id: f.under_test_only for f in self.families.values()
|
|
560
|
+
if f.under_test_only}
|
|
561
|
+
|
|
562
|
+
def versions(self) -> dict[str, tuple[str, str, int]]:
|
|
563
|
+
"""toolchain -> (family, site version label, release order within
|
|
564
|
+
the family) for the site's toolchains (offload.engine.site.matrix
|
|
565
|
+
VERSIONS): the order is the version's rank among the family's
|
|
566
|
+
distinct versions in catalog order."""
|
|
567
|
+
out = {}
|
|
568
|
+
seen: dict[str, list] = {}
|
|
569
|
+
for n in self.site_toolchains():
|
|
570
|
+
t = self.toolchains[n]
|
|
571
|
+
vs = seen.setdefault(t.family_id, [])
|
|
572
|
+
if t.version not in vs:
|
|
573
|
+
vs.append(t.version)
|
|
574
|
+
out[n] = (t.family_id, t.site_version, vs.index(t.version))
|
|
575
|
+
return out
|
|
576
|
+
|
|
577
|
+
def targets(self) -> dict[tuple[str, str], str]:
|
|
578
|
+
"""(machine, mode row key as text) -> the site's target id
|
|
579
|
+
(catalog/machines.yaml ``modes.<mode>.target``), machines and
|
|
580
|
+
modes in file order."""
|
|
581
|
+
from offload.engine.confirm.machines import load
|
|
582
|
+
out = {}
|
|
583
|
+
for m in load().values():
|
|
584
|
+
for mode in m.modes:
|
|
585
|
+
t = m.mode_table[mode].get("target")
|
|
586
|
+
if t:
|
|
587
|
+
out[(m.name, str(m.row_key(mode)))] = t
|
|
588
|
+
return out
|
|
589
|
+
|
|
590
|
+
def run_targets(self, name: str) -> tuple[str, ...]:
|
|
591
|
+
"""The site targets a toolchain and its twins were measured on (their
|
|
592
|
+
machines' modes; the catalog's ``site_targets`` where it has them): the
|
|
593
|
+
feature-support cells it can have, any other being n/a."""
|
|
594
|
+
if self.toolchains[name].site_targets:
|
|
595
|
+
return self.toolchains[name].site_targets
|
|
596
|
+
ran = {(t.machine, str(x)) for t in (self.toolchains[n] for n in (name, *self.twins_of(name)))
|
|
597
|
+
for x in t.xnack_modes}
|
|
598
|
+
return tuple(t for k, t in self.targets().items() if k in ran)
|
|
599
|
+
|
|
600
|
+
def target_kinds(self) -> dict[str, str]:
|
|
601
|
+
"""target id -> GPU vendor kind of its machine."""
|
|
602
|
+
from offload.engine.confirm.machines import load
|
|
603
|
+
out = {}
|
|
604
|
+
for m in load().values():
|
|
605
|
+
for mode in m.modes:
|
|
606
|
+
t = m.mode_table[mode].get("target")
|
|
607
|
+
if t:
|
|
608
|
+
out[t] = self.arches[m.arch]["gpu"]
|
|
609
|
+
return out
|
|
610
|
+
|
|
611
|
+
def family_order(self) -> tuple[str, ...]:
|
|
612
|
+
"""The site's family order (the first is the default family)."""
|
|
613
|
+
return tuple(self.site.get("family_order") or self.families)
|
|
614
|
+
|
|
615
|
+
def install_roots(self) -> tuple[str, ...]:
|
|
616
|
+
"""Every install root a recipe may name, unique, in catalog order."""
|
|
617
|
+
return tuple(dict.fromkeys(r for t in self.toolchains.values()
|
|
618
|
+
for r in t.install_roots))
|
|
619
|
+
|
|
620
|
+
def arch_machines(self) -> dict[str, str]:
|
|
621
|
+
from offload.engine.confirm.machines import load
|
|
622
|
+
out: dict[str, str] = {}
|
|
623
|
+
for m in load().values():
|
|
624
|
+
out.setdefault(m.arch, m.name) # the first machine of an arch, when several share its ISA
|
|
625
|
+
return out
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
def load(path: Path | str | None = None, environ=None) -> Registry:
|
|
629
|
+
"""The registry of `path` (default: the catalog, or the file
|
|
630
|
+
``COMPLIANT_TOOLCHAINS`` names)."""
|
|
631
|
+
p = Path(path or os.environ.get(CATALOG_ENV) or CATALOG)
|
|
632
|
+
data = yaml.safe_load(p.read_text()) or {}
|
|
633
|
+
if p == CATALOG:
|
|
634
|
+
data = localcfg.overlay("toolchains.yaml", data)
|
|
635
|
+
return Registry(data, environ)
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
@lru_cache(maxsize=None)
|
|
639
|
+
def _registry(path: str) -> Registry:
|
|
640
|
+
return load(path)
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
def registry() -> Registry:
|
|
644
|
+
"""The registry in use (cached per catalog path)."""
|
|
645
|
+
return _registry(str(os.environ.get(CATALOG_ENV) or CATALOG))
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
def reset() -> None:
|
|
649
|
+
"""Forget the cached registry (tests that point COMPLIANT_TOOLCHAINS at
|
|
650
|
+
another catalog, then reload the consumer modules)."""
|
|
651
|
+
_registry.cache_clear()
|
|
652
|
+
import sys
|
|
653
|
+
fi = sys.modules.get("offload.engine.confirm.findings")
|
|
654
|
+
if fi is not None:
|
|
655
|
+
fi.front_end.cache_clear()
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
_R = registry()
|
|
659
|
+
TOOLCHAINS: dict[str, Toolchain] = dict(_R.toolchains)
|
|
660
|
+
# the device of each arch (``device_of``), the machine of each arch and the
|
|
661
|
+
# toolchain-name suffix of an arch's twin toolchains ("" for gfx942)
|
|
662
|
+
DEVICES = {a: d["device"] for a, d in _R.arches.items()}
|
|
663
|
+
MACHINES = _R.arch_machines()
|
|
664
|
+
ARCH_SUFFIX = {a: d["twin_suffix"] for a, d in _R.arches.items()
|
|
665
|
+
if "twin_suffix" in d}
|
|
666
|
+
DEVICE = DEVICES[next(iter(ARCH_SUFFIX))] # the target device of Tuolumne runs
|
|
667
|
+
# the gfx942 headline toolchains of the families that witness for each other
|
|
668
|
+
# (a family under test only, GCC, is left out: the fuzz, stress and widened
|
|
669
|
+
# campaigns' targets) and their gfx90a twins
|
|
670
|
+
GFX942_TOOLCHAINS = tuple(t for t in _R.of_arch("gfx942")
|
|
671
|
+
if _R.toolchains[t].family_id not in _R.under_test_only())
|
|
672
|
+
GFX90A_TOOLCHAINS = tuple(_R.twin(t, "gfx90a") for t in GFX942_TOOLCHAINS
|
|
673
|
+
if _R.twin(t, "gfx90a"))
|
|
674
|
+
# Toolchains measured only by regression mode (tools/confirm.py
|
|
675
|
+
# regress), each with the headline toolchain it is compared with. They are
|
|
676
|
+
# never headline columns and their rows go to results/confirm/regress/
|
|
677
|
+
REGRESSION_TOOLCHAINS = _R.regression()
|
|
678
|
+
GCC_TOOLCHAINS = _R.of_family("gcc")
|
|
679
|
+
# the toolchains of other machines than the AMD ones (support-table
|
|
680
|
+
# columns of their own; offload.engine.report): the NVIDIA machine's
|
|
681
|
+
NVIDIA_TOOLCHAINS = _R.of_gpu("nvidia")
|
|
682
|
+
# the install roots other modules name directly: AFAR's front end is the
|
|
683
|
+
# legality pre-check's (offload.engine.prerun), its /p/vast1 copy serves Tioga
|
|
684
|
+
AFAR_BIN = f"{TOOLCHAINS['afar'].install_root}/bin"
|
|
685
|
+
AFAR_VAST = TOOLCHAINS["afar_g90"].install_root
|
|
686
|
+
AFAR_BIN_G90 = f"{AFAR_VAST}/bin"
|
|
687
|
+
NVHPC_BIN = TOOLCHAINS["nvhpc"].install_root
|
|
688
|
+
NVHPC269_BIN = TOOLCHAINS["nvhpc269"].install_root
|
|
689
|
+
GCC_G90_ROOT = TOOLCHAINS["gcc_g90"].install_root
|
|
690
|
+
GCC_SM80_ROOT = TOOLCHAINS["gcc_sm80"].install_root
|
|
691
|
+
GCC_VERSION = TOOLCHAINS["gcc_sm80"].version
|
|
692
|
+
# C: the OpenMP C flags of the AMD recipe kinds on gfx942
|
|
693
|
+
# (offload.engine.run_matrix; tests)
|
|
694
|
+
C_FLAGS = {k: _R.family_of_kind(k).flags["omp"]["c"].format(arch="gfx942")
|
|
695
|
+
for k in ("afar", "cce")}
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
def install_roots() -> tuple[str, ...]:
|
|
699
|
+
"""Every compiler install root of the catalog (paths to scrub from
|
|
700
|
+
recorded messages)."""
|
|
701
|
+
return registry().install_roots()
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
@lru_cache(maxsize=None)
|
|
705
|
+
def base_name(name: str) -> str:
|
|
706
|
+
"""The toolchain a twin is the twin of (``cce21_g90``, ``afar_mi300x`` -> ``cce21``,
|
|
707
|
+
``afar``); a name the catalog does not know loses an arch's twin suffix."""
|
|
708
|
+
tc = TOOLCHAINS.get(name)
|
|
709
|
+
if tc is not None:
|
|
710
|
+
return tc.twin_of or name
|
|
711
|
+
for suffix in ARCH_SUFFIX.values():
|
|
712
|
+
if suffix and name.endswith(suffix):
|
|
713
|
+
return name[:-len(suffix)]
|
|
714
|
+
return name
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
def arch_of(name: str) -> str:
|
|
718
|
+
"""The arch of a registered toolchain (``TOOLCHAINS``). A name the registry does not know raises KeyError (it used to
|
|
719
|
+
default to gfx942, so an unregistered toolchain's rows were recorded
|
|
720
|
+
as MI300A rows)."""
|
|
721
|
+
tc = TOOLCHAINS.get(name)
|
|
722
|
+
if tc is not None:
|
|
723
|
+
return tc.arch
|
|
724
|
+
raise KeyError(f"unknown toolchain {name}: register it in "
|
|
725
|
+
"catalog/toolchains.yaml (docs/tooling/contributing.md, "
|
|
726
|
+
"\"Add a compiler\")")
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
def device_of(tc: Toolchain) -> str:
|
|
730
|
+
"""The target device of a toolchain's runs."""
|
|
731
|
+
return DEVICES[tc.arch]
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
def parse_rocminfo(text: str) -> tuple[str, str]:
|
|
735
|
+
"""(gfx name, marketing name) of the first GPU agent in rocminfo's
|
|
736
|
+
output; ("", "") if none."""
|
|
737
|
+
m = re.search(r"^\s*Name:\s+(gfx[0-9a-f]+)\s*$", text, re.M)
|
|
738
|
+
if m is None:
|
|
739
|
+
return "", ""
|
|
740
|
+
# the agent's marketing name follows its name, before the next agent
|
|
741
|
+
rest = text[m.end():]
|
|
742
|
+
nxt = re.search(r"^\s*Name:", rest, re.M)
|
|
743
|
+
mk = re.search(r"^\s*Marketing Name:\s+(\S.*?)\s*$",
|
|
744
|
+
rest[:nxt.start()] if nxt else rest, re.M)
|
|
745
|
+
return m.group(1), mk.group(1) if mk else ""
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
def gpu_count(text: str) -> int:
|
|
749
|
+
"""The number of GPU agents in rocminfo's output (the devices a run
|
|
750
|
+
sees; ROCR_VISIBLE_DEVICES filters them)."""
|
|
751
|
+
return len(re.findall(r"^\s*Name:\s+gfx[0-9a-f]+\s*$", text, re.M))
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
def detect_gpu_count() -> int | None:
|
|
755
|
+
"""GPU agents visible to this process per rocminfo (else the
|
|
756
|
+
NVIDIA GPUs per nvidia-smi, narrowed by CUDA_VISIBLE_DEVICES), None
|
|
757
|
+
without either."""
|
|
758
|
+
for exe in ["/opt/rocm/bin/rocminfo"] + sorted(
|
|
759
|
+
str(p) for p in Path("/opt").glob("rocm-*/bin/rocminfo"))[::-1]:
|
|
760
|
+
if Path(exe).is_file():
|
|
761
|
+
try:
|
|
762
|
+
res = subprocess.run([exe], capture_output=True, text=True,
|
|
763
|
+
timeout=60)
|
|
764
|
+
except (subprocess.SubprocessError, OSError):
|
|
765
|
+
continue
|
|
766
|
+
return gpu_count(res.stdout)
|
|
767
|
+
gpus = _nvidia_gpus()
|
|
768
|
+
if gpus is None:
|
|
769
|
+
return None
|
|
770
|
+
return len(visible_nvidia(gpus, os.environ.get("CUDA_VISIBLE_DEVICES")))
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
NVIDIA_SMI = "nvidia-smi"
|
|
774
|
+
_NV_QUERY = ["--query-gpu=index,uuid,compute_cap,name",
|
|
775
|
+
"--format=csv,noheader"]
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
def parse_nvidia_smi(text: str) -> list[tuple[str, str, str, str]]:
|
|
779
|
+
"""(index, uuid, sm arch, name) per GPU of ``nvidia-smi
|
|
780
|
+
--query-gpu=index,uuid,compute_cap,name --format=csv,noheader``
|
|
781
|
+
: compute capability 8.0 is ``sm_80``."""
|
|
782
|
+
out = []
|
|
783
|
+
for line in text.splitlines():
|
|
784
|
+
parts = [x.strip() for x in line.split(",")]
|
|
785
|
+
if len(parts) < 4 or not re.fullmatch(r"\d+\.\d+", parts[2]):
|
|
786
|
+
continue
|
|
787
|
+
out.append((parts[0], parts[1], "sm_" + parts[2].replace(".", ""),
|
|
788
|
+
", ".join(parts[3:])))
|
|
789
|
+
return out
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
def visible_nvidia(gpus: list, cuda_visible: str | None) -> list:
|
|
793
|
+
"""The GPUs a CUDA process sees: CUDA_VISIBLE_DEVICES (indices or
|
|
794
|
+
UUIDs, in its order; nvidia-smi itself ignores it) narrows the list."""
|
|
795
|
+
if cuda_visible is None:
|
|
796
|
+
return list(gpus)
|
|
797
|
+
out = []
|
|
798
|
+
for tok in (t.strip() for t in cuda_visible.split(",")):
|
|
799
|
+
if not tok:
|
|
800
|
+
break
|
|
801
|
+
hit = [g for g in gpus if tok == g[0] or g[1].startswith(tok)]
|
|
802
|
+
if not hit: # CUDA stops at the first invalid entry
|
|
803
|
+
break
|
|
804
|
+
out.append(hit[0])
|
|
805
|
+
return out
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
def _nvidia_gpus() -> list | None:
|
|
809
|
+
try:
|
|
810
|
+
res = subprocess.run([NVIDIA_SMI, *_NV_QUERY], capture_output=True,
|
|
811
|
+
text=True, timeout=60)
|
|
812
|
+
except (subprocess.SubprocessError, OSError):
|
|
813
|
+
return None
|
|
814
|
+
if res.returncode != 0:
|
|
815
|
+
return None
|
|
816
|
+
return parse_nvidia_smi(res.stdout)
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
def detect_gpu() -> tuple[str, str]:
|
|
820
|
+
"""(gfx name, marketing name) of this node's first GPU per rocminfo
|
|
821
|
+
(recorded in every result row); without rocminfo,
|
|
822
|
+
(sm arch, name) of the first visible NVIDIA GPU per nvidia-smi; ("",
|
|
823
|
+
"") without a GPU or either tool. Cached."""
|
|
824
|
+
if _GPU:
|
|
825
|
+
return _GPU[0]
|
|
826
|
+
found = ("", "")
|
|
827
|
+
cands = ["/opt/rocm/bin/rocminfo"] + sorted(
|
|
828
|
+
str(p) for p in Path("/opt").glob("rocm-*/bin/rocminfo"))[::-1]
|
|
829
|
+
for exe in cands:
|
|
830
|
+
if not Path(exe).is_file():
|
|
831
|
+
continue
|
|
832
|
+
try:
|
|
833
|
+
res = subprocess.run([exe], capture_output=True, text=True,
|
|
834
|
+
timeout=60)
|
|
835
|
+
except (subprocess.SubprocessError, OSError):
|
|
836
|
+
continue
|
|
837
|
+
found = parse_rocminfo(res.stdout)
|
|
838
|
+
if found[0]:
|
|
839
|
+
break
|
|
840
|
+
if not found[0]: # An NVIDIA node (nvidia-smi)
|
|
841
|
+
vis = visible_nvidia(_nvidia_gpus() or [],
|
|
842
|
+
os.environ.get("CUDA_VISIBLE_DEVICES"))
|
|
843
|
+
if vis:
|
|
844
|
+
found = (vis[0][2], vis[0][3])
|
|
845
|
+
_GPU.append(found)
|
|
846
|
+
return found
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
_GPU: list[tuple[str, str]] = []
|
|
850
|
+
|
|
851
|
+
_TRIPLE = re.compile(rb"amdgcn-amd-amdhsa--gfx[0-9a-f]+(?::[a-z]+[+-])*")
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
def code_object_targets(data: bytes) -> list[str]:
|
|
855
|
+
"""The AMDGPU code-object target ids (``amdgcn-amd-amdhsa--gfx90a``,
|
|
856
|
+
with ``:xnack-``/``:xnack+`` when the code object is not "xnack any")
|
|
857
|
+
named in an executable's bytes, sorted and unique (run
|
|
858
|
+
metadata; AFAR's packaged images are read with llvm-objdump
|
|
859
|
+
--offloading instead)."""
|
|
860
|
+
return sorted({m.decode() for m in _TRIPLE.findall(data)})
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
# GCC's offload image for AMD is an AMDGPU ELF code object embedded in the
|
|
864
|
+
# host executable; its e_flags name the GPU (EF_AMDGPU_MACH, the low byte;
|
|
865
|
+
# gcc/config/gcn/gcn-devices.def) and the xnack setting (code object v4+:
|
|
866
|
+
# 0x100 any, 0x200 off, 0x300 on)
|
|
867
|
+
_GCN_MACH = {0x30: "gfx908", 0x3f: "gfx90a", 0x4c: "gfx942", 0x4f: "gfx950"}
|
|
868
|
+
_EM_AMDGPU = 224
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
def gcn_targets(data: bytes) -> list[str]:
|
|
872
|
+
"""The target ids (``amdgcn-amd-amdhsa--gfx90a``, ``:xnack-``/
|
|
873
|
+
``:xnack+`` when not "any") of the AMDGPU ELF code objects embedded in
|
|
874
|
+
an executable's bytes (GCC's offload images), sorted and unique."""
|
|
875
|
+
import struct
|
|
876
|
+
out = set()
|
|
877
|
+
i = data.find(b"\x7fELF")
|
|
878
|
+
while i >= 0:
|
|
879
|
+
if len(data) >= i + 52 and data[i + 4] == 2 and data[i + 5] == 1:
|
|
880
|
+
machine, = struct.unpack_from("<H", data, i + 18)
|
|
881
|
+
flags, = struct.unpack_from("<I", data, i + 48)
|
|
882
|
+
if machine == _EM_AMDGPU:
|
|
883
|
+
mach = _GCN_MACH.get(flags & 0xff, f"mach{flags & 0xff:#x}")
|
|
884
|
+
xn = {0x200: ":xnack-", 0x300: ":xnack+"}.get(
|
|
885
|
+
flags & 0x300, "")
|
|
886
|
+
out.add(f"amdgcn-amd-amdhsa--{mach}{xn}")
|
|
887
|
+
i = data.find(b"\x7fELF", i + 1)
|
|
888
|
+
return sorted(out)
|
|
889
|
+
|
|
890
|
+
|
|
891
|
+
def parse_nvhpc_cuda(dryrun: str) -> str:
|
|
892
|
+
"""The CUDA version an NVHPC compile uses, from its -dryrun output
|
|
893
|
+
(the bundled toolkit path ``.../cuda/<X.Y>/...``); "" if none."""
|
|
894
|
+
found = re.findall(r"/cuda/(\d+\.\d+)\b", dryrun)
|
|
895
|
+
return found[0] if found else ""
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
def nvhpc_cuda(tc, workdir) -> str:
|
|
899
|
+
"""The default CUDA of an NVHPC toolchain (recorded
|
|
900
|
+
in the toolchain metadata), from -dryrun of the smoke program."""
|
|
901
|
+
res = subprocess.run(["bash", "-c", tc.compile_cmd(
|
|
902
|
+
str(_DEV_F90), str(Path(workdir) / "dryrun.out")).replace(
|
|
903
|
+
" -o ", " -dryrun -o ", 1)], capture_output=True, text=True,
|
|
904
|
+
timeout=300, cwd=workdir)
|
|
905
|
+
return parse_nvhpc_cuda(res.stdout + res.stderr)
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
_SM = re.compile(rb"\bsm_[0-9]{2,3}[af]?\b")
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
def nvidia_targets(data: bytes) -> list[str]:
|
|
912
|
+
"""The sm_NN arches named in an NVHPC executable's embedded
|
|
913
|
+
device images, sorted and unique."""
|
|
914
|
+
return sorted({m.decode() for m in _SM.findall(data)})
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
def loaded_rocm_version(tc: Toolchain) -> str | None:
|
|
918
|
+
"""ROCm version the toolchain's prelude loads, or None if it loads none."""
|
|
919
|
+
if not any(t == "rocm" or t.startswith("rocm/")
|
|
920
|
+
for t in tc.prelude.split()):
|
|
921
|
+
return None
|
|
922
|
+
res = subprocess.run(
|
|
923
|
+
["bash", "-c", f'{{ {tc.prelude}\n}} >/dev/null 2>&1 && echo "$ROCM_PATH"'],
|
|
924
|
+
capture_output=True, text=True, check=True)
|
|
925
|
+
m = re.search(r"rocm-(\d+\.\d+(?:\.\d+)?)", res.stdout)
|
|
926
|
+
return m.group(1) if m else None
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
def compiler_version(tc: Toolchain) -> str:
|
|
930
|
+
"""The compiler's version banner (its first line, plus CCE's target line
|
|
931
|
+
when there is one), run through the toolchain's prelude; "" if the
|
|
932
|
+
compiler cannot be run. C toolchains report the C compiler's
|
|
933
|
+
banner ("AMD clang version ...", "Cray clang version ...")."""
|
|
934
|
+
key = tc.name if tc.lang != "c" else f"{tc.name}:c"
|
|
935
|
+
cached = _VERSIONS.get(key)
|
|
936
|
+
if cached is not None:
|
|
937
|
+
return cached
|
|
938
|
+
try:
|
|
939
|
+
res = subprocess.run(
|
|
940
|
+
["bash", "-c", f"{{ {tc.prelude or 'true'}\n}} >/dev/null 2>&1; "
|
|
941
|
+
f"{tc.compiler()} --version 2>&1"],
|
|
942
|
+
capture_output=True, text=True, timeout=120)
|
|
943
|
+
lines = [ln.strip() for ln in res.stdout.splitlines()
|
|
944
|
+
if ln.strip().startswith(("AMD flang", "Cray Fortran",
|
|
945
|
+
"AMD clang", "Cray clang",
|
|
946
|
+
"nvfortran ", "nvc ",
|
|
947
|
+
"GNU Fortran (GCC)",
|
|
948
|
+
"gcc (GCC)"))]
|
|
949
|
+
out = " | ".join(lines)
|
|
950
|
+
except (subprocess.SubprocessError, OSError):
|
|
951
|
+
out = ""
|
|
952
|
+
_VERSIONS[key] = out
|
|
953
|
+
return out
|
|
954
|
+
|
|
955
|
+
|
|
956
|
+
_VERSIONS: dict[str, str] = {}
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
def parse_module_list(text: str) -> list[str]:
|
|
960
|
+
"""The module names of ``module -t list`` output."""
|
|
961
|
+
return [ln.strip() for ln in text.splitlines()
|
|
962
|
+
if ln.strip() and not ln.rstrip().endswith(":")
|
|
963
|
+
and " " not in ln.strip()]
|
|
964
|
+
|
|
965
|
+
|
|
966
|
+
_DEV_F90 = ROOT / "tests" / "data" / "dev.f90"
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
def toolchain_meta(tc: Toolchain, workdir: Path) -> dict:
|
|
970
|
+
"""Run metadata of a toolchain: its machine, arch and device,
|
|
971
|
+
the modules its prelude leaves loaded (``module -t list``) and the
|
|
972
|
+
code-object target ids of a compiled smoke program (tests/data/dev.f90;
|
|
973
|
+
AFAR's offload images through its llvm-objdump --offloading, CCE's
|
|
974
|
+
triples from the executable's bytes). The compilers' default code
|
|
975
|
+
objects are "xnack any": no ``:xnack`` feature in the id."""
|
|
976
|
+
import dataclasses
|
|
977
|
+
workdir = Path(workdir)
|
|
978
|
+
workdir.mkdir(parents=True, exist_ok=True)
|
|
979
|
+
out: dict = {"name": tc.name, "machine": tc.machine, "arch": tc.arch,
|
|
980
|
+
"device": device_of(tc), "modules": [], "code_object": []}
|
|
981
|
+
if "module " in tc.prelude:
|
|
982
|
+
res = subprocess.run(
|
|
983
|
+
["bash", "-c", f"{{ {tc.prelude}\n}} >/dev/null 2>&1; "
|
|
984
|
+
"module -t list 2>&1"],
|
|
985
|
+
capture_output=True, text=True, timeout=120)
|
|
986
|
+
out["modules"] = parse_module_list(res.stdout)
|
|
987
|
+
f = dataclasses.replace(tc, lang="f90", model="omp")
|
|
988
|
+
if f.compile_time_modes(): # Built for its headline mode
|
|
989
|
+
m = f._machine()
|
|
990
|
+
f = f.for_mode(m.row_key(m.headline_mode))
|
|
991
|
+
exe = workdir / f"{tc.name}.meta.out"
|
|
992
|
+
res = subprocess.run(["bash", "-c", f.compile_cmd(str(_DEV_F90),
|
|
993
|
+
str(exe))],
|
|
994
|
+
capture_output=True, text=True, timeout=600,
|
|
995
|
+
cwd=workdir)
|
|
996
|
+
if res.returncode != 0 or not exe.is_file():
|
|
997
|
+
out["code_object_error"] = (res.stdout + res.stderr)[-400:]
|
|
998
|
+
return out
|
|
999
|
+
found = code_object_targets(exe.read_bytes())
|
|
1000
|
+
if tc.kind == "gcc" and tc.arch.startswith("gfx"): # embedded ELF
|
|
1001
|
+
found = gcn_targets(exe.read_bytes())
|
|
1002
|
+
if tc.kind == "nvhpc" or tc.arch.startswith("sm_"): # The
|
|
1003
|
+
found = nvidia_targets(exe.read_bytes()) # embedded images' arch
|
|
1004
|
+
objdump = Path(tc.fc).parent.parent / "lib" / "llvm" / "bin" / \
|
|
1005
|
+
"llvm-objdump"
|
|
1006
|
+
if tc.base == "afar" and objdump.is_file():
|
|
1007
|
+
r = subprocess.run([str(objdump), "--offloading", str(exe)],
|
|
1008
|
+
capture_output=True, text=True, timeout=120)
|
|
1009
|
+
arches = re.findall(r"^arch\s+(\S+)", r.stdout, re.M)
|
|
1010
|
+
triples = re.findall(r"^triple\s+(\S+)", r.stdout, re.M)
|
|
1011
|
+
found += [f"{t} {a}" for t, a in zip(triples, arches)]
|
|
1012
|
+
out["code_object"] = found
|
|
1013
|
+
if tc.kind == "nvhpc": # The CUDA the compiler picks
|
|
1014
|
+
out["cuda"] = nvhpc_cuda(f, workdir)
|
|
1015
|
+
# The runtime the runs load (LD_LIBRARY_PATH)
|
|
1016
|
+
out["runtime_libs"] = dict(tc.env).get("LD_LIBRARY_PATH", "")
|
|
1017
|
+
if tc.kind == "gcc": # the release's runtime (and ROCm's HSA)
|
|
1018
|
+
out["runtime_libs"] = dict(tc.env).get("LD_LIBRARY_PATH", "")
|
|
1019
|
+
return out
|
|
1020
|
+
|
|
1021
|
+
|
|
1022
|
+
|
|
1023
|
+
def family(name: str) -> str:
|
|
1024
|
+
"""The message-table key of a toolchain (catalog/toolchains.yaml
|
|
1025
|
+
``families.<f>.message_table``): every CCE release shares the tables
|
|
1026
|
+
captured from CCE 19."""
|
|
1027
|
+
return registry().message_table(name)
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
def check_registry(reg: Registry | None = None) -> list[str]:
|
|
1031
|
+
"""The toolchain registry against the machines
|
|
1032
|
+
(catalog/machines.yaml), the support-table columns (offload.engine.report)
|
|
1033
|
+
and the canaries (catalog/canaries.yaml). Returns the problems (empty
|
|
1034
|
+
when consistent); a new toolchain fails here until every place that
|
|
1035
|
+
must know it does."""
|
|
1036
|
+
from offload.engine.confirm.machines import load
|
|
1037
|
+
from offload.engine import canary
|
|
1038
|
+
reg = reg or registry()
|
|
1039
|
+
machines = load()
|
|
1040
|
+
twins = {w for t in reg.of_arch("gfx942") for w in reg.twins_of(t)}
|
|
1041
|
+
columns = set(reg.of_arch("gfx942")) | twins | set(reg.of_gpu("nvidia")) | \
|
|
1042
|
+
{n for n, t in reg.toolchains.items() if not t.report_column}
|
|
1043
|
+
canaries = set((canary.load().get("toolchains") or {}))
|
|
1044
|
+
out = []
|
|
1045
|
+
for name, tc in reg.toolchains.items():
|
|
1046
|
+
m = machines.get(tc.machine)
|
|
1047
|
+
if m is None:
|
|
1048
|
+
out.append(f"{name}: machine {tc.machine} is not in "
|
|
1049
|
+
"catalog/machines.yaml")
|
|
1050
|
+
elif m.arch != tc.arch:
|
|
1051
|
+
out.append(f"{name}: arch {tc.arch}, machine {m.name} is "
|
|
1052
|
+
f"{m.arch}")
|
|
1053
|
+
if tc.canaries not in canaries:
|
|
1054
|
+
out.append(f"{name}: no canaries in catalog/canaries.yaml "
|
|
1055
|
+
f"(entry {tc.canaries}: the five kinds, measured)")
|
|
1056
|
+
if not tc.lane:
|
|
1057
|
+
out.append(f"{name}: no lane (which run scripts run it)")
|
|
1058
|
+
if name in reg.regression():
|
|
1059
|
+
continue
|
|
1060
|
+
if m is not None and name not in m.toolchains:
|
|
1061
|
+
out.append(f"{name}: not in machines.yaml {m.name} toolchains")
|
|
1062
|
+
if name not in columns:
|
|
1063
|
+
out.append(f"{name}: not a support-table column "
|
|
1064
|
+
"(offload.engine.report.ALL_TOOLCHAINS)")
|
|
1065
|
+
for m in machines.values():
|
|
1066
|
+
for name in m.toolchains:
|
|
1067
|
+
if name not in reg.toolchains:
|
|
1068
|
+
out.append(f"machines.yaml {m.name}: toolchain {name} is "
|
|
1069
|
+
"not registered")
|
|
1070
|
+
return out
|