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