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
offload/engine/gen.py
ADDED
|
@@ -0,0 +1,1114 @@
|
|
|
1
|
+
"""Program generator for the slice: legal and illegal free-form Fortran.
|
|
2
|
+
|
|
3
|
+
``generate(atoms, version)`` yields, for each atom, one small deterministic
|
|
4
|
+
self-checking legal program with that atom as ``primary_atom`` (built from
|
|
5
|
+
``offload.engine.gen_templates``), then one illegal variant for each rule in
|
|
6
|
+
``VIOLATIONS`` whose base atom is in ``atoms``. Each program must parse,
|
|
7
|
+
contain its primary atom, and have ``violations`` equal to ``[]`` (legal) or
|
|
8
|
+
``[violates]`` (illegal), else ``GenError``. ``UNGENERATABLE`` lists atoms
|
|
9
|
+
without a program.
|
|
10
|
+
Each program prints one line ``RESULT ran_on_host=<0|1> check=<pass|fail>``
|
|
11
|
+
and exits 0. ``ran_on_host`` comes from ``omp_is_initial_device()`` in the
|
|
12
|
+
target region, or from a probe region that sets ``on_dev``. ``NEEDS``,
|
|
13
|
+
``EVIDENCE``, ``NO_ORACLE`` and ``UNVERIFIED`` define the header markers.
|
|
14
|
+
Version 34 uses ``offload.engine.acc_gen``; version 50 uses the 5.2 recipes
|
|
15
|
+
(exceptions in ``NO_VARIANT_50``)."""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import dataclasses
|
|
19
|
+
import re
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from functools import lru_cache
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import Callable, Iterable, Iterator
|
|
24
|
+
|
|
25
|
+
import yaml
|
|
26
|
+
|
|
27
|
+
from offload.engine import gen_templates as T
|
|
28
|
+
from offload.engine.catalog import (MODEL_NAME, catalog_dir, default_skeleton,
|
|
29
|
+
directive_atom, model_of, semantic_atoms,
|
|
30
|
+
slice_atoms, slice_directives)
|
|
31
|
+
from offload.engine.grammar import GrammarError, parse_directive
|
|
32
|
+
from offload.engine.offload_scope import ScopeError, scope_of
|
|
33
|
+
from offload.engine.offload_scope import check as check_scope
|
|
34
|
+
from offload.engine.rules import (RULE_PREFIX, ProgramError, default_rules,
|
|
35
|
+
leaves, parse_program, rules_for, violations)
|
|
36
|
+
|
|
37
|
+
STD_LEVELS = ("f95", "f2003", "f2008", "f2018")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class GenError(Exception):
|
|
41
|
+
"""An atom without a recipe, or a program that fails its own checks."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class Program:
|
|
46
|
+
id: str
|
|
47
|
+
lang: str
|
|
48
|
+
source: str
|
|
49
|
+
atoms: frozenset
|
|
50
|
+
primary_atom: str
|
|
51
|
+
legal: bool
|
|
52
|
+
violates: str | None
|
|
53
|
+
observable: bool
|
|
54
|
+
std: str = "f2008"
|
|
55
|
+
needs: tuple = ()
|
|
56
|
+
evidence: str = "construct"
|
|
57
|
+
expect: str = "result"
|
|
58
|
+
token: str = ""
|
|
59
|
+
model: str = "omp" # "acc": an OpenACC program
|
|
60
|
+
# "device" (the atom's headline program) or "host+device" (a
|
|
61
|
+
# host construct feeding a target region the way people use it,
|
|
62
|
+
# reported apart and judged on the device result;
|
|
63
|
+
# offload.engine.offload_scope)
|
|
64
|
+
scope: str = "device"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# The message text of the compile-output probes (the error directive's
|
|
68
|
+
# message clause); the harness looks for it in the
|
|
69
|
+
# compiler's output.
|
|
70
|
+
PROBE_TOKEN = "COMPLIANCE_PROBE_MESSAGE"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Program.expect: how a correct run ends. "result": exit 0 with
|
|
74
|
+
# the RESULT line (the output contract above). "error_termination": a
|
|
75
|
+
# negative probe; the program uses the atom where the spec requires runtime
|
|
76
|
+
# error termination, so a correct run ends there with the runtime's error
|
|
77
|
+
# message (offload.engine.harness.ERROR_TERMINATION); reaching the end prints
|
|
78
|
+
# RESULT ... check=fail.
|
|
79
|
+
EXPECT = {
|
|
80
|
+
"result": "exit status 0 with one RESULT line",
|
|
81
|
+
"error_termination": "runtime error termination with the toolchain's "
|
|
82
|
+
"error message before the RESULT line (a negative "
|
|
83
|
+
"probe; continuing prints check=fail)",
|
|
84
|
+
# compile-output probes: an error directive with
|
|
85
|
+
# at(compilation) and message(PROBE_TOKEN)
|
|
86
|
+
"compile_message": "the compile succeeds and its output shows the "
|
|
87
|
+
"token as a warning; then the program runs as for "
|
|
88
|
+
"result",
|
|
89
|
+
"compile_error": "the compile stops with the token as an error "
|
|
90
|
+
"(compile-time error termination); nothing runs",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# Program.evidence: how the program shows that the construct of interest
|
|
95
|
+
# worked on the device.
|
|
96
|
+
EVIDENCE = {
|
|
97
|
+
"construct": "the check depends on the construct and on its own device "
|
|
98
|
+
"execution (a no-op or host fallback of the construct fails "
|
|
99
|
+
"it or reports ran_on_host=1)",
|
|
100
|
+
"probe": "a negative probe: the program uses the atom where "
|
|
101
|
+
"the spec requires runtime error termination (expect="
|
|
102
|
+
"\"error_termination\"), so the run must end there with the "
|
|
103
|
+
"runtime's error message; without the atom it continues and "
|
|
104
|
+
"prints check=fail; or a compile-output probe (expect "
|
|
105
|
+
"compile_message/compile_error): the compiler output must show "
|
|
106
|
+
"the error directive's message, or the compile must stop",
|
|
107
|
+
"copy_mode_only": "the check tells a working construct from a no-op only "
|
|
108
|
+
"in copy mode (HSA_XNACK=0): under unified memory host "
|
|
109
|
+
"and device addresses coincide",
|
|
110
|
+
# (owner agreement): "unverified" only where a deterministic
|
|
111
|
+
# oracle is possible and missing; the forms no run can separate carry
|
|
112
|
+
# their NO_ORACLE category instead
|
|
113
|
+
"hint_only": "no oracle can exist: the spec lets an implementation "
|
|
114
|
+
"ignore the form (a hint, an assertion the program makes, "
|
|
115
|
+
"or a bound that one-at-a-time execution meets), so a "
|
|
116
|
+
"conforming run without it can coincide; reported as "
|
|
117
|
+
"'accepted; conforms vacuously'",
|
|
118
|
+
"implementation_defined": "no oracle can exist: the spec leaves the "
|
|
119
|
+
"behaviour to the implementation (or permits "
|
|
120
|
+
"but does not require it), so a conforming "
|
|
121
|
+
"run without the form can coincide; reported "
|
|
122
|
+
"as 'implementation-defined'",
|
|
123
|
+
"equivalent_default": "no oracle can exist: by the spec the form is the "
|
|
124
|
+
"behaviour without it (a default modifier, "
|
|
125
|
+
"argument, category or binding); reported as "
|
|
126
|
+
"'equivalent to the default (no separable "
|
|
127
|
+
"effect)'",
|
|
128
|
+
"legality": "the atom's only effect is a compile-time restriction: its "
|
|
129
|
+
"oracle is the illegal variant the header names (a compiler "
|
|
130
|
+
"must reject it); the legal program's run is no evidence",
|
|
131
|
+
"unverified": "a deterministic oracle for behaviour the spec fixes is "
|
|
132
|
+
"possible but the program has none (the header says what "
|
|
133
|
+
"is missing)",
|
|
134
|
+
}
|
|
135
|
+
# The evidence categories with no separating oracle, each with
|
|
136
|
+
# its spec basis (catalog/omp/no_oracle.yaml): header lines
|
|
137
|
+
# ``! no oracle (<kind>): <reason>`` and ``! basis: <cite>: "<quote>"``.
|
|
138
|
+
NO_ORACLE = ("hint_only", "implementation_defined", "equivalent_default")
|
|
139
|
+
# Evidence levels the oracle mutation audit covers (offload.engine.mutate).
|
|
140
|
+
AUDITED = ("construct", "copy_mode_only", "probe")
|
|
141
|
+
# Why a program is evidence="unverified": the header line
|
|
142
|
+
# ``! unverified (<kind>): <reason>`` (exactly one, only on such programs;
|
|
143
|
+
# offload.engine.mutate.audit_summary reports it as unverified_<kind>).
|
|
144
|
+
UNVERIFIED = {
|
|
145
|
+
"needs_other_infrastructure": "the effect is observable only by means "
|
|
146
|
+
"outside the program's own result (a tool "
|
|
147
|
+
"interface such as OMPT, or a feature "
|
|
148
|
+
"neither toolchain provides)",
|
|
149
|
+
# The spec fixes the behaviour and a single-run check of it is
|
|
150
|
+
# possible, but this program does not have it (the reason says which)
|
|
151
|
+
"oracle_not_written": "the spec fixes the behaviour and a deterministic "
|
|
152
|
+
"check of it is possible, but the program does "
|
|
153
|
+
"not have it yet (the reason names the check)",
|
|
154
|
+
}
|
|
155
|
+
# header lines: ``! `` in Fortran, ``// `` in C
|
|
156
|
+
_UNVERIFIED_LINE = re.compile(r"^(?:!|//) unverified \((\w+)\): (.+)$",
|
|
157
|
+
re.M)
|
|
158
|
+
_NO_ORACLE_LINE = re.compile(r"^(?:!|//) no oracle \((\w+)\): (.+)$", re.M)
|
|
159
|
+
_BASIS_LINE = re.compile(r"^(?:!|//) basis: (.+)$", re.M)
|
|
160
|
+
_LEGALITY_LINE = re.compile(r"^(?:!|//) legality oracle: (\S+)$", re.M)
|
|
161
|
+
from offload.engine.root import ROOT # noqa: E402
|
|
162
|
+
|
|
163
|
+
NO_ORACLE_YAML = ROOT / "catalog" / "omp" / "no_oracle.yaml"
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# Hand derivations of expected results (the `derivation` source
|
|
167
|
+
# of offload.engine.expected), written into the legal program's header
|
|
168
|
+
DERIVATIONS = ROOT / "catalog" / "omp" / "derivations.yaml"
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@lru_cache(maxsize=None)
|
|
172
|
+
def derivations() -> dict:
|
|
173
|
+
"""(atom, version) -> (value, text with the version's citations)."""
|
|
174
|
+
import yaml
|
|
175
|
+
if not DERIVATIONS.is_file():
|
|
176
|
+
return {}
|
|
177
|
+
doc = yaml.safe_load(DERIVATIONS.read_text())
|
|
178
|
+
cites = doc.get("cites", {})
|
|
179
|
+
out = {}
|
|
180
|
+
for e in doc["entries"]:
|
|
181
|
+
for v in e["versions"]:
|
|
182
|
+
text = re.sub(r"\{cite:(\w+)\}",
|
|
183
|
+
lambda m: cites[m.group(1)][v], e["text"])
|
|
184
|
+
if (e["atom"], v) in out:
|
|
185
|
+
raise ValueError(f"two derivations of {e['atom']} at {v}")
|
|
186
|
+
out[(e["atom"], v)] = (e["value"], text)
|
|
187
|
+
return out
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def with_derivation(prog: Program, atom: str, version: int) -> Program:
|
|
191
|
+
"""The legal program with its hand derivation (catalog/omp/
|
|
192
|
+
derivations.yaml) as the last header line ``! derivation (<value>):
|
|
193
|
+
<text>``. Added only to the programs `generate` returns: the illegal
|
|
194
|
+
variants, the host+device patterns and the C ports are derived from
|
|
195
|
+
``_legal`` (no derivation), so their text transforms never see it."""
|
|
196
|
+
d = derivations().get((atom, version))
|
|
197
|
+
if d is None or not prog.legal:
|
|
198
|
+
return prog
|
|
199
|
+
lines = prog.source.split("\n")
|
|
200
|
+
k = 0
|
|
201
|
+
while k < len(lines) and lines[k].startswith("!"):
|
|
202
|
+
k += 1
|
|
203
|
+
lines.insert(k, f"! derivation ({d[0]}): {d[1]}")
|
|
204
|
+
return dataclasses.replace(prog, source="\n".join(lines))
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@lru_cache(maxsize=None)
|
|
208
|
+
def no_oracle_bases(model: str = "omp") -> dict:
|
|
209
|
+
"""catalog/<model>/no_oracle.yaml: basis id -> {version: [{cite,
|
|
210
|
+
quote}]}."""
|
|
211
|
+
path = NO_ORACLE_YAML if model == "omp" else \
|
|
212
|
+
catalog_dir(model) / "no_oracle.yaml"
|
|
213
|
+
data = yaml.safe_load(path.read_text()) or {}
|
|
214
|
+
out = {}
|
|
215
|
+
for bid, e in (data.get("bases") or {}).items():
|
|
216
|
+
out[bid] = {int(v): list(c) for v, c in e.items() if v != "status"}
|
|
217
|
+
return out
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def basis_text(basis: str, version: int) -> str:
|
|
221
|
+
"""The ``! basis:`` text of a basis id at a version: the first
|
|
222
|
+
citation and its quoted sentence."""
|
|
223
|
+
model = model_of(version)
|
|
224
|
+
cites = no_oracle_bases(model).get(basis, {}).get(version)
|
|
225
|
+
if not cites:
|
|
226
|
+
raise GenError(f"no spec basis {basis!r} at {version} in "
|
|
227
|
+
f"catalog/{model}/no_oracle.yaml")
|
|
228
|
+
return f'{cites[0]["cite"]}: "{cites[0]["quote"]}"'
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def unverified_of(source: str) -> tuple[str, str] | None:
|
|
232
|
+
"""(kind, reason) of the program's ``! unverified (<kind>): <reason>``
|
|
233
|
+
header line, or None."""
|
|
234
|
+
m = _UNVERIFIED_LINE.search(source)
|
|
235
|
+
return (m.group(1), m.group(2)) if m else None
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def no_oracle_of(source: str) -> tuple[str, str, str] | None:
|
|
239
|
+
"""(kind, reason, basis) of a program with no separating oracle (its
|
|
240
|
+
``! no oracle (<kind>): <reason>`` and ``! basis: ...`` header lines),
|
|
241
|
+
or None."""
|
|
242
|
+
m = _NO_ORACLE_LINE.search(source)
|
|
243
|
+
if m is None:
|
|
244
|
+
return None
|
|
245
|
+
b = _BASIS_LINE.search(source)
|
|
246
|
+
return m.group(1), m.group(2), b.group(1) if b else ""
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def legality_of(source: str) -> str | None:
|
|
250
|
+
"""The rule id of a legality program's ``! legality oracle:`` line."""
|
|
251
|
+
m = _LEGALITY_LINE.search(source)
|
|
252
|
+
return m.group(1) if m else None
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# Program.needs: run-time requirements beyond a plain offload device.
|
|
256
|
+
NEEDS = {
|
|
257
|
+
"zero_copy": "memory the device can access (unified shared memory, "
|
|
258
|
+
"HSA_XNACK=1); in copy mode the runtime aborts or reports "
|
|
259
|
+
"an unsupported requirement",
|
|
260
|
+
"device_c_f_pointer": "c_f_pointer callable in device code (CCE 19 "
|
|
261
|
+
"fails to link _C_F_POINTER for the GPU)",
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
# --- atoms without a program -------------------------------------------------------
|
|
266
|
+
|
|
267
|
+
UNGENERATABLE: dict[int, dict[str, str]] = {50: {}, 52: {}, 60: {}, 34: {}}
|
|
268
|
+
|
|
269
|
+
# --- the omp_lib stub for the base-language check ----------------------------------
|
|
270
|
+
|
|
271
|
+
OMP_LIB_STUB = """\
|
|
272
|
+
! Declaration-only stub of omp_lib, for the base-language check only
|
|
273
|
+
! (gfortran -std=<level> -fsyntax-only, without -fopenmp): it declares the
|
|
274
|
+
! OpenMP names the generated programs use, with the kinds, types and
|
|
275
|
+
! interfaces of the OpenMP 5.2/6.0 Fortran API, so that `use omp_lib, only:`
|
|
276
|
+
! resolves without any compiler's OpenMP module. Never linked, never run.
|
|
277
|
+
module omp_lib
|
|
278
|
+
use, intrinsic :: iso_c_binding, only: c_ptr, c_int
|
|
279
|
+
implicit none
|
|
280
|
+
integer, parameter :: omp_allocator_handle_kind = 8
|
|
281
|
+
integer, parameter :: omp_memspace_handle_kind = 8
|
|
282
|
+
integer, parameter :: omp_alloctrait_key_kind = 8
|
|
283
|
+
integer, parameter :: omp_alloctrait_val_kind = 8
|
|
284
|
+
integer, parameter :: omp_depend_kind = 16
|
|
285
|
+
integer, parameter :: omp_impex_kind = 4
|
|
286
|
+
type omp_alloctrait
|
|
287
|
+
integer(omp_alloctrait_key_kind) :: key
|
|
288
|
+
integer(omp_alloctrait_val_kind) :: value
|
|
289
|
+
end type omp_alloctrait
|
|
290
|
+
integer(omp_alloctrait_key_kind), parameter :: omp_atk_alignment = 3
|
|
291
|
+
integer(omp_allocator_handle_kind), parameter :: omp_default_mem_alloc = 1
|
|
292
|
+
integer(omp_memspace_handle_kind), parameter :: omp_default_mem_space = 0
|
|
293
|
+
integer(omp_impex_kind), parameter :: omp_not_impex = 0, omp_import = 1, &
|
|
294
|
+
omp_export = 2, omp_impex = 3
|
|
295
|
+
interface
|
|
296
|
+
logical function omp_is_initial_device()
|
|
297
|
+
end function omp_is_initial_device
|
|
298
|
+
integer function omp_get_team_num()
|
|
299
|
+
end function omp_get_team_num
|
|
300
|
+
integer function omp_get_thread_num()
|
|
301
|
+
end function omp_get_thread_num
|
|
302
|
+
integer function omp_get_default_device()
|
|
303
|
+
end function omp_get_default_device
|
|
304
|
+
double precision function omp_get_wtime()
|
|
305
|
+
end function omp_get_wtime
|
|
306
|
+
integer function omp_get_num_threads()
|
|
307
|
+
end function omp_get_num_threads
|
|
308
|
+
integer function omp_get_num_teams()
|
|
309
|
+
end function omp_get_num_teams
|
|
310
|
+
integer function omp_get_num_devices()
|
|
311
|
+
end function omp_get_num_devices
|
|
312
|
+
integer function omp_get_device_num()
|
|
313
|
+
end function omp_get_device_num
|
|
314
|
+
integer(c_int) function omp_target_is_present(ptr, device_num) bind(c)
|
|
315
|
+
import :: c_ptr, c_int
|
|
316
|
+
type(c_ptr), value :: ptr
|
|
317
|
+
integer(c_int), value :: device_num
|
|
318
|
+
end function omp_target_is_present
|
|
319
|
+
end interface
|
|
320
|
+
end module omp_lib
|
|
321
|
+
"""
|
|
322
|
+
|
|
323
|
+
# The names OMP_LIB_STUB declares for the programs (test-checked against
|
|
324
|
+
# every program's ONLY list).
|
|
325
|
+
OMP_LIB_STUB_NAMES = frozenset({
|
|
326
|
+
"omp_allocator_handle_kind", "omp_memspace_handle_kind",
|
|
327
|
+
"omp_alloctrait_key_kind", "omp_alloctrait_val_kind", "omp_depend_kind",
|
|
328
|
+
"omp_impex_kind", "omp_alloctrait", "omp_atk_alignment",
|
|
329
|
+
"omp_default_mem_alloc", "omp_default_mem_space", "omp_not_impex",
|
|
330
|
+
"omp_import", "omp_export", "omp_impex", "omp_is_initial_device",
|
|
331
|
+
"omp_get_team_num", "omp_get_thread_num", "omp_get_default_device",
|
|
332
|
+
"omp_get_wtime", "omp_get_num_threads", "omp_get_num_teams",
|
|
333
|
+
"omp_get_num_devices", "omp_get_device_num",
|
|
334
|
+
"omp_target_is_present"})
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
# --- building ---------------------------------------------------------------------------
|
|
338
|
+
|
|
339
|
+
@lru_cache(maxsize=None)
|
|
340
|
+
def _directive_keys() -> dict[str, str]:
|
|
341
|
+
return {directive_atom(k): k for k in slice_directives(default_skeleton())}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def _recipe(atom: str, version: int) -> T.Src:
|
|
345
|
+
if model_of(version) == "acc":
|
|
346
|
+
from offload.engine import acc_gen
|
|
347
|
+
return acc_gen.recipe(atom, version)
|
|
348
|
+
parts = atom.split(".")
|
|
349
|
+
if len(parts) < 3 or parts[0] != "omp":
|
|
350
|
+
raise GenError(f"not an atom id: {atom!r}")
|
|
351
|
+
if parts[1] == "directive":
|
|
352
|
+
key = _directive_keys().get(atom)
|
|
353
|
+
if key is None:
|
|
354
|
+
raise GenError(f"no slice directive for {atom!r}")
|
|
355
|
+
return T.directive_recipe(key, version)
|
|
356
|
+
clause, feat = parts[2], (parts[3] if len(parts) > 3 else None)
|
|
357
|
+
if feat == "directive_name":
|
|
358
|
+
if clause == "if":
|
|
359
|
+
return T.if_dnm_prog(version)
|
|
360
|
+
return _dnm(clause, version)
|
|
361
|
+
src = T.clause_recipe(clause, feat, version)
|
|
362
|
+
if src is None:
|
|
363
|
+
raise GenError(f"no recipe for {atom!r} at {version}")
|
|
364
|
+
return src
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def _parsed_atoms(source: str, version: int) -> frozenset:
|
|
368
|
+
tree = parse_program(source, version)
|
|
369
|
+
return frozenset().union(*(d.atoms for d in tree.directives),
|
|
370
|
+
*(d.atoms for d in tree.ends.values()))
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _header(pid, atom, version, src: T.Src, violates=None) -> list[str]:
|
|
374
|
+
obs = "yes" if src.observable else "no"
|
|
375
|
+
if src.note:
|
|
376
|
+
obs += f" ({src.note})"
|
|
377
|
+
model = model_of(version)
|
|
378
|
+
where = ("probe (a target region just before the region of interest,"
|
|
379
|
+
" which may not call the OpenMP API)"
|
|
380
|
+
if src.probe else "inside the target region of interest")
|
|
381
|
+
if model == "acc":
|
|
382
|
+
where = "inside the compute region of interest (acc_on_device)"
|
|
383
|
+
return [f"Generated by compliance.gen ({MODEL_NAME[model]} "
|
|
384
|
+
f"{version // 10}.{version % 10}, free-form Fortran). Do not "
|
|
385
|
+
"edit.",
|
|
386
|
+
f"id: {pid}", f"primary atom: {atom}",
|
|
387
|
+
"legal: " + ("yes" if violates is None
|
|
388
|
+
else f"no (violates {violates})"),
|
|
389
|
+
f"observable: {obs}", f"ran_on_host: {where}",
|
|
390
|
+
f"evidence: {src.evidence}",
|
|
391
|
+
"needs: " + (", ".join(src.needs) if src.needs else "none"),
|
|
392
|
+
f"std: {src.std}"] + (
|
|
393
|
+
[f"expect: {src.expect}"]
|
|
394
|
+
if src.expect != "result" else []) + (
|
|
395
|
+
[f"token: {src.token}"] if src.token else []) + list(
|
|
396
|
+
src.header_notes) + (
|
|
397
|
+
[f"basis: {basis_text(src.basis, version)}"]
|
|
398
|
+
if src.basis else []) + (
|
|
399
|
+
[f"legality oracle: {RULE_PREFIX[model]}{version}-"
|
|
400
|
+
f"{src.legality_rule}"]
|
|
401
|
+
if src.legality_rule else [])
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
def _pid(atom: str, version: int) -> str:
|
|
405
|
+
m = model_of(version)
|
|
406
|
+
return f"{m}{version}-" + atom.removeprefix(f"{m}.").replace(".", "-")
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def _program(atom: str, version: int, src: T.Src) -> Program:
|
|
410
|
+
pid = _pid(atom, version)
|
|
411
|
+
source = src.render(_header(pid, atom, version, src))
|
|
412
|
+
try:
|
|
413
|
+
atoms = _parsed_atoms(source, version)
|
|
414
|
+
found = violations(parse_program(source, version), version)
|
|
415
|
+
except (GrammarError, ProgramError) as err:
|
|
416
|
+
raise GenError(f"{pid}: {err}\n{source}") from err
|
|
417
|
+
# a semantic atom (catalog/omp/semantic_atoms.yaml) is exercised through
|
|
418
|
+
# the program's data; no directive carries it, so it is added to the
|
|
419
|
+
# parsed atoms
|
|
420
|
+
if atom in semantic_atoms():
|
|
421
|
+
atoms = atoms | {atom}
|
|
422
|
+
if atom not in atoms:
|
|
423
|
+
raise GenError(f"{pid}: the program does not exercise {atom}\n"
|
|
424
|
+
f"{source}")
|
|
425
|
+
if found:
|
|
426
|
+
raise GenError(f"{pid}: legal program violates {found}\n{source}")
|
|
427
|
+
if src.evidence not in EVIDENCE or not set(src.needs) <= set(NEEDS) \
|
|
428
|
+
or src.expect not in EXPECT \
|
|
429
|
+
or (src.evidence == "probe") != (src.expect != "result") \
|
|
430
|
+
or bool(src.token) != src.expect.startswith("compile_"):
|
|
431
|
+
raise GenError(f"{pid}: bad evidence {src.evidence!r}, needs "
|
|
432
|
+
f"{src.needs!r} or expect {src.expect!r}")
|
|
433
|
+
unv = _UNVERIFIED_LINE.findall(source)
|
|
434
|
+
if (src.evidence == "unverified") != bool(unv) or len(unv) > 1 or any(
|
|
435
|
+
k not in UNVERIFIED for k, _ in unv):
|
|
436
|
+
raise GenError(f"{pid}: evidence {src.evidence!r} with unverified "
|
|
437
|
+
f"lines {unv!r}")
|
|
438
|
+
noo = _NO_ORACLE_LINE.findall(source)
|
|
439
|
+
if (src.evidence in NO_ORACLE) != bool(noo) or len(noo) > 1 or any(
|
|
440
|
+
k != src.evidence for k, _ in noo) or (
|
|
441
|
+
bool(noo) != bool(_BASIS_LINE.search(source))):
|
|
442
|
+
raise GenError(f"{pid}: evidence {src.evidence!r} with no-oracle "
|
|
443
|
+
f"lines {noo!r} (a no-oracle program needs exactly "
|
|
444
|
+
"one, of its own kind, and a basis)")
|
|
445
|
+
if (src.evidence == "legality") != bool(legality_of(source)):
|
|
446
|
+
raise GenError(f"{pid}: evidence {src.evidence!r} without its "
|
|
447
|
+
"legality oracle line (or the line without it)")
|
|
448
|
+
prog = Program(pid, "fortran", source, atoms, atom, True, None,
|
|
449
|
+
src.observable, src.std, tuple(src.needs), src.evidence,
|
|
450
|
+
src.expect, src.token, model_of(version),
|
|
451
|
+
scope_of(source)[0])
|
|
452
|
+
_check_scope(prog)
|
|
453
|
+
return prog
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
def _check_scope(prog: Program) -> None:
|
|
457
|
+
"""The program is device offload (or a declared host+device
|
|
458
|
+
pattern); offload.engine.offload_scope.check."""
|
|
459
|
+
try:
|
|
460
|
+
check_scope(prog)
|
|
461
|
+
except ScopeError as err:
|
|
462
|
+
raise GenError(str(err)) from err
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
@lru_cache(maxsize=None)
|
|
466
|
+
def _legal(atom: str, version: int) -> Program:
|
|
467
|
+
return _program(atom, version, _recipe(atom, version))
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
# --- host+device patterns -------------------------------------------------
|
|
471
|
+
#
|
|
472
|
+
# The maintainer's exception to the device-offload scope: host constructs that
|
|
473
|
+
# feed a target region in a way people actually use are kept as patterns,
|
|
474
|
+
# each with its own program (id ``<atom program id>-hostdev``,
|
|
475
|
+
# Program.scope "host+device", header line ``! scope: host+device: <the
|
|
476
|
+
# realistic use>``). They are reported apart from the atom's device-only
|
|
477
|
+
# headline program, judged on the device result, and not mutation-audited
|
|
478
|
+
# (the headline program is the atom's oracle).
|
|
479
|
+
_DEPEND_FIRST = {"omp.clause.depend": "out", "omp.clause.depend.out": "out",
|
|
480
|
+
"omp.clause.depend.in": "out",
|
|
481
|
+
"omp.clause.depend.inout": "inout",
|
|
482
|
+
"omp.clause.depend.inoutset": "inoutset",
|
|
483
|
+
"omp.clause.depend.mutexinoutset": "mutexinoutset",
|
|
484
|
+
"omp.clause.depend.iterator": "iterator",
|
|
485
|
+
"omp.clause.depend.depobj": "depobj"}
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def _depend_host(atom: str):
|
|
489
|
+
def build(version: int) -> T.Src:
|
|
490
|
+
s = T.depend_host_prog(version, _DEPEND_FIRST[atom], "in")
|
|
491
|
+
if atom == "omp.clause.depend.in":
|
|
492
|
+
s.focus = "depend(in: w)"
|
|
493
|
+
return s
|
|
494
|
+
return build
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
HOST_DEVICE: dict[str, Callable[[int], T.Src]] = {
|
|
498
|
+
**{a: _depend_host(a) for a in _DEPEND_FIRST},
|
|
499
|
+
"omp.directive.target": lambda v: T.threads_offload_prog(v),
|
|
500
|
+
"omp.clause.nowait": lambda v: T.threads_offload_prog(v, nowait=True),
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def hostdev_id(atom: str, version: int) -> str:
|
|
505
|
+
return _pid(atom, version) + "-hostdev"
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
@lru_cache(maxsize=None)
|
|
509
|
+
def _hostdev(atom: str, version: int) -> Program:
|
|
510
|
+
"""The host+device pattern program of `atom` (HOST_DEVICE)."""
|
|
511
|
+
src = HOST_DEVICE[atom](version)
|
|
512
|
+
pid = hostdev_id(atom, version)
|
|
513
|
+
prog = _program(atom, version, src)
|
|
514
|
+
source = re.sub(r"^! id: .*$", f"! id: {pid}", prog.source, count=1,
|
|
515
|
+
flags=re.M)
|
|
516
|
+
if prog.scope != "host+device":
|
|
517
|
+
raise GenError(f"{pid}: a host+device pattern without its scope "
|
|
518
|
+
"line")
|
|
519
|
+
return dataclasses.replace(prog, id=pid, source=source)
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
# --- the directive-name modifier family (6.0) --------------------------------------
|
|
523
|
+
|
|
524
|
+
# Argument for a clause whose base form has none (``nowait`` ->
|
|
525
|
+
# ``nowait(target: .true.)``).
|
|
526
|
+
_DNM_ARG = {"transparent": "omp_impex"}
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
# Base atom of the family member when it is not omp.clause.<clause>
|
|
530
|
+
# (ordered: the block-ordered base program repeats the word "ordered";
|
|
531
|
+
# linear: the simple step modifier takes no other modifier).
|
|
532
|
+
_DNM_BASE = {"ordered": "omp.clause.ordered.n",
|
|
533
|
+
"linear": "omp.clause.linear.step"}
|
|
534
|
+
|
|
535
|
+
# Base programs of family members built from another recipe: reduction on
|
|
536
|
+
# parallel do in a target region without default(none). The base
|
|
537
|
+
# program of omp.clause.reduction is target teams distribute parallel do,
|
|
538
|
+
# where reduction(do, ...) leaves the teams sharing the item, so the teams'
|
|
539
|
+
# do reductions race for it, and default(none) leaves the item without a
|
|
540
|
+
# data-sharing attribute on teams and parallel.
|
|
541
|
+
_DNM_RECIPE = {"reduction": lambda v: T.reduction_prog(v, key="parallel do",
|
|
542
|
+
hyg=False),
|
|
543
|
+
# message/severity: the parallel do form (the base atoms'
|
|
544
|
+
# programs use the error directive)
|
|
545
|
+
"message": lambda v: T.pdo(v, 'message("generated")').unverified(
|
|
546
|
+
"needs_other_infrastructure", T.ERROR_CLAUSE_WHY),
|
|
547
|
+
"severity": lambda v: T.pdo(v, "severity(warning)").unverified(
|
|
548
|
+
"needs_other_infrastructure", T.ERROR_CLAUSE_WHY)}
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
def _dnm_variants(focus: str, clause: str, name: str) -> list[str]:
|
|
552
|
+
m = re.fullmatch(rf"{clause}(?:\((.*)\))?", focus)
|
|
553
|
+
if m is None:
|
|
554
|
+
return []
|
|
555
|
+
args = m.group(1)
|
|
556
|
+
if args is None:
|
|
557
|
+
return [f"{clause}({name}: {_DNM_ARG.get(clause, '.true.')})"]
|
|
558
|
+
out = [f"{clause}({name}: {args})"]
|
|
559
|
+
if ":" in args:
|
|
560
|
+
head, tail = args.split(":", 1)
|
|
561
|
+
out += [f"{clause}({name}, {args})",
|
|
562
|
+
f"{clause}({head.strip()}, {name}:{tail})",
|
|
563
|
+
f"{clause}({head.strip()}: {name},{tail})",
|
|
564
|
+
f"{clause}({args}, {name})"]
|
|
565
|
+
else:
|
|
566
|
+
out.append(f"{clause}({args}: {name})")
|
|
567
|
+
return out
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
def _dnm(clause: str, version: int) -> T.Src:
|
|
571
|
+
"""The base program of omp.clause.<clause> with a directive-name
|
|
572
|
+
modifier on the focus clause, naming the innermost leaf (or the
|
|
573
|
+
directive) that takes the clause."""
|
|
574
|
+
base = _DNM_RECIPE[clause](version) if clause in _DNM_RECIPE else \
|
|
575
|
+
_recipe(_DNM_BASE.get(clause, f"omp.clause.{clause}"), version)
|
|
576
|
+
focus = next((c for c in _split_clauses(base.focus)
|
|
577
|
+
if re.match(rf"{clause}\b", c)), None)
|
|
578
|
+
if focus is None:
|
|
579
|
+
raise GenError(f"no focus clause for {clause} directive_name")
|
|
580
|
+
rendered = base.render([])
|
|
581
|
+
hits = [ln for ln in rendered.splitlines() if focus in ln]
|
|
582
|
+
if len(hits) != 1:
|
|
583
|
+
raise GenError(f"focus {focus!r} not unique in the {clause} program")
|
|
584
|
+
key = parse_directive(_directive_text(rendered, hits[0]), "fortran",
|
|
585
|
+
version).name
|
|
586
|
+
names = [leaf for leaf in reversed(leaves(key))
|
|
587
|
+
if T.permits(leaf, clause, version)] + [key]
|
|
588
|
+
atom = f"omp.clause.{clause}.directive_name"
|
|
589
|
+
for name in names:
|
|
590
|
+
spelled = T.spell(name, version)
|
|
591
|
+
for variant in _dnm_variants(focus, clause, spelled):
|
|
592
|
+
src = dataclasses.replace(base, focus=variant)
|
|
593
|
+
src.module = [x.replace(focus, variant) for x in base.module]
|
|
594
|
+
for f in ("spec", "region", "init", "post"):
|
|
595
|
+
setattr(src, f, [x.replace(focus, variant)
|
|
596
|
+
for x in getattr(base, f)])
|
|
597
|
+
source = src.render([])
|
|
598
|
+
try:
|
|
599
|
+
ok = atom in _parsed_atoms(source, version) and not \
|
|
600
|
+
violations(parse_program(source, version), version)
|
|
601
|
+
except (GrammarError, ProgramError):
|
|
602
|
+
ok = False
|
|
603
|
+
if ok:
|
|
604
|
+
return _dnm_evidence(src, clause, key, name, version)
|
|
605
|
+
raise GenError(f"no directive-name form of {focus!r} parses at "
|
|
606
|
+
f"{version}")
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
# Directive-name forms on a compound construct whose clause, without the
|
|
610
|
+
# modifier, already applies only to the named constituent by the rules of
|
|
611
|
+
# 6.0 §19.2 p.528 ("Clauses on Compound Constructs"): (clause, compound,
|
|
612
|
+
# named constituent) -> the rule.
|
|
613
|
+
_DNM_SAME = {
|
|
614
|
+
("private", "parallel do", "do"):
|
|
615
|
+
"private has the innermost-leaf property, so without the modifier "
|
|
616
|
+
"it applies only to the innermost leaf that permits it, do",
|
|
617
|
+
("firstprivate", "parallel do", "do"):
|
|
618
|
+
"firstprivate on a compound construct with a worksharing-loop "
|
|
619
|
+
"applies to the do, and the parallel then shares the item, which is "
|
|
620
|
+
"also the effect of firstprivate(do: ...)",
|
|
621
|
+
("allocate", "parallel do", "do"):
|
|
622
|
+
"allocate has the all-privatizing property: it applies to the leaves "
|
|
623
|
+
"on which a clause privatizes the item, here only the do (private "
|
|
624
|
+
"has the innermost-leaf property)",
|
|
625
|
+
("reduction", "parallel do", "do"):
|
|
626
|
+
"reduction on parallel combined with a worksharing-loop applies to "
|
|
627
|
+
"the do, and the parallel then shares the item, which is also the "
|
|
628
|
+
"effect of reduction(do, ...)",
|
|
629
|
+
("thread_limit", "target teams distribute parallel do", "teams"):
|
|
630
|
+
"without the modifier thread_limit applies to target and teams, and "
|
|
631
|
+
"a teams construct closely nested in a target construct with "
|
|
632
|
+
"thread_limit behaves as if the clause were on the teams too (6.0 "
|
|
633
|
+
"§12.2 p.394), so every legal form (no modifier, teams, target) "
|
|
634
|
+
"gives each team the same limit",
|
|
635
|
+
}
|
|
636
|
+
# Directive-name forms whose constituents differ in effect, but in ways
|
|
637
|
+
# no single run of a conforming program can tell apart.
|
|
638
|
+
_DNM_IMPL = {
|
|
639
|
+
"nowait": "with the modifier nowait drops the do's barrier, which the "
|
|
640
|
+
"parallel region's end barrier follows at once; without it "
|
|
641
|
+
"nowait applies to the outermost leaf, target (outermost-leaf "
|
|
642
|
+
"property, 6.0 §19.2 p.528), whose target task an "
|
|
643
|
+
"implementation may run synchronously: no conforming run "
|
|
644
|
+
"separates the two",
|
|
645
|
+
}
|
|
646
|
+
_DNM_NO_RENAME = ("; no other constituent accepts the clause, so no "
|
|
647
|
+
"directive-name mutation is legal")
|
|
648
|
+
# The spec basis (catalog/omp/no_oracle.yaml) of each _DNM_SAME rule.
|
|
649
|
+
_DNM_SAME_BASIS = {"private": "dnm_innermost_leaf",
|
|
650
|
+
"firstprivate": "dnm_firstprivate",
|
|
651
|
+
"allocate": "dnm_all_privatizing",
|
|
652
|
+
"reduction": "dnm_reduction",
|
|
653
|
+
"thread_limit": "dnm_thread_limit"}
|
|
654
|
+
_DNM_IMPL_BASIS = {"nowait": "target_nowait"}
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
def _dnm_evidence(src: T.Src, clause: str, key: str, name: str,
|
|
658
|
+
version: int) -> T.Src:
|
|
659
|
+
"""An observable member of the family has no separating oracle (triage, categories): where only the named constituent accepts
|
|
660
|
+
the clause, or where the rules of 6.0 §19.2 already apply the
|
|
661
|
+
unmodified clause to the named constituent alone, the forms are the
|
|
662
|
+
same (equivalent_default); the others differ only in ways no single run
|
|
663
|
+
can show (implementation_defined). Each carries its spec basis."""
|
|
664
|
+
if not src.observable and src.evidence not in ("unverified",) + NO_ORACLE:
|
|
665
|
+
return src
|
|
666
|
+
# the base program's check tests the clause's effect (it stays
|
|
667
|
+
# observable) only when the base has an audited oracle
|
|
668
|
+
checked = src.evidence in AUDITED and src.observable
|
|
669
|
+
takers = [leaf for leaf in leaves(key) if T.permits(leaf, clause, version)]
|
|
670
|
+
if len(takers) <= 1:
|
|
671
|
+
basis = "dnm_own_directive" if len(leaves(key)) == 1 \
|
|
672
|
+
else "dnm_single_leaf"
|
|
673
|
+
return src.no_oracle(
|
|
674
|
+
"equivalent_default", f"{clause} applies only to the {name} "
|
|
675
|
+
f"constituent of {key}, the one the modifier names, so the form "
|
|
676
|
+
"without the modifier is the same" + _DNM_NO_RENAME, basis,
|
|
677
|
+
checked=checked)
|
|
678
|
+
same = _DNM_SAME.get((clause, key, name))
|
|
679
|
+
if same is not None:
|
|
680
|
+
return src.no_oracle(
|
|
681
|
+
"equivalent_default", f"{same} (6.0 §19.2 p.528), so the form "
|
|
682
|
+
"without the modifier is the same", _DNM_SAME_BASIS[clause],
|
|
683
|
+
checked=checked)
|
|
684
|
+
why = _DNM_IMPL.get(clause)
|
|
685
|
+
if why is None or key != "target teams distribute parallel do":
|
|
686
|
+
raise GenError(f"no triage for the directive-name form of {clause} "
|
|
687
|
+
f"on {key} (constituents {takers})")
|
|
688
|
+
return src.no_oracle("implementation_defined", why,
|
|
689
|
+
_DNM_IMPL_BASIS[clause], checked=checked)
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
def _split_clauses(text: str) -> list[str]:
|
|
693
|
+
out, depth, cur = [], 0, ""
|
|
694
|
+
for ch in text:
|
|
695
|
+
depth += ch == "("
|
|
696
|
+
depth -= ch == ")"
|
|
697
|
+
if ch == " " and depth == 0:
|
|
698
|
+
if cur:
|
|
699
|
+
out.append(cur)
|
|
700
|
+
cur = ""
|
|
701
|
+
continue
|
|
702
|
+
cur += ch
|
|
703
|
+
if cur:
|
|
704
|
+
out.append(cur)
|
|
705
|
+
return out
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
def _directive_text(source: str, line: str) -> str:
|
|
709
|
+
"""The whole (possibly continued) directive containing `line`."""
|
|
710
|
+
lines = source.splitlines()
|
|
711
|
+
k = lines.index(line)
|
|
712
|
+
while k and lines[k - 1].rstrip().endswith("&"):
|
|
713
|
+
k -= 1
|
|
714
|
+
out = [lines[k]]
|
|
715
|
+
while out[-1].rstrip().endswith("&"):
|
|
716
|
+
k += 1
|
|
717
|
+
out.append(lines[k])
|
|
718
|
+
return "\n".join(out)
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
# --- illegal variants -----------------------------------------------------------------
|
|
722
|
+
|
|
723
|
+
def _sub(old: str, new: str, count: int = 1):
|
|
724
|
+
"""A source transform replacing `old` (which must occur `count` times)."""
|
|
725
|
+
def fn(source: str) -> str:
|
|
726
|
+
n = source.count(old)
|
|
727
|
+
if n != count:
|
|
728
|
+
raise GenError(f"transform: {old!r} occurs {n} times, "
|
|
729
|
+
f"expected {count}")
|
|
730
|
+
return source.replace(old, new)
|
|
731
|
+
return fn
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
def _chain(*fns):
|
|
735
|
+
def fn(source: str) -> str:
|
|
736
|
+
for f in fns:
|
|
737
|
+
source = f(source)
|
|
738
|
+
return source
|
|
739
|
+
return fn
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
def _regex(pattern: str, repl: str):
|
|
743
|
+
def fn(source: str) -> str:
|
|
744
|
+
new, n = re.subn(pattern, repl, source, count=1, flags=re.M | re.S)
|
|
745
|
+
if n != 1:
|
|
746
|
+
raise GenError(f"transform: no match for {pattern!r}")
|
|
747
|
+
return new
|
|
748
|
+
return fn
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
def _insert(pattern: str, lines: list[str], after: bool = True):
|
|
752
|
+
"""Insert `lines` after (or before) the one source line whose stripped
|
|
753
|
+
text matches `pattern` (re.fullmatch), at that line's indentation."""
|
|
754
|
+
def fn(source: str) -> str:
|
|
755
|
+
src = source.split("\n")
|
|
756
|
+
hits = [k for k, ln in enumerate(src)
|
|
757
|
+
if re.fullmatch(pattern, ln.strip())]
|
|
758
|
+
if len(hits) != 1:
|
|
759
|
+
raise GenError(f"transform: {pattern!r} matches {len(hits)} "
|
|
760
|
+
"lines, expected 1")
|
|
761
|
+
k = hits[0]
|
|
762
|
+
ind = src[k][:len(src[k]) - len(src[k].lstrip())]
|
|
763
|
+
new = [ind + x for x in lines]
|
|
764
|
+
src[k + 1 if after else k:k + 1 if after else k] = new
|
|
765
|
+
return "\n".join(src)
|
|
766
|
+
return fn
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
def _drop(pattern: str):
|
|
770
|
+
"""Remove the one line whose stripped text matches `pattern`."""
|
|
771
|
+
def fn(source: str) -> str:
|
|
772
|
+
src = source.split("\n")
|
|
773
|
+
hits = [k for k, ln in enumerate(src)
|
|
774
|
+
if re.fullmatch(pattern, ln.strip())]
|
|
775
|
+
if len(hits) != 1:
|
|
776
|
+
raise GenError(f"transform: {pattern!r} matches {len(hits)} "
|
|
777
|
+
"lines, expected 1")
|
|
778
|
+
del src[hits[0]]
|
|
779
|
+
return "\n".join(src)
|
|
780
|
+
return fn
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
# rule stem -> {version: (base atom, transform)}; one change each (see the
|
|
784
|
+
# isolation notes in catalog/omp/rules.yaml).
|
|
785
|
+
_T: dict[str, dict[int, tuple[str, Callable[[str], str]]]] = {}
|
|
786
|
+
|
|
787
|
+
|
|
788
|
+
def _rule(stem, versions, base, fn):
|
|
789
|
+
for v in versions:
|
|
790
|
+
_T.setdefault(stem, {})[v] = (base, fn)
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
BOTH = (52, 60)
|
|
794
|
+
_TARGET_MAPS = ("!$omp target map(to: a) map(from: b) map(from: nt) "
|
|
795
|
+
"map(tofrom: host_flag)")
|
|
796
|
+
|
|
797
|
+
# The teams construct is nested in a parallel construct inside
|
|
798
|
+
# the target region (before: a host parallel region with no target), so the
|
|
799
|
+
# illegal nesting is in offload code
|
|
800
|
+
_rule("teams-nesting-001", BOTH, "omp.directive.teams", _chain(
|
|
801
|
+
_insert(re.escape(_TARGET_MAPS), ["!$omp parallel num_threads(1)"]),
|
|
802
|
+
_insert(r"!\$omp end target$", ["!$omp end parallel"], after=False)))
|
|
803
|
+
_rule("teams-nesting-002", BOTH, "omp.directive.teams",
|
|
804
|
+
_insert(re.escape(_TARGET_MAPS), ["host_flag = 1"]))
|
|
805
|
+
_rule("teams-nesting-003", BOTH, "omp.directive.teams", _chain(
|
|
806
|
+
_insert(r"if \(omp_get_team_num\(\) == 0\) then", ["!$omp single"],
|
|
807
|
+
after=False),
|
|
808
|
+
_insert(r"!\$omp end teams", ["!$omp end single"], after=False)))
|
|
809
|
+
_rule("distribute-nesting-001", BOTH, "omp.directive.distribute", _chain(
|
|
810
|
+
_sub("!$omp target teams map", "!$omp target parallel map"),
|
|
811
|
+
_sub(" num_teams(4)", ""),
|
|
812
|
+
_sub("!$omp end target teams", "!$omp end target parallel")))
|
|
813
|
+
# The orphaned loop construct without bind is in a declare target
|
|
814
|
+
# subroutine called in a target region (the bind(parallel) program without
|
|
815
|
+
# its bind clause); before, the main program's loop construct with its
|
|
816
|
+
# target teams wrapper removed, which ran on the host. The loop is in a
|
|
817
|
+
# procedure, so the 5.0 rule (bind required on an orphaned loop in a
|
|
818
|
+
# procedure, 5.0 §2.9.5 p.131) holds too.
|
|
819
|
+
_rule("loop-nesting-001", (50,) + BOTH, "omp.clause.bind.parallel",
|
|
820
|
+
_sub("!$omp loop bind(parallel)", "!$omp loop"))
|
|
821
|
+
# The primary atom of a variant whose transform removes its base atom: the
|
|
822
|
+
# directive the rule restricts (the base program supplies the context).
|
|
823
|
+
VARIANT_PRIMARY = {"loop-nesting-001": "omp.directive.loop"}
|
|
824
|
+
# the bind programs use an orphaned loop, which the rule
|
|
825
|
+
# never flags: the variant is the loop program with bind(teams) added and
|
|
826
|
+
# its target teams wrapper made target parallel (as distribute-nesting-001)
|
|
827
|
+
_rule("loop-nesting-002", BOTH, "omp.directive.loop", _chain(
|
|
828
|
+
_sub("!$omp loop", "!$omp loop bind(teams)"),
|
|
829
|
+
_sub("!$omp target teams map", "!$omp target parallel map"),
|
|
830
|
+
_sub(" num_teams(4)", ""),
|
|
831
|
+
_sub("!$omp end target teams", "!$omp end target parallel")))
|
|
832
|
+
_rule("target-nesting-001", BOTH, "omp.directive.target", _insert(
|
|
833
|
+
r"!\$omp end target", ["!$omp target update from(b)"], after=False))
|
|
834
|
+
_rule("order-nesting-001", BOTH, "omp.clause.order.concurrent", _chain(
|
|
835
|
+
_insert(r"b\(i\) = 2\*a\(i\) \+ 1", ["!$omp task"], after=False),
|
|
836
|
+
_insert(r"b\(i\) = 2\*a\(i\) \+ 1", ["!$omp end task"])))
|
|
837
|
+
_rule("declaretarget-placement-001", BOTH, "omp.directive.target", _insert(
|
|
838
|
+
r"!\$omp end target", ["!$omp declare target (a)"], after=False))
|
|
839
|
+
_rule("requires-placement-001", BOTH, "omp.directive.target_parallel",
|
|
840
|
+
_insert(r"host_flag = merge.*", [
|
|
841
|
+
"!$omp requires atomic_default_mem_order(seq_cst)"], after=False))
|
|
842
|
+
_rule("requires-placement-002", (52,), "omp.directive.target", _insert(
|
|
843
|
+
r"!\$omp end target", ["!$omp requires unified_shared_memory"]))
|
|
844
|
+
_rule("assoc-loop-001", BOTH, "omp.directive.parallel_do", _regex(
|
|
845
|
+
r"(!\$omp parallel do [^\n]*\n)\s*do i = 1, n\n.*?end do\n"
|
|
846
|
+
r"\s*!\$omp end parallel do\n", r"\1 b = 2*a + 1\n"))
|
|
847
|
+
_rule("collapse-loop-001", BOTH, "omp.clause.collapse",
|
|
848
|
+
_sub("collapse(2)", "collapse(3)"))
|
|
849
|
+
_rule("target-map-001", (52,), "omp.directive.target",
|
|
850
|
+
_sub("map(from: b)", "map(release: b)"))
|
|
851
|
+
_rule("targetdata-map-001", (52,), "omp.directive.target_data",
|
|
852
|
+
_sub("!$omp target data map(to: a) map(from: b)",
|
|
853
|
+
"!$omp target data map(to: a) map(release: b)"))
|
|
854
|
+
_rule("targetenterdata-map-001", BOTH, "omp.directive.target_enter_data",
|
|
855
|
+
_sub("map(alloc: b)", "map(from: b)"))
|
|
856
|
+
_rule("targetexitdata-map-001", BOTH, "omp.directive.target_exit_data",
|
|
857
|
+
_sub("map(from: b) map(release: a)", "map(to: b) map(release: a)"))
|
|
858
|
+
_rule("mapitem-map-001", BOTH, "omp.clause.map.mapper",
|
|
859
|
+
_sub("map(mapper(mm), tofrom: s)",
|
|
860
|
+
"map(mapper(mm), tofrom: s) map(to: s)"))
|
|
861
|
+
_rule("mapitem-map-002", (52,), "omp.directive.target",
|
|
862
|
+
_sub("map(to: a) map(from: b) map(tofrom: host_flag)\n",
|
|
863
|
+
"map(to: a) map(to: a(1:n)) map(from: b) "
|
|
864
|
+
"map(tofrom: host_flag)\n"))
|
|
865
|
+
_rule("mapitem-map-003", (60,), "omp.clause.map.self",
|
|
866
|
+
_sub("map(self: a)", "map(self: a) map(to: a(1:n))"))
|
|
867
|
+
_rule("loop-dsa-001", BOTH, "omp.directive.loop",
|
|
868
|
+
_sub("!$omp loop", "!$omp loop lastprivate(host_flag)"))
|
|
869
|
+
_rule("target-dsa-001", BOTH, "omp.directive.target",
|
|
870
|
+
_sub("map(to: a) map(from: b) map(tofrom: host_flag)\n",
|
|
871
|
+
"map(to: a) map(from: b) map(tofrom: host_flag) "
|
|
872
|
+
"firstprivate(a)\n"))
|
|
873
|
+
_rule("distribute-dsa-001", BOTH, "omp.directive.distribute",
|
|
874
|
+
_sub("!$omp distribute", "!$omp distribute firstprivate(host_flag) "
|
|
875
|
+
"lastprivate(host_flag)"))
|
|
876
|
+
_rule("datasharing-dsa-001", BOTH, "omp.clause.private",
|
|
877
|
+
_sub("private(t)", "private(t) firstprivate(t)"))
|
|
878
|
+
_USE_DEV = _sub(" implicit none\n", " implicit none\n type :: ud_t\n"
|
|
879
|
+
" integer :: v(4)\n end type ud_t\n type(ud_t) :: su\n")
|
|
880
|
+
_rule("usedevice-clause-001", (52,), "omp.clause.use_device_addr", _chain(
|
|
881
|
+
_USE_DEV, _sub("use_device_addr(a, b)", "use_device_addr(a, b, su%v)")))
|
|
882
|
+
_rule("usedevice-clause-002", (60,), "omp.clause.use_device_addr", _chain(
|
|
883
|
+
_USE_DEV,
|
|
884
|
+
_sub("use_device_addr(a, b)", "use_device_addr(a, b, su%v(1:2))")))
|
|
885
|
+
_rule("dnm-clause-001", BOTH, "omp.clause.if.directive_name",
|
|
886
|
+
_sub("if(parallel: use_dev)", "if(simd: use_dev)"))
|
|
887
|
+
_rule("if-clause-001", BOTH, "omp.clause.if.directive_name",
|
|
888
|
+
_sub("if(parallel: use_dev)", "if(parallel: use_dev) if(use_dev)"))
|
|
889
|
+
_rule("threadlimit-clause-001", BOTH, "omp.clause.thread_limit",
|
|
890
|
+
_sub("thread_limit(16)", "thread_limit(0)"))
|
|
891
|
+
_rule("numteams-clause-001", BOTH, "omp.clause.num_teams",
|
|
892
|
+
_sub("num_teams(4)", "num_teams(0)"))
|
|
893
|
+
_rule("numteams-clause-002", BOTH, "omp.clause.num_teams.lower_bound",
|
|
894
|
+
_sub("num_teams(2: 4)", "num_teams(8: 4)"))
|
|
895
|
+
_rule("distschedule-clause-001", BOTH, "omp.clause.dist_schedule.chunk_size",
|
|
896
|
+
_sub("dist_schedule(static, 4)", "dist_schedule(static, 0)"))
|
|
897
|
+
_rule("reduction-clause-001", BOTH, "omp.directive.teams", _chain(
|
|
898
|
+
_insert(r"logical :: ok", ["integer :: t"]),
|
|
899
|
+
_regex(r"(!\$omp teams [^\n]*)\n", r"\1 reduction(task, +: t)\n")))
|
|
900
|
+
# The device report moves into a one-thread parallel region,
|
|
901
|
+
# since a teams region may not call omp_is_initial_device (teams-nesting-003)
|
|
902
|
+
_rule("reduction-clause-002", BOTH, "omp.clause.reduction.inscan", _chain(
|
|
903
|
+
_regex(r"^( *)(host_flag = merge\(1, 0, omp_is_initial_device\(\)\))\n",
|
|
904
|
+
r"\1!$omp parallel num_threads(1)\n\1 \2\n"
|
|
905
|
+
r"\1!$omp end parallel\n"),
|
|
906
|
+
_sub("!$omp target map", "!$omp target teams map"),
|
|
907
|
+
_sub("!$omp end target\n", "!$omp end target teams\n"),
|
|
908
|
+
_sub("!$omp parallel do", "!$omp distribute parallel do"),
|
|
909
|
+
_sub("!$omp end parallel do", "!$omp end distribute parallel do")))
|
|
910
|
+
_rule("reduction-clause-003", BOTH, "omp.clause.reduction.inscan",
|
|
911
|
+
_sub("reduction(inscan, +: s)", "reduction(inscan, +: s) "
|
|
912
|
+
"reduction(+: host_flag)"))
|
|
913
|
+
_rule("reduction-clause-004", BOTH, "omp.clause.reduction.inscan",
|
|
914
|
+
_sub("reduction(inscan, +: s)", "reduction(inscan, +: s) "
|
|
915
|
+
"schedule(static)"))
|
|
916
|
+
_rule("reduction-clause-005", BOTH, "omp.clause.reduction.task",
|
|
917
|
+
_sub("!$omp end do\n", "!$omp end do nowait\n"))
|
|
918
|
+
_rule("distribute-clause-001", BOTH, "omp.directive.distribute",
|
|
919
|
+
_sub("!$omp distribute", "!$omp distribute "
|
|
920
|
+
"lastprivate(conditional: host_flag)"))
|
|
921
|
+
# The legality oracle of default(none): b is no longer listed
|
|
922
|
+
_rule("default-dsa-001", BOTH, "omp.clause.default.none",
|
|
923
|
+
_sub("default(none) shared(a, b)", "default(none) shared(a)"))
|
|
924
|
+
_rule("listitem-clause-001", BOTH, "omp.clause.private",
|
|
925
|
+
_sub("private(t)", "private(t, b(1))"))
|
|
926
|
+
_rule("device-clause-001", BOTH, "omp.clause.device.ancestor", _sub(
|
|
927
|
+
" !$omp target map(to: a)",
|
|
928
|
+
" !$omp target enter data device(ancestor: 1) map(to: a)\n"
|
|
929
|
+
" !$omp target map(to: a)"))
|
|
930
|
+
_rule("device-clause-002", BOTH, "omp.clause.device.ancestor",
|
|
931
|
+
_sub("device(ancestor: 1)", "device(ancestor: 2)"))
|
|
932
|
+
_rule("device-clause-003", BOTH, "omp.clause.device.ancestor",
|
|
933
|
+
_sub(" !$omp requires reverse_offload\n", ""))
|
|
934
|
+
_rule("target-clause-001", BOTH, "omp.clause.device.ancestor",
|
|
935
|
+
_sub("device(ancestor: 1)", "device(ancestor: 1) if(.true.)"))
|
|
936
|
+
_rule("declaretarget-clause-001", BOTH, "omp.clause.enter",
|
|
937
|
+
_sub("!$omp declare target enter(dv)",
|
|
938
|
+
"!$omp declare target (dv) enter(dw)"))
|
|
939
|
+
_rule("declaretarget-clause-002", (52,), "omp.clause.device_type.any",
|
|
940
|
+
_sub("to(f) device_type(any)", "device_type(any)"))
|
|
941
|
+
_rule("declaretarget-clause-003", BOTH, "omp.clause.link",
|
|
942
|
+
_sub("link(dv)", "link(dv) device_type(nohost)"))
|
|
943
|
+
_rule("requires-clause-001", (52,),
|
|
944
|
+
"omp.clause.atomic_default_mem_order.seq_cst",
|
|
945
|
+
_sub(" !$omp requires atomic_default_mem_order(seq_cst)\n",
|
|
946
|
+
" !$omp requires atomic_default_mem_order(seq_cst)\n"
|
|
947
|
+
" !$omp requires atomic_default_mem_order(relaxed)\n"))
|
|
948
|
+
|
|
949
|
+
# The OpenMP 5.0 variant of a rule that has a 5.0 entry is the 5.2
|
|
950
|
+
# transform applied to the 5.0 program of the same atom (each one checked:
|
|
951
|
+
# it must violate exactly the 5.0 rule), except where the 5.0 rule differs
|
|
952
|
+
# so that the 5.2 change is legal 5.0.
|
|
953
|
+
NO_VARIANT_50: dict[str, str] = {}
|
|
954
|
+
# 5.0 transforms of their own: the 5.0 num_teams program asks for one team
|
|
955
|
+
_T50 = {"numteams-clause-001": ("omp.clause.num_teams",
|
|
956
|
+
_sub("num_teams(1)", "num_teams(0)"))}
|
|
957
|
+
_RULES50 = {r.id for r in default_rules() if r.version == 50}
|
|
958
|
+
for _stem, _by in list(_T.items()):
|
|
959
|
+
if 52 in _by and f"OMP50-{_stem}" in _RULES50 \
|
|
960
|
+
and _stem not in NO_VARIANT_50:
|
|
961
|
+
_by[50] = _T50.get(_stem, _by[52])
|
|
962
|
+
|
|
963
|
+
NOT_GENERATABLE_WHY: dict[str, str] = {
|
|
964
|
+
f"OMP50-{_stem}": _why for _stem, _why in NO_VARIANT_50.items()}
|
|
965
|
+
for _v in (50,) + BOTH:
|
|
966
|
+
for _stem in ("defaultmap-map-001", "defaultmap-map-002"):
|
|
967
|
+
if _v == 50 and _stem == "defaultmap-map-002":
|
|
968
|
+
continue # the all category is 5.2
|
|
969
|
+
NOT_GENERATABLE_WHY[f"OMP{_v}-{_stem}"] = (
|
|
970
|
+
"no violation template: the generator writes one defaultmap "
|
|
971
|
+
"clause per construct (the grammar lets defaultmap repeat since "
|
|
972
|
+
"; the rule checks parsed source)")
|
|
973
|
+
|
|
974
|
+
# rule id -> (base atom, source transform); the OpenACC transforms are
|
|
975
|
+
# offload.engine.acc_gen's
|
|
976
|
+
VIOLATION_BASE: dict[str, tuple[str, Callable[[str], str]]] = {
|
|
977
|
+
f"OMP{v}-{stem}": entry for stem, by in _T.items()
|
|
978
|
+
for v, entry in by.items()}
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
def _acc_violations():
|
|
982
|
+
from offload.engine import acc_gen
|
|
983
|
+
for stem, entry in acc_gen.ILLEGAL.items():
|
|
984
|
+
VIOLATION_BASE[f"ACC34-{stem}"] = entry
|
|
985
|
+
from offload.engine.rules import acc_rules
|
|
986
|
+
for r in acc_rules():
|
|
987
|
+
if r.check == "static" and r.id not in VIOLATION_BASE:
|
|
988
|
+
NOT_GENERATABLE_WHY[r.id] = acc_gen.NO_VARIANT_WHY
|
|
989
|
+
|
|
990
|
+
# Added the remaining static restrictions (data/reports/
|
|
991
|
+
# rules-coverage.md); their illegal programs are the unit cases of
|
|
992
|
+
# tests/engine/test_generators.py (CASES), not generated variants.
|
|
993
|
+
TASK16_NO_VARIANT = ("Rule: no single-change illegal variant of a "
|
|
994
|
+
"generated program is written; the rule's legal and "
|
|
995
|
+
"illegal programs are the unit cases in "
|
|
996
|
+
"tests/engine/test_generators.py (CASES)")
|
|
997
|
+
for _r in default_rules():
|
|
998
|
+
if _r.check == "static" and _r.id not in NOT_GENERATABLE_WHY and \
|
|
999
|
+
_r.id not in VIOLATION_BASE:
|
|
1000
|
+
NOT_GENERATABLE_WHY[_r.id] = TASK16_NO_VARIANT
|
|
1001
|
+
_acc_violations()
|
|
1002
|
+
# The iterator restriction of map clauses is checked to judge
|
|
1003
|
+
# corpus tests (omp_vv); a catalog variant would add a program whose
|
|
1004
|
+
# behaviour is unspecified and need not be diagnosed, and no measurement
|
|
1005
|
+
for _v in BOTH:
|
|
1006
|
+
NOT_GENERATABLE_WHY[f"OMP{_v}-map-clause-005"] = (
|
|
1007
|
+
"added to judge corpus tests: a variant with two "
|
|
1008
|
+
"iterator instances of one containing array has unspecified "
|
|
1009
|
+
"behaviour that need not be diagnosed, so it measures nothing")
|
|
1010
|
+
|
|
1011
|
+
NOT_GENERATABLE: set[str] = set(NOT_GENERATABLE_WHY)
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
_ZERO_COPY_SOURCE = re.compile(
|
|
1015
|
+
r"^\s*!\$omp\s+requires\b[^\n]*\b(unified_shared_memory|self_maps)\b"
|
|
1016
|
+
r"|\bmap\s*\(\s*self\b|\bdefaultmap\s*\(\s*self\b", re.M | re.I)
|
|
1017
|
+
|
|
1018
|
+
|
|
1019
|
+
def needs_zero_copy(source: str) -> bool:
|
|
1020
|
+
"""Whether a source uses a feature that needs memory the device can
|
|
1021
|
+
access (requires unified_shared_memory / self_maps, self maps)."""
|
|
1022
|
+
return bool(_ZERO_COPY_SOURCE.search(source))
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
def _make_violation(rid: str) -> Callable[[Program], Program]:
|
|
1026
|
+
version = int(rid[3:5])
|
|
1027
|
+
fn = VIOLATION_BASE[rid][1]
|
|
1028
|
+
|
|
1029
|
+
def apply(prog: Program) -> Program:
|
|
1030
|
+
pid = f"{model_of(version)}{version}-illegal-{rid.split('-', 1)[1]}"
|
|
1031
|
+
source = fn(prog.source)
|
|
1032
|
+
primary = variant_primary(rid)
|
|
1033
|
+
if primary != prog.primary_atom:
|
|
1034
|
+
source = re.sub(r"^! primary atom: .*$",
|
|
1035
|
+
f"! primary atom: {primary}", source, count=1,
|
|
1036
|
+
flags=re.M)
|
|
1037
|
+
source = re.sub(r"^! id: .*$", f"! id: {pid}", source, count=1,
|
|
1038
|
+
flags=re.M)
|
|
1039
|
+
source = re.sub(r"^! legal: .*$", f"! legal: no (violates {rid})",
|
|
1040
|
+
source, count=1, flags=re.M)
|
|
1041
|
+
try:
|
|
1042
|
+
atoms = _parsed_atoms(source, version)
|
|
1043
|
+
except (GrammarError, ProgramError) as err:
|
|
1044
|
+
raise GenError(f"{pid}: {err}\n{source}") from err
|
|
1045
|
+
needs = tuple(prog.needs)
|
|
1046
|
+
if "zero_copy" not in needs and needs_zero_copy(source):
|
|
1047
|
+
needs += ("zero_copy",)
|
|
1048
|
+
source = re.sub(r"^! needs: .*$", "! needs: " + ", ".join(needs),
|
|
1049
|
+
source, count=1, flags=re.M)
|
|
1050
|
+
return dataclasses.replace(prog, id=pid, source=source, atoms=atoms,
|
|
1051
|
+
legal=False, violates=rid, needs=needs,
|
|
1052
|
+
primary_atom=primary)
|
|
1053
|
+
return apply
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
def variant_primary(rid: str) -> str:
|
|
1057
|
+
"""The primary atom of the illegal variant of `rid`: its base atom, or
|
|
1058
|
+
the VARIANT_PRIMARY override."""
|
|
1059
|
+
return VARIANT_PRIMARY.get(rid.split("-", 1)[1],
|
|
1060
|
+
VIOLATION_BASE[rid][0])
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
VIOLATIONS: dict[str, Callable[[Program], Program]] = {
|
|
1064
|
+
rid: _make_violation(rid) for rid in VIOLATION_BASE}
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
def _check_rule_sets():
|
|
1068
|
+
rules = {r.id: r for v in (52, 34) for r in rules_for(v)}
|
|
1069
|
+
for rid in VIOLATIONS:
|
|
1070
|
+
if rid not in rules or rules[rid].check != "static":
|
|
1071
|
+
raise GenError(f"VIOLATIONS names {rid}, not a static rule")
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
_check_rule_sets()
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
@lru_cache(maxsize=None)
|
|
1078
|
+
def _illegal(rid: str) -> Program:
|
|
1079
|
+
version = int(rid[3:5])
|
|
1080
|
+
base_atom, _ = VIOLATION_BASE[rid]
|
|
1081
|
+
prog = VIOLATIONS[rid](_legal(base_atom, version))
|
|
1082
|
+
found = violations(parse_program(prog.source, version), version)
|
|
1083
|
+
if found != [rid]:
|
|
1084
|
+
raise GenError(f"{prog.id}: violates {found}, expected [{rid}]\n"
|
|
1085
|
+
f"{prog.source}")
|
|
1086
|
+
_check_scope(prog)
|
|
1087
|
+
return prog
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
# --- the entry point ------------------------------------------------------------------
|
|
1091
|
+
|
|
1092
|
+
def generate(atoms: Iterable[str], version: int) -> Iterator[Program]:
|
|
1093
|
+
"""One legal program per atom (sorted), then the illegal variants whose
|
|
1094
|
+
base atom is among `atoms` (sorted by rule id). An atom listed in
|
|
1095
|
+
UNGENERATABLE[version] is skipped (with its stated reason); any other
|
|
1096
|
+
atom without a program raises GenError."""
|
|
1097
|
+
wanted = sorted(set(atoms))
|
|
1098
|
+
skip = UNGENERATABLE.get(version, {})
|
|
1099
|
+
for atom in wanted:
|
|
1100
|
+
if atom in skip:
|
|
1101
|
+
continue
|
|
1102
|
+
yield with_derivation(_legal(atom, version), atom, version)
|
|
1103
|
+
if atom in HOST_DEVICE and model_of(version) == "omp":
|
|
1104
|
+
yield _hostdev(atom, version)
|
|
1105
|
+
chosen = set(wanted) - set(skip)
|
|
1106
|
+
for rid in sorted(VIOLATION_BASE):
|
|
1107
|
+
if rid.startswith(f"{RULE_PREFIX[model_of(version)]}{version}-") \
|
|
1108
|
+
and VIOLATION_BASE[rid][0] in chosen:
|
|
1109
|
+
yield _illegal(rid)
|
|
1110
|
+
|
|
1111
|
+
|
|
1112
|
+
def all_programs(version: int) -> list[Program]:
|
|
1113
|
+
"""Every program of the slice at `version`."""
|
|
1114
|
+
return list(generate(slice_atoms(version), version))
|