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,1180 @@
|
|
|
1
|
+
"""The campaign interface: what a campaign of generated programs declares, and
|
|
2
|
+
the generic steps that take it through gen, prerun, witness, legality, run,
|
|
3
|
+
gate, confirm, report and a findings plan. The steps call the existing
|
|
4
|
+
machinery (offload.engine.harness, gate, prerun, confirm).
|
|
5
|
+
|
|
6
|
+
A campaign is one module that defines a ``Campaign`` subclass and one entry
|
|
7
|
+
in ``MODULES`` (docs/tooling/contributing.md, "Add a campaign"). It declares its
|
|
8
|
+
programs (``programs(seed, n, **opts)``, deterministic, each a frozen object
|
|
9
|
+
with ``id``, ``lang``, ``model``, ``version``, ``source``, ``expected``,
|
|
10
|
+
``legality``, ``why``, ``cites`` and ``harness()``), its labels (``defined``,
|
|
11
|
+
``unspecified``, ``illegal``, ``pending``; only ``gated(p)`` programs are
|
|
12
|
+
gated and confirmed), its gate kind, the cell identity (``cell``) and its
|
|
13
|
+
``Capabilities``. Only the runner (``HarnessRunner``) compiles or runs
|
|
14
|
+
anything; the other steps read and write results/<name>/<run>/.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import dataclasses
|
|
19
|
+
import hashlib
|
|
20
|
+
import importlib
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import re
|
|
24
|
+
import threading
|
|
25
|
+
import time
|
|
26
|
+
from collections import Counter, defaultdict
|
|
27
|
+
from dataclasses import dataclass, field
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
|
|
30
|
+
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
31
|
+
RESULTS = ROOT / "results"
|
|
32
|
+
|
|
33
|
+
# --- JSONL files with per-writer parts ------------------------------------------------
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _parts(path: Path) -> list[Path]:
|
|
37
|
+
"""`path` and its per-writer parts (``<stem>.part.<node>.<pid>.jsonl``),
|
|
38
|
+
oldest first: a retry reads after the row it replaces."""
|
|
39
|
+
return ([path] if path.is_file() else []) + sorted(
|
|
40
|
+
path.parent.glob(f"{path.stem}.part.*{path.suffix}"),
|
|
41
|
+
key=lambda p: (p.stat().st_mtime_ns, p.name))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def read_jsonl(path: Path) -> list[dict]:
|
|
45
|
+
"""The rows of a JSONL file and its parts; a line that does not parse
|
|
46
|
+
(an interrupted write) is skipped, so its work is redone."""
|
|
47
|
+
out = []
|
|
48
|
+
for p in _parts(Path(path)):
|
|
49
|
+
for ln in p.read_text().splitlines():
|
|
50
|
+
if ln.strip():
|
|
51
|
+
try:
|
|
52
|
+
out.append(json.loads(ln))
|
|
53
|
+
except json.JSONDecodeError:
|
|
54
|
+
pass
|
|
55
|
+
return out
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
_LOCK = threading.Lock()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def append_jsonl(path: Path, rows: list[dict]) -> None:
|
|
62
|
+
"""Append to this process's own part of `path` (appends from two nodes
|
|
63
|
+
to one file interleave on a network file system)."""
|
|
64
|
+
path = Path(path)
|
|
65
|
+
part = path.parent / (f"{path.stem}.part.{os.uname().nodename}."
|
|
66
|
+
f"{os.getpid()}{path.suffix}")
|
|
67
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
68
|
+
with _LOCK, open(part, "a") as fh:
|
|
69
|
+
fh.write("".join(json.dumps(r, sort_keys=True) + "\n" for r in rows))
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def sha256(text: str) -> str:
|
|
73
|
+
return hashlib.sha256(text.encode()).hexdigest()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# --- capabilities: what the catalog lets a campaign express ---------------------------
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def mode_name(row_key: int) -> str:
|
|
80
|
+
"""The campaigns' name of a memory mode by its stored row key:
|
|
81
|
+
``copy`` for the copy mode, ``unified`` for unified and (NVHPC) managed
|
|
82
|
+
memory, which the campaigns treat as one mode (catalog/machines.yaml)."""
|
|
83
|
+
from offload.engine.confirm import machines as M
|
|
84
|
+
for m in M.load().values():
|
|
85
|
+
for mode in m.modes:
|
|
86
|
+
if m.row_key(mode) == row_key:
|
|
87
|
+
return "copy" if mode == "copy" else "unified"
|
|
88
|
+
raise KeyError(f"no memory mode has row key {row_key}")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@dataclass(frozen=True)
|
|
92
|
+
class Capabilities:
|
|
93
|
+
"""What a campaign expresses, and where it is measured. ``families``
|
|
94
|
+
maps a machine (catalog/machines.yaml) to the compiler family ids
|
|
95
|
+
(catalog/toolchains.yaml ``families``) measured there, or ``None`` for
|
|
96
|
+
every family with a toolchain on that machine; ``regression`` includes
|
|
97
|
+
the releases measured only against another (``regression_of``). The
|
|
98
|
+
toolchains and row keys are computed from the catalog, in its order."""
|
|
99
|
+
langs: tuple[str, ...] # "c", "f90"
|
|
100
|
+
models: tuple[str, ...] # "omp", "acc"
|
|
101
|
+
families: dict = field(default_factory=dict) # machine -> families | None
|
|
102
|
+
regression: bool = False
|
|
103
|
+
draw_options: tuple[str, ...] = () # the keyword options of programs()
|
|
104
|
+
|
|
105
|
+
def machines(self) -> tuple[str, ...]:
|
|
106
|
+
from offload.engine.confirm import machines as M
|
|
107
|
+
return tuple(m for m in M.load() if m in self.families)
|
|
108
|
+
|
|
109
|
+
def toolchains(self, machine: str) -> tuple[str, ...]:
|
|
110
|
+
from offload.engine.toolchains import registry
|
|
111
|
+
fams = self.families.get(machine)
|
|
112
|
+
out = []
|
|
113
|
+
for name, tc in registry().toolchains.items():
|
|
114
|
+
if tc.machine != machine:
|
|
115
|
+
continue
|
|
116
|
+
if tc.regression_of is not None and not self.regression:
|
|
117
|
+
continue
|
|
118
|
+
if fams is not None and tc.family_id not in fams:
|
|
119
|
+
continue
|
|
120
|
+
if not any(tc.family.why_unsupported(m, l) is None
|
|
121
|
+
for m in self.models for l in self.langs):
|
|
122
|
+
continue
|
|
123
|
+
out.append(name)
|
|
124
|
+
return tuple(out)
|
|
125
|
+
|
|
126
|
+
def modes(self, machine: str) -> tuple[int, ...]:
|
|
127
|
+
"""The stored row keys of the machine's memory modes, ascending."""
|
|
128
|
+
from offload.engine.confirm import machines as M
|
|
129
|
+
m = M.load()[machine]
|
|
130
|
+
return tuple(sorted(m.row_key(x) for x in m.modes))
|
|
131
|
+
|
|
132
|
+
def targets(self) -> dict[str, tuple[list[str], list[int]]]:
|
|
133
|
+
"""machine -> (toolchains, row keys): the campaign drivers' TARGETS."""
|
|
134
|
+
return {m: (list(self.toolchains(m)), list(self.modes(m)))
|
|
135
|
+
for m in self.machines()}
|
|
136
|
+
|
|
137
|
+
def check(self) -> list[str]:
|
|
138
|
+
"""Problems (empty when consistent): an unknown machine or family,
|
|
139
|
+
a machine with no toolchain for the campaign."""
|
|
140
|
+
from offload.engine.confirm import machines as M
|
|
141
|
+
from offload.engine.toolchains import registry
|
|
142
|
+
reg = registry()
|
|
143
|
+
out = []
|
|
144
|
+
for machine, fams in self.families.items():
|
|
145
|
+
if machine not in M.load():
|
|
146
|
+
out.append(f"machine {machine} is not in catalog/machines.yaml")
|
|
147
|
+
continue
|
|
148
|
+
for f in fams or ():
|
|
149
|
+
if f not in reg.families:
|
|
150
|
+
out.append(f"family {f} is not in catalog/toolchains.yaml")
|
|
151
|
+
if not self.toolchains(machine):
|
|
152
|
+
out.append(f"no toolchain of {machine} compiles the campaign")
|
|
153
|
+
for m in self.models:
|
|
154
|
+
if m not in ("omp", "acc"):
|
|
155
|
+
out.append(f"unknown model {m}")
|
|
156
|
+
for l in self.langs:
|
|
157
|
+
if l not in ("c", "f90"):
|
|
158
|
+
out.append(f"unknown language {l}")
|
|
159
|
+
return out
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
# --- the campaign -------------------------------------------------------------------
|
|
163
|
+
|
|
164
|
+
LABELS = ("defined", "unspecified", "illegal", "pending")
|
|
165
|
+
FAILING_OK = ("correct_on_device", "unobservable")
|
|
166
|
+
# a front end's rejection that names a feature it lacks is no legality
|
|
167
|
+
# verdict (the compiler does not implement it; it says nothing about the
|
|
168
|
+
# program): the messages the campaigns recorded (tools/campaigns/oop.py's list)
|
|
169
|
+
NOT_A_VERDICT = re.compile(
|
|
170
|
+
r"not yet implemented|not supported|unimplemented feature|not allowed "
|
|
171
|
+
r"on device|unrecognized openmp directive|nvvmcompileprogram|failed to "
|
|
172
|
+
r"translate accelerator region|no device symbol|unsupported accelerator code"
|
|
173
|
+
# a diagnostic whose subject is the default mapper CCE generates
|
|
174
|
+
# (default$mapper$<type>$<module>): about the compiler's code, not the
|
|
175
|
+
# program's (section 8)
|
|
176
|
+
r"|ERROR default\$mapper\$\S*, File", re.I)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class Campaign:
|
|
180
|
+
"""The interface. A campaign module subclasses it, sets the class
|
|
181
|
+
attributes and defines ``programs``; the other methods have defaults
|
|
182
|
+
that read the program objects' fields."""
|
|
183
|
+
name: str = "" # results/<name>/, the row's `campaign`
|
|
184
|
+
kind: str = "" # the gate kind (default: name)
|
|
185
|
+
prefix: str = "" # the gate's build-directory prefix (default: <kind>_)
|
|
186
|
+
signature: str = "program" # offload.engine.gate SIGNATURE_MODES
|
|
187
|
+
labels: tuple = LABELS
|
|
188
|
+
caps: Capabilities = Capabilities(("f90",), ("omp",))
|
|
189
|
+
printed_values: bool = True # the programs print `name= value` lines (VALUE_KINDS)
|
|
190
|
+
compile_limit_s: int = 900 # the gate's compile limit (COMPILE_LIMIT_S)
|
|
191
|
+
not_a_verdict: re.Pattern = NOT_A_VERDICT
|
|
192
|
+
fe_timeout_s: int = 600 # one front-end check in prerun
|
|
193
|
+
timeout_s: int = 120 # a run's default time limit
|
|
194
|
+
opt: str = "-O2"
|
|
195
|
+
doc: str = "" # where the campaign is written up
|
|
196
|
+
hand_listed: bool = False # programs() ignores the draw: gen writes no meta.json
|
|
197
|
+
# a campaign of real code (hecbench): the programs of a run are read back from its
|
|
198
|
+
# programs.jsonl (`programs_from_records`), so a machine without the draw's inputs runs
|
|
199
|
+
# them; `src_name` names the file `gen` writes for a program
|
|
200
|
+
stored_programs: bool = False
|
|
201
|
+
# run names whose results nobody reads (a sealed half): report, cluster, confirm and
|
|
202
|
+
# findings-plan refuse them (tools/campaign.py)
|
|
203
|
+
sealed_runs: tuple = ()
|
|
204
|
+
|
|
205
|
+
def make_runner(self):
|
|
206
|
+
"""The runner of the steps that compile or run (the harness's by default)."""
|
|
207
|
+
return HarnessRunner(self)
|
|
208
|
+
|
|
209
|
+
def src_name(self, p) -> str:
|
|
210
|
+
return f"{p.id}.{self.ext(p)}"
|
|
211
|
+
|
|
212
|
+
def programs_from_records(self, rows: list) -> list:
|
|
213
|
+
raise NotImplementedError
|
|
214
|
+
|
|
215
|
+
def gate_filter(self, items: list, rows: list) -> list:
|
|
216
|
+
"""The failing cells worth a gate run, given every row of the run (all machines'): a
|
|
217
|
+
campaign whose evidence needs more than the gate (hecbench: a witness family) drops
|
|
218
|
+
the cells that cannot become evidence."""
|
|
219
|
+
return items
|
|
220
|
+
|
|
221
|
+
def is_sealed(self, programs: list) -> bool:
|
|
222
|
+
"""Whether a run of these programs is a sealed set's (its results are read by its scorer
|
|
223
|
+
only): by its content, never by its name. Default: no campaign has sealed runs."""
|
|
224
|
+
return False
|
|
225
|
+
|
|
226
|
+
def bind_run(self, run_dir, programs: list) -> None:
|
|
227
|
+
"""Attach what the run directory holds to its programs (hecbench: the
|
|
228
|
+
pre-run's serial host reference)."""
|
|
229
|
+
|
|
230
|
+
# -- programs --
|
|
231
|
+
def programs(self, seed: int = 0, n: int = 0, **opts) -> list:
|
|
232
|
+
raise NotImplementedError
|
|
233
|
+
|
|
234
|
+
def expected(self, p) -> dict:
|
|
235
|
+
return dict(p.expected)
|
|
236
|
+
|
|
237
|
+
def legality(self, p) -> str:
|
|
238
|
+
return p.legality
|
|
239
|
+
|
|
240
|
+
def spec_rows(self, p) -> list:
|
|
241
|
+
return [dict(r) if isinstance(r, dict) else dict(r) for r in p.cites]
|
|
242
|
+
|
|
243
|
+
def record(self, p) -> dict:
|
|
244
|
+
"""The programs.jsonl row of a program (the generic layer adds
|
|
245
|
+
``sha``)."""
|
|
246
|
+
return {"id": p.id, "lang": p.lang, "model": p.model,
|
|
247
|
+
"version": p.version, "legality": self.legality(p),
|
|
248
|
+
"why": p.why, "expected": self.expected(p),
|
|
249
|
+
"cites": self.spec_rows(p), "title": getattr(p, "title", "")}
|
|
250
|
+
|
|
251
|
+
def harness(self, p):
|
|
252
|
+
return p.harness()
|
|
253
|
+
|
|
254
|
+
def ext(self, p) -> str:
|
|
255
|
+
return "c" if p.lang == "c" else "f90"
|
|
256
|
+
|
|
257
|
+
def modes_of(self, p) -> tuple:
|
|
258
|
+
"""The memory modes (``copy``, ``unified``) the program's expected
|
|
259
|
+
values hold in."""
|
|
260
|
+
return tuple(getattr(p, "modes", ("copy", "unified")))
|
|
261
|
+
|
|
262
|
+
def gated(self, p) -> bool:
|
|
263
|
+
"""Whether a failure of the program is a candidate finding (gated
|
|
264
|
+
and confirmed) rather than an observation."""
|
|
265
|
+
return self.legality(p) == "defined"
|
|
266
|
+
|
|
267
|
+
def unknown_why(self, p) -> str:
|
|
268
|
+
"""The confirmer's reason for an ungated program's cell."""
|
|
269
|
+
return f"{self.legality(p)}: {p.why}"[:300]
|
|
270
|
+
|
|
271
|
+
def parse_observed(self, stdout: str) -> dict:
|
|
272
|
+
return {m.group(1): int(m.group(2)) for m in
|
|
273
|
+
re.finditer(r"^(\w+)= (-?\d+)\s*$", stdout or "", re.M)}
|
|
274
|
+
|
|
275
|
+
# -- rows --
|
|
276
|
+
def row_tags(self, p) -> dict:
|
|
277
|
+
"""What the campaign adds to every result row of the program."""
|
|
278
|
+
return {"lang": p.lang, "model": p.model, "legality": self.legality(p)}
|
|
279
|
+
|
|
280
|
+
def gate_tags(self, r: dict) -> dict:
|
|
281
|
+
"""What the campaign adds to a gate item made from result row `r`."""
|
|
282
|
+
return {}
|
|
283
|
+
|
|
284
|
+
# -- report --
|
|
285
|
+
def short_id(self, p) -> str:
|
|
286
|
+
return p.id
|
|
287
|
+
|
|
288
|
+
def mark(self, p) -> str:
|
|
289
|
+
"""The matrix's label column: nothing for a defined program."""
|
|
290
|
+
return {"defined": "", "pending": "P", "unspecified": "U",
|
|
291
|
+
"illegal": "N"}.get(self.legality(p), "?")
|
|
292
|
+
|
|
293
|
+
def facets(self, p) -> set:
|
|
294
|
+
"""The ``axis=value`` items a failure cluster's members may share
|
|
295
|
+
(``clusters``); by default the program's family and variant."""
|
|
296
|
+
return {f"{k}={getattr(p, k)}" for k in ("family", "variant")
|
|
297
|
+
if getattr(p, k, None) is not None}
|
|
298
|
+
|
|
299
|
+
# -- derived --
|
|
300
|
+
@property
|
|
301
|
+
def gate_kind(self) -> str:
|
|
302
|
+
return self.kind or self.name
|
|
303
|
+
|
|
304
|
+
@property
|
|
305
|
+
def gate_prefix(self) -> str:
|
|
306
|
+
return self.prefix or f"{self.gate_kind}_"
|
|
307
|
+
|
|
308
|
+
def cell(self, pid: str, toolchain: str, xnack) -> str:
|
|
309
|
+
return f"{self.gate_kind}|{pid}|{toolchain}|{xnack}"
|
|
310
|
+
|
|
311
|
+
def check(self) -> list[str]:
|
|
312
|
+
out = self.caps.check()
|
|
313
|
+
if not self.name:
|
|
314
|
+
out.append("no name")
|
|
315
|
+
if not set(self.labels) <= set(LABELS):
|
|
316
|
+
out.append(f"labels not among {LABELS}: {self.labels}")
|
|
317
|
+
return out
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
# --- the registry ---------------------------------------------------------------------
|
|
321
|
+
|
|
322
|
+
# campaign name -> the module that defines and registers it (one line per
|
|
323
|
+
# campaign: the registry entry of docs/tooling/contributing.md, "Add a campaign")
|
|
324
|
+
MODULES: dict[str, str] = {
|
|
325
|
+
"nested": "offload.engine.campaigns.nested",
|
|
326
|
+
"oop": "offload.engine.campaigns.oop",
|
|
327
|
+
"hecbench": "offload.engine.campaigns.hecbench",
|
|
328
|
+
}
|
|
329
|
+
_REGISTERED: dict[str, Campaign] = {}
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def register(camp: Campaign) -> Campaign:
|
|
333
|
+
"""Register a campaign (a module does this at import): its gate kind
|
|
334
|
+
is declared to offload.engine.gate (register_kind, VALUE_KINDS,
|
|
335
|
+
COMPILE_LIMIT_S); its declarations are checked."""
|
|
336
|
+
from offload.engine import gate as GT
|
|
337
|
+
problems = camp.check()
|
|
338
|
+
if problems:
|
|
339
|
+
raise ValueError(f"campaign {camp.name or '?'}: " + "; ".join(problems))
|
|
340
|
+
new_kind = camp.gate_kind not in GT.KINDS
|
|
341
|
+
GT.register_kind(camp.gate_kind, camp.gate_prefix, camp.signature)
|
|
342
|
+
if camp.printed_values and camp.gate_kind not in GT.VALUE_KINDS:
|
|
343
|
+
GT.VALUE_KINDS = (*GT.VALUE_KINDS, camp.gate_kind)
|
|
344
|
+
GT.COMPILE_LIMIT_S.setdefault(camp.gate_kind, camp.compile_limit_s)
|
|
345
|
+
if new_kind:
|
|
346
|
+
_ADDED_KINDS[camp.name] = camp.gate_kind
|
|
347
|
+
old = _REGISTERED.get(camp.name)
|
|
348
|
+
if old is not None and (type(old).__module__, type(old).__name__) != \
|
|
349
|
+
(type(camp).__module__, type(camp).__name__):
|
|
350
|
+
raise ValueError(f"campaign {camp.name} is registered twice "
|
|
351
|
+
f"({type(old).__module__} and {type(camp).__module__})")
|
|
352
|
+
_REGISTERED[camp.name] = camp
|
|
353
|
+
return camp
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def get(name: str) -> Campaign:
|
|
357
|
+
"""The registered campaign `name` (its module imported on demand)."""
|
|
358
|
+
if name not in _REGISTERED:
|
|
359
|
+
mod = MODULES.get(name)
|
|
360
|
+
if mod is None:
|
|
361
|
+
raise KeyError(f"unknown campaign {name!r}: one of "
|
|
362
|
+
f"{', '.join(names())} (offload.engine.campaign.MODULES)")
|
|
363
|
+
m = importlib.import_module(mod)
|
|
364
|
+
if name not in _REGISTERED: # imported before and unregistered since
|
|
365
|
+
importlib.reload(m)
|
|
366
|
+
if name not in _REGISTERED:
|
|
367
|
+
raise KeyError(f"{mod} registers no campaign named {name!r}")
|
|
368
|
+
return _REGISTERED[name]
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def names() -> tuple[str, ...]:
|
|
372
|
+
return tuple(dict.fromkeys([*MODULES, *_REGISTERED]))
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def unregister(name: str) -> None:
|
|
376
|
+
"""Forget a campaign registered by a test, and the gate kind it added."""
|
|
377
|
+
from offload.engine import gate as GT
|
|
378
|
+
_REGISTERED.pop(name, None)
|
|
379
|
+
if name not in _BUILTIN:
|
|
380
|
+
MODULES.pop(name, None)
|
|
381
|
+
kind = _ADDED_KINDS.pop(name, None)
|
|
382
|
+
if kind is not None:
|
|
383
|
+
GT.KINDS.pop(kind, None)
|
|
384
|
+
GT.COMPILE_LIMIT_S.pop(kind, None)
|
|
385
|
+
GT.VALUE_KINDS = tuple(k for k in GT.VALUE_KINDS if k != kind)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
_BUILTIN = frozenset(MODULES)
|
|
389
|
+
_ADDED_KINDS: dict[str, str] = {}
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
# --- runners --------------------------------------------------------------------------
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def _fe(ok, why: str, not_a_verdict: re.Pattern):
|
|
396
|
+
"""A front end's verdict: None (no verdict) when it rejected the program
|
|
397
|
+
for a feature it lacks."""
|
|
398
|
+
if ok is None:
|
|
399
|
+
return None
|
|
400
|
+
if ok:
|
|
401
|
+
return True
|
|
402
|
+
return None if not_a_verdict.search(why or "") else False
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
class HarnessRunner:
|
|
406
|
+
"""The real runner: offload.engine.prerun (the rules and AFAR's front end:
|
|
407
|
+
a Tuolumne compute node), offload.engine.confirm.witness (the independent
|
|
408
|
+
checker, on its machine inside the cap), offload.engine.harness.run_program
|
|
409
|
+
(this node's toolchains) and offload.engine.gate_run.rerun_program (the
|
|
410
|
+
gate's environments). Nothing here runs on a login node."""
|
|
411
|
+
parallel = "process" # prerun and run may fork
|
|
412
|
+
|
|
413
|
+
def __init__(self, camp: Campaign):
|
|
414
|
+
self.camp = camp
|
|
415
|
+
|
|
416
|
+
def prerun(self, p) -> dict:
|
|
417
|
+
from offload.engine import prerun
|
|
418
|
+
r_ok, r_why = prerun.rules_witness(p)
|
|
419
|
+
f_ok, f_why = prerun.frontend_witness(p, timeout_s=self.camp.fe_timeout_s)
|
|
420
|
+
why = list(r_why) + [w for w in f_why if f_ok is not True]
|
|
421
|
+
if r_ok is not None and f_ok is not None and r_ok != f_ok:
|
|
422
|
+
why.append("witnesses disagree: legality review")
|
|
423
|
+
return {"id": p.id, "ok": bool(r_ok and f_ok), "reasons": why,
|
|
424
|
+
"rules": r_ok, "rules_why": r_why, "afar_fe": f_ok,
|
|
425
|
+
"afar_why": f_why}
|
|
426
|
+
|
|
427
|
+
def witness(self, p) -> dict:
|
|
428
|
+
from offload.engine.confirm import witness as W
|
|
429
|
+
sha = sha256(p.source)
|
|
430
|
+
try:
|
|
431
|
+
return W.check(p.id, p.source, p.lang, sha, model=p.model)
|
|
432
|
+
except Exception as e: # ssh or checker trouble: no verdict
|
|
433
|
+
return {"program": p.id, "sha256": sha, "result": "error",
|
|
434
|
+
"message": f"{type(e).__name__}: {e}"[:300]}
|
|
435
|
+
|
|
436
|
+
def _tc(self, toolchain: str, version: int, lang: str):
|
|
437
|
+
from offload.engine import run_matrix
|
|
438
|
+
from offload.engine.toolchains import TOOLCHAINS
|
|
439
|
+
return run_matrix.for_version(TOOLCHAINS[toolchain], version, lang)
|
|
440
|
+
|
|
441
|
+
def run(self, prog, toolchain: str, xnack: int, *, version: int,
|
|
442
|
+
timeout_s: int, opt: str = "-O2") -> dict:
|
|
443
|
+
from offload.engine import harness
|
|
444
|
+
tc = self._tc(toolchain, version, prog.lang)
|
|
445
|
+
r = harness.run_program(prog, tc, xnack, opt, timeout_s=timeout_s,
|
|
446
|
+
repeats=3)
|
|
447
|
+
return dataclasses.asdict(r)
|
|
448
|
+
|
|
449
|
+
def rerun(self, prog, toolchain: str, xnack: int, env: dict, *,
|
|
450
|
+
version: int, timeout_s: int, opt: str = "-O2") -> dict:
|
|
451
|
+
from offload.engine import gate_run as GR
|
|
452
|
+
tc = self._tc(toolchain, version, prog.lang)
|
|
453
|
+
rr = GR.rerun_program(prog, tc, xnack, env, opt, timeout_s=timeout_s,
|
|
454
|
+
compile_timeout_s=self.camp.compile_limit_s)
|
|
455
|
+
if os.environ.get("COMPLIANT_RUN_SLOTS"): # wingtip: (c) is another GPU
|
|
456
|
+
rr["node"] = f"{rr.get('node', '')}:gpu" \
|
|
457
|
+
f"{os.environ.get('CUDA_VISIBLE_DEVICES', 'all')}"
|
|
458
|
+
return rr
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
# --- the generic steps over one campaign run -------------------------------------------
|
|
462
|
+
|
|
463
|
+
_META_KEYS = ("gate_budget_s",) # meta.json keys that are not draw options
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
def _prerun_task(args):
|
|
467
|
+
"""A pre-run check in a worker process (the process pool pickles the
|
|
468
|
+
arguments, not the campaign)."""
|
|
469
|
+
camp_name, d, label, pid = args
|
|
470
|
+
run = Run(get(camp_name), Path(d), label)
|
|
471
|
+
p = run.programs({pid})[0]
|
|
472
|
+
return run.camp.make_runner().prerun(p)
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
class Run:
|
|
476
|
+
"""One run of a campaign: its directory and the steps over it."""
|
|
477
|
+
|
|
478
|
+
def __init__(self, camp: Campaign, d: Path, label: str = "",
|
|
479
|
+
cache: dict | None = None):
|
|
480
|
+
self.camp = camp
|
|
481
|
+
self.d = Path(d)
|
|
482
|
+
self.label = label or str(self.d)
|
|
483
|
+
self._cache = cache if cache is not None else {}
|
|
484
|
+
|
|
485
|
+
@property
|
|
486
|
+
def sealed(self) -> bool:
|
|
487
|
+
"""The run holds a sealed set's programs (``Campaign.is_sealed``), or carries a name in
|
|
488
|
+
``Campaign.sealed_runs``: no step logs a count of its failures or refusals."""
|
|
489
|
+
if self.d.name in self.camp.sealed_runs:
|
|
490
|
+
return True
|
|
491
|
+
try:
|
|
492
|
+
return self.camp.is_sealed(self.programs())
|
|
493
|
+
except (OSError, ValueError):
|
|
494
|
+
return False
|
|
495
|
+
|
|
496
|
+
# -- programs --
|
|
497
|
+
def meta(self) -> dict:
|
|
498
|
+
try:
|
|
499
|
+
return json.loads((self.d / "meta.json").read_text())
|
|
500
|
+
except FileNotFoundError:
|
|
501
|
+
return {}
|
|
502
|
+
|
|
503
|
+
def draw(self, meta: dict, fresh: bool = False) -> list:
|
|
504
|
+
if self.camp.stored_programs and not fresh:
|
|
505
|
+
rows = read_jsonl(self.d / "programs.jsonl")
|
|
506
|
+
if rows:
|
|
507
|
+
return self.camp.programs_from_records(rows)
|
|
508
|
+
opts ={k: meta[k] for k in self.camp.caps.draw_options if k in meta}
|
|
509
|
+
return self.camp.programs(meta.get("seed", 0), meta.get("n", 0), **opts)
|
|
510
|
+
|
|
511
|
+
def programs(self, ids=None) -> list:
|
|
512
|
+
"""The run's programs: the draw regenerated from meta.json and
|
|
513
|
+
checked against programs.jsonl's hashes."""
|
|
514
|
+
key = str(self.d)
|
|
515
|
+
if key not in self._cache:
|
|
516
|
+
ps = self.draw(self.meta())
|
|
517
|
+
stored = {r["id"]: r["sha"] for r in
|
|
518
|
+
read_jsonl(self.d / "programs.jsonl")}
|
|
519
|
+
for p in ps:
|
|
520
|
+
sha = sha256(p.source)
|
|
521
|
+
if stored.get(p.id, sha) != sha:
|
|
522
|
+
raise SystemExit(f"{p.id}: the generator changed since "
|
|
523
|
+
f"`gen` (sha differs)")
|
|
524
|
+
self.camp.bind_run(self.d, ps)
|
|
525
|
+
self._cache[key] = ps
|
|
526
|
+
return [p for p in self._cache[key] if not ids or p.id in ids]
|
|
527
|
+
|
|
528
|
+
def gen(self, seed: int, n: int, **opts) -> int:
|
|
529
|
+
"""Draw the programs and write meta.json, programs.jsonl and src/."""
|
|
530
|
+
bad = set(opts) - set(self.camp.caps.draw_options)
|
|
531
|
+
if bad:
|
|
532
|
+
raise ValueError(f"{self.camp.name}: unknown draw options "
|
|
533
|
+
f"{sorted(bad)} (declared: "
|
|
534
|
+
f"{self.camp.caps.draw_options})")
|
|
535
|
+
(self.d / "src").mkdir(parents=True, exist_ok=True)
|
|
536
|
+
meta = {"n": n, "seed": seed, **opts}
|
|
537
|
+
if not self.camp.hand_listed:
|
|
538
|
+
(self.d / "meta.json").write_text(json.dumps(meta))
|
|
539
|
+
self._cache.pop(str(self.d), None)
|
|
540
|
+
ps = self.draw(meta, fresh=True) # a new draw, not the stored programs
|
|
541
|
+
rows = []
|
|
542
|
+
for p in ps:
|
|
543
|
+
(self.d / "src" / self.camp.src_name(p)).write_text(p.source)
|
|
544
|
+
rows.append({**self.camp.record(p), "sha": sha256(p.source)})
|
|
545
|
+
(self.d / "programs.jsonl").write_text(
|
|
546
|
+
"".join(json.dumps(r, sort_keys=True) + "\n" for r in rows))
|
|
547
|
+
return len(rows)
|
|
548
|
+
|
|
549
|
+
# -- legality --
|
|
550
|
+
def prerun(self, runner=None, workers: int = 8, log=print) -> dict:
|
|
551
|
+
"""offload.engine.prerun's two witnesses over every program (resumable);
|
|
552
|
+
returns the rows by id."""
|
|
553
|
+
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, \
|
|
554
|
+
as_completed
|
|
555
|
+
out = self.d / "prerun.jsonl"
|
|
556
|
+
done = {r["id"] for r in read_jsonl(out)}
|
|
557
|
+
todo = [p for p in self.programs() if p.id not in done]
|
|
558
|
+
if runner is None or getattr(runner, "parallel", "") == "process":
|
|
559
|
+
with ProcessPoolExecutor(max_workers=workers) as pool:
|
|
560
|
+
futs = [pool.submit(_prerun_task, (self.camp.name, str(self.d),
|
|
561
|
+
self.label, p.id))
|
|
562
|
+
for p in todo]
|
|
563
|
+
for f in as_completed(futs):
|
|
564
|
+
append_jsonl(out, [f.result()])
|
|
565
|
+
else:
|
|
566
|
+
with ThreadPoolExecutor(max_workers=workers) as pool:
|
|
567
|
+
for r in pool.map(runner.prerun, todo):
|
|
568
|
+
append_jsonl(out, [r])
|
|
569
|
+
self._cache.pop(str(self.d), None) # the programs bind the new rows (bind_run)
|
|
570
|
+
rows = {r["id"]: r for r in read_jsonl(out)}
|
|
571
|
+
if self.sealed:
|
|
572
|
+
log("prerun done") # no count of refused programs for a sealed run
|
|
573
|
+
return rows
|
|
574
|
+
for r in rows.values():
|
|
575
|
+
if not r["ok"]:
|
|
576
|
+
log("refused", r["id"], "; ".join(r["reasons"])[:300])
|
|
577
|
+
log(f"{len(rows)} checked, {sum(1 for r in rows.values() if not r['ok'])} refused")
|
|
578
|
+
return rows
|
|
579
|
+
|
|
580
|
+
def witness(self, runner=None, workers: int = 4, log=print) -> dict:
|
|
581
|
+
"""The independent checker's compile-only verdict per program
|
|
582
|
+
(catalog/machines.yaml independent_checkers; over ssh inside the
|
|
583
|
+
cap), at most 4 at once (the wingtip compile limit); resumable."""
|
|
584
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
585
|
+
runner = runner or self.camp.make_runner()
|
|
586
|
+
out = self.d / "witness.jsonl"
|
|
587
|
+
done = {r["program"] for r in read_jsonl(out) if r.get("result") != "error"}
|
|
588
|
+
todo = [p for p in self.programs() if p.id not in done]
|
|
589
|
+
with ThreadPoolExecutor(max_workers=min(workers, 4)) as pool:
|
|
590
|
+
for r in pool.map(runner.witness, todo):
|
|
591
|
+
append_jsonl(out, [r])
|
|
592
|
+
log(r["program"], r["result"], r.get("message", "")[:120])
|
|
593
|
+
return {r["program"]: r for r in read_jsonl(out)}
|
|
594
|
+
|
|
595
|
+
def legality_table(self) -> dict:
|
|
596
|
+
"""program id -> {rules, afar_fe, nvhpc_fe, cce_fe, legality,
|
|
597
|
+
legal_for: {family: bool}, prerun, nvhpc_message}: a program is
|
|
598
|
+
legal for a compiler family when the rules accept it, a front end
|
|
599
|
+
of another family accepts it and none of another family rejects it
|
|
600
|
+
with a diagnostic (a rejection that names a missing feature is no
|
|
601
|
+
verdict). The front ends: the pre-run's (AFAR), the independent
|
|
602
|
+
checker's (NVHPC, witness.jsonl) and CCE's (any CCE row that
|
|
603
|
+
compiled). A family under test only (GCC) never witnesses."""
|
|
604
|
+
from offload.engine.toolchains import registry
|
|
605
|
+
reg = registry()
|
|
606
|
+
nav = self.camp.not_a_verdict
|
|
607
|
+
pre = {r["id"]: r for r in read_jsonl(self.d / "prerun.jsonl")}
|
|
608
|
+
wit = {r["program"]: r for r in read_jsonl(self.d / "witness.jsonl")}
|
|
609
|
+
cce: dict = {}
|
|
610
|
+
for r in self.rows():
|
|
611
|
+
tc = reg.toolchains.get(r["toolchain"])
|
|
612
|
+
if tc is None or tc.family_id != "cce":
|
|
613
|
+
continue
|
|
614
|
+
# a link failure comes after the front end accepted it; a
|
|
615
|
+
# diagnostic is a rejection unless it names a missing feature;
|
|
616
|
+
# any compile wins
|
|
617
|
+
reason = str(r.get("reason", ""))
|
|
618
|
+
pid = r["program_id"]
|
|
619
|
+
if r["outcome"] not in ("rejected", "harness_error") or \
|
|
620
|
+
reason.startswith("link_undefined"):
|
|
621
|
+
cce[pid] = True
|
|
622
|
+
elif r["outcome"] == "rejected" and reason.startswith("diagnostic") \
|
|
623
|
+
and not nav.search(reason) and cce.get(pid) is not True:
|
|
624
|
+
cce[pid] = False
|
|
625
|
+
else:
|
|
626
|
+
cce.setdefault(pid, None)
|
|
627
|
+
out = {}
|
|
628
|
+
for p in self.programs():
|
|
629
|
+
r = pre.get(p.id) or {}
|
|
630
|
+
rules = r.get("rules")
|
|
631
|
+
afar = _fe(r.get("afar_fe"), "; ".join(r.get("afar_why") or []), nav)
|
|
632
|
+
w = wit.get(p.id, {})
|
|
633
|
+
nv = _fe({"accept": True, "reject": False}.get(w.get("result")),
|
|
634
|
+
w.get("message", ""), nav)
|
|
635
|
+
fe = {"afar": afar, "nvhpc": nv, "cce": cce.get(p.id)}
|
|
636
|
+
legal_for = {}
|
|
637
|
+
for fam in reg.families:
|
|
638
|
+
others = [v for f, v in fe.items() if f != fam and v is not None]
|
|
639
|
+
legal_for[fam] = bool(rules) and any(others) and all(others)
|
|
640
|
+
out[p.id] = {"rules": rules, "afar_fe": afar, "nvhpc_fe": nv,
|
|
641
|
+
"cce_fe": cce.get(p.id), "legality": self.camp.legality(p),
|
|
642
|
+
"legal_for": legal_for,
|
|
643
|
+
"prerun": (r.get("rules_why", []) + r.get("afar_why", []))[:4],
|
|
644
|
+
"nvhpc_message": w.get("message", "")}
|
|
645
|
+
return out
|
|
646
|
+
|
|
647
|
+
def legality(self, log=print) -> dict:
|
|
648
|
+
leg = self.legality_table()
|
|
649
|
+
(self.d / "legality.json").write_text(json.dumps(leg, indent=1, sort_keys=True))
|
|
650
|
+
n_all = sum(1 for r in leg.values() if all(r["legal_for"].values()))
|
|
651
|
+
for pid, r in leg.items():
|
|
652
|
+
if not all(r["legal_for"].values()) or r["legality"] != "defined":
|
|
653
|
+
log(pid, r["legality"], "rules", r["rules"], "afar_fe", r["afar_fe"],
|
|
654
|
+
"nvhpc_fe", r["nvhpc_fe"], "|", r["nvhpc_message"][:100], "|",
|
|
655
|
+
"; ".join(r["prerun"])[:160])
|
|
656
|
+
log(f"{len(leg)} programs; {n_all} legal for every family")
|
|
657
|
+
return leg
|
|
658
|
+
|
|
659
|
+
def prerun_ok(self) -> set:
|
|
660
|
+
"""The programs the rules accept (a front-end refusal is a
|
|
661
|
+
measurement: the run shows which compilers reject them). Without a
|
|
662
|
+
stored pre-run the rules witness runs here (pure Python)."""
|
|
663
|
+
from offload.engine import prerun
|
|
664
|
+
stored = {r["id"]: r.get("rules") for r in read_jsonl(self.d / "prerun.jsonl")}
|
|
665
|
+
ok = set()
|
|
666
|
+
for p in self.programs():
|
|
667
|
+
v = stored.get(p.id)
|
|
668
|
+
if v is None:
|
|
669
|
+
v = prerun.rules_witness(p)[0]
|
|
670
|
+
if v:
|
|
671
|
+
ok.add(p.id)
|
|
672
|
+
return ok
|
|
673
|
+
|
|
674
|
+
# -- runs --
|
|
675
|
+
def rows(self) -> list[dict]:
|
|
676
|
+
"""The run's rows, one per (program, toolchain, row key): the last
|
|
677
|
+
written."""
|
|
678
|
+
last = {}
|
|
679
|
+
for r in read_jsonl(self.d / "rows.jsonl"):
|
|
680
|
+
last[(r["program_id"], r["toolchain"], r["xnack"])] = r
|
|
681
|
+
return list(last.values())
|
|
682
|
+
|
|
683
|
+
def cells(self, progs, toolchains, modes, ok: set) -> list[tuple]:
|
|
684
|
+
"""(program, toolchain, row key) of the runs: a program the rules
|
|
685
|
+
accept, on a toolchain whose family compiles its model and
|
|
686
|
+
language (catalog/toolchains.yaml ``unsupported``), in a mode its
|
|
687
|
+
expected values hold in."""
|
|
688
|
+
from offload.engine.toolchains import TOOLCHAINS
|
|
689
|
+
out = []
|
|
690
|
+
for p in progs:
|
|
691
|
+
if p.id not in ok:
|
|
692
|
+
continue
|
|
693
|
+
for t in toolchains:
|
|
694
|
+
tc = TOOLCHAINS[t]
|
|
695
|
+
if tc.family.why_unsupported(p.model, self.camp.ext(p)):
|
|
696
|
+
continue
|
|
697
|
+
for x in modes:
|
|
698
|
+
if x in tc.xnack_modes and mode_name(x) in self.camp.modes_of(p):
|
|
699
|
+
out.append((p, t, x))
|
|
700
|
+
return out
|
|
701
|
+
|
|
702
|
+
def run_one(self, runner, p, t: str, x: int, timeout_s: int) -> dict:
|
|
703
|
+
t0 = time.time()
|
|
704
|
+
try:
|
|
705
|
+
d = runner.run(self.camp.harness(p), t, x, version=p.version,
|
|
706
|
+
timeout_s=timeout_s, opt=self.camp.opt)
|
|
707
|
+
except Exception as e: # a harness failure, not the program's
|
|
708
|
+
d = {"program_id": p.id, "toolchain": t, "xnack": x,
|
|
709
|
+
"outcome": "harness_error", "reason": f"harness: {e}"[:300]}
|
|
710
|
+
d.update(campaign=self.camp.name, mode=mode_name(x),
|
|
711
|
+
expected=self.camp.expected(p),
|
|
712
|
+
observed=self.camp.parse_observed(d.get("stdout", "")),
|
|
713
|
+
task_s=round(time.time() - t0, 1), **self.camp.row_tags(p))
|
|
714
|
+
d["stdout"] = (d.get("stdout") or "")[-2000:]
|
|
715
|
+
d["stderr"] = (d.get("stderr") or "")[-3000:]
|
|
716
|
+
return d
|
|
717
|
+
|
|
718
|
+
def run(self, machine: str, runner=None, toolchains=None, modes=None,
|
|
719
|
+
ids=None, legal_only: bool = False, workers: int = 8,
|
|
720
|
+
shard: str | None = None, timeout_s: int | None = None,
|
|
721
|
+
limit_s: float = 3000, log=print) -> int:
|
|
722
|
+
"""Compile and run the programs on the machine's toolchains through
|
|
723
|
+
the harness, resumable (a cell with a row is not run again), in a
|
|
724
|
+
fixed shuffled order (a run cut short covers every axis), bounded
|
|
725
|
+
by `limit_s`; ``shard`` ``k/m`` takes every m-th remaining cell."""
|
|
726
|
+
import random
|
|
727
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
728
|
+
runner = runner or self.camp.make_runner()
|
|
729
|
+
ok = self.prerun_ok()
|
|
730
|
+
if not ok:
|
|
731
|
+
log("no program has a rules verdict: run `prerun` first")
|
|
732
|
+
return 2
|
|
733
|
+
tcs = list(toolchains) if toolchains else list(self.camp.caps.toolchains(machine))
|
|
734
|
+
modes = list(modes) if modes else list(self.camp.caps.modes(machine))
|
|
735
|
+
out = self.d / "rows.jsonl"
|
|
736
|
+
done = {(r["program_id"], r["toolchain"], r["xnack"]) for r in read_jsonl(out)}
|
|
737
|
+
progs = self.programs(set(ids) if ids else None)
|
|
738
|
+
if legal_only:
|
|
739
|
+
progs = [p for p in progs if self.camp.gated(p)]
|
|
740
|
+
timeout_s = timeout_s or self.camp.timeout_s
|
|
741
|
+
jobs = [(p, t, x) for p, t, x in self.cells(progs, tcs, modes, ok)
|
|
742
|
+
if (p.id, t, x) not in done]
|
|
743
|
+
random.Random(7).shuffle(jobs)
|
|
744
|
+
if shard:
|
|
745
|
+
k, m = (int(v) for v in shard.split("/"))
|
|
746
|
+
jobs = jobs[k::m]
|
|
747
|
+
if not self.sealed:
|
|
748
|
+
log(f"{len(jobs)} runs to do ({len(done)} done)")
|
|
749
|
+
end = time.time() + limit_s
|
|
750
|
+
with ThreadPoolExecutor(max_workers=workers) as pool:
|
|
751
|
+
futs = [pool.submit(lambda j=j: None if time.time() > end
|
|
752
|
+
else self.run_one(runner, *j, timeout_s))
|
|
753
|
+
for j in jobs]
|
|
754
|
+
for f in as_completed(futs):
|
|
755
|
+
r = f.result()
|
|
756
|
+
if r is not None:
|
|
757
|
+
append_jsonl(out, [r])
|
|
758
|
+
log("done")
|
|
759
|
+
return 0
|
|
760
|
+
|
|
761
|
+
# -- the reproduction gate --
|
|
762
|
+
def gate_items(self, machine: str | None = None) -> list[dict]:
|
|
763
|
+
"""The failing rows of gated programs as gate items (one machine,
|
|
764
|
+
or all)."""
|
|
765
|
+
from offload.engine.gate_stored import machine_of
|
|
766
|
+
byid = {p.id: p for p in self.programs()}
|
|
767
|
+
out = []
|
|
768
|
+
for r in self.rows():
|
|
769
|
+
if r["outcome"] in FAILING_OK or r["outcome"] == "harness_error":
|
|
770
|
+
continue
|
|
771
|
+
p = byid.get(r["program_id"])
|
|
772
|
+
if p is None or not self.camp.gated(p):
|
|
773
|
+
continue # observations are not gated
|
|
774
|
+
m = machine_of(r["toolchain"])
|
|
775
|
+
if machine and m != machine:
|
|
776
|
+
continue
|
|
777
|
+
out.append({**{k: r.get(k) for k in (
|
|
778
|
+
"outcome", "reason", "flaky", "build_dir", "node",
|
|
779
|
+
"toolchain_build", "toolchain", "xnack", "mode")},
|
|
780
|
+
"campaign": self.camp.name, "kind": self.camp.gate_kind,
|
|
781
|
+
"machine": m, "ident": r["program_id"], "opt": self.camp.opt,
|
|
782
|
+
"timeout_s": self.camp.timeout_s,
|
|
783
|
+
"stdout": r.get("stdout") or "",
|
|
784
|
+
"compile_log": (r.get("stderr") or "")[-3000:],
|
|
785
|
+
"cell": self.camp.cell(r["program_id"], r["toolchain"], r["xnack"]),
|
|
786
|
+
**self.camp.gate_tags(r)})
|
|
787
|
+
only = self.d / "gate_only.json" # a run that gates a chosen set of cells (hecbench t120):
|
|
788
|
+
if only.is_file(): # the list decides, with the witnesses of another run's rows
|
|
789
|
+
keep = set(json.loads(only.read_text()))
|
|
790
|
+
return [it for it in out if it["cell"] in keep]
|
|
791
|
+
return self.camp.gate_filter(out, self.rows())
|
|
792
|
+
|
|
793
|
+
def gate_budget(self) -> float | None:
|
|
794
|
+
"""The gate's budget (summed rerun seconds), kept in meta.json so
|
|
795
|
+
every later command plans the same sample; None: every failing row."""
|
|
796
|
+
return self.meta().get("gate_budget_s")
|
|
797
|
+
|
|
798
|
+
def set_gate_budget(self, budget_s: float) -> None:
|
|
799
|
+
meta = self.meta()
|
|
800
|
+
meta["gate_budget_s"] = budget_s
|
|
801
|
+
(self.d / "meta.json").write_text(json.dumps(meta))
|
|
802
|
+
|
|
803
|
+
def gate_plan(self, items: list[dict] | None = None) -> dict:
|
|
804
|
+
from offload.engine import gate as GT
|
|
805
|
+
items = self.gate_items() if items is None else items
|
|
806
|
+
total = sum(len(GT.ENVS) * GT.cost_s(it) for it in items) + 1
|
|
807
|
+
return GT.plan(items, budget_s=self.gate_budget() or total)
|
|
808
|
+
|
|
809
|
+
@staticmethod
|
|
810
|
+
def node_share(items: list[dict], mode: str | None, here: str,
|
|
811
|
+
stored_on: str | None = None) -> list[dict]:
|
|
812
|
+
"""The rows this gate job takes by the node they were stored on:
|
|
813
|
+
"same" (a, b, d in place), "other" ((c)), "any" or None (no
|
|
814
|
+
placement), narrowed to the rows stored on the comma-separated
|
|
815
|
+
nodes `stored_on`."""
|
|
816
|
+
if mode == "same":
|
|
817
|
+
items = [it for it in items if it.get("node") == here]
|
|
818
|
+
elif mode == "other":
|
|
819
|
+
items = [it for it in items if it.get("node") != here]
|
|
820
|
+
if stored_on:
|
|
821
|
+
keep = set(stored_on.split(","))
|
|
822
|
+
items = [it for it in items if it.get("node") in keep]
|
|
823
|
+
return items
|
|
824
|
+
|
|
825
|
+
def gate(self, machine: str, runner=None, envs: str = "a,b,c,d",
|
|
826
|
+
node: str | None = None, stored_on: str | None = None,
|
|
827
|
+
shard: str | None = None, root: str | None = None,
|
|
828
|
+
workers: int = 8, timeout_s: int | None = None,
|
|
829
|
+
budget_s: float | None = None, log=print) -> int:
|
|
830
|
+
"""Rerun this machine's share of the planned failing rows in the
|
|
831
|
+
gate's environments (offload.engine.gate.environments, gate_run);
|
|
832
|
+
resumable per (cell, environment)."""
|
|
833
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
834
|
+
from offload.engine import gate as GT
|
|
835
|
+
runner = runner or self.camp.make_runner()
|
|
836
|
+
byid = {p.id: p for p in self.programs()}
|
|
837
|
+
if budget_s:
|
|
838
|
+
self.set_gate_budget(budget_s)
|
|
839
|
+
# the plan covers every machine's rows (as `verdicts` plans them);
|
|
840
|
+
# this run takes its machine's share
|
|
841
|
+
planned = self.gate_plan()
|
|
842
|
+
items = [r for r in planned["rows"] if r["machine"] == machine
|
|
843
|
+
and r["sample"] in ("all", "new", "runtime", "sampled")]
|
|
844
|
+
if node or stored_on:
|
|
845
|
+
from offload.engine.provenance import node as here
|
|
846
|
+
items = self.node_share(items, node, here(), stored_on)
|
|
847
|
+
if shard:
|
|
848
|
+
k, m = (int(v) for v in shard.split("/"))
|
|
849
|
+
items = items[k::m]
|
|
850
|
+
out = self.d / "gate_reruns.jsonl"
|
|
851
|
+
done = {(r["cell"], r["env"]) for r in read_jsonl(out)}
|
|
852
|
+
want = envs.split(",")
|
|
853
|
+
jobs = []
|
|
854
|
+
for it in items:
|
|
855
|
+
es = [e for e in GT.environments(it, root or None)
|
|
856
|
+
if e["env"] in want and (it["cell"], e["env"]) not in done]
|
|
857
|
+
if es:
|
|
858
|
+
jobs.append((it, es))
|
|
859
|
+
if not self.sealed: # a sealed run's gate logs no count of failing rows
|
|
860
|
+
log(f"{len(planned['rows'])} failing rows, {len(items)} here, "
|
|
861
|
+
f"{sum(len(j[1]) for j in jobs)} reruns")
|
|
862
|
+
timeout_s = timeout_s or self.camp.timeout_s
|
|
863
|
+
|
|
864
|
+
def one(job):
|
|
865
|
+
it, es = job
|
|
866
|
+
p = byid[it["ident"]]
|
|
867
|
+
for e in es:
|
|
868
|
+
rr = runner.rerun(self.camp.harness(p), it["toolchain"],
|
|
869
|
+
int(it["xnack"]), e, version=p.version,
|
|
870
|
+
timeout_s=timeout_s, opt=self.camp.opt)
|
|
871
|
+
append_jsonl(out, [{**rr, "cell": it["cell"]}])
|
|
872
|
+
with ThreadPoolExecutor(max_workers=workers) as pool:
|
|
873
|
+
list(pool.map(one, jobs))
|
|
874
|
+
return 0
|
|
875
|
+
|
|
876
|
+
def verdicts(self) -> dict:
|
|
877
|
+
"""cell -> the gate's judgement (offload.engine.gate.judge, inherit)
|
|
878
|
+
with the planned item."""
|
|
879
|
+
from offload.engine import gate as GT
|
|
880
|
+
reruns = defaultdict(list)
|
|
881
|
+
for r in read_jsonl(self.d / "gate_reruns.jsonl"):
|
|
882
|
+
reruns[r["cell"]].append(r)
|
|
883
|
+
planned = self.gate_plan()["rows"]
|
|
884
|
+
judged = {}
|
|
885
|
+
for it in planned:
|
|
886
|
+
try:
|
|
887
|
+
judged[it["cell"]] = GT.judge(it, reruns[it["cell"]])
|
|
888
|
+
except ValueError:
|
|
889
|
+
pass
|
|
890
|
+
final = GT.inherit(planned, {c: j["verdict"] for c, j in judged.items()})
|
|
891
|
+
out = {}
|
|
892
|
+
for it in planned:
|
|
893
|
+
c = it["cell"]
|
|
894
|
+
f = final.get(c, {"verdict": "unchecked", "inherited": False})
|
|
895
|
+
rec = {**judged.get(c, {}), **f, "item": it}
|
|
896
|
+
rec["own"] = c in judged and not f.get("inherited") and \
|
|
897
|
+
f["verdict"] == judged[c]["verdict"]
|
|
898
|
+
out[c] = rec
|
|
899
|
+
return out
|
|
900
|
+
|
|
901
|
+
# -- report --
|
|
902
|
+
def cls(self, r: dict) -> str:
|
|
903
|
+
"""The outcome class of a row (offload.engine.gate.observe)."""
|
|
904
|
+
from offload.engine import gate as GT
|
|
905
|
+
return GT.observe({**r, "kind": self.camp.gate_kind})[0]
|
|
906
|
+
|
|
907
|
+
def summary(self) -> dict:
|
|
908
|
+
ps = {p.id: p for p in self.programs()}
|
|
909
|
+
rs = self.rows()
|
|
910
|
+
by_tc = defaultdict(Counter)
|
|
911
|
+
for r in rs:
|
|
912
|
+
p = ps.get(r["program_id"])
|
|
913
|
+
if p is None or not self.camp.gated(p):
|
|
914
|
+
continue
|
|
915
|
+
by_tc[(r["toolchain"], mode_name(r["xnack"]))][self.cls(r)] += 1
|
|
916
|
+
v = self.verdicts()
|
|
917
|
+
return {"rows": len(rs),
|
|
918
|
+
"by_toolchain": {f"{t}|{m}": dict(c) for (t, m), c in by_tc.items()},
|
|
919
|
+
"gate": dict(Counter(x["verdict"] for x in v.values()))}
|
|
920
|
+
|
|
921
|
+
def matrix(self) -> str:
|
|
922
|
+
"""Markdown: one row per program, one column per toolchain and
|
|
923
|
+
mode (ok, WA, rej, ICE, crash, run, TO, host, ign, harn; ``*``
|
|
924
|
+
marks a cell the gate confirmed, ``?`` one it did not)."""
|
|
925
|
+
v = self.verdicts()
|
|
926
|
+
rs = self.rows()
|
|
927
|
+
order = toolchain_order()
|
|
928
|
+
cols = sorted({(r["toolchain"], mode_name(r["xnack"])) for r in rs},
|
|
929
|
+
key=lambda c: (order.get(c[0], 99), c[1] != "copy"))
|
|
930
|
+
cell = {}
|
|
931
|
+
for r in rs:
|
|
932
|
+
c = SHORT.get(self.cls(r), self.cls(r))
|
|
933
|
+
if c != "ok":
|
|
934
|
+
g = v.get(self.camp.cell(r["program_id"], r["toolchain"],
|
|
935
|
+
r["xnack"]), {}).get("verdict")
|
|
936
|
+
c += "*" if g == "confirmed" else "?" if g else ""
|
|
937
|
+
cell[(r["program_id"], r["toolchain"], mode_name(r["xnack"]))] = c
|
|
938
|
+
head = ["program", "spec"] + [f"{t} {m[0]}" for t, m in cols]
|
|
939
|
+
L = ["| " + " | ".join(head) + " |", "|" + "---|" * len(head)]
|
|
940
|
+
for p in self.programs():
|
|
941
|
+
L.append("| " + " | ".join(
|
|
942
|
+
[self.camp.short_id(p), self.camp.mark(p)] +
|
|
943
|
+
[cell.get((p.id, t, m), "") for t, m in cols]) + " |")
|
|
944
|
+
return "\n".join(L)
|
|
945
|
+
|
|
946
|
+
def report(self, log=print) -> dict:
|
|
947
|
+
s = self.summary()
|
|
948
|
+
log(json.dumps(s, indent=1, sort_keys=True))
|
|
949
|
+
(self.d / "matrix.md").write_text(self.matrix() + "\n")
|
|
950
|
+
log("matrix ->", self.d / "matrix.md")
|
|
951
|
+
return s
|
|
952
|
+
|
|
953
|
+
# -- clusters of failures --
|
|
954
|
+
def row_signature(self, r: dict) -> str:
|
|
955
|
+
return row_signature(r, self.cls(r))
|
|
956
|
+
|
|
957
|
+
def clusters(self) -> list[dict]:
|
|
958
|
+
"""Failures of gated programs grouped by (toolchain, mode,
|
|
959
|
+
signature), with the facets the members share and the passing
|
|
960
|
+
programs of the same toolchain and mode mostly lack, and how many
|
|
961
|
+
the gate confirmed."""
|
|
962
|
+
ps = {p.id: p for p in self.programs()}
|
|
963
|
+
ver = self.verdicts()
|
|
964
|
+
rs = [r for r in self.rows()
|
|
965
|
+
if r["program_id"] in ps and self.camp.gated(ps[r["program_id"]])]
|
|
966
|
+
ok = defaultdict(list)
|
|
967
|
+
bad = defaultdict(list)
|
|
968
|
+
for r in rs:
|
|
969
|
+
key = (r["toolchain"], mode_name(r["xnack"]))
|
|
970
|
+
cls = self.cls(r)
|
|
971
|
+
if cls in FAILING_OK:
|
|
972
|
+
ok[key].append(r["program_id"])
|
|
973
|
+
elif cls != "harness_error":
|
|
974
|
+
v = ver.get(self.camp.cell(r["program_id"], r["toolchain"],
|
|
975
|
+
r["xnack"]), {}).get("verdict")
|
|
976
|
+
bad[key + (self.row_signature(r),)].append((r["program_id"], v))
|
|
977
|
+
out = []
|
|
978
|
+
for key, members in bad.items():
|
|
979
|
+
tc, mode, sig = key
|
|
980
|
+
ids = [m[0] for m in members]
|
|
981
|
+
mem = [self.camp.facets(ps[i]) for i in ids]
|
|
982
|
+
pas = [self.camp.facets(ps[i]) for i in ok[(tc, mode)]]
|
|
983
|
+
share = []
|
|
984
|
+
for item in sorted(set().union(*mem)):
|
|
985
|
+
f_in = sum(item in m for m in mem) / len(mem)
|
|
986
|
+
f_out = (sum(item in m for m in pas) / len(pas)) if pas else 0
|
|
987
|
+
if f_in >= 0.8 and f_out <= f_in - 0.4:
|
|
988
|
+
share.append((item, round(f_in, 2), round(f_out, 2)))
|
|
989
|
+
out.append({"toolchain": tc, "mode": mode, "signature": sig,
|
|
990
|
+
"n": len(ids),
|
|
991
|
+
"confirmed": sum(1 for m in members if m[1] == "confirmed"),
|
|
992
|
+
"programs": sorted(ids), "discriminators": share})
|
|
993
|
+
return sorted(out, key=lambda c: (-c["n"], c["toolchain"]))
|
|
994
|
+
|
|
995
|
+
def cluster(self, log=print) -> list[dict]:
|
|
996
|
+
cs = self.clusters()
|
|
997
|
+
(self.d / "clusters.json").write_text(json.dumps(cs, indent=1))
|
|
998
|
+
for c in cs:
|
|
999
|
+
log(f"{c['n']:4d} ({c['confirmed']:3d} conf) {c['toolchain']:9s} "
|
|
1000
|
+
f"{c['mode']:8s} {c['signature']}")
|
|
1001
|
+
log(" ", "; ".join(f"{i} {f}/{g}" for i, f, g in
|
|
1002
|
+
c["discriminators"][:8]))
|
|
1003
|
+
return cs
|
|
1004
|
+
|
|
1005
|
+
# -- the confirmer --
|
|
1006
|
+
def cell_legality(self, p, toolchain: str, leg: dict):
|
|
1007
|
+
"""The confirmer's legality of a cell: legal when the program's
|
|
1008
|
+
behaviour is defined (its label, whatever ``gated`` says: an
|
|
1009
|
+
unspecified program's failure may be confirmed as an observation,
|
|
1010
|
+
never as a compiler bug) and it is legal for the toolchain's family
|
|
1011
|
+
(the rules and a front end of another family); unknown (the
|
|
1012
|
+
legality review, never a compiler bug) otherwise."""
|
|
1013
|
+
from offload.engine.confirm.legality import Legality
|
|
1014
|
+
from offload.engine.toolchains import TOOLCHAINS
|
|
1015
|
+
r = leg[p.id]
|
|
1016
|
+
if self.camp.legality(p) != "defined":
|
|
1017
|
+
return Legality("unknown", self.camp.unknown_why(p))
|
|
1018
|
+
fam = TOOLCHAINS[toolchain].kind
|
|
1019
|
+
if r["legal_for"].get(fam):
|
|
1020
|
+
fes = [f for f in ("afar", "nvhpc", "cce") if f != fam and r.get(f"{f}_fe")]
|
|
1021
|
+
return Legality("legal", "two witnesses: the rules (compliance."
|
|
1022
|
+
"rules) and the front end of " + ", ".join(fes) +
|
|
1023
|
+
" (not under test for this case)")
|
|
1024
|
+
return Legality("unknown", "no front end of another family accepted it, "
|
|
1025
|
+
"or one rejected it with a diagnostic")
|
|
1026
|
+
|
|
1027
|
+
def confirm(self, log=print) -> list[dict]:
|
|
1028
|
+
"""The confirmer (offload.engine.confirm.engine, stored evidence only)
|
|
1029
|
+
over every failing row of a gated program, with the gate's verdicts
|
|
1030
|
+
and the legality above -> confirm.jsonl. The gate reads this run's
|
|
1031
|
+
verdicts only while it runs: the module's own file is put back."""
|
|
1032
|
+
from offload.engine import gate as GT
|
|
1033
|
+
saved = GT.VERDICTS_FILE
|
|
1034
|
+
try:
|
|
1035
|
+
return self._confirm(log)
|
|
1036
|
+
finally:
|
|
1037
|
+
GT.VERDICTS_FILE = saved
|
|
1038
|
+
|
|
1039
|
+
def _confirm(self, log) -> list[dict]:
|
|
1040
|
+
from offload.engine import gate as GT
|
|
1041
|
+
from offload.engine.confirm import engine as EN
|
|
1042
|
+
from offload.engine.confirm import ingest as IG
|
|
1043
|
+
from offload.engine.confirm import programs as P
|
|
1044
|
+
from offload.engine.confirm.collectors import Context
|
|
1045
|
+
from offload.engine.confirm.store import Store
|
|
1046
|
+
d = self.d
|
|
1047
|
+
ps = {p.id: p for p in self.programs()}
|
|
1048
|
+
leg = self.legality_table()
|
|
1049
|
+
ver = self.verdicts()
|
|
1050
|
+
gv = d / "gate_verdicts.file.jsonl"
|
|
1051
|
+
with open(gv, "w") as fh:
|
|
1052
|
+
for c, v in ver.items():
|
|
1053
|
+
it = v["item"]
|
|
1054
|
+
fh.write(json.dumps({"cell": c, "kind": "file", "ident": it["ident"],
|
|
1055
|
+
"toolchain": it["toolchain"], "xnack": it["xnack"],
|
|
1056
|
+
"verdict": v["verdict"]}) + "\n")
|
|
1057
|
+
GT.VERDICTS_FILE = gv
|
|
1058
|
+
rows_ = []
|
|
1059
|
+
for r in self.rows():
|
|
1060
|
+
p = ps.get(r["program_id"])
|
|
1061
|
+
if p is None or not self.camp.gated(p):
|
|
1062
|
+
continue
|
|
1063
|
+
try:
|
|
1064
|
+
row = IG.row_of_result(r, f"{self.label}/rows.jsonl")
|
|
1065
|
+
except KeyError:
|
|
1066
|
+
continue
|
|
1067
|
+
rows_.append(dataclasses.replace(row, kind="file"))
|
|
1068
|
+
ctx = Context(IG.Index(rows_), Store(d / "confirm_evidence.jsonl"),
|
|
1069
|
+
allow_run=False)
|
|
1070
|
+
vby = {(v["item"]["ident"], v["item"]["toolchain"],
|
|
1071
|
+
IG._mode(v["item"]["toolchain"], v["item"]["xnack"])[1]): v["verdict"]
|
|
1072
|
+
for v in ver.values()}
|
|
1073
|
+
refs, out = {}, []
|
|
1074
|
+
for x in rows_:
|
|
1075
|
+
if x.outcome in (*FAILING_OK, "harness_error"):
|
|
1076
|
+
continue
|
|
1077
|
+
p = ps[x.ident]
|
|
1078
|
+
if x.ident not in refs:
|
|
1079
|
+
refs[x.ident] = P.file_ref(
|
|
1080
|
+
[str(d / "src" / f"{x.ident}.{self.camp.ext(p)}")], "check=pass",
|
|
1081
|
+
label=x.ident, version=p.version)
|
|
1082
|
+
case = IG.case_of_row(x, refs[x.ident])
|
|
1083
|
+
try:
|
|
1084
|
+
res = EN.confirm(case, ctx, legality=self.cell_legality(p, x.toolchain, leg),
|
|
1085
|
+
minimize=False, draft=False)
|
|
1086
|
+
except Exception as e:
|
|
1087
|
+
res = {"verdict": "error", "rule": "", "reason": f"{e}"[:300]}
|
|
1088
|
+
out.append({"program": x.ident, "toolchain": x.toolchain, "mode": x.mode,
|
|
1089
|
+
"outcome": x.outcome, "verdict": res.get("verdict"),
|
|
1090
|
+
"rule": res.get("rule"), "reason": (res.get("reason") or "")[:400],
|
|
1091
|
+
"gate": vby.get((x.ident, x.toolchain, x.mode)),
|
|
1092
|
+
"findings": [f.get("file") for f in res.get("findings") or []],
|
|
1093
|
+
"related": [f.get("file") for f in res.get("related") or []],
|
|
1094
|
+
"legality": (res.get("legality") or {}).get("status")})
|
|
1095
|
+
(d / "confirm.jsonl").write_text("".join(
|
|
1096
|
+
json.dumps(o, sort_keys=True) + "\n" for o in out))
|
|
1097
|
+
log(len(out), "cases;", Counter(o["verdict"] for o in out))
|
|
1098
|
+
return out
|
|
1099
|
+
|
|
1100
|
+
# -- the findings plan --
|
|
1101
|
+
def findings_plan(self, log=print) -> str:
|
|
1102
|
+
"""A plan, not a finding: every cluster of confirmed failures of
|
|
1103
|
+
gated programs with its programs, the confirmer's verdicts on them
|
|
1104
|
+
and the tools/new_finding.py command that drafts the finding once a
|
|
1105
|
+
person has reduced one program and made its controls
|
|
1106
|
+
(docs/tooling/contributing.md, "Add a finding"). Written to
|
|
1107
|
+
findings_plan.md; nothing under findings is touched."""
|
|
1108
|
+
conf = {}
|
|
1109
|
+
for o in read_jsonl(self.d / "confirm.jsonl"):
|
|
1110
|
+
conf[(o["program"], o["toolchain"], o["mode"])] = o
|
|
1111
|
+
L = [f"# {self.camp.name}: candidate findings of {self.label}", "",
|
|
1112
|
+
"A cluster is one (toolchain, mode, failure signature) over the gated programs; "
|
|
1113
|
+
"only the cells the gate confirmed count. Reduce one program per cluster "
|
|
1114
|
+
"(tools/reduce.py), make controls, then draft with the command given.", ""]
|
|
1115
|
+
n = 0
|
|
1116
|
+
for c in self.clusters():
|
|
1117
|
+
if not c["confirmed"]:
|
|
1118
|
+
continue
|
|
1119
|
+
n += 1
|
|
1120
|
+
vs = Counter(conf.get((pid, c["toolchain"], c["mode"]), {}).get("verdict", "-")
|
|
1121
|
+
for pid in c["programs"])
|
|
1122
|
+
first = c["programs"][0]
|
|
1123
|
+
ext = self.camp.ext({p.id: p for p in self.programs()}[first])
|
|
1124
|
+
L += [f"## {n}. {c['toolchain']} {c['mode']}: {c['signature']}", "",
|
|
1125
|
+
f"- programs: {c['n']} ({c['confirmed']} confirmed): "
|
|
1126
|
+
+ ", ".join(c["programs"][:12]) + (" ..." if c["n"] > 12 else ""),
|
|
1127
|
+
"- confirmer: " + ", ".join(f"{k} {v}" for k, v in sorted(vs.items())),
|
|
1128
|
+
"- shared facets: " + (", ".join(f"{i} ({f}/{g})" for i, f, g in
|
|
1129
|
+
c["discriminators"][:8]) or "none"),
|
|
1130
|
+
f"- draft: `python3 -I tools/new_finding.py REDUCTION.{ext} --campaign "
|
|
1131
|
+
f"{self.camp.name} --rows {self.label}/rows.jsonl --control CTL.{ext} "
|
|
1132
|
+
f"--name SLUG --dir data/findings/{self.camp.name}`", ""]
|
|
1133
|
+
if n == 0:
|
|
1134
|
+
L.append("No confirmed failure of a gated program.")
|
|
1135
|
+
text = "\n".join(L).rstrip() + "\n"
|
|
1136
|
+
(self.d / "findings_plan.md").write_text(text)
|
|
1137
|
+
log(f"{n} candidate clusters -> {self.d / 'findings_plan.md'}")
|
|
1138
|
+
return text
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
SHORT = {"correct_on_device": "ok", "wrong_answer": "WA", "rejected": "rej",
|
|
1142
|
+
"ice": "ICE", "crash": "crash", "run_error": "run", "timeout": "TO",
|
|
1143
|
+
"fell_back_to_host": "host", "accepted_ignored": "ign",
|
|
1144
|
+
"harness_error": "harn", "unobservable": "ok"}
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
def toolchain_order() -> dict[str, int]:
|
|
1148
|
+
"""The report columns' order: the catalog's, arch twins last."""
|
|
1149
|
+
from offload.engine.toolchains import registry
|
|
1150
|
+
reg = registry()
|
|
1151
|
+
names_ = [n for n, t in reg.toolchains.items() if t.twin_of is None] + \
|
|
1152
|
+
[n for n, t in reg.toolchains.items() if t.twin_of is not None]
|
|
1153
|
+
return {n: i for i, n in enumerate(names_)}
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
def norm_reason(text: str) -> str:
|
|
1157
|
+
"""A failure's first line with paths, addresses and numbers removed."""
|
|
1158
|
+
t = (text or "").strip().splitlines()[0] if (text or "").strip() else ""
|
|
1159
|
+
t = re.sub(r"<tmpdir>|/\S+", "<path>", t)
|
|
1160
|
+
t = re.sub(r"\b0x[0-9a-f]+\b", "<addr>", t)
|
|
1161
|
+
t = re.sub(r"\d+", "N", t)
|
|
1162
|
+
return t[:140]
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
def row_signature(r: dict, cls: str) -> str:
|
|
1166
|
+
"""A failure's signature for clustering: a wrong answer names the
|
|
1167
|
+
expected values that differ, anything else its class and reason."""
|
|
1168
|
+
if cls == "wrong_answer":
|
|
1169
|
+
exp, obs = r.get("expected") or {}, r.get("observed") or {}
|
|
1170
|
+
bad = sorted(k for k in exp if obs.get(k) != exp[k])
|
|
1171
|
+
return "wrong:" + ",".join(bad) if bad else "wrong:?"
|
|
1172
|
+
return f"{cls}:{norm_reason(r.get('reason', ''))}"
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
def run_dir(camp: Campaign, name: str, results: Path | None = None) -> Path:
|
|
1176
|
+
return Path(results or RESULTS) / camp.name / name
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
def run_label(camp: Campaign, name: str) -> str:
|
|
1180
|
+
return f"results/{camp.name}/{name}"
|