offtarget 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- offload/__init__.py +10 -0
- offload/__main__.py +5 -0
- offload/_bundle.py +74 -0
- offload/_root/catalog/acc/claims.yaml +197 -0
- offload/_root/catalog/acc/clauses.yaml +391 -0
- offload/_root/catalog/acc/no_oracle.yaml +89 -0
- offload/_root/catalog/acc/out_of_scope.yaml +17 -0
- offload/_root/catalog/acc/rules.yaml +433 -0
- offload/_root/catalog/acc/semantic_atoms.yaml +27 -0
- offload/_root/catalog/acc/skeleton.yaml +1567 -0
- offload/_root/catalog/acc/spec_overrides.yaml +72 -0
- offload/_root/catalog/later_forms.yaml +76 -0
- offload/_root/catalog/machines.yaml +218 -0
- offload/_root/catalog/omp/claims.yaml +2047 -0
- offload/_root/catalog/omp/clauses.yaml +914 -0
- offload/_root/catalog/omp/derivations.yaml +177 -0
- offload/_root/catalog/omp/memory_modes.yaml +40 -0
- offload/_root/catalog/omp/no_oracle.yaml +373 -0
- offload/_root/catalog/omp/omp50_delta.yaml +377 -0
- offload/_root/catalog/omp/out_of_scope.yaml +64 -0
- offload/_root/catalog/omp/port_equivalence.yaml +352 -0
- offload/_root/catalog/omp/rules.yaml +3131 -0
- offload/_root/catalog/omp/rules_coverage.yaml +9939 -0
- offload/_root/catalog/omp/semantic_atoms.yaml +34 -0
- offload/_root/catalog/omp/skeleton.yaml +9181 -0
- offload/_root/catalog/omp/spec_overrides.yaml +932 -0
- offload/_root/catalog/toolchains.yaml +472 -0
- offload/_root/catalog/vendor_claims_generic.yaml +40925 -0
- offload/_root/data/canuse/b.json +1 -0
- offload/_root/data/canuse/c.json +1 -0
- offload/_root/data/canuse/columns.json +1 -0
- offload/_root/data/canuse/d.json +1 -0
- offload/_root/data/canuse/f.json +1 -0
- offload/_root/data/canuse/index.json +1 -0
- offload/_root/data/canuse/p.json +1 -0
- offload/_root/data/compilers/afar.json +1 -0
- offload/_root/data/compilers/cce19.json +1 -0
- offload/_root/data/compilers/cce20.json +1 -0
- offload/_root/data/compilers/cce21.json +1 -0
- offload/_root/data/compilers/cce21_4.json +1 -0
- offload/_root/data/compilers/gcc.json +1 -0
- offload/_root/data/compilers/gcc_sm80.json +1 -0
- offload/_root/data/compilers/nvhpc.json +1 -0
- offload/_root/data/compilers/nvhpc269.json +1 -0
- offload/_root/data/findings/AUTHORING.md +107 -0
- offload/_root/data/findings/README.md +33 -0
- offload/_root/data/findings/afar-c-error-directive-in-target-link.c +37 -0
- offload/_root/data/findings/afar-c-lastprivate-distribute-parallel-for-small-type.c +56 -0
- offload/_root/data/findings/afar-c-teams-distribute-reduction-first-team.c +59 -0
- offload/_root/data/findings/afar-c-update-iterator-copy-mode.c +45 -0
- offload/_root/data/findings/afar-c-xnack1-target-is-present.c +31 -0
- offload/_root/data/findings/afar-cce19-character-defaultmap.f90 +27 -0
- offload/_root/data/findings/afar-cce19-task-in-target-ice.f90 +23 -0
- offload/_root/data/findings/afar-clang-requires-device-safesync-hang.c +24 -0
- offload/_root/data/findings/afar-flang-firstprivate-map-two-targets.f90 +34 -0
- offload/_root/data/findings/afar-flang-loop-bind-teams-reduction.f90 +27 -0
- offload/_root/data/findings/afar-flang-task-reduction-max.f90 +31 -0
- offload/_root/data/findings/afar-flang-thread-limit-target-parallel-do.f90 +22 -0
- offload/_root/data/findings/afar-linear-ref-omp50.f90 +29 -0
- offload/_root/data/findings/afar-loop-bind-thread-in-teams.f90 +44 -0
- offload/_root/data/findings/afar-nontemporal-assumed-shape-ice.f90 +38 -0
- offload/_root/data/findings/afar-udr-derived-type-link.f90 +41 -0
- offload/_root/data/findings/afar-xnack1-atomic-min-nested-parallel.f90 +53 -0
- offload/_root/data/findings/afar-xnack1-present-not-enforced.f90 +36 -0
- offload/_root/data/findings/afar-xnack1-target-is-present.f90 +47 -0
- offload/_root/data/findings/apps/afar-cce-teams-private-array-nested-parallel-wrong.f90 +100 -0
- offload/_root/data/findings/apps/cce20-device-link-infer-address-spaces-crash.f90 +159 -0
- offload/_root/data/findings/apps/cce21-device-link-agpr-copy-mfma-assert.f90 +343 -0
- offload/_root/data/findings/apps/cce21-private-array-loaded-subscript-wrong.f90 +113 -0
- offload/_root/data/findings/apps/controls/bubble-simple-rddot.f90 +284 -0
- offload/_root/data/findings/apps/controls/bubble-two-substeps.f90 +287 -0
- offload/_root/data/findings/apps/controls/cbc-inline.f90 +97 -0
- offload/_root/data/findings/apps/controls/cbc-integers.f90 +91 -0
- offload/_root/data/findings/apps/controls/cbc-only-density.f90 +97 -0
- offload/_root/data/findings/apps/controls/cbc-only-velocity.f90 +97 -0
- offload/_root/data/findings/apps/controls/gcc-acc-c-tile-control.c +26 -0
- offload/_root/data/findings/apps/controls/gcc-acc-tile-control.f90 +29 -0
- offload/_root/data/findings/apps/controls/private-array-subscript-probes.f90 +45 -0
- offload/_root/data/findings/apps/controls/teams-private-array-read-par.f90 +31 -0
- offload/_root/data/findings/apps/controls/teams-private-array-seq.f90 +30 -0
- offload/_root/data/findings/apps/controls/teams-private-array-shared.f90 +34 -0
- offload/_root/data/findings/apps/controls/teams-private-array-split.f90 +36 -0
- offload/_root/data/findings/apps/controls/teams-private-array-write-par.f90 +31 -0
- offload/_root/data/findings/apps/gcc-acc-c-tile-partial-tiles-wrong.c +60 -0
- offload/_root/data/findings/apps/gcc-acc-tile-partial-tiles-wrong.f90 +64 -0
- offload/_root/data/findings/catalog/afar-c-complex-reduction-link.c +66 -0
- offload/_root/data/findings/catalog/afar-c-critical-hint-link.c +68 -0
- offload/_root/data/findings/catalog/afar-c-ordered-doacross-link.c +62 -0
- offload/_root/data/findings/catalog/afar-c-reduction-task-link.c +81 -0
- offload/_root/data/findings/catalog/afar-flang-absent-optional-target-crash.f90 +76 -0
- offload/_root/data/findings/catalog/afar-flang-critical-target-parallel-wrong.f90 +74 -0
- offload/_root/data/findings/catalog/afar-flang-dist-schedule-chunk.f90 +80 -0
- offload/_root/data/findings/catalog/afar-flang-linear-parallel-ice.f90 +68 -0
- offload/_root/data/findings/catalog/afar-flang-named-critical-link.f90 +67 -0
- offload/_root/data/findings/catalog/afar-flang-ordered-wrong.f90 +78 -0
- offload/_root/data/findings/catalog/afar-flang-reduction-minus-rejected.f90 +77 -0
- offload/_root/data/findings/catalog/afar-flang-reduction-task-ice.f90 +68 -0
- offload/_root/data/findings/catalog/afar-flang-sections-in-target-ice.f90 +67 -0
- offload/_root/data/findings/catalog/afar-flang-workdistribute-ice.f90 +71 -0
- offload/_root/data/findings/catalog/c-allocate-const-mem-firstprivate-wrong.c +79 -0
- offload/_root/data/findings/catalog/cce-acc-allocate-in-compute-crash.f90 +65 -0
- offload/_root/data/findings/catalog/cce-acc-character-dummy-routine-ice.f90 +81 -0
- offload/_root/data/findings/catalog/cce-acc-loop-seq-in-routine-wrong.f90 +81 -0
- offload/_root/data/findings/catalog/cce-acc-stop-in-compute-crash.f90 +62 -0
- offload/_root/data/findings/catalog/cce-allocators-stack-ice.f90 +81 -0
- offload/_root/data/findings/catalog/cce-atomic-default-mem-order-acquire-release-rejected.f90 +61 -0
- offload/_root/data/findings/catalog/cce-c-allocate-align-link.c +83 -0
- offload/_root/data/findings/catalog/cce-c-allocate-allocator-modifier-rejected.c +77 -0
- offload/_root/data/findings/catalog/cce-c-device-type-directive-name-ice.c +70 -0
- offload/_root/data/findings/catalog/cce-c-dist-schedule-chunk.c +81 -0
- offload/_root/data/findings/catalog/cce-c-f-pointer-device-link.f90 +70 -0
- offload/_root/data/findings/catalog/cce-c-lastprivate-parallel-in-seq-loop-wrong.c +64 -0
- offload/_root/data/findings/catalog/cce-c-long-double-ice.c +61 -0
- offload/_root/data/findings/catalog/cce-c-map-iterator-ice.c +92 -0
- offload/_root/data/findings/catalog/cce-c-motion-iterator-rejected.c +68 -0
- offload/_root/data/findings/catalog/cce-c-ordered-doacross-link.c +64 -0
- offload/_root/data/findings/catalog/cce-c-ordered-link.c +77 -0
- offload/_root/data/findings/catalog/cce-c-recursive-function-ice.c +62 -0
- offload/_root/data/findings/catalog/cce-c-reduction-inscan-ice.c +67 -0
- offload/_root/data/findings/catalog/cce-c-reduction-task-link.c +73 -0
- offload/_root/data/findings/catalog/cce-c-sections-in-target-wrong.c +70 -0
- offload/_root/data/findings/catalog/cce-c-single-masked-task-link.c +66 -0
- offload/_root/data/findings/catalog/cce-c-task-in-target-link.c +75 -0
- offload/_root/data/findings/catalog/cce-c-uses-allocators-traits-rejected.c +71 -0
- offload/_root/data/findings/catalog/cce-flang-allocate-const-mem-ice.f90 +67 -0
- offload/_root/data/findings/catalog/cce-flang-allocate-in-target-crash.f90 +68 -0
- offload/_root/data/findings/catalog/cce-flang-lastprivate-parallel-in-seq-loop-wrong.f90 +83 -0
- offload/_root/data/findings/catalog/cce-flang-stop-in-target-crash.f90 +64 -0
- offload/_root/data/findings/catalog/cce-iterator-link.f90 +67 -0
- offload/_root/data/findings/catalog/cce-linear-lastprivate-ice.f90 +69 -0
- offload/_root/data/findings/catalog/cce-nohost-link.f90 +90 -0
- offload/_root/data/findings/catalog/cce-reduction-inscan-ice.f90 +66 -0
- offload/_root/data/findings/catalog/cce-reduction-task-link.f90 +76 -0
- offload/_root/data/findings/catalog/cce19-reduction-task-addrspacecast-ice.f90 +77 -0
- offload/_root/data/findings/catalog/cce20-c-defaultmap-private-storage-rejected.c +85 -0
- offload/_root/data/findings/catalog/cce20-map-self-rejected.f90 +64 -0
- offload/_root/data/findings/catalog/cce21-c-declare-target-local-rejected.c +73 -0
- offload/_root/data/findings/catalog/cce21-c-target-loop-ice.c +77 -0
- offload/_root/data/findings/catalog/defaultmap-present-private-array-abort.f90 +73 -0
- offload/_root/data/findings/catalog/nvhpc-acc-associate-illegal-address.f90 +66 -0
- offload/_root/data/findings/catalog/nvhpc-c-function-pointer-kernel-missing.c +68 -0
- offload/_root/data/findings/catalog/nvhpc-c-long-double-kernel-missing.c +64 -0
- offload/_root/data/findings/catalog/nvhpc-c-static-local-kernel-missing.c +73 -0
- offload/_root/data/findings/catalog/nvhpc-c-vla-kernel-missing.c +63 -0
- offload/_root/data/findings/catalog/nvhpc-flang-type-bound-kernel-missing.f90 +86 -0
- offload/_root/data/findings/cce-acc-init-set-runtime-assert.f90 +35 -0
- offload/_root/data/findings/cce-acc-reduction-200-int8-scalars-wrong.f90 +1278 -0
- offload/_root/data/findings/cce-acc-routine-bind-module-ice.f90 +35 -0
- offload/_root/data/findings/cce-acc-self-condition-ignored.f90 +17 -0
- offload/_root/data/findings/cce-c-dist-schedule-segv.c +34 -0
- offload/_root/data/findings/cce-c-map-delete-refcount.c +47 -0
- offload/_root/data/findings/cce-c-map-present-assert.c +45 -0
- offload/_root/data/findings/cce-c-openmp45-device-link.c +34 -0
- offload/_root/data/findings/cce-c-parallel-for-in-target.c +73 -0
- offload/_root/data/findings/cce-defaultmap-tofrom-explicit-map.f90 +92 -0
- offload/_root/data/findings/cce-mapper-next-map-copy-back.f90 +48 -0
- offload/_root/data/findings/cce-trim-merge-output-one-character.f90 +40 -0
- offload/_root/data/findings/cce-uses-allocators-traits-omp50.f90 +28 -0
- offload/_root/data/findings/cce19-acc-if-false-link.f90 +17 -0
- offload/_root/data/findings/cce19-c-reduction-63-scalars-one-wrong.c +235 -0
- offload/_root/data/findings/cce19-target-parallel-guarded-loop.f90 +35 -0
- offload/_root/data/findings/cce19-target-parallel-single-ice.f90 +38 -0
- offload/_root/data/findings/cce21-alloc-2e32-sum-wrong.f90 +68 -0
- offload/_root/data/findings/cce21-defaultmap-aggregate-flag.f90 +52 -0
- offload/_root/data/findings/cce21-in-reduction-assumed-shape-write-lost.f90 +61 -0
- offload/_root/data/findings/cce21-in-reduction-taskwait-link.f90 +59 -0
- offload/_root/data/findings/cce21-linear-modifier-default-none.f90 +59 -0
- offload/_root/data/findings/clang-c-declare-target-to-omp52.c +50 -0
- offload/_root/data/findings/clang-c-linear-directive-name-hang.c +30 -0
- offload/_root/data/findings/clang-c-map-iterator-omp51.c +51 -0
- offload/_root/data/findings/clang-c-shared-declare-target-combined.c +58 -0
- offload/_root/data/findings/dataenv/cce-value-dummy-target-write-visible.f90 +74 -0
- offload/_root/data/findings/defaultmap-none-loop-variable.f90 +69 -0
- offload/_root/data/findings/fortran-loop-bind-thread-in-parallel.f90 +53 -0
- offload/_root/data/findings/fortran-schedule-static-in-target.f90 +55 -0
- offload/_root/data/findings/fresh/cce-common-block-name-in-map-rejected.f90 +47 -0
- offload/_root/data/findings/fresh/cce-if-stop-in-target-ice-one-condition.f90 +38 -0
- offload/_root/data/findings/fresh/cce-if-stop-in-target-ice.f90 +43 -0
- offload/_root/data/findings/fresh/cce-list-directed-print-in-target-copy-crash.f90 +40 -0
- offload/_root/data/findings/fresh/cce19-acc-automatic-array-copyout-copy-crash.f90 +56 -0
- offload/_root/data/findings/fresh/cce21-combined-if-runtime-expr-loop-skipped.f90 +57 -0
- offload/_root/data/findings/fresh/nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.f90 +67 -0
- offload/_root/data/findings/fresh/nvhpc-teams-loop-module-allocatable-assign-fort2-crash.f90 +73 -0
- offload/_root/data/findings/fuzz/1131-afar.f90 +48 -0
- offload/_root/data/findings/fuzz/1391-cce20.f90 +40 -0
- offload/_root/data/findings/fuzz/14-cce20.f90 +36 -0
- offload/_root/data/findings/fuzz/1505-cce20.f90 +88 -0
- offload/_root/data/findings/fuzz/1540-afar.f90 +44 -0
- offload/_root/data/findings/fuzz/158-afar.f90 +63 -0
- offload/_root/data/findings/fuzz/16-cce20.f90 +39 -0
- offload/_root/data/findings/fuzz/1644-cce21.f90 +31 -0
- offload/_root/data/findings/fuzz/165-cce19.f90 +52 -0
- offload/_root/data/findings/fuzz/1749-cce20.f90 +34 -0
- offload/_root/data/findings/fuzz/1936-afar.f90 +61 -0
- offload/_root/data/findings/fuzz/1978-cce19.f90 +41 -0
- offload/_root/data/findings/fuzz/2014-cce19.f90 +46 -0
- offload/_root/data/findings/fuzz/2224-cce19.f90 +30 -0
- offload/_root/data/findings/fuzz/2334-cce19.f90 +57 -0
- offload/_root/data/findings/fuzz/536-cce19.f90 +38 -0
- offload/_root/data/findings/fuzz/591-cce19.f90 +54 -0
- offload/_root/data/findings/fuzz/650-afar.f90 +58 -0
- offload/_root/data/findings/fuzz/698-afar.f90 +68 -0
- offload/_root/data/findings/fuzz/700-afar.f90 +46 -0
- offload/_root/data/findings/fuzz/775-cce21.f90 +33 -0
- offload/_root/data/findings/fuzz/87-afar.f90 +47 -0
- offload/_root/data/findings/fuzz/916-afar.f90 +67 -0
- offload/_root/data/findings/fuzz/958-cce20.f90 +44 -0
- offload/_root/data/findings/fuzz/98-cce19.f90 +40 -0
- offload/_root/data/findings/fuzz/README.md +236 -0
- offload/_root/data/findings/fuzz/b1-121-afar.f90 +47 -0
- offload/_root/data/findings/fuzz/b1-183-afar.f90 +55 -0
- offload/_root/data/findings/fuzz/b1-22-cce20.f90 +38 -0
- offload/_root/data/findings/fuzz/b1-231-afar.f90 +56 -0
- offload/_root/data/findings/fuzz/b1-268-afar.f90 +46 -0
- offload/_root/data/findings/fuzz/b2-183-afar.f90 +57 -0
- offload/_root/data/findings/fuzz/b2-209-cce19.f90 +51 -0
- offload/_root/data/findings/fuzz/b2-213-afar.f90 +63 -0
- offload/_root/data/findings/fuzz/b2-52-afar.f90 +56 -0
- offload/_root/data/findings/fuzz/b2-68-afar.f90 +54 -0
- offload/_root/data/findings/fuzz/b2-85-cce20.f90 +55 -0
- offload/_root/data/findings/fuzz/b3-188-cce19.f90 +90 -0
- offload/_root/data/findings/fuzz/b3-190-cce21.f90 +88 -0
- offload/_root/data/findings/fuzz/b3-197-cce19.f90 +77 -0
- offload/_root/data/findings/fuzz/b3-250-cce20.f90 +89 -0
- offload/_root/data/findings/fuzz/b3-278-cce19.f90 +70 -0
- offload/_root/data/findings/fuzz/b3-45-cce21.f90 +83 -0
- offload/_root/data/findings/fuzz/b3-54-afar.f90 +67 -0
- offload/_root/data/findings/fuzz/b3-61-cce20.f90 +100 -0
- offload/_root/data/findings/fuzz/b3-9-afar.f90 +100 -0
- offload/_root/data/findings/fuzz/b3-9-cce21.f90 +103 -0
- offload/_root/data/findings/fuzz/b3-94-afar.f90 +80 -0
- offload/_root/data/findings/fuzz/b4-39-afar.f90 +141 -0
- offload/_root/data/findings/fuzz/b4-86-cce19.f90 +71 -0
- offload/_root/data/findings/fuzz/controls/gcc-complex-pointer-store-control.f90 +28 -0
- offload/_root/data/findings/fuzz/controls/gcc-declare-reduction-module-control.f90 +29 -0
- offload/_root/data/findings/fuzz/controls/gcc-target-simd-map-nontemporal-control.f90 +21 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-mapped-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-unreferenced-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-default-none-removed-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-default-shared-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-firstprivate-removed-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-reduction-mapped-control.f90 +17 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-removed-control.f90 +17 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-tofrom-lastprivate-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-depend-explicit-map-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-depend-removed-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-end-distribute-control.f90 +16 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-num-threads-removed-control.f90 +26 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-removed-control.f90 +22 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-distribute-simd-no-end-directive-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-explicit-length-character-dummy-control.f90 +18 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-array-value-control.f90 +23 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-distribute-control.f90 +20 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-map-always-first-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-map-always-removed-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-num-threads-removed-control.f90 +12 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-firstprivate-dropped-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-single-nowait-control.f90 +13 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-split-control.f90 +15 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-collapse-split-control.f90 +21 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-end-directive-control.f90 +14 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-no-collapse-control.f90 +19 -0
- offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-split-no-end-directive-control.f90 +15 -0
- offload/_root/data/findings/fuzz/gcc-declare-reduction-module-not-found.f90 +66 -0
- offload/_root/data/findings/fuzz/gcc-strided-target-update-rejected.f90 +58 -0
- offload/_root/data/findings/fuzz/gcc-target-simd-map-nontemporal-rejected.f90 +54 -0
- offload/_root/data/findings/fuzz/nvhpc-allocatable-component-implicit-map-illegal-address.f90 +84 -0
- offload/_root/data/findings/fuzz/nvhpc-assumed-length-character-dummy-map-ice.f90 +69 -0
- offload/_root/data/findings/fuzz/nvhpc-default-none-reduction-lastprivate-fort1-crash.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-defaultmap-firstprivate-lastprivate-ice.f90 +71 -0
- offload/_root/data/findings/fuzz/nvhpc-defaultmap-to-scalar-reduction-lost.f90 +82 -0
- offload/_root/data/findings/fuzz/nvhpc-depend-implicit-map-illegal-address.f90 +81 -0
- offload/_root/data/findings/fuzz/nvhpc-distribute-parallel-num-threads-writes-lost.f90 +79 -0
- offload/_root/data/findings/fuzz/nvhpc-end-distribute-simd-rejected.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-loop-character-achar-unsupported.f90 +75 -0
- offload/_root/data/findings/fuzz/nvhpc-map-always-after-map-to-not-copied-back.f90 +70 -0
- offload/_root/data/findings/fuzz/nvhpc-num-threads-reduction-identity-lost.f90 +54 -0
- offload/_root/data/findings/fuzz/nvhpc-target-parallel-firstprivate-translate-failure.f90 +66 -0
- offload/_root/data/findings/fuzz/nvhpc-target-parallel-single-hang.f90 +68 -0
- offload/_root/data/findings/fuzz/nvhpc-target-simd-collapse-translate-failure.f90 +73 -0
- offload/_root/data/findings/fuzz/nvhpc-target-simd-no-end-directive-rejected.f90 +68 -0
- offload/_root/data/findings/fuzz/par-s1-2082-gcc_g90.f90 +71 -0
- offload/_root/data/findings/fuzz/s1-2370-cce21.f90 +67 -0
- offload/_root/data/findings/fuzz/s1-2592-cce21.f90 +56 -0
- offload/_root/data/findings/fuzz/s1-3463-cce21.f90 +92 -0
- offload/_root/data/findings/fuzz/s1-4339-afar.f90 +79 -0
- offload/_root/data/findings/fuzz/s1-6085-cce21.f90 +96 -0
- offload/_root/data/findings/fuzz/s1-6760-cce20.f90 +65 -0
- offload/_root/data/findings/fuzz/s1-6888-cce21.f90 +76 -0
- offload/_root/data/findings/fuzz/s1-7882-cce20.f90 +63 -0
- offload/_root/data/findings/fuzz/s1-8634-cce21.f90 +45 -0
- offload/_root/data/findings/fuzz/s1-91-cce21.f90 +92 -0
- offload/_root/data/findings/fuzz/s1-9443-afar.f90 +59 -0
- offload/_root/data/findings/fuzz/s1-9914-cce19.f90 +78 -0
- offload/_root/data/findings/gcc/controls/gcc-acc-c-detach-control.c +34 -0
- offload/_root/data/findings/gcc/controls/gcc-acc-detach-control.f90 +26 -0
- offload/_root/data/findings/gcc/controls/gcc-defaultmap-to-pointer-control.f90 +31 -0
- offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.c +26 -0
- offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.f90 +21 -0
- offload/_root/data/findings/gcc/gcc-acc-bind-device-type-rejected.f90 +71 -0
- offload/_root/data/findings/gcc/gcc-acc-c-bind-device-type-rejected.c +76 -0
- offload/_root/data/findings/gcc/gcc-acc-c-detach-delete-attach-underflow.c +74 -0
- offload/_root/data/findings/gcc/gcc-acc-c-gang-dim-rejected.c +79 -0
- offload/_root/data/findings/gcc/gcc-acc-c-link-in-routine-rejected.c +82 -0
- offload/_root/data/findings/gcc/gcc-acc-detach-delete-attach-underflow.f90 +66 -0
- offload/_root/data/findings/gcc/gcc-acc-gang-dim-collapse-force-rejected.f90 +69 -0
- offload/_root/data/findings/gcc/gcc-acc-init-set-shutdown-rejected.f90 +70 -0
- offload/_root/data/findings/gcc/gcc-acc-link-in-routine-rejected.f90 +82 -0
- offload/_root/data/findings/gcc/gcc-acc-use-device-allocatable-rejected.f90 +88 -0
- offload/_root/data/findings/gcc/gcc-c-motion-mapper-rejected.c +110 -0
- offload/_root/data/findings/gcc/gcc-c-omp60-undocumented-rejected.c +76 -0
- offload/_root/data/findings/gcc/gcc-c-omp60-unimplemented-rejected.c +119 -0
- offload/_root/data/findings/gcc/gcc-c-target-in-task-mandatory-device-not-found.c +87 -0
- offload/_root/data/findings/gcc/gcc-c-uses-allocators-traits-unimplemented.c +85 -0
- offload/_root/data/findings/gcc/gcc-declare-mapper-rejected.f90 +85 -0
- offload/_root/data/findings/gcc/gcc-defaultmap-to-pointer-copy-back.f90 +66 -0
- offload/_root/data/findings/gcc/gcc-loop-bind-default-none-rejected.f90 +93 -0
- offload/_root/data/findings/gcc/gcc-omp60-undocumented-rejected.f90 +72 -0
- offload/_root/data/findings/gcc/gcc-omp60-unimplemented-rejected.f90 +112 -0
- offload/_root/data/findings/gcc/gcc-target-in-task-mandatory-device-not-found.f90 +83 -0
- offload/_root/data/findings/gcc/gcc-uses-allocators-traits-unimplemented.f90 +78 -0
- offload/_root/data/findings/harvest/afar-flang-strided-target-update.f90 +96 -0
- offload/_root/data/findings/harvest/cce-acc-declare-create-module-allocatable-xnack1-fault.f90 +58 -0
- offload/_root/data/findings/harvest/cce-c-implicit-struct-map-partly-present.c +100 -0
- offload/_root/data/findings/harvest/cce-c-strided-target-update.c +74 -0
- offload/_root/data/findings/harvest/cce-ftn-target-parallel-thread-query-ice.f90 +67 -0
- offload/_root/data/findings/harvest/cce-named-constant-array-declare-target-routine-rejected.f90 +69 -0
- offload/_root/data/findings/harvest/cce-use-device-ptr-c-ptr-not-converted.f90 +64 -0
- offload/_root/data/findings/harvest/cce21-declare-target-link-module-variable-write-lost.f90 +63 -0
- offload/_root/data/findings/harvest/cce21-internal-procedure-calls-internal-in-target-fault.f90 +71 -0
- offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-target-only-control.c +22 -0
- offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-whole-control.c +23 -0
- offload/_root/data/findings/harvest/controls/gcc-acc-declare-create-allocatable-control.f90 +34 -0
- offload/_root/data/findings/harvest/controls/gcc-c-same-item-two-maps-control.c +17 -0
- offload/_root/data/findings/harvest/controls/gcc-c-target-data-struct-pointer-section-control.c +27 -0
- offload/_root/data/findings/harvest/controls/gcc-c-target-data-two-maps-control.c +20 -0
- offload/_root/data/findings/harvest/controls/gcc-same-item-two-maps-control.f90 +16 -0
- offload/_root/data/findings/harvest/controls/gcc-teams-simd-matmul-allocatable-control.f90 +27 -0
- offload/_root/data/findings/harvest/gcc-acc-declare-create-allocatable-not-mapped.f90 +66 -0
- offload/_root/data/findings/harvest/gcc-c-same-item-two-maps-rejected.c +45 -0
- offload/_root/data/findings/harvest/gcc-c-strided-section-rejected.c +70 -0
- offload/_root/data/findings/harvest/gcc-c-target-data-struct-pointer-section-ice.c +78 -0
- offload/_root/data/findings/harvest/gcc-c-target-data-two-maps-ice.c +49 -0
- offload/_root/data/findings/harvest/gcc-same-item-two-maps-rejected.f90 +46 -0
- offload/_root/data/findings/harvest/gcc-teams-simd-matmul-allocatable-ice.f90 +53 -0
- offload/_root/data/findings/harvest/nvhpc-c-target-data-if-false-use-device-ptr-garbage.c +49 -0
- offload/_root/data/findings/harvest/nvhpc-named-constant-array-declare-target-routine-rejected.f90 +65 -0
- offload/_root/data/findings/harvest/nvhpc-use-device-ptr-c-ptr-not-found.f90 +60 -0
- offload/_root/data/findings/harvest/nvhpc2511-target-nowait-in-parallel-for-ice.c +59 -0
- offload/_root/data/findings/hecbench/controls/f16-ctl-float-array.c +28 -0
- offload/_root/data/findings/hecbench/controls/pc-ctl-builtin-popcount.c +37 -0
- offload/_root/data/findings/hecbench/controls/pc-ctl-shift-sum.c +43 -0
- offload/_root/data/findings/hecbench/gcc-c-float16-array-in-target-lto-ice.c +65 -0
- offload/_root/data/findings/hecbench/gcc-c-swar-popcount-assembler-error.c +80 -0
- offload/_root/data/findings/index.yaml +2453 -0
- offload/_root/data/findings/malloc/afar-device-malloc-in-kernel-corrupts-records.c +371 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-direct.c +52 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-fence.c +57 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-flush.c +57 -0
- offload/_root/data/findings/malloc/controls/afar-first-use-malloc-stack.c +52 -0
- offload/_root/data/findings/multithread-allocatable-section-maps.f90 +91 -0
- offload/_root/data/findings/nested/afar-cce-c-call-result-member-in-target-rejected.c +69 -0
- offload/_root/data/findings/nested/afar-cce-c-update-struct-and-member-rejected.c +92 -0
- offload/_root/data/findings/nested/afar-flang-pointer-root-allocatable-component-enter-data-fault.f90 +121 -0
- offload/_root/data/findings/nested/cce-c-struct-and-nested-pointee-sections-ice.c +79 -0
- offload/_root/data/findings/nested/cce-fortran-nested-allocatable-component-copy-fault.f90 +64 -0
- offload/_root/data/findings/nested/cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.f90 +93 -0
- offload/_root/data/findings/nested/cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.f90 +80 -0
- offload/_root/data/findings/nested/controls/c3-ctl-nested-data.c +27 -0
- offload/_root/data/findings/nested/controls/c5-acc-serial-struct-and-array.c +26 -0
- offload/_root/data/findings/nested/controls/e2-ctl-two-directives.c +42 -0
- offload/_root/data/findings/nested/controls/e3-ctl-attach-clause.c +42 -0
- offload/_root/data/findings/nested/controls/f3-pointer-array-only.c +33 -0
- offload/_root/data/findings/nested/controls/f5-ctl-copyout-exit.c +33 -0
- offload/_root/data/findings/nested/controls/f6-ctl-pointer-to-struct-array.c +28 -0
- offload/_root/data/findings/nested/controls/g2-ctl-allocatable.f90 +34 -0
- offload/_root/data/findings/nested/controls/g2-ctl-entered-to.f90 +34 -0
- offload/_root/data/findings/nested/controls/g3-ctl-from-struct-no-element.c +27 -0
- offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-to.c +27 -0
- offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-tofrom.c +27 -0
- offload/_root/data/findings/nested/controls/g5-ctl-element-pointers-only.f90 +36 -0
- offload/_root/data/findings/nested/controls/g5-ctl-root-pointer-only.f90 +36 -0
- offload/_root/data/findings/nested/controls/gp2-ctl-no-mapper-explicit-maps.c +24 -0
- offload/_root/data/findings/nested/controls/gt2-ctl-no-always.c +26 -0
- offload/_root/data/findings/nested/controls/gt3-ctl-always-on-structure-only.c +26 -0
- offload/_root/data/findings/nested/controls/j1-embedded-struct-pointer-to-struct.c +24 -0
- offload/_root/data/findings/nested/controls/j2-ctl-pointer-instead-of-embedded.c +24 -0
- offload/_root/data/findings/nested/controls/j6-ctl-struct-and-one-pointee-level.c +23 -0
- offload/_root/data/findings/nested/controls/j7-ctl-struct-and-embedded-pointee.c +24 -0
- offload/_root/data/findings/nested/controls/m2-ctl-variable-root.f90 +32 -0
- offload/_root/data/findings/nested/controls/m3-ctl-fixed-array-component.f90 +32 -0
- offload/_root/data/findings/nested/controls/m5-ctl-no-enter-data.f90 +33 -0
- offload/_root/data/findings/nested/controls/n8-ctl-fixed-array-in-component.f90 +33 -0
- offload/_root/data/findings/nested/controls/n9-ctl-allocatable-in-the-variable.f90 +33 -0
- offload/_root/data/findings/nested/controls/ns4-ctl-two-directives-struct-then-pointee.c +27 -0
- offload/_root/data/findings/nested/controls/ns8-ctl-enter-together-exit-split.c +26 -0
- offload/_root/data/findings/nested/controls/nu3-ctl-update-pointee-only.c +28 -0
- offload/_root/data/findings/nested/controls/p2-ctl-pointer-variable.c +27 -0
- offload/_root/data/findings/nested/controls/p3-ctl-direct-member.c +26 -0
- offload/_root/data/findings/nested/controls/q2-ctl-fixed-array.f90 +37 -0
- offload/_root/data/findings/nested/controls/q3-ctl-allocatable-component-of-the-variable.f90 +38 -0
- offload/_root/data/findings/nested/controls/ta2-ctl-no-allocatable-component.f90 +42 -0
- offload/_root/data/findings/nested/controls/ta3-ctl-allocatable-scalar-in-the-variable.f90 +38 -0
- offload/_root/data/findings/nested/controls/ta4-ctl-pointer-component-only.f90 +42 -0
- offload/_root/data/findings/nested/controls/u3-ctl-update-member-only.c +24 -0
- offload/_root/data/findings/nested/controls/u4-ctl-two-updates.c +25 -0
- offload/_root/data/findings/nested/controls/u5-ctl-same-list-in-map.c +25 -0
- offload/_root/data/findings/nested/controls/ua2-ctl-variable-root.f90 +37 -0
- offload/_root/data/findings/nested/controls/ua4-ctl-to-in-place-of-alloc-and-update.f90 +37 -0
- offload/_root/data/findings/nested/controls/v2-ctl-parent-first.c +25 -0
- offload/_root/data/findings/nested/controls/v4-ctl-embedded-member.c +24 -0
- offload/_root/data/findings/nested/gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.c +83 -0
- offload/_root/data/findings/nested/gcc-acc-c-parent-and-shared-pointee-one-directive.c +88 -0
- offload/_root/data/findings/nested/gcc-acc-c-struct-and-member-array-one-directive.c +84 -0
- offload/_root/data/findings/nested/gcc-c-always-on-pointer-member-section-ice.c +75 -0
- offload/_root/data/findings/nested/gcc-c-declare-mapper-pointer-member-section-gpu-fault.c +93 -0
- offload/_root/data/findings/nested/gcc-c-from-struct-and-pointee-section-rejected.c +83 -0
- offload/_root/data/findings/nested/gcc-fortran-pointer-component-alloc-bounds-lost.f90 +62 -0
- offload/_root/data/findings/nested/gcc-fortran-root-and-element-pointer-components-ice.f90 +77 -0
- offload/_root/data/findings/nested/nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.c +55 -0
- offload/_root/data/findings/nested/nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.c +86 -0
- offload/_root/data/findings/nvhpc-acc-atomic-update-sum-fort2-crash.f90 +53 -0
- offload/_root/data/findings/nvhpc-c-acc-atomic-update-sum-ice.c +43 -0
- offload/_root/data/findings/nvhpc-c-dist-schedule-chunk-compile-hang.c +41 -0
- offload/_root/data/findings/nvhpc-c-map-present-ignored.c +42 -0
- offload/_root/data/findings/nvhpc-c-ordered-in-target-nvcpfe-crash.c +92 -0
- offload/_root/data/findings/nvhpc-c-parallel-for-firstprivate-in-target.c +62 -0
- offload/_root/data/findings/nvhpc-c-parallel-if-in-target-nvvm-ice.c +56 -0
- offload/_root/data/findings/nvhpc-defaultmap-firstprivate-explicit-map.f90 +45 -0
- offload/_root/data/findings/nvhpc-defaultmap-from-allocatable-indexing.f90 +60 -0
- offload/_root/data/findings/nvhpc-depend-inoutset-ignored.f90 +64 -0
- offload/_root/data/findings/nvhpc-dist-schedule-chunk-illegal-address.f90 +52 -0
- offload/_root/data/findings/nvhpc-managed-acc-shutdown-host-access.f90 +42 -0
- offload/_root/data/findings/nvhpc-parallel-if-in-target-nvvm-ice.f90 +60 -0
- offload/_root/data/findings/oop/afar-final-dealloc-device-link.f90 +85 -0
- offload/_root/data/findings/oop/afar-pdt-length-parameter-not-implemented.f90 +65 -0
- offload/_root/data/findings/oop/cce-class-is-device-link.f90 +86 -0
- offload/_root/data/findings/oop/cce-copy-alloc-component-section-fault.f90 +73 -0
- offload/_root/data/findings/oop/cce-copy-parent-to-component-tofrom-lost.f90 +65 -0
- offload/_root/data/findings/oop/cce-copy-second-member-section-lost.f90 +65 -0
- offload/_root/data/findings/oop/cce-element-component-map-lost.f90 +64 -0
- offload/_root/data/findings/oop/cce-final-dealloc-device-abort.f90 +85 -0
- offload/_root/data/findings/oop/cce-pdt-default-mapper-rejected.f90 +71 -0
- offload/_root/data/findings/oop/cce-polymorphic-dispatch-device-link.f90 +100 -0
- offload/_root/data/findings/oop/cce-section-of-element-component-overlap.f90 +76 -0
- offload/_root/data/findings/oop/cce-select-type-guard-not-taken.f90 +91 -0
- offload/_root/data/findings/oop/cce-udr-derived-type-unsupported.f90 +69 -0
- offload/_root/data/findings/oop/cce21-element-component-map-lost.f90 +62 -0
- offload/_root/data/findings/oop/controls/alloccomp-comp-only.f90 +44 -0
- offload/_root/data/findings/oop/controls/alloccomp-whole-explicit-component.f90 +50 -0
- offload/_root/data/findings/oop/controls/alloccomp-whole.f90 +49 -0
- offload/_root/data/findings/oop/controls/elemsec-element.f90 +47 -0
- offload/_root/data/findings/oop/controls/final-local.f90 +64 -0
- offload/_root/data/findings/oop/controls/host-class-star-select-type.f90 +58 -0
- offload/_root/data/findings/oop/controls/host-firstprivate-defined-assignment.f90 +54 -0
- offload/_root/data/findings/oop/controls/host-lastprivate-defined-assignment.f90 +58 -0
- offload/_root/data/findings/oop/controls/host-private-finalization.f90 +51 -0
- offload/_root/data/findings/oop/controls/host-select-type.f90 +65 -0
- offload/_root/data/findings/oop/controls/parent-and-comp-component-only.f90 +45 -0
- offload/_root/data/findings/oop/controls/pdt-kind.f90 +46 -0
- offload/_root/data/findings/oop/controls/pdt-len-host.f90 +43 -0
- offload/_root/data/findings/oop/controls/pdt-len-unparameterized.f90 +46 -0
- offload/_root/data/findings/oop/controls/poly-dispatch-static.f90 +75 -0
- offload/_root/data/findings/oop/controls/section-alloc-whole-component.f90 +49 -0
- offload/_root/data/findings/oop/controls/section-element-whole-array.f90 +50 -0
- offload/_root/data/findings/oop/controls/section-element-whole-component.f90 +50 -0
- offload/_root/data/findings/oop/controls/section-fixed.f90 +43 -0
- offload/_root/data/findings/oop/controls/tbp-override.f90 +64 -0
- offload/_root/data/findings/oop/gcc-acc-parent-and-member-data-rejected.f90 +63 -0
- offload/_root/data/findings/oop/gcc-pdt-length-parameter-abort.f90 +68 -0
- offload/_root/data/findings/oop/gcc-polymorphic-dispatch-abort.f90 +97 -0
- offload/_root/data/findings/oop/gcc-vtab-not-marked-for-offload.f90 +94 -0
- offload/_root/data/findings/oop/nvhpc-copy-alloc-component-illegal-address.f90 +76 -0
- offload/_root/data/findings/oop/nvhpc-copy-pdt-length-parameter-illegal-address.f90 +69 -0
- offload/_root/data/findings/oop/nvhpc-named-mapper-rejected.f90 +65 -0
- offload/_root/data/findings/oop/nvhpc-polymorphic-dispatch-translate-failure.f90 +90 -0
- offload/_root/data/findings/oop/nvhpc-polymorphism-runtime-unsupported.f90 +94 -0
- offload/_root/data/findings/oop/nvhpc-type-bound-call-rejected.f90 +89 -0
- offload/_root/data/findings/oop/nvhpc-udr-derived-type-rejected.f90 +67 -0
- offload/_root/data/findings/reviews/afar-c-error-directive-in-target-link.json +217 -0
- offload/_root/data/findings/reviews/afar-c-lastprivate-distribute-parallel-for-small-type.json +113 -0
- offload/_root/data/findings/reviews/afar-c-teams-distribute-reduction-first-team.json +130 -0
- offload/_root/data/findings/reviews/afar-c-update-iterator-copy-mode.json +113 -0
- offload/_root/data/findings/reviews/afar-cce19-character-defaultmap.json +292 -0
- offload/_root/data/findings/reviews/afar-clang-requires-device-safesync-hang.json +191 -0
- offload/_root/data/findings/reviews/afar-flang-firstprivate-map-two-targets.json +130 -0
- offload/_root/data/findings/reviews/afar-flang-loop-bind-teams-reduction.json +126 -0
- offload/_root/data/findings/reviews/afar-flang-task-reduction-max.json +113 -0
- offload/_root/data/findings/reviews/afar-flang-thread-limit-target-parallel-do.json +113 -0
- offload/_root/data/findings/reviews/afar-loop-bind-thread-in-teams.json +191 -0
- offload/_root/data/findings/reviews/afar-nontemporal-assumed-shape-ice.json +113 -0
- offload/_root/data/findings/reviews/afar-udr-derived-type-link.json +113 -0
- offload/_root/data/findings/reviews/afar-xnack1-atomic-min-nested-parallel.json +113 -0
- offload/_root/data/findings/reviews/afar-xnack1-target-is-present.json +113 -0
- offload/_root/data/findings/reviews/apps--afar-cce-teams-private-array-nested-parallel-wrong.json +113 -0
- offload/_root/data/findings/reviews/apps--cce20-device-link-infer-address-spaces-crash.json +113 -0
- offload/_root/data/findings/reviews/apps--cce21-device-link-agpr-copy-mfma-assert.json +113 -0
- offload/_root/data/findings/reviews/apps--cce21-private-array-loaded-subscript-wrong.json +113 -0
- offload/_root/data/findings/reviews/apps--gcc-acc-c-tile-partial-tiles-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-c-ordered-doacross-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-c-reduction-task-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-absent-optional-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-critical-target-parallel-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-dist-schedule-chunk.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-linear-parallel-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-named-critical-link.json +126 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-ordered-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-reduction-minus-rejected.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-sections-in-target-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--afar-flang-workdistribute-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--c-allocate-const-mem-firstprivate-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-acc-character-dummy-routine-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-acc-loop-seq-in-routine-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-allocators-stack-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-allocate-align-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-allocate-allocator-modifier-rejected.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-dist-schedule-chunk.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-f-pointer-device-link.json +130 -0
- offload/_root/data/findings/reviews/catalog--cce-c-long-double-ice.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce-c-map-iterator-ice.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce-c-recursive-function-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-c-sections-in-target-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-allocate-in-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-lastprivate-parallel-in-seq-loop-wrong.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-flang-stop-in-target-crash.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-iterator-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-linear-lastprivate-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-reduction-inscan-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce-reduction-task-link.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce19-reduction-task-addrspacecast-ice.json +113 -0
- offload/_root/data/findings/reviews/catalog--cce20-c-defaultmap-private-storage-rejected.json +217 -0
- offload/_root/data/findings/reviews/catalog--cce20-map-self-rejected.json +204 -0
- offload/_root/data/findings/reviews/catalog--cce21-c-target-loop-ice.json +126 -0
- offload/_root/data/findings/reviews/catalog--defaultmap-present-private-array-abort.json +236 -0
- offload/_root/data/findings/reviews/catalog--nvhpc-acc-associate-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/catalog--nvhpc-c-function-pointer-kernel-missing.json +268 -0
- offload/_root/data/findings/reviews/cce-acc-init-set-runtime-assert.json +113 -0
- offload/_root/data/findings/reviews/cce-acc-reduction-200-int8-scalars-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce-acc-routine-bind-module-ice.json +113 -0
- offload/_root/data/findings/reviews/cce-c-dist-schedule-segv.json +113 -0
- offload/_root/data/findings/reviews/cce-c-map-delete-refcount.json +149 -0
- offload/_root/data/findings/reviews/cce-c-map-present-assert.json +126 -0
- offload/_root/data/findings/reviews/cce-c-openmp45-device-link.json +113 -0
- offload/_root/data/findings/reviews/cce-c-parallel-for-in-target.json +141 -0
- offload/_root/data/findings/reviews/cce-mapper-next-map-copy-back.json +208 -0
- offload/_root/data/findings/reviews/cce-uses-allocators-traits-omp50.json +191 -0
- offload/_root/data/findings/reviews/cce19-c-reduction-63-scalars-one-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce19-target-parallel-guarded-loop.json +113 -0
- offload/_root/data/findings/reviews/cce19-target-parallel-single-ice.json +113 -0
- offload/_root/data/findings/reviews/cce21-alloc-2e32-sum-wrong.json +113 -0
- offload/_root/data/findings/reviews/cce21-defaultmap-aggregate-flag.json +210 -0
- offload/_root/data/findings/reviews/cce21-in-reduction-assumed-shape-write-lost.json +113 -0
- offload/_root/data/findings/reviews/cce21-in-reduction-taskwait-link.json +113 -0
- offload/_root/data/findings/reviews/clang-c-declare-target-to-omp52.json +113 -0
- offload/_root/data/findings/reviews/clang-c-linear-directive-name-hang.json +113 -0
- offload/_root/data/findings/reviews/clang-c-shared-declare-target-combined.json +132 -0
- offload/_root/data/findings/reviews/dataenv--cce-value-dummy-target-write-visible.json +113 -0
- offload/_root/data/findings/reviews/defaultmap-none-loop-variable.json +113 -0
- offload/_root/data/findings/reviews/fortran-schedule-static-in-target.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce-common-block-name-in-map-rejected.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce-list-directed-print-in-target-copy-crash.json +217 -0
- offload/_root/data/findings/reviews/fresh--cce19-acc-automatic-array-copyout-copy-crash.json +113 -0
- offload/_root/data/findings/reviews/fresh--cce21-combined-if-runtime-expr-loop-skipped.json +113 -0
- offload/_root/data/findings/reviews/fresh--nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.json +113 -0
- offload/_root/data/findings/reviews/fresh--nvhpc-teams-loop-module-allocatable-assign-fort2-crash.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1505-cce20.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1540-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--1978-cce19.json +130 -0
- offload/_root/data/findings/reviews/fuzz--2334-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--591-cce19.json +147 -0
- offload/_root/data/findings/reviews/fuzz--650-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--916-afar.json +130 -0
- offload/_root/data/findings/reviews/fuzz--98-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b1-121-afar.json +160 -0
- offload/_root/data/findings/reviews/fuzz--b2-209-cce19.json +141 -0
- offload/_root/data/findings/reviews/fuzz--b2-68-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b2-85-cce20.json +217 -0
- offload/_root/data/findings/reviews/fuzz--b3-188-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b3-278-cce19.json +212 -0
- offload/_root/data/findings/reviews/fuzz--b3-54-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--b3-61-cce20.json +191 -0
- offload/_root/data/findings/reviews/fuzz--b4-86-cce19.json +113 -0
- offload/_root/data/findings/reviews/fuzz--gcc-declare-reduction-module-not-found.json +113 -0
- offload/_root/data/findings/reviews/fuzz--gcc-target-simd-map-nontemporal-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-allocatable-component-implicit-map-illegal-address.json +141 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-assumed-length-character-dummy-map-ice.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-default-none-reduction-lastprivate-fort1-crash.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-firstprivate-lastprivate-ice.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-to-scalar-reduction-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-depend-implicit-map-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-distribute-parallel-num-threads-writes-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-end-distribute-simd-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-loop-character-achar-unsupported.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-map-always-after-map-to-not-copied-back.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-num-threads-reduction-identity-lost.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-firstprivate-translate-failure.json +191 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-single-hang.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-collapse-translate-failure.json +113 -0
- offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-no-end-directive-rejected.json +113 -0
- offload/_root/data/findings/reviews/fuzz--par-s1-2082-gcc_g90.json +126 -0
- offload/_root/data/findings/reviews/fuzz--s1-2370-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-2592-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-3463-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-6760-cce20.json +130 -0
- offload/_root/data/findings/reviews/fuzz--s1-6888-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-7882-cce20.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-8634-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-91-cce21.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-9443-afar.json +113 -0
- offload/_root/data/findings/reviews/fuzz--s1-9914-cce19.json +141 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-bind-device-type-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-detach-delete-attach-underflow.json +314 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-gang-dim-collapse-force-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-init-set-shutdown-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-link-in-routine-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-acc-use-device-allocatable-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-motion-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-omp60-undocumented-rejected.json +217 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-omp60-unimplemented-rejected.json +236 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-target-in-task-mandatory-device-not-found.json +236 -0
- offload/_root/data/findings/reviews/gcc--gcc-c-uses-allocators-traits-unimplemented.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-declare-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/gcc--gcc-defaultmap-to-pointer-copy-back.json +217 -0
- offload/_root/data/findings/reviews/gcc--gcc-loop-bind-default-none-rejected.json +113 -0
- offload/_root/data/findings/reviews/harvest--afar-flang-strided-target-update.json +141 -0
- offload/_root/data/findings/reviews/harvest--cce-acc-declare-create-module-allocatable-xnack1-fault.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce-c-implicit-struct-map-partly-present.json +217 -0
- offload/_root/data/findings/reviews/harvest--cce-c-strided-target-update.json +141 -0
- offload/_root/data/findings/reviews/harvest--cce-ftn-target-parallel-thread-query-ice.json +130 -0
- offload/_root/data/findings/reviews/harvest--cce-named-constant-array-declare-target-routine-rejected.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce-use-device-ptr-c-ptr-not-converted.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce21-declare-target-link-module-variable-write-lost.json +113 -0
- offload/_root/data/findings/reviews/harvest--cce21-internal-procedure-calls-internal-in-target-fault.json +158 -0
- offload/_root/data/findings/reviews/harvest--gcc-acc-declare-create-allocatable-not-mapped.json +204 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-same-item-two-maps-rejected.json +143 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-strided-section-rejected.json +164 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-target-data-struct-pointer-section-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--gcc-c-target-data-two-maps-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--gcc-teams-simd-matmul-allocatable-ice.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-c-target-data-if-false-use-device-ptr-garbage.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-named-constant-array-declare-target-routine-rejected.json +126 -0
- offload/_root/data/findings/reviews/harvest--nvhpc-use-device-ptr-c-ptr-not-found.json +113 -0
- offload/_root/data/findings/reviews/harvest--nvhpc2511-target-nowait-in-parallel-for-ice.json +130 -0
- offload/_root/data/findings/reviews/hecbench--gcc-c-float16-array-in-target-lto-ice.json +217 -0
- offload/_root/data/findings/reviews/hecbench--gcc-c-swar-popcount-assembler-error.json +126 -0
- offload/_root/data/findings/reviews/malloc--afar-device-malloc-in-kernel-corrupts-records.json +270 -0
- offload/_root/data/findings/reviews/multithread-allocatable-section-maps.json +191 -0
- offload/_root/data/findings/reviews/nested--afar-cce-c-call-result-member-in-target-rejected.json +113 -0
- offload/_root/data/findings/reviews/nested--afar-cce-c-update-struct-and-member-rejected.json +126 -0
- offload/_root/data/findings/reviews/nested--afar-flang-pointer-root-allocatable-component-enter-data-fault.json +191 -0
- offload/_root/data/findings/reviews/nested--cce-c-struct-and-nested-pointee-sections-ice.json +113 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-nested-allocatable-component-copy-fault.json +214 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.json +191 -0
- offload/_root/data/findings/reviews/nested--cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.json +297 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.json +204 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-parent-and-shared-pointee-one-directive.json +130 -0
- offload/_root/data/findings/reviews/nested--gcc-acc-c-struct-and-member-array-one-directive.json +141 -0
- offload/_root/data/findings/reviews/nested--gcc-c-always-on-pointer-member-section-ice.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-c-declare-mapper-pointer-member-section-gpu-fault.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-c-from-struct-and-pointee-section-rejected.json +113 -0
- offload/_root/data/findings/reviews/nested--gcc-fortran-pointer-component-alloc-bounds-lost.json +217 -0
- offload/_root/data/findings/reviews/nested--gcc-fortran-root-and-element-pointer-components-ice.json +217 -0
- offload/_root/data/findings/reviews/nested--nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.json +204 -0
- offload/_root/data/findings/reviews/nested--nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.json +191 -0
- offload/_root/data/findings/reviews/nvhpc-c-acc-atomic-update-sum-ice.json +277 -0
- offload/_root/data/findings/reviews/nvhpc-c-dist-schedule-chunk-compile-hang.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-map-present-ignored.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-ordered-in-target-nvcpfe-crash.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-c-parallel-for-firstprivate-in-target.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-defaultmap-firstprivate-explicit-map.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-defaultmap-from-allocatable-indexing.json +132 -0
- offload/_root/data/findings/reviews/nvhpc-depend-inoutset-ignored.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-dist-schedule-chunk-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-managed-acc-shutdown-host-access.json +113 -0
- offload/_root/data/findings/reviews/nvhpc-parallel-if-in-target-nvvm-ice.json +113 -0
- offload/_root/data/findings/reviews/oop--afar-final-dealloc-device-link.json +132 -0
- offload/_root/data/findings/reviews/oop--afar-pdt-length-parameter-not-implemented.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-class-is-device-link.json +130 -0
- offload/_root/data/findings/reviews/oop--cce-copy-alloc-component-section-fault.json +217 -0
- offload/_root/data/findings/reviews/oop--cce-copy-parent-to-component-tofrom-lost.json +217 -0
- offload/_root/data/findings/reviews/oop--cce-copy-second-member-section-lost.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-element-component-map-lost.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-final-dealloc-device-abort.json +208 -0
- offload/_root/data/findings/reviews/oop--cce-pdt-default-mapper-rejected.json +191 -0
- offload/_root/data/findings/reviews/oop--cce-polymorphic-dispatch-device-link.json +247 -0
- offload/_root/data/findings/reviews/oop--cce-section-of-element-component-overlap.json +113 -0
- offload/_root/data/findings/reviews/oop--cce-select-type-guard-not-taken.json +191 -0
- offload/_root/data/findings/reviews/oop--cce-udr-derived-type-unsupported.json +132 -0
- offload/_root/data/findings/reviews/oop--gcc-acc-parent-and-member-data-rejected.json +141 -0
- offload/_root/data/findings/reviews/oop--gcc-pdt-length-parameter-abort.json +141 -0
- offload/_root/data/findings/reviews/oop--gcc-polymorphic-dispatch-abort.json +217 -0
- offload/_root/data/findings/reviews/oop--gcc-vtab-not-marked-for-offload.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-copy-alloc-component-illegal-address.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-copy-pdt-length-parameter-illegal-address.json +236 -0
- offload/_root/data/findings/reviews/oop--nvhpc-named-mapper-rejected.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-polymorphic-dispatch-translate-failure.json +223 -0
- offload/_root/data/findings/reviews/oop--nvhpc-polymorphism-runtime-unsupported.json +126 -0
- offload/_root/data/findings/reviews/oop--nvhpc-type-bound-call-rejected.json +113 -0
- offload/_root/data/findings/reviews/oop--nvhpc-udr-derived-type-rejected.json +113 -0
- offload/_root/data/findings/reviews/stress--afar-c-lastprivate-combined-target-not-mapped.json +113 -0
- offload/_root/data/findings/reviews/stress--afar-target-scalar-implicit-firstprivate.json +175 -0
- offload/_root/data/findings/reviews/stress--cce-acc-declare-create-scalar-serial-firstprivate.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-c-distribute-lastprivate-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-c-flto-offload-dropped.json +204 -0
- offload/_root/data/findings/reviews/stress--cce-ftn-cif-record-split-abort.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-lastprivate-num-threads-collapse-simd.json +113 -0
- offload/_root/data/findings/reviews/stress--cce-teams-reduction-many-teams-wrap.json +113 -0
- offload/_root/data/findings/reviews/stress--cce21-declare-target-scalar-map-write-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--gcc-declare-target-allocatable-component-ice.json +191 -0
- offload/_root/data/findings/reviews/stress--nvhpc-acc-derived-type-component-not-copied.json +126 -0
- offload/_root/data/findings/reviews/stress--nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-declare-target-scalar-write-lost.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-lastprivate-combined-target-not-mapped.json +113 -0
- offload/_root/data/findings/reviews/stress--nvhpc-target-scalar-implicit-firstprivate.json +130 -0
- offload/_root/data/findings/reviews/target-update-sections-in-parallel.json +113 -0
- offload/_root/data/findings/stress/afar-c-lastprivate-combined-target-not-mapped.c +72 -0
- offload/_root/data/findings/stress/afar-target-scalar-implicit-firstprivate.f90 +47 -0
- offload/_root/data/findings/stress/cce-acc-declare-create-scalar-serial-firstprivate.f90 +43 -0
- offload/_root/data/findings/stress/cce-c-distribute-lastprivate-lost.c +52 -0
- offload/_root/data/findings/stress/cce-c-flto-offload-dropped.c +73 -0
- offload/_root/data/findings/stress/cce-ftn-cif-record-split-abort.f90 +109 -0
- offload/_root/data/findings/stress/cce-lastprivate-num-threads-collapse-simd.f90 +66 -0
- offload/_root/data/findings/stress/cce-teams-reduction-many-teams-wrap.f90 +55 -0
- offload/_root/data/findings/stress/cce21-declare-target-scalar-map-write-lost.f90 +58 -0
- offload/_root/data/findings/stress/controls/gcc-declare-target-allocatable-component-control.f90 +29 -0
- offload/_root/data/findings/stress/gcc-declare-target-allocatable-component-ice.f90 +61 -0
- offload/_root/data/findings/stress/nvhpc-acc-derived-type-component-not-copied.f90 +33 -0
- offload/_root/data/findings/stress/nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.c +62 -0
- offload/_root/data/findings/stress/nvhpc-declare-target-scalar-write-lost.f90 +43 -0
- offload/_root/data/findings/stress/nvhpc-lastprivate-combined-target-not-mapped.f90 +60 -0
- offload/_root/data/findings/stress/nvhpc-target-scalar-implicit-firstprivate.f90 +41 -0
- offload/_root/data/findings/target-update-sections-in-parallel.f90 +53 -0
- offload/_root/data/issues.json +1 -0
- offload/_root/data/search.json +1 -0
- offload/_root/data/vendor/checks/build.py +288 -0
- offload/_version.py +24 -0
- offload/canuse.py +88 -0
- offload/cli.py +52 -0
- offload/data.py +85 -0
- offload/engine/__init__.py +0 -0
- offload/engine/acc_c_gen.py +415 -0
- offload/engine/acc_gen.py +1104 -0
- offload/engine/acc_rules.py +656 -0
- offload/engine/apps.py +804 -0
- offload/engine/baseline.py +324 -0
- offload/engine/c_gen.py +883 -0
- offload/engine/c_program.py +913 -0
- offload/engine/c_rules.py +503 -0
- offload/engine/campaign.py +1180 -0
- offload/engine/campaigns/__init__.py +2 -0
- offload/engine/campaigns/hecbench.py +153 -0
- offload/engine/campaigns/nested.py +76 -0
- offload/engine/campaigns/oop.py +61 -0
- offload/engine/canary.py +275 -0
- offload/engine/catalog.py +860 -0
- offload/engine/citations.py +532 -0
- offload/engine/clang_oracle.py +208 -0
- offload/engine/combos.py +234 -0
- offload/engine/confirm/__init__.py +2 -0
- offload/engine/confirm/backlog.py +159 -0
- offload/engine/confirm/claims.py +423 -0
- offload/engine/confirm/collectors.py +665 -0
- offload/engine/confirm/decisions.py +202 -0
- offload/engine/confirm/draft.py +195 -0
- offload/engine/confirm/engine.py +157 -0
- offload/engine/confirm/execute.py +382 -0
- offload/engine/confirm/facts.py +467 -0
- offload/engine/confirm/findings.py +617 -0
- offload/engine/confirm/forms.py +145 -0
- offload/engine/confirm/ingest.py +372 -0
- offload/engine/confirm/jobs.py +215 -0
- offload/engine/confirm/legality.py +323 -0
- offload/engine/confirm/machines.py +254 -0
- offload/engine/confirm/minimize.py +268 -0
- offload/engine/confirm/model.py +249 -0
- offload/engine/confirm/ports.py +107 -0
- offload/engine/confirm/programs.py +222 -0
- offload/engine/confirm/registry.py +151 -0
- offload/engine/confirm/regress.py +278 -0
- offload/engine/confirm/rules.py +565 -0
- offload/engine/confirm/store.py +63 -0
- offload/engine/confirm/triage.py +838 -0
- offload/engine/confirm/validate.py +607 -0
- offload/engine/confirm/witness.py +355 -0
- offload/engine/corpus_check.py +388 -0
- offload/engine/coverage.py +318 -0
- offload/engine/dataenv_gen.py +1318 -0
- offload/engine/dataenv_rules.py +278 -0
- offload/engine/devtemps.py +146 -0
- offload/engine/expected.py +2559 -0
- offload/engine/f2c.py +1783 -0
- offload/engine/finding_claims.py +330 -0
- offload/engine/finding_header.py +229 -0
- offload/engine/finding_rows.py +382 -0
- offload/engine/flang_oracle.py +299 -0
- offload/engine/fsource.py +620 -0
- offload/engine/fuzz.py +2455 -0
- offload/engine/fuzz_base.py +2016 -0
- offload/engine/fuzz_campaign.py +592 -0
- offload/engine/fuzz_exec.py +798 -0
- offload/engine/fuzz_min.py +1049 -0
- offload/engine/fuzz_profile.py +340 -0
- offload/engine/fuzz_report.py +1270 -0
- offload/engine/fuzz_steer.py +181 -0
- offload/engine/gate.py +1013 -0
- offload/engine/gate_report.py +711 -0
- offload/engine/gate_run.py +118 -0
- offload/engine/gate_stored.py +466 -0
- offload/engine/gen.py +1114 -0
- offload/engine/gen_templates.py +2583 -0
- offload/engine/grammar.py +695 -0
- offload/engine/harness.py +1472 -0
- offload/engine/harvest/__init__.py +3 -0
- offload/engine/harvest/c_runtime.py +465 -0
- offload/engine/harvest/checks.py +534 -0
- offload/engine/harvest/convert.py +784 -0
- offload/engine/harvest/f_runtime.py +668 -0
- offload/engine/harvest/filters.py +338 -0
- offload/engine/harvest/history.py +122 -0
- offload/engine/harvest/inventory.py +399 -0
- offload/engine/harvest2/__init__.py +5 -0
- offload/engine/harvest2/aomp.py +119 -0
- offload/engine/harvest2/examples.py +116 -0
- offload/engine/harvest2/gomp.py +679 -0
- offload/engine/harvest2/hand.py +150 -0
- offload/engine/harvest2/split.py +78 -0
- offload/engine/harvest_known/__init__.py +2 -0
- offload/engine/harvest_known/apps.py +65 -0
- offload/engine/harvest_known/cases.py +128 -0
- offload/engine/harvest_known/centres.py +184 -0
- offload/engine/harvest_known/forum.py +180 -0
- offload/engine/harvest_known/relnotes.py +42 -0
- offload/engine/harvest_known/textscan.py +107 -0
- offload/engine/hdrwrap.py +42 -0
- offload/engine/hecbench.py +568 -0
- offload/engine/hecbench_report.py +265 -0
- offload/engine/hecbench_run.py +483 -0
- offload/engine/idioms.py +1427 -0
- offload/engine/kbody_cites.py +81 -0
- offload/engine/kbody_emit.py +949 -0
- offload/engine/kbody_gen.py +795 -0
- offload/engine/legality_review.py +236 -0
- offload/engine/localcfg.py +58 -0
- offload/engine/malloc_dd.py +267 -0
- offload/engine/mutate.py +1933 -0
- offload/engine/nested_cites.py +196 -0
- offload/engine/nested_emit.py +789 -0
- offload/engine/nested_gen.py +1721 -0
- offload/engine/offload_scope.py +197 -0
- offload/engine/ompvv.py +624 -0
- offload/engine/oop_gen.py +2249 -0
- offload/engine/prerun.py +1435 -0
- offload/engine/program_source.py +739 -0
- offload/engine/provenance.py +103 -0
- offload/engine/reduce.py +2098 -0
- offload/engine/report.py +3374 -0
- offload/engine/root.py +33 -0
- offload/engine/rules.py +4256 -0
- offload/engine/run_matrix.py +325 -0
- offload/engine/site/__init__.py +1 -0
- offload/engine/site/columns.py +53 -0
- offload/engine/site/data.py +648 -0
- offload/engine/site/header.py +228 -0
- offload/engine/site/inputs.py +115 -0
- offload/engine/site/matrix.py +434 -0
- offload/engine/site/scrub.py +294 -0
- offload/engine/skeleton.py +121 -0
- offload/engine/spec_text.py +242 -0
- offload/engine/stress.py +4122 -0
- offload/engine/stress_c.py +1000 -0
- offload/engine/stress_exec.py +805 -0
- offload/engine/stress_min.py +248 -0
- offload/engine/stress_report.py +552 -0
- offload/engine/textclean.py +97 -0
- offload/engine/toolchains.py +1070 -0
- offload/engine/transforms.py +511 -0
- offload/engine/usage.py +1252 -0
- offload/engine/widen.py +673 -0
- offload/engine/widen_progs.py +2396 -0
- offload/issues.py +146 -0
- offtarget-0.1.0.dist-info/METADATA +86 -0
- offtarget-0.1.0.dist-info/RECORD +886 -0
- offtarget-0.1.0.dist-info/WHEEL +4 -0
- offtarget-0.1.0.dist-info/entry_points.txt +2 -0
- offtarget-0.1.0.dist-info/licenses/LICENSE +21 -0
- offtarget-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +20 -0
|
@@ -0,0 +1,2249 @@
|
|
|
1
|
+
"""fortran-oop: program families of Fortran derived types and object-oriented
|
|
2
|
+
features in device code.
|
|
3
|
+
|
|
4
|
+
Each family is a set of small, self-checking, free-form Fortran programs
|
|
5
|
+
(OpenMP 5.2, or OpenACC 3.4 for the ``acc-`` families). A program prints
|
|
6
|
+
``name= value`` lines and the harness's ``RESULT ran_on_host=<0|1>
|
|
7
|
+
check=<pass|fail>`` line. Expected values are computed here in Python from
|
|
8
|
+
the program's arithmetic and written into its checks and header.
|
|
9
|
+
``legality`` is ``defined`` (the program must pass both legality witnesses,
|
|
10
|
+
offload.engine.prerun) or ``unspecified`` (the spec leaves the behaviour
|
|
11
|
+
unspecified or OpenACC 3.4 does not address it; a failure is an
|
|
12
|
+
observation, not a finding; ``why`` cites the text). Expected values hold in
|
|
13
|
+
both memory modes unless ``modes`` says otherwise.
|
|
14
|
+
``programs()`` lists every program, ``program(id)`` returns one, and
|
|
15
|
+
``Program.harness()`` is the offload.engine.gen.Program the harness runs."""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import re
|
|
19
|
+
import textwrap
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
|
|
22
|
+
N = 64
|
|
23
|
+
S1 = N * (N + 1) // 2 # sum 1..n
|
|
24
|
+
S2 = N * (N + 1) * (2 * N + 1) // 6 # sum of squares 1..n
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True)
|
|
28
|
+
class Program:
|
|
29
|
+
id: str
|
|
30
|
+
family: str
|
|
31
|
+
variant: str
|
|
32
|
+
title: str
|
|
33
|
+
model: str # "omp" | "acc"
|
|
34
|
+
version: int # 52 | 34
|
|
35
|
+
source: str
|
|
36
|
+
expected: dict
|
|
37
|
+
legality: str # "defined" | "unspecified"
|
|
38
|
+
cites: tuple
|
|
39
|
+
why: str = ""
|
|
40
|
+
modes: tuple = ("copy", "unified")
|
|
41
|
+
lang: str = "f90"
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def text(self) -> str: # offload.engine.prerun reads .text or .source
|
|
45
|
+
return self.source
|
|
46
|
+
|
|
47
|
+
def harness(self):
|
|
48
|
+
"""The offload.engine.gen.Program the harness runs."""
|
|
49
|
+
from offload.engine.gen import Program as HP
|
|
50
|
+
return HP(id=self.id, lang="f90", source=self.source,
|
|
51
|
+
atoms=frozenset({f"oop.{self.family}"}),
|
|
52
|
+
primary_atom=f"oop.{self.family}", legal=True,
|
|
53
|
+
violates=None, observable=True, model=self.model)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class V:
|
|
58
|
+
"""One variant under construction."""
|
|
59
|
+
family: str
|
|
60
|
+
variant: str
|
|
61
|
+
title: str
|
|
62
|
+
cites: list
|
|
63
|
+
types: str = ""
|
|
64
|
+
mod_decls: str = ""
|
|
65
|
+
procs: str = ""
|
|
66
|
+
decls: str = ""
|
|
67
|
+
body: str = ""
|
|
68
|
+
checks: list = field(default_factory=list) # (name, expected int)
|
|
69
|
+
legality: str = "defined"
|
|
70
|
+
why: str = ""
|
|
71
|
+
model: str = "omp"
|
|
72
|
+
modes: tuple = ("copy", "unified")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
_OPEN = re.compile(r"^(?:do\b|if\s*\(.*\)\s*then$|select\s+type\b|"
|
|
76
|
+
r"(?:abstract\s+)?interface\b|module\s+(?!procedure)\w+$|"
|
|
77
|
+
r"type\s*(?:,[^:]*)?::|type\s+(?!is\b)\w+$|"
|
|
78
|
+
r"(?:[\w(),=*]+\s+)*?(?:subroutine|function)\s+\w+)",
|
|
79
|
+
re.I)
|
|
80
|
+
_MIDDLE = re.compile(r"^(?:else\b|type\s+is\b|class\s+is\b|"
|
|
81
|
+
r"class\s+default\b|contains$)", re.I)
|
|
82
|
+
_CLOSE = re.compile(r"^end\b", re.I)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _block(text: str, indent: int) -> list[str]:
|
|
86
|
+
"""The statements of `text`, re-indented by nesting (two blanks per
|
|
87
|
+
level, directives at the level of the code around them)."""
|
|
88
|
+
out, level, in_select = [], 0, []
|
|
89
|
+
for raw in text.split("\n"):
|
|
90
|
+
ln = raw.strip()
|
|
91
|
+
if not ln:
|
|
92
|
+
continue
|
|
93
|
+
if _CLOSE.match(ln):
|
|
94
|
+
if re.match(r"^end\s*select", ln, re.I) and in_select:
|
|
95
|
+
level -= 1
|
|
96
|
+
in_select.pop()
|
|
97
|
+
level -= 1
|
|
98
|
+
out.append(" " * (indent + 2 * max(level, 0)) + ln)
|
|
99
|
+
continue
|
|
100
|
+
if _MIDDLE.match(ln):
|
|
101
|
+
if re.match(r"^(?:type|class)\s+(?:is|default)", ln, re.I):
|
|
102
|
+
if in_select and in_select[-1]:
|
|
103
|
+
level -= 1
|
|
104
|
+
elif in_select:
|
|
105
|
+
in_select[-1] = True
|
|
106
|
+
out.append(" " * (indent + 2 * level) + ln)
|
|
107
|
+
level += 1
|
|
108
|
+
continue
|
|
109
|
+
out.append(" " * (indent + 2 * max(level - 1, 0)) + ln)
|
|
110
|
+
continue
|
|
111
|
+
out.append(" " * (indent + 2 * level) + ln)
|
|
112
|
+
if _OPEN.match(ln) and not ln.lower().startswith("!"):
|
|
113
|
+
level += 1
|
|
114
|
+
if re.match(r"^select\s+type", ln, re.I):
|
|
115
|
+
in_select.append(False)
|
|
116
|
+
return out
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _wrap(prefix: str, text: str) -> list[str]:
|
|
120
|
+
lines = textwrap.wrap(text, 96, break_long_words=False,
|
|
121
|
+
break_on_hyphens=False)
|
|
122
|
+
return [f"! {prefix}{lines[0]}"] + [f"! {ln}" for ln in lines[1:]]
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def render(v: V) -> Program:
|
|
126
|
+
acc = v.model == "acc"
|
|
127
|
+
pid = f"oop-{v.family}-{v.variant}"
|
|
128
|
+
head = [f"! fortran-oop {v.family}/{v.variant} "
|
|
129
|
+
f"({'OpenACC 3.4' if acc else 'OpenMP 5.2'}, free-form Fortran):"]
|
|
130
|
+
head += _wrap("", v.title)
|
|
131
|
+
head += _wrap("spec: ", "; ".join(v.cites))
|
|
132
|
+
head += _wrap("legality: ", v.legality + (f": {v.why}" if v.why else ""))
|
|
133
|
+
head += _wrap("expected (computed by compliance/oop_gen.py): ",
|
|
134
|
+
", ".join(f"{k}= {x}" for k, x in v.checks))
|
|
135
|
+
mod = ["module oop_m", " implicit none", f" integer, parameter :: n = {N}"]
|
|
136
|
+
mod += _block(v.types, 2) + _block(v.mod_decls, 2)
|
|
137
|
+
procs = _block(v.procs, 2)
|
|
138
|
+
if procs:
|
|
139
|
+
mod += ["contains"] + procs
|
|
140
|
+
mod += ["end module oop_m"]
|
|
141
|
+
main = ["program oop", f" use {'openacc' if acc else 'omp_lib'}",
|
|
142
|
+
" use oop_m", " implicit none", " integer :: host_flag",
|
|
143
|
+
" logical :: ok"]
|
|
144
|
+
names = {k for k, _ in v.checks}
|
|
145
|
+
declared = "\n".join(ln for ln in v.decls.split("\n")
|
|
146
|
+
if "::" in ln).lower()
|
|
147
|
+
missing = [k for k in sorted(names)
|
|
148
|
+
if not re.search(rf"\b{k}\b", declared)]
|
|
149
|
+
if missing:
|
|
150
|
+
main += [f" integer :: {', '.join(missing)}"]
|
|
151
|
+
main += _block(v.decls, 2)
|
|
152
|
+
main += [" host_flag = 1"]
|
|
153
|
+
if acc:
|
|
154
|
+
main += [" !$acc serial copy(host_flag)",
|
|
155
|
+
" host_flag = merge(1, 0, acc_on_device(acc_device_host))",
|
|
156
|
+
" !$acc end serial"]
|
|
157
|
+
else:
|
|
158
|
+
main += [" !$omp target map(from: host_flag)",
|
|
159
|
+
" host_flag = merge(1, 0, omp_is_initial_device())",
|
|
160
|
+
" !$omp end target"]
|
|
161
|
+
main += _block(v.body, 2)
|
|
162
|
+
main += [" ok = .true."]
|
|
163
|
+
main += [f" ok = ok .and. ({k} == {x})" for k, x in v.checks]
|
|
164
|
+
main += [f" print '(a,i0)', '{k}= ', {k}" for k, _ in v.checks]
|
|
165
|
+
main += [" print '(a,i0,a,a)', 'RESULT ran_on_host=', host_flag, "
|
|
166
|
+
"' check=', merge('pass', 'fail', ok)", "end program oop"]
|
|
167
|
+
src = "\n".join(head + mod + [""] + main) + "\n"
|
|
168
|
+
too_long = [ln for ln in src.split("\n") if len(ln) > 132]
|
|
169
|
+
if too_long:
|
|
170
|
+
raise ValueError(f"{pid}: line over 132 characters: {too_long[0]}")
|
|
171
|
+
return Program(id=pid, family=v.family, variant=v.variant,
|
|
172
|
+
title=v.title, model=v.model,
|
|
173
|
+
version=34 if acc else 52, source=src,
|
|
174
|
+
expected=dict(v.checks), legality=v.legality,
|
|
175
|
+
cites=tuple(v.cites), why=v.why, modes=v.modes)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
# --- shared pieces --------------------------------------------------------------------
|
|
179
|
+
|
|
180
|
+
VEC = """
|
|
181
|
+
type vec
|
|
182
|
+
integer :: n = 0
|
|
183
|
+
integer, allocatable :: a(:)
|
|
184
|
+
end type vec
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
VEC_SETUP = """
|
|
188
|
+
allocate(x%a(n))
|
|
189
|
+
x%n = n
|
|
190
|
+
do i = 1, n
|
|
191
|
+
x%a(i) = i
|
|
192
|
+
end do
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
C_MAPPABLE = "OpenMP 5.2 §1.2.6 p.18-19 (mappable type)"
|
|
196
|
+
C_MAP = "OpenMP 5.2 §5.8.3 p.151-155 (map clause)"
|
|
197
|
+
C_DEFMAPPER = "OpenMP 5.2 §5.8.2 p.150 (predefined default mapper)"
|
|
198
|
+
C_ALLOCCOMP = ("OpenMP 5.2 §5.8.3 p.151 l.29-37 (components from the "
|
|
199
|
+
"predefined default mapper); OpenMP 6.0 §B.5 p.909 l.35-37 "
|
|
200
|
+
"(5.0: mapping of allocatable and pointer components)")
|
|
201
|
+
C_ARRAYELTS = ("OpenMP 6.0 §7.9.6 p.281 l.25-26 (array elements become "
|
|
202
|
+
"implicit list items)")
|
|
203
|
+
C_IMPLICIT = ("OpenMP 5.2 §5.8.1 p.148 (implicit data-mapping: a "
|
|
204
|
+
"non-scalar is tofrom); §1.2.6 (scalar: intrinsic type)")
|
|
205
|
+
C_STRUCTELT = ("OpenMP 5.2 §13.8 p.286 l.27-28 (other referenced elements "
|
|
206
|
+
"of a mapped structure element are mapped too)")
|
|
207
|
+
C_TBP = ("OpenMP 5.2 §1.2.6 p.19 l.1-3 (type-bound procedures accessed in "
|
|
208
|
+
"a target region appear in a declare target directive)")
|
|
209
|
+
C_DT = "OpenMP 5.2 §7.8.1 p.205-207 (declare target, procedures)"
|
|
210
|
+
C_PROCREF = "OpenMP 5.2 §13.8 p.285 l.1-3 (procedures referenced in target)"
|
|
211
|
+
C_UPDATE = "OpenMP 5.2 §13.9 (target update)"
|
|
212
|
+
C_ENTER = "OpenMP 5.2 §13.6, §13.7 (target enter data, target exit data)"
|
|
213
|
+
C_MAPPER = "OpenMP 5.2 §5.8.8 p.162-164 (declare mapper)"
|
|
214
|
+
C_SECTION = ("OpenMP 5.2 §5.8.3 p.151 l.13 (structure elements and array "
|
|
215
|
+
"sections are list items); §5.8.3 p.157 l.21-22")
|
|
216
|
+
C_POLY60 = ("OpenMP 6.0 §7.9.6 p.288 l.10 (Fortran: a map list item of "
|
|
217
|
+
"polymorphic type: the behavior is unspecified)")
|
|
218
|
+
C_FINAL = ("OpenMP 5.2 §5.3 p.107 l.20-22 (finalization of a privatized "
|
|
219
|
+
"list item at the end of the region)")
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
# --- F01 nested types and arrays of types ---------------------------------------------
|
|
223
|
+
|
|
224
|
+
def _nested() -> list[V]:
|
|
225
|
+
out = []
|
|
226
|
+
types = """
|
|
227
|
+
type inner
|
|
228
|
+
integer :: a = 0, b = 0
|
|
229
|
+
end type inner
|
|
230
|
+
type outer
|
|
231
|
+
type(inner) :: in
|
|
232
|
+
integer :: c = 0
|
|
233
|
+
integer :: arr(4) = 0
|
|
234
|
+
end type outer
|
|
235
|
+
"""
|
|
236
|
+
setup = """
|
|
237
|
+
o%in%a = 3
|
|
238
|
+
o%in%b = 5
|
|
239
|
+
o%c = 7
|
|
240
|
+
o%arr = [1, 2, 3, 4]
|
|
241
|
+
"""
|
|
242
|
+
region = """
|
|
243
|
+
o%c = o%in%a * 10 + o%in%b + o%arr(1) + o%arr(2) + o%arr(3) + o%arr(4)
|
|
244
|
+
o%in%a = o%in%a + o%arr(4)
|
|
245
|
+
"""
|
|
246
|
+
tail = "r1 = o%c\nr2 = o%in%a\n"
|
|
247
|
+
r1 = 3 * 10 + 5 + 1 + 2 + 3 + 4
|
|
248
|
+
out.append(V("nested", "whole", "a structure with a nested structure and "
|
|
249
|
+
"a fixed-size array component, map(tofrom:) whole",
|
|
250
|
+
[C_MAP, C_DEFMAPPER], types=types,
|
|
251
|
+
decls="type(outer) :: o",
|
|
252
|
+
body=setup + "!$omp target map(tofrom: o)\n" + region +
|
|
253
|
+
"!$omp end target\n" + tail,
|
|
254
|
+
checks=[("r1", r1), ("r2", 3 + 4)]))
|
|
255
|
+
out.append(V("nested", "implicit", "the same structure referenced in a "
|
|
256
|
+
"target region without a map clause (implicitly tofrom)",
|
|
257
|
+
[C_IMPLICIT, C_DEFMAPPER], types=types,
|
|
258
|
+
decls="type(outer) :: o",
|
|
259
|
+
body=setup + "!$omp target\n" + region + "!$omp end target\n"
|
|
260
|
+
+ tail, checks=[("r1", r1), ("r2", 7)]))
|
|
261
|
+
out.append(V("nested", "aos", "an array of structures in a target teams "
|
|
262
|
+
"distribute parallel do",
|
|
263
|
+
[C_MAP, C_ARRAYELTS],
|
|
264
|
+
types="type pt\n integer :: x = 0, y = 0\nend type pt",
|
|
265
|
+
decls="type(pt) :: p(n)\ninteger :: i",
|
|
266
|
+
body="""
|
|
267
|
+
do i = 1, n
|
|
268
|
+
p(i)%x = i
|
|
269
|
+
p(i)%y = 2 * i
|
|
270
|
+
end do
|
|
271
|
+
!$omp target teams distribute parallel do map(tofrom: p)
|
|
272
|
+
do i = 1, n
|
|
273
|
+
p(i)%x = p(i)%x + 3 * p(i)%y
|
|
274
|
+
end do
|
|
275
|
+
r1 = sum(p%x)
|
|
276
|
+
r2 = p(n)%x
|
|
277
|
+
""", checks=[("r1", 7 * S1), ("r2", 7 * N)]))
|
|
278
|
+
out.append(V("nested", "cells", "a structure whose component is an array "
|
|
279
|
+
"of structures with array components, with a reduction",
|
|
280
|
+
[C_MAP, "OpenMP 5.2 §17.2 p.341 l.11-13 (a reduction on a "
|
|
281
|
+
"combined target construct maps tofrom)"],
|
|
282
|
+
types="""
|
|
283
|
+
type cell
|
|
284
|
+
integer :: v(3) = 0
|
|
285
|
+
end type cell
|
|
286
|
+
type grid
|
|
287
|
+
type(cell) :: c(n)
|
|
288
|
+
integer :: total = 0
|
|
289
|
+
end type grid
|
|
290
|
+
""", decls="type(grid) :: g\ninteger :: i, tot",
|
|
291
|
+
body="""
|
|
292
|
+
do i = 1, n
|
|
293
|
+
g%c(i)%v = [i, 2 * i, 3 * i]
|
|
294
|
+
end do
|
|
295
|
+
tot = 0
|
|
296
|
+
!$omp target teams distribute parallel do map(tofrom: g) reduction(+: tot)
|
|
297
|
+
do i = 1, n
|
|
298
|
+
g%c(i)%v(2) = g%c(i)%v(1) + g%c(i)%v(3)
|
|
299
|
+
tot = tot + g%c(i)%v(2)
|
|
300
|
+
end do
|
|
301
|
+
r1 = tot
|
|
302
|
+
r2 = g%c(5)%v(2)
|
|
303
|
+
""", checks=[("r1", 4 * S1), ("r2", 20)]))
|
|
304
|
+
out.append(V("nested", "enterexit", "an array of structures by target "
|
|
305
|
+
"enter data, updated on the device, target update from, "
|
|
306
|
+
"exit data", [C_ENTER, C_UPDATE, C_MAP],
|
|
307
|
+
types="type pt\n integer :: x = 0, y = 0\nend type pt",
|
|
308
|
+
decls="type(pt) :: p(n)\ninteger :: i",
|
|
309
|
+
body="""
|
|
310
|
+
do i = 1, n
|
|
311
|
+
p(i)%x = i
|
|
312
|
+
p(i)%y = 0
|
|
313
|
+
end do
|
|
314
|
+
!$omp target enter data map(to: p)
|
|
315
|
+
!$omp target teams distribute parallel do
|
|
316
|
+
do i = 1, n
|
|
317
|
+
p(i)%x = 2 * p(i)%x
|
|
318
|
+
p(i)%y = i
|
|
319
|
+
end do
|
|
320
|
+
!$omp target update from(p)
|
|
321
|
+
r1 = sum(p%x)
|
|
322
|
+
r2 = sum(p%y)
|
|
323
|
+
!$omp target exit data map(release: p)
|
|
324
|
+
""", checks=[("r1", 2 * S1), ("r2", S1)]))
|
|
325
|
+
return out
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
# --- F02 allocatable components (deep copy) -------------------------------------------
|
|
329
|
+
|
|
330
|
+
def _alloccomp() -> list[V]:
|
|
331
|
+
out = []
|
|
332
|
+
d = "type(vec) :: x\ninteger :: i"
|
|
333
|
+
out.append(V("alloccomp", "whole", "map(tofrom:) of a structure with an "
|
|
334
|
+
"allocatable array component: the component's data is mapped "
|
|
335
|
+
"with it (deep copy)", [C_ALLOCCOMP, C_DEFMAPPER],
|
|
336
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
337
|
+
!$omp target teams distribute parallel do map(tofrom: x)
|
|
338
|
+
do i = 1, n
|
|
339
|
+
x%a(i) = 3 * x%a(i) + x%n
|
|
340
|
+
end do
|
|
341
|
+
r1 = sum(x%a)
|
|
342
|
+
r2 = x%a(n)
|
|
343
|
+
""", checks=[("r1", 3 * S1 + N * N), ("r2", 3 * N + N)]))
|
|
344
|
+
out.append(V("alloccomp", "parent-and-comp", "map(to:) of the structure "
|
|
345
|
+
"and map(tofrom:) of its allocatable component on one "
|
|
346
|
+
"construct", [C_MAP, C_ALLOCCOMP,
|
|
347
|
+
"OpenMP 5.2 §5.8.3 p.156 l.6-7"],
|
|
348
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
349
|
+
!$omp target teams distribute parallel do map(to: x) map(tofrom: x%a)
|
|
350
|
+
do i = 1, n
|
|
351
|
+
x%a(i) = x%a(i) + 7
|
|
352
|
+
end do
|
|
353
|
+
r1 = sum(x%a)
|
|
354
|
+
""", checks=[("r1", S1 + 7 * N)]))
|
|
355
|
+
out.append(V("alloccomp", "comp-only", "map(tofrom:) of the allocatable "
|
|
356
|
+
"component alone", [C_MAP, C_STRUCTELT],
|
|
357
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
358
|
+
!$omp target teams distribute parallel do map(tofrom: x%a)
|
|
359
|
+
do i = 1, n
|
|
360
|
+
x%a(i) = 2 * x%a(i)
|
|
361
|
+
end do
|
|
362
|
+
r1 = sum(x%a)
|
|
363
|
+
""", checks=[("r1", 2 * S1)]))
|
|
364
|
+
out.append(V("alloccomp", "enterexit", "target enter data of the "
|
|
365
|
+
"structure (deep copy), a target region with an implicit map, "
|
|
366
|
+
"target exit data map(from:)", [C_ENTER, C_ALLOCCOMP],
|
|
367
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
368
|
+
!$omp target enter data map(to: x)
|
|
369
|
+
!$omp target teams distribute parallel do
|
|
370
|
+
do i = 1, n
|
|
371
|
+
x%a(i) = 5 * x%a(i)
|
|
372
|
+
end do
|
|
373
|
+
!$omp target exit data map(from: x)
|
|
374
|
+
r1 = sum(x%a)
|
|
375
|
+
""", checks=[("r1", 5 * S1)]))
|
|
376
|
+
out.append(V("alloccomp", "array", "an array of structures, each with an "
|
|
377
|
+
"allocatable component, mapped whole",
|
|
378
|
+
[C_ALLOCCOMP, C_ARRAYELTS], types=VEC,
|
|
379
|
+
decls="type(vec) :: v(4)\ninteger :: i, k",
|
|
380
|
+
body="""
|
|
381
|
+
do k = 1, 4
|
|
382
|
+
allocate(v(k)%a(n))
|
|
383
|
+
v(k)%n = n
|
|
384
|
+
do i = 1, n
|
|
385
|
+
v(k)%a(i) = k * i
|
|
386
|
+
end do
|
|
387
|
+
end do
|
|
388
|
+
!$omp target teams distribute parallel do collapse(2) map(tofrom: v)
|
|
389
|
+
do k = 1, 4
|
|
390
|
+
do i = 1, n
|
|
391
|
+
v(k)%a(i) = v(k)%a(i) + k
|
|
392
|
+
end do
|
|
393
|
+
end do
|
|
394
|
+
r1 = 0
|
|
395
|
+
do k = 1, 4
|
|
396
|
+
r1 = r1 + sum(v(k)%a)
|
|
397
|
+
end do
|
|
398
|
+
""", checks=[("r1", 10 * (S1 + N))]))
|
|
399
|
+
out.append(V("alloccomp", "twolevel", "an allocatable array of structures "
|
|
400
|
+
"with allocatable components inside a structure (two levels "
|
|
401
|
+
"of deep copy)", [C_ALLOCCOMP, C_ARRAYELTS],
|
|
402
|
+
types="""
|
|
403
|
+
type inner
|
|
404
|
+
integer, allocatable :: b(:)
|
|
405
|
+
end type inner
|
|
406
|
+
type outer
|
|
407
|
+
type(inner), allocatable :: c(:)
|
|
408
|
+
integer :: m = 0
|
|
409
|
+
end type outer
|
|
410
|
+
""", decls="type(outer) :: o\ninteger :: i, j",
|
|
411
|
+
body="""
|
|
412
|
+
allocate(o%c(3))
|
|
413
|
+
o%m = 3
|
|
414
|
+
do j = 1, 3
|
|
415
|
+
allocate(o%c(j)%b(n))
|
|
416
|
+
do i = 1, n
|
|
417
|
+
o%c(j)%b(i) = 100 * j + i
|
|
418
|
+
end do
|
|
419
|
+
end do
|
|
420
|
+
!$omp target teams distribute parallel do collapse(2) map(tofrom: o)
|
|
421
|
+
do j = 1, 3
|
|
422
|
+
do i = 1, n
|
|
423
|
+
o%c(j)%b(i) = 2 * o%c(j)%b(i)
|
|
424
|
+
end do
|
|
425
|
+
end do
|
|
426
|
+
r1 = 0
|
|
427
|
+
do j = 1, 3
|
|
428
|
+
r1 = r1 + sum(o%c(j)%b)
|
|
429
|
+
end do
|
|
430
|
+
""", checks=[("r1", 2 * (600 * N + 3 * S1))]))
|
|
431
|
+
out.append(V("alloccomp", "scalar", "an allocatable scalar component",
|
|
432
|
+
[C_ALLOCCOMP],
|
|
433
|
+
types="""
|
|
434
|
+
type sc
|
|
435
|
+
integer, allocatable :: s
|
|
436
|
+
integer :: k = 0
|
|
437
|
+
end type sc
|
|
438
|
+
""", decls="type(sc) :: x",
|
|
439
|
+
body="""
|
|
440
|
+
allocate(x%s)
|
|
441
|
+
x%s = 5
|
|
442
|
+
x%k = 3
|
|
443
|
+
!$omp target map(tofrom: x)
|
|
444
|
+
x%s = x%s * 10 + x%k
|
|
445
|
+
!$omp end target
|
|
446
|
+
r1 = x%s
|
|
447
|
+
""", checks=[("r1", 53)]))
|
|
448
|
+
out.append(V("alloccomp", "update", "target update from(x%a) of an "
|
|
449
|
+
"allocatable component of a structure entered by target "
|
|
450
|
+
"enter data", [C_UPDATE, C_ALLOCCOMP, C_ENTER],
|
|
451
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
452
|
+
!$omp target enter data map(to: x)
|
|
453
|
+
!$omp target teams distribute parallel do
|
|
454
|
+
do i = 1, n
|
|
455
|
+
x%a(i) = -x%a(i)
|
|
456
|
+
end do
|
|
457
|
+
!$omp target update from(x%a)
|
|
458
|
+
r1 = sum(x%a)
|
|
459
|
+
!$omp target exit data map(release: x)
|
|
460
|
+
""", checks=[("r1", -S1)]))
|
|
461
|
+
return out
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
# --- F03 pointer components -----------------------------------------------------------
|
|
465
|
+
|
|
466
|
+
PV = """
|
|
467
|
+
type pv
|
|
468
|
+
integer :: n = 0
|
|
469
|
+
integer, pointer :: p(:) => null()
|
|
470
|
+
end type pv
|
|
471
|
+
"""
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
def _ptrcomp() -> list[V]:
|
|
475
|
+
out = []
|
|
476
|
+
d = "type(pv) :: x\ninteger, target :: buf(n)\ninteger :: i"
|
|
477
|
+
setup = "do i = 1, n\n buf(i) = i\nend do\nx%n = n\nx%p => buf\n"
|
|
478
|
+
out.append(V("ptrcomp", "parent-and-comp", "map(to:) of a structure and "
|
|
479
|
+
"map(tofrom:) of its pointer component: the target is mapped "
|
|
480
|
+
"and the device pointer attached",
|
|
481
|
+
[C_MAP, "OpenMP 5.2 §5.8.3 p.152 l.1-16 (pointer list items, "
|
|
482
|
+
"attached pointers)"], types=PV, decls=d,
|
|
483
|
+
body=setup + """
|
|
484
|
+
!$omp target teams distribute parallel do map(to: x) map(tofrom: x%p)
|
|
485
|
+
do i = 1, n
|
|
486
|
+
x%p(i) = x%p(i) + 100
|
|
487
|
+
end do
|
|
488
|
+
r1 = sum(buf)
|
|
489
|
+
r2 = buf(n)
|
|
490
|
+
""", checks=[("r1", S1 + 100 * N), ("r2", N + 100)]))
|
|
491
|
+
out.append(V("ptrcomp", "comp-only", "map(tofrom:) of a pointer "
|
|
492
|
+
"component alone", [C_MAP, C_STRUCTELT], types=PV, decls=d,
|
|
493
|
+
body=setup + """
|
|
494
|
+
!$omp target teams distribute parallel do map(tofrom: x%p)
|
|
495
|
+
do i = 1, n
|
|
496
|
+
x%p(i) = 2 * x%p(i)
|
|
497
|
+
end do
|
|
498
|
+
r1 = sum(buf)
|
|
499
|
+
""", checks=[("r1", 2 * S1)]))
|
|
500
|
+
out.append(V("ptrcomp", "enterexit", "target enter data of the structure, "
|
|
501
|
+
"then of its pointer component (attach), a target region, exit "
|
|
502
|
+
"data from the component, release of the structure",
|
|
503
|
+
[C_ENTER, "OpenMP 5.2 §5.8.3 p.152 l.5-16",
|
|
504
|
+
"OpenMP 5.2 §5.8.3 p.156 l.27-30"], types=PV, decls=d,
|
|
505
|
+
body=setup + """
|
|
506
|
+
!$omp target enter data map(to: x)
|
|
507
|
+
!$omp target enter data map(to: x%p)
|
|
508
|
+
!$omp target teams distribute parallel do
|
|
509
|
+
do i = 1, n
|
|
510
|
+
x%p(i) = 3 * x%p(i)
|
|
511
|
+
end do
|
|
512
|
+
!$omp target exit data map(from: x%p)
|
|
513
|
+
!$omp target exit data map(release: x)
|
|
514
|
+
r1 = sum(buf)
|
|
515
|
+
""", checks=[("r1", 3 * S1)]))
|
|
516
|
+
out.append(V("ptrcomp", "section-target", "a pointer component associated "
|
|
517
|
+
"with an array section buf(9:24), map(tofrom: x%p)",
|
|
518
|
+
[C_MAP, "OpenMP 5.2 §5.8.3 p.152 l.1-4"], types=PV, decls=d,
|
|
519
|
+
body="""
|
|
520
|
+
do i = 1, n
|
|
521
|
+
buf(i) = i
|
|
522
|
+
end do
|
|
523
|
+
x%n = 16
|
|
524
|
+
x%p => buf(9:24)
|
|
525
|
+
!$omp target teams distribute parallel do map(tofrom: x%p)
|
|
526
|
+
do i = 1, 16
|
|
527
|
+
x%p(i) = x%p(i) + 1000
|
|
528
|
+
end do
|
|
529
|
+
r1 = sum(buf)
|
|
530
|
+
r2 = buf(9)
|
|
531
|
+
""", checks=[("r1", S1 + 16000), ("r2", 1009)]))
|
|
532
|
+
return out
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
# --- F04 sections of components -------------------------------------------------------
|
|
536
|
+
|
|
537
|
+
def _section() -> list[V]:
|
|
538
|
+
out = []
|
|
539
|
+
d = "type(vec) :: x\ninteger :: i"
|
|
540
|
+
out.append(V("section", "alloc", "map(tofrom: x%a(9:40)): a section of an "
|
|
541
|
+
"allocatable component", [C_SECTION, C_STRUCTELT],
|
|
542
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
543
|
+
!$omp target teams distribute parallel do map(tofrom: x%a(9:40))
|
|
544
|
+
do i = 9, 40
|
|
545
|
+
x%a(i) = x%a(i) + 1000
|
|
546
|
+
end do
|
|
547
|
+
r1 = sum(x%a)
|
|
548
|
+
r2 = x%a(8)
|
|
549
|
+
""", checks=[("r1", S1 + 32000), ("r2", 8)]))
|
|
550
|
+
out.append(V("section", "fixed", "map(tofrom: s%b(17:48)): a section of a "
|
|
551
|
+
"fixed-size array component", [C_SECTION, C_STRUCTELT],
|
|
552
|
+
types="type fs\n integer :: b(n) = 0\n integer :: k = 0\n"
|
|
553
|
+
"end type fs", decls="type(fs) :: s\ninteger :: i",
|
|
554
|
+
body="""
|
|
555
|
+
do i = 1, n
|
|
556
|
+
s%b(i) = i
|
|
557
|
+
end do
|
|
558
|
+
!$omp target teams distribute parallel do map(tofrom: s%b(17:48))
|
|
559
|
+
do i = 17, 48
|
|
560
|
+
s%b(i) = 2 * s%b(i)
|
|
561
|
+
end do
|
|
562
|
+
r1 = sum(s%b)
|
|
563
|
+
""", checks=[("r1", S1 + sum(range(17, 49)))]))
|
|
564
|
+
out.append(V("section", "update", "target update from(x%a(1:16)) after "
|
|
565
|
+
"the device changed every element, then exit data from",
|
|
566
|
+
[C_UPDATE, C_SECTION, C_ENTER], types=VEC, decls=d,
|
|
567
|
+
body=VEC_SETUP + """
|
|
568
|
+
!$omp target enter data map(to: x)
|
|
569
|
+
!$omp target teams distribute parallel do
|
|
570
|
+
do i = 1, n
|
|
571
|
+
x%a(i) = 2 * x%a(i)
|
|
572
|
+
end do
|
|
573
|
+
!$omp target update from(x%a(1:16))
|
|
574
|
+
r1 = sum(x%a(1:16))
|
|
575
|
+
!$omp target exit data map(from: x)
|
|
576
|
+
r2 = sum(x%a)
|
|
577
|
+
""", checks=[("r1", 2 * 136), ("r2", 2 * S1)]))
|
|
578
|
+
out.append(V("section", "element", "map(tofrom: v(2)%a(5:20)): a section "
|
|
579
|
+
"of the allocatable component of an array element",
|
|
580
|
+
[C_SECTION], types=VEC,
|
|
581
|
+
decls="type(vec) :: v(3)\ninteger :: i, k",
|
|
582
|
+
body="""
|
|
583
|
+
do k = 1, 3
|
|
584
|
+
allocate(v(k)%a(n))
|
|
585
|
+
v(k)%n = n
|
|
586
|
+
do i = 1, n
|
|
587
|
+
v(k)%a(i) = i
|
|
588
|
+
end do
|
|
589
|
+
end do
|
|
590
|
+
!$omp target teams distribute parallel do map(tofrom: v(2)%a(5:20))
|
|
591
|
+
do i = 5, 20
|
|
592
|
+
v(2)%a(i) = v(2)%a(i) + 50
|
|
593
|
+
end do
|
|
594
|
+
r1 = sum(v(2)%a)
|
|
595
|
+
r2 = sum(v(1)%a)
|
|
596
|
+
""", checks=[("r1", S1 + 16 * 50), ("r2", S1)]))
|
|
597
|
+
out.append(V("section", "nested", "map(tofrom: o%in%v(3:30)): a section of "
|
|
598
|
+
"an allocatable component of a nested structure", [C_SECTION],
|
|
599
|
+
types="""
|
|
600
|
+
type in_t
|
|
601
|
+
integer, allocatable :: v(:)
|
|
602
|
+
end type in_t
|
|
603
|
+
type out_t
|
|
604
|
+
type(in_t) :: in
|
|
605
|
+
integer :: tag = 0
|
|
606
|
+
end type out_t
|
|
607
|
+
""", decls="type(out_t) :: o\ninteger :: i",
|
|
608
|
+
body="""
|
|
609
|
+
allocate(o%in%v(n))
|
|
610
|
+
do i = 1, n
|
|
611
|
+
o%in%v(i) = i
|
|
612
|
+
end do
|
|
613
|
+
!$omp target teams distribute parallel do map(tofrom: o%in%v(3:30))
|
|
614
|
+
do i = 3, 30
|
|
615
|
+
o%in%v(i) = 3 * o%in%v(i)
|
|
616
|
+
end do
|
|
617
|
+
r1 = sum(o%in%v)
|
|
618
|
+
""", checks=[("r1", S1 + 2 * sum(range(3, 31)))]))
|
|
619
|
+
return out
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
# --- F05 declare mapper ----------------------------------------------------------------
|
|
623
|
+
|
|
624
|
+
MAPPER = "!$omp declare mapper(vec :: v) map(tofrom: v, v%a(1:v%n))"
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
def _mapper() -> list[V]:
|
|
628
|
+
out = []
|
|
629
|
+
d = "type(vec) :: x\ninteger :: i"
|
|
630
|
+
out.append(V("mapper", "default", "a default user-defined mapper for a "
|
|
631
|
+
"type with an allocatable component", [C_MAPPER, C_MAP],
|
|
632
|
+
types=VEC + MAPPER, decls=d, body=VEC_SETUP + """
|
|
633
|
+
!$omp target teams distribute parallel do map(tofrom: x)
|
|
634
|
+
do i = 1, n
|
|
635
|
+
x%a(i) = x%a(i) + i
|
|
636
|
+
end do
|
|
637
|
+
r1 = sum(x%a)
|
|
638
|
+
""", checks=[("r1", 2 * S1)]))
|
|
639
|
+
out.append(V("mapper", "named", "a named mapper used by "
|
|
640
|
+
"map(mapper(deep), tofrom: x)", [C_MAPPER,
|
|
641
|
+
"OpenMP 5.2 §5.8.2"],
|
|
642
|
+
types=VEC + "!$omp declare mapper(deep: vec :: v) "
|
|
643
|
+
"map(tofrom: v, v%a(1:v%n))", decls=d,
|
|
644
|
+
body=VEC_SETUP + """
|
|
645
|
+
!$omp target teams distribute parallel do map(mapper(deep), tofrom: x)
|
|
646
|
+
do i = 1, n
|
|
647
|
+
x%a(i) = x%a(i) * x%n
|
|
648
|
+
end do
|
|
649
|
+
r1 = sum(x%a)
|
|
650
|
+
""", checks=[("r1", N * S1)]))
|
|
651
|
+
out.append(V("mapper", "array", "an array of structures mapped through "
|
|
652
|
+
"the default user-defined mapper (each element by the mapper)",
|
|
653
|
+
[C_MAPPER, "OpenMP 5.2 §5.8.3 p.151 l.26-28"],
|
|
654
|
+
types=VEC + MAPPER, decls="type(vec) :: v(3)\ninteger :: i, k",
|
|
655
|
+
body="""
|
|
656
|
+
do k = 1, 3
|
|
657
|
+
allocate(v(k)%a(n))
|
|
658
|
+
v(k)%n = n
|
|
659
|
+
do i = 1, n
|
|
660
|
+
v(k)%a(i) = i
|
|
661
|
+
end do
|
|
662
|
+
end do
|
|
663
|
+
!$omp target teams distribute parallel do collapse(2) map(tofrom: v)
|
|
664
|
+
do k = 1, 3
|
|
665
|
+
do i = 1, n
|
|
666
|
+
v(k)%a(i) = v(k)%a(i) + k
|
|
667
|
+
end do
|
|
668
|
+
end do
|
|
669
|
+
r1 = sum(v(1)%a) + sum(v(2)%a) + sum(v(3)%a)
|
|
670
|
+
""", checks=[("r1", 3 * S1 + 6 * N)]))
|
|
671
|
+
out.append(V("mapper", "update", "target update from(x) through the "
|
|
672
|
+
"default user-defined mapper (the component's data comes "
|
|
673
|
+
"back)", [C_MAPPER, C_UPDATE,
|
|
674
|
+
"OpenMP 5.2 §5.9 p.165-166 (motion clauses use "
|
|
675
|
+
"mappers)"],
|
|
676
|
+
types=VEC + MAPPER, decls=d, body=VEC_SETUP + """
|
|
677
|
+
!$omp target enter data map(to: x)
|
|
678
|
+
!$omp target teams distribute parallel do
|
|
679
|
+
do i = 1, n
|
|
680
|
+
x%a(i) = x%a(i) + 5
|
|
681
|
+
end do
|
|
682
|
+
!$omp target update from(x)
|
|
683
|
+
r1 = sum(x%a)
|
|
684
|
+
!$omp target exit data map(release: x)
|
|
685
|
+
""", checks=[("r1", S1 + 5 * N)]))
|
|
686
|
+
out.append(V("mapper", "implicit", "a structure referenced in a target "
|
|
687
|
+
"region without a map clause: the implicit map uses the "
|
|
688
|
+
"default user-defined mapper", [C_MAPPER, C_IMPLICIT,
|
|
689
|
+
C_MAP],
|
|
690
|
+
types=VEC + MAPPER, decls=d, body=VEC_SETUP + """
|
|
691
|
+
!$omp target teams distribute parallel do
|
|
692
|
+
do i = 1, n
|
|
693
|
+
x%a(i) = 3 * x%a(i)
|
|
694
|
+
end do
|
|
695
|
+
r1 = sum(x%a)
|
|
696
|
+
""", checks=[("r1", 3 * S1)]))
|
|
697
|
+
out.append(V("mapper", "chained", "a mapper of an outer type whose map of "
|
|
698
|
+
"an inner component uses the inner type's mapper",
|
|
699
|
+
[C_MAPPER, "OpenMP 5.2 §5.8.8 p.164 l.1-2 (mapper map "
|
|
700
|
+
"clauses are subject to mappers in scope)"],
|
|
701
|
+
types="""
|
|
702
|
+
type inner_t
|
|
703
|
+
integer :: m = 0
|
|
704
|
+
integer, allocatable :: b(:)
|
|
705
|
+
end type inner_t
|
|
706
|
+
type outer_t
|
|
707
|
+
type(inner_t) :: in
|
|
708
|
+
integer :: k = 0
|
|
709
|
+
end type outer_t
|
|
710
|
+
!$omp declare mapper(inner_t :: w) map(tofrom: w, w%b(1:w%m))
|
|
711
|
+
!$omp declare mapper(outer_t :: o) map(tofrom: o, o%in)
|
|
712
|
+
""", decls="type(outer_t) :: o\ninteger :: i",
|
|
713
|
+
body="""
|
|
714
|
+
allocate(o%in%b(n))
|
|
715
|
+
o%in%m = n
|
|
716
|
+
o%k = 10
|
|
717
|
+
do i = 1, n
|
|
718
|
+
o%in%b(i) = i
|
|
719
|
+
end do
|
|
720
|
+
!$omp target teams distribute parallel do map(tofrom: o)
|
|
721
|
+
do i = 1, n
|
|
722
|
+
o%in%b(i) = o%in%b(i) + o%k
|
|
723
|
+
end do
|
|
724
|
+
r1 = sum(o%in%b)
|
|
725
|
+
""", checks=[("r1", S1 + 10 * N)]))
|
|
726
|
+
return out
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
# --- F06 parameterized derived types ---------------------------------------------------
|
|
730
|
+
|
|
731
|
+
LV = """
|
|
732
|
+
type lv(m)
|
|
733
|
+
integer, len :: m
|
|
734
|
+
integer :: a(m)
|
|
735
|
+
end type lv
|
|
736
|
+
"""
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
def _pdt() -> list[V]:
|
|
740
|
+
out = []
|
|
741
|
+
out.append(V("pdt", "kind", "a derived type with a kind type parameter "
|
|
742
|
+
"(integer(8) components), map(tofrom:)",
|
|
743
|
+
[C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7 (same type, type "
|
|
744
|
+
"parameters and rank)"],
|
|
745
|
+
types="""
|
|
746
|
+
type kv(k)
|
|
747
|
+
integer, kind :: k = 4
|
|
748
|
+
integer(k) :: v(8)
|
|
749
|
+
end type kv
|
|
750
|
+
""", decls="type(kv(8)) :: x\ninteger :: i",
|
|
751
|
+
body="""
|
|
752
|
+
do i = 1, 8
|
|
753
|
+
x%v(i) = int(i, 8) * 1000000000_8
|
|
754
|
+
end do
|
|
755
|
+
!$omp target map(tofrom: x)
|
|
756
|
+
do i = 1, 8
|
|
757
|
+
x%v(i) = x%v(i) + i
|
|
758
|
+
end do
|
|
759
|
+
!$omp end target
|
|
760
|
+
r1 = int(x%v(8) - 8000000000_8)
|
|
761
|
+
r2 = int(mod(sum(x%v), 1000000_8))
|
|
762
|
+
""", checks=[("r1", 8), ("r2", 36)]))
|
|
763
|
+
out.append(V("pdt", "len", "a derived type with a length type parameter "
|
|
764
|
+
"(constant), its value read on the device",
|
|
765
|
+
[C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7"], types=LV,
|
|
766
|
+
decls="type(lv(16)) :: x\ninteger :: i",
|
|
767
|
+
body="""
|
|
768
|
+
do i = 1, 16
|
|
769
|
+
x%a(i) = i
|
|
770
|
+
end do
|
|
771
|
+
!$omp target map(tofrom: x) map(from: r1)
|
|
772
|
+
r1 = x%m
|
|
773
|
+
do i = 1, x%m
|
|
774
|
+
x%a(i) = x%a(i) * x%a(i)
|
|
775
|
+
end do
|
|
776
|
+
!$omp end target
|
|
777
|
+
r2 = sum(x%a)
|
|
778
|
+
""", checks=[("r1", 16),
|
|
779
|
+
("r2", sum(i * i for i in range(1, 17)))]))
|
|
780
|
+
out.append(V("pdt", "deferred", "an allocatable scalar of a derived type "
|
|
781
|
+
"with a deferred length type parameter (allocate(lv(32) :: y))",
|
|
782
|
+
[C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7"], types=LV,
|
|
783
|
+
decls="type(lv(:)), allocatable :: y\ninteger :: i",
|
|
784
|
+
body="""
|
|
785
|
+
allocate(lv(32) :: y)
|
|
786
|
+
do i = 1, 32
|
|
787
|
+
y%a(i) = i
|
|
788
|
+
end do
|
|
789
|
+
!$omp target map(tofrom: y)
|
|
790
|
+
do i = 1, 32
|
|
791
|
+
y%a(i) = y%a(i) + y%m
|
|
792
|
+
end do
|
|
793
|
+
!$omp end target
|
|
794
|
+
r1 = sum(y%a)
|
|
795
|
+
""", checks=[("r1", 528 + 32 * 32)]))
|
|
796
|
+
out.append(V("pdt", "array", "an array of a parameterized derived type in "
|
|
797
|
+
"a target teams distribute parallel do", [C_MAP, C_ARRAYELTS],
|
|
798
|
+
types=LV, decls="type(lv(4)) :: arr(n)\ninteger :: i, j",
|
|
799
|
+
body="""
|
|
800
|
+
do j = 1, n
|
|
801
|
+
arr(j)%a = j
|
|
802
|
+
end do
|
|
803
|
+
!$omp target teams distribute parallel do collapse(2) map(tofrom: arr)
|
|
804
|
+
do j = 1, n
|
|
805
|
+
do i = 1, 4
|
|
806
|
+
arr(j)%a(i) = arr(j)%a(i) + i
|
|
807
|
+
end do
|
|
808
|
+
end do
|
|
809
|
+
r1 = 0
|
|
810
|
+
do j = 1, n
|
|
811
|
+
r1 = r1 + sum(arr(j)%a)
|
|
812
|
+
end do
|
|
813
|
+
""", checks=[("r1", 4 * S1 + 10 * N)]))
|
|
814
|
+
out.append(V("pdt", "kindlen", "a derived type with a kind and a length "
|
|
815
|
+
"type parameter", [C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7"],
|
|
816
|
+
types="""
|
|
817
|
+
type kl(k, m)
|
|
818
|
+
integer, kind :: k = 4
|
|
819
|
+
integer, len :: m
|
|
820
|
+
integer(k) :: a(m)
|
|
821
|
+
end type kl
|
|
822
|
+
""", decls="type(kl(8, 10)) :: x\ninteger :: i",
|
|
823
|
+
body="""
|
|
824
|
+
do i = 1, 10
|
|
825
|
+
x%a(i) = i
|
|
826
|
+
end do
|
|
827
|
+
!$omp target map(tofrom: x)
|
|
828
|
+
do i = 1, x%m
|
|
829
|
+
x%a(i) = 2 * x%a(i) + 1
|
|
830
|
+
end do
|
|
831
|
+
!$omp end target
|
|
832
|
+
r1 = int(sum(x%a))
|
|
833
|
+
""", checks=[("r1", 2 * 55 + 10)]))
|
|
834
|
+
return out
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
# --- F07 type extension ----------------------------------------------------------------
|
|
838
|
+
|
|
839
|
+
BASE_EXT = """
|
|
840
|
+
type base
|
|
841
|
+
integer :: a = 0
|
|
842
|
+
end type base
|
|
843
|
+
type, extends(base) :: ext
|
|
844
|
+
integer :: b = 0
|
|
845
|
+
end type ext
|
|
846
|
+
"""
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
def _extends() -> list[V]:
|
|
850
|
+
out = []
|
|
851
|
+
out.append(V("extends", "whole", "an extended type mapped whole: "
|
|
852
|
+
"inherited and own components, and the parent component",
|
|
853
|
+
[C_MAP, C_DEFMAPPER], types=BASE_EXT, decls="type(ext) :: e",
|
|
854
|
+
body="""
|
|
855
|
+
e%a = 5
|
|
856
|
+
e%b = 7
|
|
857
|
+
!$omp target map(tofrom: e)
|
|
858
|
+
e%b = e%a * 2 + e%b
|
|
859
|
+
e%a = e%a + 1
|
|
860
|
+
e%base%a = e%base%a + 10
|
|
861
|
+
!$omp end target
|
|
862
|
+
r1 = e%a
|
|
863
|
+
r2 = e%b
|
|
864
|
+
""", checks=[("r1", 16), ("r2", 17)]))
|
|
865
|
+
out.append(V("extends", "parent-comp", "map(tofrom: e%base): the parent "
|
|
866
|
+
"component as a structure element", [C_MAP, C_STRUCTELT],
|
|
867
|
+
types=BASE_EXT, decls="type(ext) :: e",
|
|
868
|
+
body="""
|
|
869
|
+
e%a = 5
|
|
870
|
+
e%b = 7
|
|
871
|
+
!$omp target map(tofrom: e%base)
|
|
872
|
+
e%base%a = e%base%a * 3
|
|
873
|
+
!$omp end target
|
|
874
|
+
r1 = e%a
|
|
875
|
+
r2 = e%b
|
|
876
|
+
""", checks=[("r1", 15), ("r2", 7)]))
|
|
877
|
+
out.append(V("extends", "alloc-parent", "an array of an extended type "
|
|
878
|
+
"whose parent has an allocatable component",
|
|
879
|
+
[C_ALLOCCOMP, C_ARRAYELTS],
|
|
880
|
+
types="""
|
|
881
|
+
type base2
|
|
882
|
+
integer, allocatable :: w(:)
|
|
883
|
+
end type base2
|
|
884
|
+
type, extends(base2) :: ext2
|
|
885
|
+
integer :: s = 0
|
|
886
|
+
end type ext2
|
|
887
|
+
""", decls="type(ext2) :: arr(4)\ninteger :: i, k",
|
|
888
|
+
body="""
|
|
889
|
+
do k = 1, 4
|
|
890
|
+
allocate(arr(k)%w(n))
|
|
891
|
+
arr(k)%w = k
|
|
892
|
+
arr(k)%s = 0
|
|
893
|
+
end do
|
|
894
|
+
!$omp target teams distribute parallel do map(tofrom: arr)
|
|
895
|
+
do k = 1, 4
|
|
896
|
+
do i = 1, n
|
|
897
|
+
arr(k)%w(i) = arr(k)%w(i) + i
|
|
898
|
+
arr(k)%s = arr(k)%s + arr(k)%w(i)
|
|
899
|
+
end do
|
|
900
|
+
end do
|
|
901
|
+
r1 = sum(arr%s)
|
|
902
|
+
r2 = arr(4)%w(n)
|
|
903
|
+
""", checks=[("r1", N * 10 + 4 * S1), ("r2", 4 + N)]))
|
|
904
|
+
out.append(V("extends", "chain", "a three-level extension chain: "
|
|
905
|
+
"components by inherited names and by parent components",
|
|
906
|
+
[C_MAP], types="""
|
|
907
|
+
type lvl1
|
|
908
|
+
integer :: a = 0
|
|
909
|
+
end type lvl1
|
|
910
|
+
type, extends(lvl1) :: lvl2
|
|
911
|
+
integer :: b = 0
|
|
912
|
+
end type lvl2
|
|
913
|
+
type, extends(lvl2) :: lvl3
|
|
914
|
+
integer :: c = 0
|
|
915
|
+
end type lvl3
|
|
916
|
+
""", decls="type(lvl3) :: t",
|
|
917
|
+
body="""
|
|
918
|
+
t%a = 1
|
|
919
|
+
t%b = 2
|
|
920
|
+
t%c = 3
|
|
921
|
+
!$omp target map(tofrom: t)
|
|
922
|
+
t%c = t%a + t%b + t%c
|
|
923
|
+
t%lvl2%lvl1%a = 10
|
|
924
|
+
t%lvl2%b = t%b * 4
|
|
925
|
+
!$omp end target
|
|
926
|
+
r1 = t%a
|
|
927
|
+
r2 = t%b
|
|
928
|
+
r3 = t%c
|
|
929
|
+
""", checks=[("r1", 10), ("r2", 8), ("r3", 6)]))
|
|
930
|
+
out.append(V("extends", "aos", "an array of an extended type in a target "
|
|
931
|
+
"teams distribute parallel do", [C_MAP, C_ARRAYELTS],
|
|
932
|
+
types=BASE_EXT, decls="type(ext) :: q(n)\ninteger :: i",
|
|
933
|
+
body="""
|
|
934
|
+
do i = 1, n
|
|
935
|
+
q(i)%a = i
|
|
936
|
+
q(i)%b = 0
|
|
937
|
+
end do
|
|
938
|
+
!$omp target teams distribute parallel do map(tofrom: q)
|
|
939
|
+
do i = 1, n
|
|
940
|
+
q(i)%b = q(i)%a * q(i)%a
|
|
941
|
+
q(i)%a = -q(i)%a
|
|
942
|
+
end do
|
|
943
|
+
r1 = sum(q%b)
|
|
944
|
+
r2 = sum(q%a)
|
|
945
|
+
""", checks=[("r1", S2), ("r2", -S1)]))
|
|
946
|
+
return out
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
# --- F08 type-bound procedures as device routines --------------------------------------
|
|
950
|
+
|
|
951
|
+
def _tbp() -> list[V]:
|
|
952
|
+
out = []
|
|
953
|
+
dt = "!$omp declare target"
|
|
954
|
+
vec3 = f"""
|
|
955
|
+
type vec3
|
|
956
|
+
integer :: x = 0, y = 0, z = 0
|
|
957
|
+
contains
|
|
958
|
+
procedure :: norm2 => v_norm2
|
|
959
|
+
procedure, nopass :: twice => v_twice
|
|
960
|
+
procedure :: scale_i, scale_ij
|
|
961
|
+
generic :: scale => scale_i, scale_ij
|
|
962
|
+
end type vec3
|
|
963
|
+
"""
|
|
964
|
+
vprocs = f"""
|
|
965
|
+
integer function v_norm2(s)
|
|
966
|
+
{dt}
|
|
967
|
+
class(vec3), intent(in) :: s
|
|
968
|
+
v_norm2 = s%x * s%x + s%y * s%y + s%z * s%z
|
|
969
|
+
end function v_norm2
|
|
970
|
+
integer function v_twice(k)
|
|
971
|
+
{dt}
|
|
972
|
+
integer, intent(in) :: k
|
|
973
|
+
v_twice = 2 * k
|
|
974
|
+
end function v_twice
|
|
975
|
+
subroutine scale_i(s, k)
|
|
976
|
+
{dt}
|
|
977
|
+
class(vec3), intent(inout) :: s
|
|
978
|
+
integer, intent(in) :: k
|
|
979
|
+
s%x = s%x * k
|
|
980
|
+
s%y = s%y * k
|
|
981
|
+
s%z = s%z * k
|
|
982
|
+
end subroutine scale_i
|
|
983
|
+
subroutine scale_ij(s, a, b)
|
|
984
|
+
{dt}
|
|
985
|
+
class(vec3), intent(inout) :: s
|
|
986
|
+
integer, intent(in) :: a, b
|
|
987
|
+
s%x = s%x * a * b
|
|
988
|
+
s%y = s%y * a * b
|
|
989
|
+
s%z = s%z * a * b
|
|
990
|
+
end subroutine scale_ij
|
|
991
|
+
"""
|
|
992
|
+
vset = "v%x = 1\nv%y = 2\nv%z = 3\n"
|
|
993
|
+
out.append(V("tbp", "function", "a type-bound function called on the "
|
|
994
|
+
"device (declare target)", [C_TBP, C_DT], types=vec3,
|
|
995
|
+
procs=vprocs, decls="type(vec3) :: v",
|
|
996
|
+
body=vset + "!$omp target map(tofrom: v) map(from: r1)\n"
|
|
997
|
+
"r1 = v%norm2()\n!$omp end target\n",
|
|
998
|
+
checks=[("r1", 14)]))
|
|
999
|
+
out.append(V("tbp", "nopass", "a NOPASS type-bound function called on the "
|
|
1000
|
+
"device", [C_TBP, C_DT], types=vec3, procs=vprocs,
|
|
1001
|
+
decls="type(vec3) :: v",
|
|
1002
|
+
body=vset + "!$omp target map(tofrom: v) map(from: r1)\n"
|
|
1003
|
+
"r1 = v%twice(21)\n!$omp end target\n",
|
|
1004
|
+
checks=[("r1", 42)]))
|
|
1005
|
+
out.append(V("tbp", "generic", "a generic type-bound binding with two "
|
|
1006
|
+
"specific subroutines, both called on the device",
|
|
1007
|
+
[C_TBP, C_DT], types=vec3, procs=vprocs,
|
|
1008
|
+
decls="type(vec3) :: v",
|
|
1009
|
+
body=vset + """
|
|
1010
|
+
!$omp target map(tofrom: v)
|
|
1011
|
+
call v%scale(3)
|
|
1012
|
+
call v%scale(2, 5)
|
|
1013
|
+
!$omp end target
|
|
1014
|
+
r1 = v%x + v%y + v%z
|
|
1015
|
+
""", checks=[("r1", (1 + 2 + 3) * 30)]))
|
|
1016
|
+
ov_types = """
|
|
1017
|
+
type base_t
|
|
1018
|
+
integer :: a = 0
|
|
1019
|
+
contains
|
|
1020
|
+
procedure :: val => base_val
|
|
1021
|
+
end type base_t
|
|
1022
|
+
type, extends(base_t) :: ext_t
|
|
1023
|
+
integer :: b = 0
|
|
1024
|
+
contains
|
|
1025
|
+
procedure :: val => ext_val
|
|
1026
|
+
end type ext_t
|
|
1027
|
+
"""
|
|
1028
|
+
ov_procs = f"""
|
|
1029
|
+
integer function base_val(s)
|
|
1030
|
+
{dt}
|
|
1031
|
+
class(base_t), intent(in) :: s
|
|
1032
|
+
base_val = s%a
|
|
1033
|
+
end function base_val
|
|
1034
|
+
integer function ext_val(s)
|
|
1035
|
+
{dt}
|
|
1036
|
+
class(ext_t), intent(in) :: s
|
|
1037
|
+
ext_val = s%a * 100 + s%b
|
|
1038
|
+
end function ext_val
|
|
1039
|
+
"""
|
|
1040
|
+
out.append(V("tbp", "override", "an overridden binding called on objects "
|
|
1041
|
+
"of the base and the extended type, and through the parent "
|
|
1042
|
+
"component", [C_TBP, C_DT], types=ov_types, procs=ov_procs,
|
|
1043
|
+
decls="type(base_t) :: b0\ntype(ext_t) :: e",
|
|
1044
|
+
body="""
|
|
1045
|
+
b0%a = 3
|
|
1046
|
+
e%a = 4
|
|
1047
|
+
e%b = 5
|
|
1048
|
+
!$omp target map(tofrom: b0, e) map(from: r1, r2, r3)
|
|
1049
|
+
r1 = b0%val()
|
|
1050
|
+
r2 = e%val()
|
|
1051
|
+
r3 = e%base_t%val()
|
|
1052
|
+
!$omp end target
|
|
1053
|
+
""", checks=[("r1", 3), ("r2", 405), ("r3", 4)]))
|
|
1054
|
+
out.append(V("tbp", "loop", "a type-bound subroutine called on each "
|
|
1055
|
+
"element of an array in a target teams distribute parallel do",
|
|
1056
|
+
[C_TBP, C_DT],
|
|
1057
|
+
types="""
|
|
1058
|
+
type cnt
|
|
1059
|
+
integer :: c = 0
|
|
1060
|
+
contains
|
|
1061
|
+
procedure :: step => cnt_step
|
|
1062
|
+
end type cnt
|
|
1063
|
+
""", procs=f"""
|
|
1064
|
+
subroutine cnt_step(s, k)
|
|
1065
|
+
{dt}
|
|
1066
|
+
class(cnt), intent(inout) :: s
|
|
1067
|
+
integer, intent(in) :: k
|
|
1068
|
+
s%c = s%c + k
|
|
1069
|
+
end subroutine cnt_step
|
|
1070
|
+
""", decls="type(cnt) :: p(n)\ninteger :: i",
|
|
1071
|
+
body="""
|
|
1072
|
+
!$omp target teams distribute parallel do map(tofrom: p)
|
|
1073
|
+
do i = 1, n
|
|
1074
|
+
call p(i)%step(i)
|
|
1075
|
+
call p(i)%step(1)
|
|
1076
|
+
end do
|
|
1077
|
+
r1 = sum(p%c)
|
|
1078
|
+
""", checks=[("r1", S1 + N)]))
|
|
1079
|
+
out.append(V("tbp", "argument", "a type-bound function with a second "
|
|
1080
|
+
"derived-type argument", [C_TBP, C_DT],
|
|
1081
|
+
types="""
|
|
1082
|
+
type acc_t
|
|
1083
|
+
integer :: v(8) = 0
|
|
1084
|
+
contains
|
|
1085
|
+
procedure :: dot => a_dot
|
|
1086
|
+
end type acc_t
|
|
1087
|
+
""", procs=f"""
|
|
1088
|
+
integer function a_dot(s, o)
|
|
1089
|
+
{dt}
|
|
1090
|
+
class(acc_t), intent(in) :: s
|
|
1091
|
+
type(acc_t), intent(in) :: o
|
|
1092
|
+
integer :: i
|
|
1093
|
+
a_dot = 0
|
|
1094
|
+
do i = 1, 8
|
|
1095
|
+
a_dot = a_dot + s%v(i) * o%v(i)
|
|
1096
|
+
end do
|
|
1097
|
+
end function a_dot
|
|
1098
|
+
""", decls="type(acc_t) :: u, w\ninteger :: i",
|
|
1099
|
+
body="""
|
|
1100
|
+
do i = 1, 8
|
|
1101
|
+
u%v(i) = i
|
|
1102
|
+
w%v(i) = 2
|
|
1103
|
+
end do
|
|
1104
|
+
!$omp target map(tofrom: u, w) map(from: r1)
|
|
1105
|
+
r1 = u%dot(w)
|
|
1106
|
+
!$omp end target
|
|
1107
|
+
""", checks=[("r1", 72)]))
|
|
1108
|
+
out.append(V("tbp", "operator", "a type-bound generic operator(+) used in "
|
|
1109
|
+
"device code", [C_TBP, C_DT],
|
|
1110
|
+
types="""
|
|
1111
|
+
type v2
|
|
1112
|
+
integer :: x = 0, y = 0
|
|
1113
|
+
contains
|
|
1114
|
+
procedure :: add => v2_add
|
|
1115
|
+
generic :: operator(+) => add
|
|
1116
|
+
end type v2
|
|
1117
|
+
""", procs=f"""
|
|
1118
|
+
function v2_add(a, b) result(c)
|
|
1119
|
+
{dt}
|
|
1120
|
+
class(v2), intent(in) :: a
|
|
1121
|
+
type(v2), intent(in) :: b
|
|
1122
|
+
type(v2) :: c
|
|
1123
|
+
c%x = a%x + b%x
|
|
1124
|
+
c%y = a%y + b%y
|
|
1125
|
+
end function v2_add
|
|
1126
|
+
""", decls="type(v2) :: a, b, c",
|
|
1127
|
+
body="""
|
|
1128
|
+
a%x = 1
|
|
1129
|
+
a%y = 2
|
|
1130
|
+
b%x = 10
|
|
1131
|
+
b%y = 20
|
|
1132
|
+
!$omp target map(tofrom: a, b, c)
|
|
1133
|
+
c = a + b
|
|
1134
|
+
!$omp end target
|
|
1135
|
+
r1 = c%x * 100 + c%y
|
|
1136
|
+
""", checks=[("r1", 1122)]))
|
|
1137
|
+
out.append(V("tbp", "nested-call", "a type-bound function that calls "
|
|
1138
|
+
"another binding of the same object", [C_TBP, C_DT],
|
|
1139
|
+
types="""
|
|
1140
|
+
type pair
|
|
1141
|
+
integer :: v(2) = 0
|
|
1142
|
+
contains
|
|
1143
|
+
procedure :: part => p_part
|
|
1144
|
+
procedure :: total => p_total
|
|
1145
|
+
end type pair
|
|
1146
|
+
""", procs=f"""
|
|
1147
|
+
integer function p_part(s, k)
|
|
1148
|
+
{dt}
|
|
1149
|
+
class(pair), intent(in) :: s
|
|
1150
|
+
integer, intent(in) :: k
|
|
1151
|
+
p_part = s%v(k) * k
|
|
1152
|
+
end function p_part
|
|
1153
|
+
integer function p_total(s)
|
|
1154
|
+
{dt}
|
|
1155
|
+
class(pair), intent(in) :: s
|
|
1156
|
+
p_total = s%part(1) + s%part(2)
|
|
1157
|
+
end function p_total
|
|
1158
|
+
""", decls="type(pair) :: q",
|
|
1159
|
+
body="""
|
|
1160
|
+
q%v = [5, 7]
|
|
1161
|
+
!$omp target map(tofrom: q) map(from: r1)
|
|
1162
|
+
r1 = q%total()
|
|
1163
|
+
!$omp end target
|
|
1164
|
+
""", checks=[("r1", 19)]))
|
|
1165
|
+
return out
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
# --- F09 polymorphic dummy arguments, SELECT TYPE, dispatch ----------------------------
|
|
1169
|
+
|
|
1170
|
+
POLY_TYPES = """
|
|
1171
|
+
type base_t
|
|
1172
|
+
integer :: a = 0
|
|
1173
|
+
end type base_t
|
|
1174
|
+
type, extends(base_t) :: ext1
|
|
1175
|
+
integer :: u = 0
|
|
1176
|
+
end type ext1
|
|
1177
|
+
type, extends(base_t) :: ext2
|
|
1178
|
+
integer :: v = 0
|
|
1179
|
+
end type ext2
|
|
1180
|
+
"""
|
|
1181
|
+
|
|
1182
|
+
BUMP = """
|
|
1183
|
+
subroutine bump(s)
|
|
1184
|
+
!$omp declare target
|
|
1185
|
+
class(base_t), intent(inout) :: s
|
|
1186
|
+
select type (s)
|
|
1187
|
+
type is (ext1)
|
|
1188
|
+
s%u = s%u + 10
|
|
1189
|
+
type is (ext2)
|
|
1190
|
+
s%v = s%v + 100
|
|
1191
|
+
class default
|
|
1192
|
+
s%a = -1
|
|
1193
|
+
end select
|
|
1194
|
+
end subroutine bump
|
|
1195
|
+
"""
|
|
1196
|
+
|
|
1197
|
+
SHAPES = """
|
|
1198
|
+
type, abstract :: shape
|
|
1199
|
+
integer :: id = 0
|
|
1200
|
+
contains
|
|
1201
|
+
procedure(area_if), deferred :: area
|
|
1202
|
+
end type shape
|
|
1203
|
+
abstract interface
|
|
1204
|
+
integer function area_if(s)
|
|
1205
|
+
import :: shape
|
|
1206
|
+
class(shape), intent(in) :: s
|
|
1207
|
+
end function area_if
|
|
1208
|
+
end interface
|
|
1209
|
+
type, extends(shape) :: sq
|
|
1210
|
+
integer :: side = 0
|
|
1211
|
+
contains
|
|
1212
|
+
procedure :: area => sq_area
|
|
1213
|
+
end type sq
|
|
1214
|
+
type, extends(shape) :: rect
|
|
1215
|
+
integer :: w = 0, h = 0
|
|
1216
|
+
contains
|
|
1217
|
+
procedure :: area => rect_area
|
|
1218
|
+
end type rect
|
|
1219
|
+
"""
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
def _shape_procs(dt: str = "!$omp declare target") -> str:
|
|
1223
|
+
return f"""
|
|
1224
|
+
integer function sq_area(s)
|
|
1225
|
+
{dt}
|
|
1226
|
+
class(sq), intent(in) :: s
|
|
1227
|
+
sq_area = s%side * s%side
|
|
1228
|
+
end function sq_area
|
|
1229
|
+
integer function rect_area(s)
|
|
1230
|
+
{dt}
|
|
1231
|
+
class(rect), intent(in) :: s
|
|
1232
|
+
rect_area = s%w * s%h
|
|
1233
|
+
end function rect_area
|
|
1234
|
+
integer function area_of(s)
|
|
1235
|
+
{dt}
|
|
1236
|
+
class(shape), intent(in) :: s
|
|
1237
|
+
area_of = s%area()
|
|
1238
|
+
end function area_of
|
|
1239
|
+
"""
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
C_SELECT = ("OpenMP 5.2 §5.3 p.107 l.17-19 (SELECT TYPE in OpenMP regions); "
|
|
1243
|
+
"Fortran 2018 11.1.11 (SELECT TYPE)")
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
def _poly() -> list[V]:
|
|
1247
|
+
out = []
|
|
1248
|
+
out.append(V("poly", "select-type", "a declare target subroutine with a "
|
|
1249
|
+
"CLASS(base_t) dummy and SELECT TYPE, called on the device "
|
|
1250
|
+
"with mapped non-polymorphic objects of three types",
|
|
1251
|
+
[C_TBP, C_DT, C_SELECT], types=POLY_TYPES, procs=BUMP,
|
|
1252
|
+
decls="type(ext1) :: e1\ntype(ext2) :: e2\ntype(base_t) :: b0",
|
|
1253
|
+
body="""
|
|
1254
|
+
!$omp target map(tofrom: e1, e2, b0)
|
|
1255
|
+
call bump(e1)
|
|
1256
|
+
call bump(e2)
|
|
1257
|
+
call bump(b0)
|
|
1258
|
+
!$omp end target
|
|
1259
|
+
r1 = e1%u
|
|
1260
|
+
r2 = e2%v
|
|
1261
|
+
r3 = b0%a
|
|
1262
|
+
""", checks=[("r1", 10), ("r2", 100), ("r3", -1)]))
|
|
1263
|
+
out.append(V("poly", "dispatch", "dynamic dispatch of a deferred binding "
|
|
1264
|
+
"(abstract type) through a CLASS(shape) dummy on the device",
|
|
1265
|
+
[C_TBP, C_DT], types=SHAPES, procs=_shape_procs(),
|
|
1266
|
+
decls="type(sq) :: q\ntype(rect) :: rr",
|
|
1267
|
+
body="""
|
|
1268
|
+
q%side = 3
|
|
1269
|
+
rr%w = 4
|
|
1270
|
+
rr%h = 5
|
|
1271
|
+
!$omp target map(tofrom: q, rr) map(from: r1)
|
|
1272
|
+
r1 = area_of(q) + area_of(rr)
|
|
1273
|
+
!$omp end target
|
|
1274
|
+
""", checks=[("r1", 29)]))
|
|
1275
|
+
out.append(V("poly", "dispatch-loop", "dynamic dispatch on every element "
|
|
1276
|
+
"of an array in a target teams distribute parallel do with a "
|
|
1277
|
+
"reduction", [C_TBP, C_DT], types=SHAPES,
|
|
1278
|
+
procs=_shape_procs(),
|
|
1279
|
+
decls="type(sq) :: qs(n)\ninteger :: i, tot",
|
|
1280
|
+
body="""
|
|
1281
|
+
do i = 1, n
|
|
1282
|
+
qs(i)%side = i
|
|
1283
|
+
end do
|
|
1284
|
+
tot = 0
|
|
1285
|
+
!$omp target teams distribute parallel do map(to: qs) reduction(+: tot)
|
|
1286
|
+
do i = 1, n
|
|
1287
|
+
tot = tot + area_of(qs(i))
|
|
1288
|
+
end do
|
|
1289
|
+
r1 = tot
|
|
1290
|
+
""", checks=[("r1", S2)]))
|
|
1291
|
+
out.append(V("poly", "class-is", "SELECT TYPE with TYPE IS and CLASS IS "
|
|
1292
|
+
"guards on the device", [C_DT, C_SELECT], types=POLY_TYPES,
|
|
1293
|
+
procs="""
|
|
1294
|
+
subroutine tag(s, t)
|
|
1295
|
+
!$omp declare target
|
|
1296
|
+
class(base_t), intent(in) :: s
|
|
1297
|
+
integer, intent(out) :: t
|
|
1298
|
+
t = 0
|
|
1299
|
+
select type (s)
|
|
1300
|
+
class is (base_t)
|
|
1301
|
+
t = 1
|
|
1302
|
+
type is (ext2)
|
|
1303
|
+
t = 2
|
|
1304
|
+
end select
|
|
1305
|
+
end subroutine tag
|
|
1306
|
+
""",
|
|
1307
|
+
decls="type(ext1) :: e1\ntype(ext2) :: e2\ntype(base_t) :: b0\n"
|
|
1308
|
+
"integer :: t1, t2, t3",
|
|
1309
|
+
body="""
|
|
1310
|
+
!$omp target map(tofrom: e1, e2, b0) map(from: t1, t2, t3)
|
|
1311
|
+
call tag(e1, t1)
|
|
1312
|
+
call tag(e2, t2)
|
|
1313
|
+
call tag(b0, t3)
|
|
1314
|
+
!$omp end target
|
|
1315
|
+
r1 = 100 * t1 + 10 * t2 + t3
|
|
1316
|
+
""", checks=[("r1", 121)]))
|
|
1317
|
+
out.append(V("poly", "parent-call", "an overriding binding that calls the "
|
|
1318
|
+
"parent's binding through the parent component, dispatched "
|
|
1319
|
+
"through a CLASS(base_t) dummy", [C_TBP, C_DT],
|
|
1320
|
+
types="""
|
|
1321
|
+
type base_t
|
|
1322
|
+
integer :: a = 0
|
|
1323
|
+
contains
|
|
1324
|
+
procedure :: val => base_val
|
|
1325
|
+
end type base_t
|
|
1326
|
+
type, extends(base_t) :: ext1
|
|
1327
|
+
integer :: u = 0
|
|
1328
|
+
contains
|
|
1329
|
+
procedure :: val => ext1_val
|
|
1330
|
+
end type ext1
|
|
1331
|
+
""", procs="""
|
|
1332
|
+
integer function base_val(s)
|
|
1333
|
+
!$omp declare target
|
|
1334
|
+
class(base_t), intent(in) :: s
|
|
1335
|
+
base_val = s%a
|
|
1336
|
+
end function base_val
|
|
1337
|
+
integer function ext1_val(s)
|
|
1338
|
+
!$omp declare target
|
|
1339
|
+
class(ext1), intent(in) :: s
|
|
1340
|
+
ext1_val = s%base_t%val() + s%u * 10
|
|
1341
|
+
end function ext1_val
|
|
1342
|
+
integer function get_val(s)
|
|
1343
|
+
!$omp declare target
|
|
1344
|
+
class(base_t), intent(in) :: s
|
|
1345
|
+
get_val = s%val()
|
|
1346
|
+
end function get_val
|
|
1347
|
+
""", decls="type(ext1) :: e1\ntype(base_t) :: b0",
|
|
1348
|
+
body="""
|
|
1349
|
+
e1%a = 3
|
|
1350
|
+
e1%u = 4
|
|
1351
|
+
b0%a = 7
|
|
1352
|
+
!$omp target map(tofrom: e1, b0) map(from: r1)
|
|
1353
|
+
r1 = get_val(e1) * 100 + get_val(b0)
|
|
1354
|
+
!$omp end target
|
|
1355
|
+
""", checks=[("r1", 4307)]))
|
|
1356
|
+
out.append(V("poly", "pointer", "a polymorphic pointer associated on the "
|
|
1357
|
+
"device with a TARGET dummy, then a dispatched call",
|
|
1358
|
+
[C_TBP, C_DT], types=SHAPES, procs=_shape_procs() + """
|
|
1359
|
+
integer function area_ptr(q)
|
|
1360
|
+
!$omp declare target
|
|
1361
|
+
type(sq), target, intent(in) :: q
|
|
1362
|
+
class(shape), pointer :: sp
|
|
1363
|
+
sp => q
|
|
1364
|
+
area_ptr = sp%area()
|
|
1365
|
+
end function area_ptr
|
|
1366
|
+
""", decls="type(sq) :: q",
|
|
1367
|
+
body="""
|
|
1368
|
+
q%side = 6
|
|
1369
|
+
!$omp target map(tofrom: q) map(from: r1)
|
|
1370
|
+
r1 = area_ptr(q)
|
|
1371
|
+
!$omp end target
|
|
1372
|
+
""", checks=[("r1", 36)]))
|
|
1373
|
+
out.append(V("poly", "mapped-class", "a CLASS(base_t), ALLOCATABLE object "
|
|
1374
|
+
"with dynamic type ext1 mapped by map(tofrom:)",
|
|
1375
|
+
[C_POLY60, C_DT], types=POLY_TYPES, procs=BUMP,
|
|
1376
|
+
decls="class(base_t), allocatable :: pa",
|
|
1377
|
+
body="""
|
|
1378
|
+
allocate(ext1 :: pa)
|
|
1379
|
+
pa%a = 1
|
|
1380
|
+
!$omp target map(tofrom: pa)
|
|
1381
|
+
call bump(pa)
|
|
1382
|
+
!$omp end target
|
|
1383
|
+
r1 = -1
|
|
1384
|
+
select type (pa)
|
|
1385
|
+
type is (ext1)
|
|
1386
|
+
r1 = pa%u
|
|
1387
|
+
end select
|
|
1388
|
+
""", checks=[("r1", 10)], legality="unspecified",
|
|
1389
|
+
why="OpenMP 6.0 §7.9.6 p.288 l.10: a map list item of "
|
|
1390
|
+
"polymorphic type (Fortran): the behavior is unspecified; "
|
|
1391
|
+
"OpenMP 6.0 §B.2 p.898 l.18-19 (5.2 to 6.0: restrictions "
|
|
1392
|
+
"changed and behavior clarified for polymorphic types)"))
|
|
1393
|
+
out.append(V("poly", "firstprivate-class", "firstprivate of a "
|
|
1394
|
+
"CLASS(base_t) dummy argument on a target construct",
|
|
1395
|
+
["OpenMP 6.0 §7.5.4 p.228 l.8-9 (firstprivate on target of "
|
|
1396
|
+
"a polymorphic variable: unspecified)"], types=POLY_TYPES,
|
|
1397
|
+
procs="""
|
|
1398
|
+
subroutine probe(s, r)
|
|
1399
|
+
class(base_t), intent(in) :: s
|
|
1400
|
+
integer, intent(out) :: r
|
|
1401
|
+
r = 0
|
|
1402
|
+
!$omp target firstprivate(s) map(from: r)
|
|
1403
|
+
r = s%a + 1
|
|
1404
|
+
!$omp end target
|
|
1405
|
+
end subroutine probe
|
|
1406
|
+
""", decls="type(ext1) :: e1",
|
|
1407
|
+
body="""
|
|
1408
|
+
e1%a = 41
|
|
1409
|
+
call probe(e1, r1)
|
|
1410
|
+
""", checks=[("r1", 42)], legality="unspecified",
|
|
1411
|
+
why="OpenMP 6.0 §7.5.4 p.228 l.8-9: firstprivate on a target "
|
|
1412
|
+
"construct of a variable of polymorphic type: the "
|
|
1413
|
+
"behavior is unspecified"))
|
|
1414
|
+
return out
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
# --- F10 CLASS(*) ----------------------------------------------------------------------
|
|
1418
|
+
|
|
1419
|
+
def _unlimited() -> list[V]:
|
|
1420
|
+
out = []
|
|
1421
|
+
pt = "type pt\n integer :: a = 0\nend type pt\n"
|
|
1422
|
+
incr = """
|
|
1423
|
+
subroutine incr_any(x)
|
|
1424
|
+
!$omp declare target
|
|
1425
|
+
class(*), intent(inout) :: x
|
|
1426
|
+
select type (x)
|
|
1427
|
+
type is (integer)
|
|
1428
|
+
x = x + 1
|
|
1429
|
+
type is (real(8))
|
|
1430
|
+
x = x + 0.5d0
|
|
1431
|
+
type is (pt)
|
|
1432
|
+
x%a = x%a + 2
|
|
1433
|
+
end select
|
|
1434
|
+
end subroutine incr_any
|
|
1435
|
+
"""
|
|
1436
|
+
out.append(V("unlimited", "select-type", "a declare target subroutine with "
|
|
1437
|
+
"a CLASS(*) dummy and SELECT TYPE over intrinsic and derived "
|
|
1438
|
+
"types, called on the device", [C_DT, C_SELECT], types=pt,
|
|
1439
|
+
procs=incr, decls="integer :: k\nreal(8) :: d\ntype(pt) :: q",
|
|
1440
|
+
body="""
|
|
1441
|
+
k = 41
|
|
1442
|
+
d = 1.5d0
|
|
1443
|
+
q%a = 5
|
|
1444
|
+
!$omp target map(tofrom: k, d, q)
|
|
1445
|
+
call incr_any(k)
|
|
1446
|
+
call incr_any(d)
|
|
1447
|
+
call incr_any(q)
|
|
1448
|
+
!$omp end target
|
|
1449
|
+
r1 = k
|
|
1450
|
+
r2 = nint(d * 10)
|
|
1451
|
+
r3 = q%a
|
|
1452
|
+
""", checks=[("r1", 42), ("r2", 20), ("r3", 7)]))
|
|
1453
|
+
out.append(V("unlimited", "classify", "a CLASS(*) function classifying "
|
|
1454
|
+
"array elements of two derived types in a target teams "
|
|
1455
|
+
"distribute parallel do", [C_DT, C_SELECT],
|
|
1456
|
+
types=pt + "type qt\n integer :: b = 0\nend type qt\n",
|
|
1457
|
+
procs="""
|
|
1458
|
+
integer function code_of(x)
|
|
1459
|
+
!$omp declare target
|
|
1460
|
+
class(*), intent(in) :: x
|
|
1461
|
+
select type (x)
|
|
1462
|
+
type is (integer)
|
|
1463
|
+
code_of = 1
|
|
1464
|
+
type is (pt)
|
|
1465
|
+
code_of = 2
|
|
1466
|
+
type is (qt)
|
|
1467
|
+
code_of = 3
|
|
1468
|
+
class default
|
|
1469
|
+
code_of = 0
|
|
1470
|
+
end select
|
|
1471
|
+
end function code_of
|
|
1472
|
+
""", decls="type(pt) :: ps(n)\ntype(qt) :: qs(n)\n"
|
|
1473
|
+
"integer :: i, tot",
|
|
1474
|
+
body="""
|
|
1475
|
+
tot = 0
|
|
1476
|
+
!$omp target teams distribute parallel do map(to: ps, qs) reduction(+: tot)
|
|
1477
|
+
do i = 1, n
|
|
1478
|
+
tot = tot + code_of(ps(i)) + code_of(qs(i))
|
|
1479
|
+
end do
|
|
1480
|
+
r1 = tot
|
|
1481
|
+
""", checks=[("r1", 5 * N)]))
|
|
1482
|
+
out.append(V("unlimited", "mapped", "a CLASS(*), ALLOCATABLE object "
|
|
1483
|
+
"(dynamic type pt) mapped by map(tofrom:)", [C_POLY60, C_DT],
|
|
1484
|
+
types=pt, procs=incr, decls="class(*), allocatable :: u",
|
|
1485
|
+
body="""
|
|
1486
|
+
allocate(u, source=pt(5))
|
|
1487
|
+
!$omp target map(tofrom: u)
|
|
1488
|
+
call incr_any(u)
|
|
1489
|
+
!$omp end target
|
|
1490
|
+
r1 = -1
|
|
1491
|
+
select type (u)
|
|
1492
|
+
type is (pt)
|
|
1493
|
+
r1 = u%a
|
|
1494
|
+
end select
|
|
1495
|
+
""", checks=[("r1", 7)], legality="unspecified",
|
|
1496
|
+
why="OpenMP 6.0 §7.9.6 p.288 l.10: a map list item of "
|
|
1497
|
+
"polymorphic type (Fortran): the behavior is unspecified"))
|
|
1498
|
+
return out
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
# --- F11 defined assignment and finalization -------------------------------------------
|
|
1502
|
+
|
|
1503
|
+
CT = """
|
|
1504
|
+
type ct
|
|
1505
|
+
integer :: v = 0
|
|
1506
|
+
integer :: copies = 0
|
|
1507
|
+
contains
|
|
1508
|
+
procedure :: asg => ct_asg
|
|
1509
|
+
generic :: assignment(=) => asg
|
|
1510
|
+
end type ct
|
|
1511
|
+
"""
|
|
1512
|
+
|
|
1513
|
+
CT_ASG = """
|
|
1514
|
+
subroutine ct_asg(a, b)
|
|
1515
|
+
!$omp declare target
|
|
1516
|
+
class(ct), intent(inout) :: a
|
|
1517
|
+
class(ct), intent(in) :: b
|
|
1518
|
+
a%v = b%v
|
|
1519
|
+
a%copies = b%copies + 1
|
|
1520
|
+
end subroutine ct_asg
|
|
1521
|
+
"""
|
|
1522
|
+
|
|
1523
|
+
FT = """
|
|
1524
|
+
type ft
|
|
1525
|
+
integer :: v = 0
|
|
1526
|
+
contains
|
|
1527
|
+
final :: ft_fin
|
|
1528
|
+
end type ft
|
|
1529
|
+
"""
|
|
1530
|
+
|
|
1531
|
+
# `to`, 5.2's deprecated synonym of enter (5.2 §7.8.2), which CCE 19/20 and
|
|
1532
|
+
# NVHPC still require: the family measures finalization, not the spelling
|
|
1533
|
+
FT_DECLS = """
|
|
1534
|
+
integer :: fin_count = 0
|
|
1535
|
+
!$omp declare target to(fin_count)
|
|
1536
|
+
"""
|
|
1537
|
+
|
|
1538
|
+
FT_FIN = """
|
|
1539
|
+
subroutine ft_fin(o)
|
|
1540
|
+
!$omp declare target
|
|
1541
|
+
type(ft), intent(inout) :: o
|
|
1542
|
+
!$omp atomic update
|
|
1543
|
+
fin_count = fin_count + 1
|
|
1544
|
+
end subroutine ft_fin
|
|
1545
|
+
"""
|
|
1546
|
+
|
|
1547
|
+
C_FIN = ("Fortran 2018 7.5.6.3 (when finalization occurs); "
|
|
1548
|
+
"OpenMP 5.2 §1.2.6 p.19 (type-bound procedures in declare target)")
|
|
1549
|
+
|
|
1550
|
+
|
|
1551
|
+
def _assignfinal() -> list[V]:
|
|
1552
|
+
out = []
|
|
1553
|
+
out.append(V("assignfinal", "tbp-assign", "an intrinsic-looking assignment "
|
|
1554
|
+
"y = x in a target region invokes the type-bound defined "
|
|
1555
|
+
"assignment", [C_TBP, C_DT,
|
|
1556
|
+
"Fortran 2018 10.2.1.4 (defined assignment)"],
|
|
1557
|
+
types=CT, procs=CT_ASG, decls="type(ct) :: x, y",
|
|
1558
|
+
body="""
|
|
1559
|
+
x%v = 5
|
|
1560
|
+
x%copies = 0
|
|
1561
|
+
!$omp target map(tofrom: x, y)
|
|
1562
|
+
y = x
|
|
1563
|
+
!$omp end target
|
|
1564
|
+
r1 = y%v
|
|
1565
|
+
r2 = y%copies
|
|
1566
|
+
""", checks=[("r1", 5), ("r2", 1)]))
|
|
1567
|
+
out.append(V("assignfinal", "iface-assign", "a defined assignment by a "
|
|
1568
|
+
"generic interface (not type-bound) in a target region",
|
|
1569
|
+
[C_DT, C_PROCREF, "Fortran 2018 10.2.1.4"],
|
|
1570
|
+
types="""
|
|
1571
|
+
type nt
|
|
1572
|
+
integer :: v = 0
|
|
1573
|
+
integer :: n = 0
|
|
1574
|
+
end type nt
|
|
1575
|
+
interface assignment(=)
|
|
1576
|
+
module procedure nt_asg
|
|
1577
|
+
end interface
|
|
1578
|
+
""", procs="""
|
|
1579
|
+
subroutine nt_asg(a, b)
|
|
1580
|
+
!$omp declare target
|
|
1581
|
+
type(nt), intent(out) :: a
|
|
1582
|
+
type(nt), intent(in) :: b
|
|
1583
|
+
a%v = b%v * 2
|
|
1584
|
+
a%n = b%n + 1
|
|
1585
|
+
end subroutine nt_asg
|
|
1586
|
+
""", decls="type(nt) :: x, y",
|
|
1587
|
+
body="""
|
|
1588
|
+
x%v = 5
|
|
1589
|
+
x%n = 0
|
|
1590
|
+
!$omp target map(tofrom: x, y)
|
|
1591
|
+
y = x
|
|
1592
|
+
!$omp end target
|
|
1593
|
+
r1 = y%v
|
|
1594
|
+
r2 = y%n
|
|
1595
|
+
""", checks=[("r1", 10), ("r2", 1)]))
|
|
1596
|
+
out.append(V("assignfinal", "firstprivate", "firstprivate(x) on a target "
|
|
1597
|
+
"construct initializes the new list item as if by the "
|
|
1598
|
+
"type-bound defined assignment", [
|
|
1599
|
+
"OpenMP 5.2 §5.4.4 p.113 l.3-6 (firstprivate "
|
|
1600
|
+
"initialization by a compatible type-bound defined "
|
|
1601
|
+
"assignment)", C_TBP],
|
|
1602
|
+
types=CT, procs=CT_ASG, decls="type(ct) :: x",
|
|
1603
|
+
body="""
|
|
1604
|
+
x%v = 5
|
|
1605
|
+
x%copies = 0
|
|
1606
|
+
!$omp target firstprivate(x) map(from: r1, r2)
|
|
1607
|
+
r1 = x%copies
|
|
1608
|
+
r2 = x%v
|
|
1609
|
+
!$omp end target
|
|
1610
|
+
""", checks=[("r1", 1), ("r2", 5)]))
|
|
1611
|
+
out.append(V("assignfinal", "lastprivate", "lastprivate(w) of a parallel "
|
|
1612
|
+
"do in a target region: the original is updated as if by the "
|
|
1613
|
+
"type-bound defined assignment", [
|
|
1614
|
+
"OpenMP 5.2 §5.4.5 p.115 l.24-25 (lastprivate update by a "
|
|
1615
|
+
"type-bound defined assignment)", C_TBP],
|
|
1616
|
+
types=CT, procs=CT_ASG, decls="type(ct) :: w\ninteger :: i",
|
|
1617
|
+
body="""
|
|
1618
|
+
w%v = -1
|
|
1619
|
+
w%copies = 0
|
|
1620
|
+
!$omp target map(tofrom: w)
|
|
1621
|
+
!$omp parallel do lastprivate(w)
|
|
1622
|
+
do i = 1, n
|
|
1623
|
+
w%v = i
|
|
1624
|
+
w%copies = 0
|
|
1625
|
+
end do
|
|
1626
|
+
!$omp end target
|
|
1627
|
+
r1 = w%v
|
|
1628
|
+
r2 = w%copies
|
|
1629
|
+
""", checks=[("r1", N), ("r2", 1)]))
|
|
1630
|
+
fin_setup = "fin_count = 0\n!$omp target update to(fin_count)\n"
|
|
1631
|
+
out.append(V("assignfinal", "final-local", "a local object of a "
|
|
1632
|
+
"finalizable type in a declare target subroutine is finalized "
|
|
1633
|
+
"on return (the final subroutine counts on the device)",
|
|
1634
|
+
[C_FIN, C_DT], types=FT, mod_decls=FT_DECLS,
|
|
1635
|
+
procs=FT_FIN + """
|
|
1636
|
+
subroutine work(k, r)
|
|
1637
|
+
!$omp declare target
|
|
1638
|
+
integer, intent(in) :: k
|
|
1639
|
+
integer, intent(out) :: r
|
|
1640
|
+
type(ft) :: o
|
|
1641
|
+
o%v = k
|
|
1642
|
+
r = 2 * o%v
|
|
1643
|
+
end subroutine work
|
|
1644
|
+
""", decls="integer :: res(n), i",
|
|
1645
|
+
body=fin_setup + """
|
|
1646
|
+
!$omp target teams distribute parallel do map(tofrom: res)
|
|
1647
|
+
do i = 1, n
|
|
1648
|
+
call work(i, res(i))
|
|
1649
|
+
end do
|
|
1650
|
+
!$omp target update from(fin_count)
|
|
1651
|
+
r1 = fin_count
|
|
1652
|
+
r2 = sum(res)
|
|
1653
|
+
""", checks=[("r1", N), ("r2", 2 * S1)]))
|
|
1654
|
+
out.append(V("assignfinal", "final-private", "private(x) of a finalizable "
|
|
1655
|
+
"type on a target construct: the private copy is finalized at "
|
|
1656
|
+
"the end of the region", [C_FINAL, C_FIN], types=FT,
|
|
1657
|
+
mod_decls=FT_DECLS, procs=FT_FIN, decls="type(ft) :: x",
|
|
1658
|
+
body=fin_setup + """
|
|
1659
|
+
!$omp target private(x)
|
|
1660
|
+
x%v = 3
|
|
1661
|
+
!$omp end target
|
|
1662
|
+
!$omp target update from(fin_count)
|
|
1663
|
+
r1 = fin_count
|
|
1664
|
+
""", checks=[("r1", 1)]))
|
|
1665
|
+
out.append(V("assignfinal", "final-assign", "intrinsic assignment to a "
|
|
1666
|
+
"local finalizable object in device code finalizes the "
|
|
1667
|
+
"left-hand side, and the object is finalized on return",
|
|
1668
|
+
["Fortran 2018 7.5.6.3 para 1 and 3 (intrinsic assignment, "
|
|
1669
|
+
"RETURN/END)", C_DT], types=FT, mod_decls=FT_DECLS,
|
|
1670
|
+
procs=FT_FIN + """
|
|
1671
|
+
subroutine copy_work(s, r)
|
|
1672
|
+
!$omp declare target
|
|
1673
|
+
type(ft), intent(in) :: s
|
|
1674
|
+
integer, intent(out) :: r
|
|
1675
|
+
type(ft) :: o
|
|
1676
|
+
o = s
|
|
1677
|
+
r = o%v
|
|
1678
|
+
end subroutine copy_work
|
|
1679
|
+
""", decls="type(ft) :: src\ninteger :: res(n), i",
|
|
1680
|
+
body=fin_setup + """
|
|
1681
|
+
src%v = 4
|
|
1682
|
+
!$omp target teams distribute parallel do map(to: src) map(tofrom: res)
|
|
1683
|
+
do i = 1, n
|
|
1684
|
+
call copy_work(src, res(i))
|
|
1685
|
+
end do
|
|
1686
|
+
!$omp target update from(fin_count)
|
|
1687
|
+
r1 = fin_count
|
|
1688
|
+
r2 = sum(res)
|
|
1689
|
+
""", checks=[("r1", 2 * N), ("r2", 4 * N)]))
|
|
1690
|
+
out.append(V("assignfinal", "final-dealloc", "DEALLOCATE of an allocatable "
|
|
1691
|
+
"finalizable object in device code finalizes it once",
|
|
1692
|
+
["Fortran 2018 7.5.6.3 para 2 (deallocation)", C_DT],
|
|
1693
|
+
types=FT, mod_decls=FT_DECLS, procs=FT_FIN + """
|
|
1694
|
+
subroutine alloc_work(k, r)
|
|
1695
|
+
!$omp declare target
|
|
1696
|
+
integer, intent(in) :: k
|
|
1697
|
+
integer, intent(out) :: r
|
|
1698
|
+
type(ft), allocatable :: o
|
|
1699
|
+
allocate(o)
|
|
1700
|
+
o%v = k
|
|
1701
|
+
r = o%v + 1
|
|
1702
|
+
deallocate(o)
|
|
1703
|
+
end subroutine alloc_work
|
|
1704
|
+
""", decls="integer :: res(n), i",
|
|
1705
|
+
body=fin_setup + """
|
|
1706
|
+
!$omp target teams distribute parallel do map(tofrom: res)
|
|
1707
|
+
do i = 1, n
|
|
1708
|
+
call alloc_work(i, res(i))
|
|
1709
|
+
end do
|
|
1710
|
+
!$omp target update from(fin_count)
|
|
1711
|
+
r1 = fin_count
|
|
1712
|
+
r2 = sum(res)
|
|
1713
|
+
""", checks=[("r1", N), ("r2", S1 + N)]))
|
|
1714
|
+
return out
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
# --- F12 declare reduction on derived types --------------------------------------------
|
|
1718
|
+
|
|
1719
|
+
V2 = "type v2\n integer :: x = 0, y = 0\nend type v2\n"
|
|
1720
|
+
C_DR = ("OpenMP 5.2 §5.5.11 p.139-140 (declare reduction); §5.5.2 p.125 "
|
|
1721
|
+
"l.25-27 (procedures of a reduction used in a target region are "
|
|
1722
|
+
"declare target)")
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
def _dreduce() -> list[V]:
|
|
1726
|
+
out = []
|
|
1727
|
+
vadd = """
|
|
1728
|
+
function vadd(a, b) result(c)
|
|
1729
|
+
!$omp declare target
|
|
1730
|
+
type(v2), intent(in) :: a, b
|
|
1731
|
+
type(v2) :: c
|
|
1732
|
+
c%x = a%x + b%x
|
|
1733
|
+
c%y = a%y + b%y
|
|
1734
|
+
end function vadd
|
|
1735
|
+
"""
|
|
1736
|
+
loop = """
|
|
1737
|
+
!$omp target teams distribute parallel do reduction({rid}: acc)
|
|
1738
|
+
do i = 1, n
|
|
1739
|
+
{stmt}
|
|
1740
|
+
end do
|
|
1741
|
+
r1 = acc%x
|
|
1742
|
+
r2 = acc%y
|
|
1743
|
+
"""
|
|
1744
|
+
out.append(V("dreduce", "function", "a declare reduction on a derived "
|
|
1745
|
+
"type whose combiner calls a function, used on target teams "
|
|
1746
|
+
"distribute parallel do", [C_DR,
|
|
1747
|
+
"OpenMP 5.2 §17.2 p.341 l.11-13"],
|
|
1748
|
+
types=V2, procs=vadd,
|
|
1749
|
+
decls="type(v2) :: acc\ninteger :: i\n"
|
|
1750
|
+
"!$omp declare reduction(vsum: v2: omp_out = "
|
|
1751
|
+
"vadd(omp_out, omp_in)) initializer(omp_priv = v2(0, 0))",
|
|
1752
|
+
body="acc = v2(0, 0)\n" + loop.format(
|
|
1753
|
+
rid="vsum", stmt=" acc = vadd(acc, v2(i, 2 * i))"),
|
|
1754
|
+
checks=[("r1", S1), ("r2", 2 * S1)]))
|
|
1755
|
+
vcomb = """
|
|
1756
|
+
subroutine vcomb(o, i)
|
|
1757
|
+
!$omp declare target
|
|
1758
|
+
type(v2), intent(inout) :: o
|
|
1759
|
+
type(v2), intent(in) :: i
|
|
1760
|
+
o%x = o%x + i%x
|
|
1761
|
+
o%y = o%y + i%y
|
|
1762
|
+
end subroutine vcomb
|
|
1763
|
+
subroutine vinit(p)
|
|
1764
|
+
!$omp declare target
|
|
1765
|
+
type(v2), intent(out) :: p
|
|
1766
|
+
p%x = 0
|
|
1767
|
+
p%y = 0
|
|
1768
|
+
end subroutine vinit
|
|
1769
|
+
"""
|
|
1770
|
+
out.append(V("dreduce", "subroutine", "a declare reduction whose combiner "
|
|
1771
|
+
"and initializer are subroutine references",
|
|
1772
|
+
[C_DR, "OpenMP 5.2 §5.5.2.1, §5.5.2.2 p.126-128"],
|
|
1773
|
+
types=V2, procs=vcomb,
|
|
1774
|
+
decls="type(v2) :: acc\ninteger :: i\n"
|
|
1775
|
+
"!$omp declare reduction(vsum2: v2: vcomb(omp_out, "
|
|
1776
|
+
"omp_in)) initializer(vinit(omp_priv))",
|
|
1777
|
+
body="acc = v2(0, 0)\n" + loop.format(
|
|
1778
|
+
rid="vsum2", stmt=" acc%x = acc%x + i\n acc%y = acc%y + 1"),
|
|
1779
|
+
checks=[("r1", S1), ("r2", N)]))
|
|
1780
|
+
out.append(V("dreduce", "operator", "a declare reduction(+) for a derived "
|
|
1781
|
+
"type whose combiner uses a type-bound operator(+)",
|
|
1782
|
+
[C_DR, C_TBP],
|
|
1783
|
+
types="""
|
|
1784
|
+
type w2
|
|
1785
|
+
integer :: x = 0, y = 0
|
|
1786
|
+
contains
|
|
1787
|
+
procedure :: add => w2_add
|
|
1788
|
+
generic :: operator(+) => add
|
|
1789
|
+
end type w2
|
|
1790
|
+
""", procs="""
|
|
1791
|
+
function w2_add(a, b) result(c)
|
|
1792
|
+
!$omp declare target
|
|
1793
|
+
class(w2), intent(in) :: a
|
|
1794
|
+
type(w2), intent(in) :: b
|
|
1795
|
+
type(w2) :: c
|
|
1796
|
+
c%x = a%x + b%x
|
|
1797
|
+
c%y = a%y + b%y
|
|
1798
|
+
end function w2_add
|
|
1799
|
+
""",
|
|
1800
|
+
decls="type(w2) :: acc\ninteger :: i\n"
|
|
1801
|
+
"!$omp declare reduction(+: w2: omp_out = omp_out + "
|
|
1802
|
+
"omp_in) initializer(omp_priv = w2(0, 0))",
|
|
1803
|
+
body="acc%x = 0\nacc%y = 0\n" + loop.format(
|
|
1804
|
+
rid="+", stmt=" acc = acc + w2(i, 1)"),
|
|
1805
|
+
checks=[("r1", S1), ("r2", N)]))
|
|
1806
|
+
out.append(V("dreduce", "default-init", "a declare reduction without an "
|
|
1807
|
+
"initializer clause: the private copies get the type's default "
|
|
1808
|
+
"initialization", [C_DR, "OpenMP 5.2 §5.5.2.2 p.128 l.6"],
|
|
1809
|
+
types="type d2\n integer :: x = 0, y = 0\nend type d2\n",
|
|
1810
|
+
procs="""
|
|
1811
|
+
subroutine dcomb(o, i)
|
|
1812
|
+
!$omp declare target
|
|
1813
|
+
type(d2), intent(inout) :: o
|
|
1814
|
+
type(d2), intent(in) :: i
|
|
1815
|
+
o%x = o%x + i%x
|
|
1816
|
+
o%y = o%y + i%y
|
|
1817
|
+
end subroutine dcomb
|
|
1818
|
+
""",
|
|
1819
|
+
decls="type(d2) :: acc\ninteger :: i\n"
|
|
1820
|
+
"!$omp declare reduction(dsum: d2: dcomb(omp_out, "
|
|
1821
|
+
"omp_in))",
|
|
1822
|
+
body=loop.format(rid="dsum",
|
|
1823
|
+
stmt=" acc%x = acc%x + i\n acc%y = acc%y + 2"),
|
|
1824
|
+
checks=[("r1", S1), ("r2", 2 * N)]))
|
|
1825
|
+
out.append(V("dreduce", "argmax", "a declare reduction keeping the element "
|
|
1826
|
+
"with the largest key", [C_DR,
|
|
1827
|
+
"OpenMP 5.2 §5.5.2.2 p.128 l.6"],
|
|
1828
|
+
types="type kv\n integer :: key = -1, val = 0\nend type kv\n",
|
|
1829
|
+
procs="""
|
|
1830
|
+
subroutine kmax(o, i)
|
|
1831
|
+
!$omp declare target
|
|
1832
|
+
type(kv), intent(inout) :: o
|
|
1833
|
+
type(kv), intent(in) :: i
|
|
1834
|
+
if (i%key > o%key) then
|
|
1835
|
+
o%key = i%key
|
|
1836
|
+
o%val = i%val
|
|
1837
|
+
end if
|
|
1838
|
+
end subroutine kmax
|
|
1839
|
+
""",
|
|
1840
|
+
decls="type(kv) :: acc\ninteger :: i\n"
|
|
1841
|
+
"!$omp declare reduction(kmx: kv: kmax(omp_out, omp_in))",
|
|
1842
|
+
body="""
|
|
1843
|
+
!$omp target teams distribute parallel do reduction(kmx: acc)
|
|
1844
|
+
do i = 1, n
|
|
1845
|
+
if (i > acc%key) then
|
|
1846
|
+
acc%key = i
|
|
1847
|
+
acc%val = 3 * i
|
|
1848
|
+
end if
|
|
1849
|
+
end do
|
|
1850
|
+
r1 = acc%key
|
|
1851
|
+
r2 = acc%val
|
|
1852
|
+
""", checks=[("r1", N), ("r2", 3 * N)]))
|
|
1853
|
+
out.append(V("dreduce", "nested", "a declare reduction on a parallel do "
|
|
1854
|
+
"inside a target region (the structure mapped tofrom)",
|
|
1855
|
+
[C_DR], types=V2, procs=vadd,
|
|
1856
|
+
decls="type(v2) :: acc\ninteger :: i\n"
|
|
1857
|
+
"!$omp declare reduction(vsum: v2: omp_out = "
|
|
1858
|
+
"vadd(omp_out, omp_in)) initializer(omp_priv = v2(0, 0))",
|
|
1859
|
+
body="""
|
|
1860
|
+
acc = v2(0, 0)
|
|
1861
|
+
!$omp target map(tofrom: acc)
|
|
1862
|
+
!$omp parallel do reduction(vsum: acc)
|
|
1863
|
+
do i = 1, n
|
|
1864
|
+
acc = vadd(acc, v2(1, i))
|
|
1865
|
+
end do
|
|
1866
|
+
!$omp end target
|
|
1867
|
+
r1 = acc%x
|
|
1868
|
+
r2 = acc%y
|
|
1869
|
+
""", checks=[("r1", N), ("r2", S1)]))
|
|
1870
|
+
return out
|
|
1871
|
+
|
|
1872
|
+
|
|
1873
|
+
# --- F13 elements and sections of arrays of structures (the AOMP map-test forms) ------
|
|
1874
|
+
|
|
1875
|
+
DC = """
|
|
1876
|
+
type dc
|
|
1877
|
+
integer :: g(20) = 0
|
|
1878
|
+
integer :: i = 0
|
|
1879
|
+
end type dc
|
|
1880
|
+
"""
|
|
1881
|
+
|
|
1882
|
+
|
|
1883
|
+
def _elemsec() -> list[V]:
|
|
1884
|
+
"""Forms of ROCm/aomp's fortran-map-tests (harvest 2's CCE leads)
|
|
1885
|
+
written as family variants: an element or a
|
|
1886
|
+
section of an array of structures, a component of an element, sections
|
|
1887
|
+
of two members, an allocatable parent."""
|
|
1888
|
+
out = []
|
|
1889
|
+
d = "type(dc) :: vk(5)\ninteger :: l"
|
|
1890
|
+
out.append(V("elemsec", "element", "map(tofrom: vk(5)): one element of an "
|
|
1891
|
+
"array of structures", [C_SECTION, C_MAP], types=DC,
|
|
1892
|
+
decls=d, body="""
|
|
1893
|
+
!$omp target map(tofrom: vk(5))
|
|
1894
|
+
do l = 1, 20
|
|
1895
|
+
vk(5)%g(l) = 20 + l
|
|
1896
|
+
end do
|
|
1897
|
+
vk(5)%i = 40
|
|
1898
|
+
!$omp end target
|
|
1899
|
+
r1 = sum(vk(5)%g)
|
|
1900
|
+
r2 = vk(5)%i
|
|
1901
|
+
r3 = sum(vk(4)%g)
|
|
1902
|
+
""", checks=[("r1", 400 + 210), ("r2", 40), ("r3", 0)]))
|
|
1903
|
+
out.append(V("elemsec", "comp-element", "map(tofrom: vk(4)%g(3)): an "
|
|
1904
|
+
"element of a component of an array element",
|
|
1905
|
+
[C_SECTION, C_MAP], types=DC, decls=d, body="""
|
|
1906
|
+
!$omp target map(tofrom: vk(4)%g(3))
|
|
1907
|
+
vk(4)%g(3) = 74
|
|
1908
|
+
!$omp end target
|
|
1909
|
+
r1 = vk(4)%g(3)
|
|
1910
|
+
r2 = sum(vk(4)%g)
|
|
1911
|
+
""", checks=[("r1", 74), ("r2", 74)]))
|
|
1912
|
+
out.append(V("elemsec", "comp-section", "map(tofrom: vk(5)%g(3:5)): a "
|
|
1913
|
+
"section of a component of an array element",
|
|
1914
|
+
[C_SECTION, C_MAP], types=DC, decls=d, body="""
|
|
1915
|
+
do l = 1, 20
|
|
1916
|
+
vk(5)%g(l) = 100 + l
|
|
1917
|
+
end do
|
|
1918
|
+
!$omp target map(tofrom: vk(5)%g(3:5))
|
|
1919
|
+
do l = 3, 5
|
|
1920
|
+
vk(5)%g(l) = l
|
|
1921
|
+
end do
|
|
1922
|
+
!$omp end target
|
|
1923
|
+
r1 = sum(vk(5)%g)
|
|
1924
|
+
""", checks=[("r1", sum(100 + x for x in range(1, 21)) -
|
|
1925
|
+
sum(100 + x for x in range(3, 6)) +
|
|
1926
|
+
12)]))
|
|
1927
|
+
out.append(V("elemsec", "struct-section", "map(tofrom: vk(3:5)): a section "
|
|
1928
|
+
"of an array of structures", [C_SECTION, C_MAP], types=DC,
|
|
1929
|
+
decls=d, body="""
|
|
1930
|
+
!$omp target map(tofrom: vk(3:5))
|
|
1931
|
+
do l = 3, 5
|
|
1932
|
+
vk(l)%i = 10 * l
|
|
1933
|
+
end do
|
|
1934
|
+
!$omp end target
|
|
1935
|
+
r1 = sum(vk%i)
|
|
1936
|
+
""", checks=[("r1", 120)]))
|
|
1937
|
+
da = "type da\n integer :: b(10) = 0\n integer :: d(10) = 0\nend type da"
|
|
1938
|
+
out.append(V("elemsec", "two-members", "map(tofrom: f%b(3:6), f%d(3:6)): "
|
|
1939
|
+
"sections of two members of one structure",
|
|
1940
|
+
[C_SECTION, C_STRUCTELT], types=da,
|
|
1941
|
+
decls="type(da) :: f\ninteger :: l", body="""
|
|
1942
|
+
!$omp target map(tofrom: f%b(3:6), f%d(3:6))
|
|
1943
|
+
do l = 3, 6
|
|
1944
|
+
f%b(l) = l
|
|
1945
|
+
f%d(l) = 2 * l
|
|
1946
|
+
end do
|
|
1947
|
+
!$omp end target
|
|
1948
|
+
r1 = sum(f%b)
|
|
1949
|
+
r2 = sum(f%d)
|
|
1950
|
+
""", checks=[("r1", 18), ("r2", 36)]))
|
|
1951
|
+
out.append(V("elemsec", "two-structs", "sections of two members of each "
|
|
1952
|
+
"of two structures on one construct",
|
|
1953
|
+
[C_SECTION, C_STRUCTELT], types=da,
|
|
1954
|
+
decls="type(da) :: f, h\ninteger :: l", body="""
|
|
1955
|
+
!$omp target map(tofrom: f%b(3:6), f%d(3:6), h%b(3:6), h%d(3:6))
|
|
1956
|
+
do l = 3, 6
|
|
1957
|
+
f%b(l) = l
|
|
1958
|
+
f%d(l) = 2 * l
|
|
1959
|
+
h%b(l) = 3 * l
|
|
1960
|
+
h%d(l) = 4 * l
|
|
1961
|
+
end do
|
|
1962
|
+
!$omp end target
|
|
1963
|
+
r1 = sum(f%b) + sum(f%d)
|
|
1964
|
+
r2 = sum(h%b) + sum(h%d)
|
|
1965
|
+
""", checks=[("r1", 54), ("r2", 126)]))
|
|
1966
|
+
out.append(V("elemsec", "nested-element", "map(tofrom: vk(4)%h%c(8)): an "
|
|
1967
|
+
"element of a nested member of an array element",
|
|
1968
|
+
[C_SECTION, C_MAP], types="""
|
|
1969
|
+
type dn
|
|
1970
|
+
integer :: c(10) = 0
|
|
1971
|
+
end type dn
|
|
1972
|
+
type dm
|
|
1973
|
+
type(dn) :: h
|
|
1974
|
+
integer :: i = 0
|
|
1975
|
+
end type dm
|
|
1976
|
+
""", decls="type(dm) :: vk(5)", body="""
|
|
1977
|
+
!$omp target map(tofrom: vk(4)%h%c(8))
|
|
1978
|
+
vk(4)%h%c(8) = 42
|
|
1979
|
+
!$omp end target
|
|
1980
|
+
r1 = vk(4)%h%c(8)
|
|
1981
|
+
r2 = sum(vk(4)%h%c)
|
|
1982
|
+
""", checks=[("r1", 42), ("r2", 42)]))
|
|
1983
|
+
out.append(V("elemsec", "alloc-parent", "map(tofrom: vj%h(4:8)): a section "
|
|
1984
|
+
"of an allocatable array-of-structures component of an "
|
|
1985
|
+
"allocatable scalar structure", [C_SECTION, C_ALLOCCOMP],
|
|
1986
|
+
types="""
|
|
1987
|
+
type da2
|
|
1988
|
+
integer :: a = 0
|
|
1989
|
+
end type da2
|
|
1990
|
+
type db
|
|
1991
|
+
type(da2), allocatable :: h(:)
|
|
1992
|
+
end type db
|
|
1993
|
+
""", decls="type(db), allocatable :: vj\ninteger :: l",
|
|
1994
|
+
body="""
|
|
1995
|
+
allocate(vj)
|
|
1996
|
+
allocate(vj%h(10))
|
|
1997
|
+
!$omp target map(tofrom: vj%h(4:8))
|
|
1998
|
+
do l = 4, 8
|
|
1999
|
+
vj%h(l)%a = 3 * l
|
|
2000
|
+
end do
|
|
2001
|
+
!$omp end target
|
|
2002
|
+
r1 = sum(vj%h%a)
|
|
2003
|
+
""", checks=[("r1", 90)]))
|
|
2004
|
+
out.append(V("elemsec", "alloc-chain", "a structure whose allocatable "
|
|
2005
|
+
"scalar components hold allocatable scalar and array "
|
|
2006
|
+
"components, mapped whole (recursive deep copy)",
|
|
2007
|
+
[C_ALLOCCOMP, C_DEFMAPPER], types="""
|
|
2008
|
+
type t1
|
|
2009
|
+
integer, allocatable :: a
|
|
2010
|
+
integer, allocatable :: c(:)
|
|
2011
|
+
end type t1
|
|
2012
|
+
type t2
|
|
2013
|
+
type(t1), allocatable :: f
|
|
2014
|
+
end type t2
|
|
2015
|
+
type t3
|
|
2016
|
+
type(t2), allocatable :: h
|
|
2017
|
+
integer, allocatable :: g(:)
|
|
2018
|
+
end type t3
|
|
2019
|
+
""", decls="type(t3) :: x\ninteger :: l", body="""
|
|
2020
|
+
allocate(x%h)
|
|
2021
|
+
allocate(x%h%f)
|
|
2022
|
+
allocate(x%h%f%a)
|
|
2023
|
+
allocate(x%h%f%c(10))
|
|
2024
|
+
allocate(x%g(10))
|
|
2025
|
+
x%h%f%a = 0
|
|
2026
|
+
x%h%f%c = 0
|
|
2027
|
+
x%g = 0
|
|
2028
|
+
!$omp target map(tofrom: x)
|
|
2029
|
+
x%h%f%a = 7
|
|
2030
|
+
do l = 1, 10
|
|
2031
|
+
x%h%f%c(l) = l
|
|
2032
|
+
x%g(l) = 2 * l
|
|
2033
|
+
end do
|
|
2034
|
+
!$omp end target
|
|
2035
|
+
r1 = x%h%f%a
|
|
2036
|
+
r2 = sum(x%h%f%c)
|
|
2037
|
+
r3 = sum(x%g)
|
|
2038
|
+
""", checks=[("r1", 7), ("r2", 55), ("r3", 110)]))
|
|
2039
|
+
return out
|
|
2040
|
+
|
|
2041
|
+
|
|
2042
|
+
# --- OpenACC 3.4 -----------------------------------------------------------------------
|
|
2043
|
+
|
|
2044
|
+
A_DATA = ("OpenACC 3.4 §2.7.1 p.49-50 l.1711-1713 (a derived-type variable: "
|
|
2045
|
+
"its members are copied; allocatable or pointer members' data are "
|
|
2046
|
+
"not)")
|
|
2047
|
+
A_ATTACH = ("OpenACC 3.4 §2.6.8 p.47-48 (attachment), §2.7.2 (data clause "
|
|
2048
|
+
"actions: attach)")
|
|
2049
|
+
A_UPDATE = ("OpenACC 3.4 §2.14.4 p.90 l.3296-3299 (members of derived types, "
|
|
2050
|
+
"subarrays of members)")
|
|
2051
|
+
A_ROUTINE = "OpenACC 3.4 §2.15.1 (routine directive)"
|
|
2052
|
+
|
|
2053
|
+
|
|
2054
|
+
def _acc() -> list[V]:
|
|
2055
|
+
out = []
|
|
2056
|
+
acc = dict(model="acc")
|
|
2057
|
+
out.append(V("acc-copy", "struct", "copy(s) of a structure with a "
|
|
2058
|
+
"fixed-size array member in a parallel loop", [A_DATA],
|
|
2059
|
+
types="type sa\n integer :: b(n) = 0\n integer :: c = 0\n"
|
|
2060
|
+
"end type sa", decls="type(sa) :: s\ninteger :: i",
|
|
2061
|
+
body="""
|
|
2062
|
+
do i = 1, n
|
|
2063
|
+
s%b(i) = i
|
|
2064
|
+
end do
|
|
2065
|
+
s%c = 5
|
|
2066
|
+
!$acc parallel loop copy(s)
|
|
2067
|
+
do i = 1, n
|
|
2068
|
+
s%b(i) = s%b(i) + s%c
|
|
2069
|
+
end do
|
|
2070
|
+
r1 = sum(s%b)
|
|
2071
|
+
""", checks=[("r1", S1 + 5 * N)], **acc))
|
|
2072
|
+
out.append(V("acc-copy", "aos", "copy(p) of an array of structures",
|
|
2073
|
+
[A_DATA], types="type pt\n integer :: x = 0, y = 0\n"
|
|
2074
|
+
"end type pt", decls="type(pt) :: p(n)\ninteger :: i",
|
|
2075
|
+
body="""
|
|
2076
|
+
do i = 1, n
|
|
2077
|
+
p(i)%x = i
|
|
2078
|
+
end do
|
|
2079
|
+
!$acc parallel loop copy(p)
|
|
2080
|
+
do i = 1, n
|
|
2081
|
+
p(i)%y = 2 * p(i)%x + 1
|
|
2082
|
+
end do
|
|
2083
|
+
r1 = sum(p%y)
|
|
2084
|
+
""", checks=[("r1", 2 * S1 + N)], **acc))
|
|
2085
|
+
d = "type(vec) :: x\ninteger :: i"
|
|
2086
|
+
out.append(V("acc-deep", "enterexit", "manual deep copy: enter data "
|
|
2087
|
+
"copyin(x), then copyin(x%a) (attach); a parallel loop; "
|
|
2088
|
+
"copyout(x%a); delete(x)", [A_DATA, A_ATTACH],
|
|
2089
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
2090
|
+
!$acc enter data copyin(x)
|
|
2091
|
+
!$acc enter data copyin(x%a)
|
|
2092
|
+
!$acc parallel loop present(x)
|
|
2093
|
+
do i = 1, n
|
|
2094
|
+
x%a(i) = x%a(i) + x%n
|
|
2095
|
+
end do
|
|
2096
|
+
!$acc exit data copyout(x%a)
|
|
2097
|
+
!$acc exit data delete(x)
|
|
2098
|
+
r1 = sum(x%a)
|
|
2099
|
+
""", checks=[("r1", S1 + N * N)], **acc))
|
|
2100
|
+
out.append(V("acc-deep", "data", "a data construct with copyin(x) "
|
|
2101
|
+
"copy(x%a) around a parallel loop", [A_DATA, A_ATTACH],
|
|
2102
|
+
types=VEC, decls=d, body=VEC_SETUP + """
|
|
2103
|
+
!$acc data copyin(x) copy(x%a)
|
|
2104
|
+
!$acc parallel loop
|
|
2105
|
+
do i = 1, n
|
|
2106
|
+
x%a(i) = 2 * x%a(i)
|
|
2107
|
+
end do
|
|
2108
|
+
!$acc end data
|
|
2109
|
+
r1 = sum(x%a)
|
|
2110
|
+
""", checks=[("r1", 2 * S1)], **acc))
|
|
2111
|
+
out.append(V("acc-deep", "attach", "explicit attach and detach clauses for "
|
|
2112
|
+
"a pointer member whose target is copied in separately",
|
|
2113
|
+
[A_ATTACH, "OpenACC 3.4 §2.7.13 (attach clause), §2.7.14 "
|
|
2114
|
+
"(detach clause)"], types=PV,
|
|
2115
|
+
decls="type(pv) :: x\ninteger, target :: buf(n)\ninteger :: i",
|
|
2116
|
+
body="""
|
|
2117
|
+
do i = 1, n
|
|
2118
|
+
buf(i) = i
|
|
2119
|
+
end do
|
|
2120
|
+
x%n = n
|
|
2121
|
+
x%p => buf
|
|
2122
|
+
!$acc enter data copyin(x)
|
|
2123
|
+
!$acc enter data copyin(buf)
|
|
2124
|
+
!$acc enter data attach(x%p)
|
|
2125
|
+
!$acc parallel loop present(x)
|
|
2126
|
+
do i = 1, n
|
|
2127
|
+
x%p(i) = 3 * x%p(i)
|
|
2128
|
+
end do
|
|
2129
|
+
!$acc exit data detach(x%p)
|
|
2130
|
+
!$acc exit data copyout(buf)
|
|
2131
|
+
!$acc exit data delete(x)
|
|
2132
|
+
r1 = sum(buf)
|
|
2133
|
+
""", checks=[("r1", 3 * S1)], **acc))
|
|
2134
|
+
out.append(V("acc-deep", "update", "update self(x%a(1:16)): a subarray "
|
|
2135
|
+
"of an allocatable member, after a device change",
|
|
2136
|
+
[A_UPDATE, A_ATTACH], types=VEC, decls=d,
|
|
2137
|
+
body=VEC_SETUP + """
|
|
2138
|
+
!$acc enter data copyin(x)
|
|
2139
|
+
!$acc enter data copyin(x%a)
|
|
2140
|
+
!$acc parallel loop present(x)
|
|
2141
|
+
do i = 1, n
|
|
2142
|
+
x%a(i) = -x%a(i)
|
|
2143
|
+
end do
|
|
2144
|
+
!$acc update self(x%a(1:16))
|
|
2145
|
+
r1 = sum(x%a(1:16))
|
|
2146
|
+
!$acc exit data copyout(x%a)
|
|
2147
|
+
!$acc exit data delete(x)
|
|
2148
|
+
r2 = sum(x%a)
|
|
2149
|
+
""", checks=[("r1", -136), ("r2", -S1)], **acc))
|
|
2150
|
+
out.append(V("acc-deep", "twolevel", "deep copy of an allocatable member "
|
|
2151
|
+
"of a nested structure member: copyin(o), copyin(o%in%b)",
|
|
2152
|
+
[A_DATA, A_ATTACH], types="""
|
|
2153
|
+
type in_t
|
|
2154
|
+
integer, allocatable :: b(:)
|
|
2155
|
+
end type in_t
|
|
2156
|
+
type out_t
|
|
2157
|
+
type(in_t) :: in
|
|
2158
|
+
integer :: k = 0
|
|
2159
|
+
end type out_t
|
|
2160
|
+
""", decls="type(out_t) :: o\ninteger :: i",
|
|
2161
|
+
body="""
|
|
2162
|
+
allocate(o%in%b(n))
|
|
2163
|
+
do i = 1, n
|
|
2164
|
+
o%in%b(i) = i
|
|
2165
|
+
end do
|
|
2166
|
+
o%k = 3
|
|
2167
|
+
!$acc enter data copyin(o)
|
|
2168
|
+
!$acc enter data copyin(o%in%b)
|
|
2169
|
+
!$acc parallel loop present(o)
|
|
2170
|
+
do i = 1, n
|
|
2171
|
+
o%in%b(i) = o%in%b(i) * o%k
|
|
2172
|
+
end do
|
|
2173
|
+
!$acc exit data copyout(o%in%b)
|
|
2174
|
+
!$acc exit data delete(o)
|
|
2175
|
+
r1 = sum(o%in%b)
|
|
2176
|
+
""", checks=[("r1", 3 * S1)], **acc))
|
|
2177
|
+
out.append(V("acc-routine", "tbp", "a type-bound function with a routine "
|
|
2178
|
+
"seq directive called on each element (non-polymorphic "
|
|
2179
|
+
"objects: the binding resolves statically)",
|
|
2180
|
+
[A_ROUTINE, "Fortran 2018 15.5.6 (resolving type-bound "
|
|
2181
|
+
"procedure references)"],
|
|
2182
|
+
types="""
|
|
2183
|
+
type tg
|
|
2184
|
+
integer :: v = 0
|
|
2185
|
+
contains
|
|
2186
|
+
procedure :: get => tg_get
|
|
2187
|
+
end type tg
|
|
2188
|
+
""", procs="""
|
|
2189
|
+
integer function tg_get(s)
|
|
2190
|
+
!$acc routine seq
|
|
2191
|
+
class(tg), intent(in) :: s
|
|
2192
|
+
tg_get = s%v
|
|
2193
|
+
end function tg_get
|
|
2194
|
+
""", decls="type(tg) :: p(n)\ninteger :: r(n), i",
|
|
2195
|
+
body="""
|
|
2196
|
+
do i = 1, n
|
|
2197
|
+
p(i)%v = i
|
|
2198
|
+
end do
|
|
2199
|
+
!$acc parallel loop copyin(p) copyout(r)
|
|
2200
|
+
do i = 1, n
|
|
2201
|
+
r(i) = 2 * p(i)%get()
|
|
2202
|
+
end do
|
|
2203
|
+
r1 = sum(r)
|
|
2204
|
+
""", checks=[("r1", 2 * S1)], **acc))
|
|
2205
|
+
out.append(V("acc-routine", "dispatch", "dynamic dispatch through a "
|
|
2206
|
+
"CLASS(shape) dummy in a routine seq function",
|
|
2207
|
+
[A_ROUTINE], types=SHAPES,
|
|
2208
|
+
procs=_shape_procs("!$acc routine seq"),
|
|
2209
|
+
decls="type(sq) :: q\ntype(rect) :: rr",
|
|
2210
|
+
body="""
|
|
2211
|
+
q%side = 3
|
|
2212
|
+
rr%w = 4
|
|
2213
|
+
rr%h = 5
|
|
2214
|
+
!$acc serial copyin(q, rr) copyout(r1)
|
|
2215
|
+
r1 = area_of(q) + area_of(rr)
|
|
2216
|
+
!$acc end serial
|
|
2217
|
+
""", checks=[("r1", 29)], legality="unspecified",
|
|
2218
|
+
why="OpenACC 3.4 does not address polymorphic objects or "
|
|
2219
|
+
"type-bound procedure dispatch in compute regions (§1.8 "
|
|
2220
|
+
"p.16 l.496-500 lists polymorphic assignment among the "
|
|
2221
|
+
"Fortran 2008 features whose use may result in "
|
|
2222
|
+
"unspecified behavior); observation only", **acc))
|
|
2223
|
+
return out
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
FAMILIES = ("nested", "alloccomp", "ptrcomp", "section", "mapper", "pdt",
|
|
2227
|
+
"extends", "tbp", "poly", "unlimited", "assignfinal", "dreduce",
|
|
2228
|
+
"elemsec", "acc-copy", "acc-deep", "acc-routine")
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
def programs() -> list[Program]:
|
|
2232
|
+
vs = (_nested() + _alloccomp() + _ptrcomp() + _section() + _mapper() +
|
|
2233
|
+
_pdt() + _extends() + _tbp() + _poly() + _unlimited() +
|
|
2234
|
+
_assignfinal() + _dreduce() + _elemsec() + _acc())
|
|
2235
|
+
return [render(v) for v in vs]
|
|
2236
|
+
|
|
2237
|
+
|
|
2238
|
+
def program(pid: str) -> Program:
|
|
2239
|
+
for p in programs():
|
|
2240
|
+
if p.id == pid:
|
|
2241
|
+
return p
|
|
2242
|
+
raise KeyError(pid)
|
|
2243
|
+
|
|
2244
|
+
|
|
2245
|
+
def parse_observed(stdout: str) -> dict:
|
|
2246
|
+
"""name -> integer of the ``name= value`` lines of a run."""
|
|
2247
|
+
import re
|
|
2248
|
+
return {m.group(1): int(m.group(2)) for m in
|
|
2249
|
+
re.finditer(r"^(\w+)= (-?\d+)\s*$", stdout or "", re.M)}
|