+2022-07-12 Andrew Stubbs <ams@codesourcery.com>
+
+ * gimple-loop-versioning.cc (loop_versioning::loop_versioning): Add
+ comment.
+ * omp-general.cc (omp_max_simd_vf): New function.
+ * omp-general.h (omp_max_simd_vf): New prototype.
+ * omp-low.cc (lower_rec_simd_input_clauses): Select largest from
+ omp_max_vf, omp_max_simt_vf, and omp_max_simd_vf.
+
2022-07-08 Tobias Burnus <tobias@codesourcery.com>
Backport from mainline:
unvectorizable code, since it is the largest size that can be
handled efficiently by scalar code. omp_max_vf calculates the
maximum number of bytes in a vector, when such a value is relevant
- to loop optimization. */
+ to loop optimization.
+ FIXME: this probably needs to use omp_max_simd_vf when in a target
+ region, but how to tell? (And MAX_FIXED_MODE_SIZE is large enough that
+ it doesn't actually matter.) */
m_maximum_scale = estimated_poly_value (omp_max_vf ());
m_maximum_scale = MAX (m_maximum_scale, MAX_FIXED_MODE_SIZE);
}
return 0;
}
+/* Return maximum SIMD width if offloading may target SIMD hardware. */
+
+int
+omp_max_simd_vf (void)
+{
+ if (!optimize)
+ return 0;
+ if (ENABLE_OFFLOADING)
+ for (const char *c = getenv ("OFFLOAD_TARGET_NAMES"); c;)
+ {
+ if (startswith (c, "amdgcn"))
+ return 64;
+ else if ((c = strchr (c, ':')))
+ c++;
+ }
+ return 0;
+}
+
/* Store the construct selectors as tree codes from last to first,
return their number. */
extern tree find_combined_omp_for (tree *, int *, void *);
extern poly_uint64 omp_max_vf (void);
extern int omp_max_simt_vf (void);
+extern int omp_max_simd_vf (void);
extern int omp_constructor_traits_to_codes (tree, enum tree_code *);
extern tree omp_check_context_selector (location_t loc, tree ctx);
extern void omp_mark_declare_variant (location_t loc, tree variant,
{
if (known_eq (sctx->max_vf, 0U))
{
- sctx->max_vf = sctx->is_simt ? omp_max_simt_vf () : omp_max_vf ();
+ /* If we are compiling for multiple devices choose the largest VF. */
+ sctx->max_vf = omp_max_vf ();
+ if (omp_maybe_offloaded_ctx (ctx))
+ {
+ if (sctx->is_simt)
+ sctx->max_vf = ordered_max (sctx->max_vf, omp_max_simt_vf ());
+ sctx->max_vf = ordered_max (sctx->max_vf, omp_max_simd_vf ());
+ }
if (maybe_gt (sctx->max_vf, 1U))
{
tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt),
+2022-07-12 Andrew Stubbs <ams@codesourcery.com>
+
+ * lib/target-supports.exp
+ (check_effective_target_amdgcn_offloading_enabled): New.
+ (check_effective_target_nvptx_offloading_enabled): New.
+ * gcc.dg/gomp/target-vf.c: New test.
+
2022-07-05 Tobias Burnus <tobias@codesourcery.com>
Backport from mainline:
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O2 -fdump-tree-omplower" } */
+
+/* Ensure that the omp_max_vf, omp_max_simt_vf, and omp_max_simd_vf are working
+ properly to set the OpenMP vectorization factor for the offload target, and
+ not just for the host. */
+
+float
+foo (float * __restrict x, float * __restrict y)
+{
+ float sum = 0.0;
+
+#pragma omp target teams distribute parallel for simd map(tofrom: sum) reduction(+:sum)
+ for (int i=0; i<1024; i++)
+ sum += x[i] * y[i];
+
+ return sum;
+}
+
+/* { dg-final { scan-tree-dump "safelen\\(64\\)" "omplower" { target amdgcn_offloading_enabled } } } */
+/* { dg-final { scan-tree-dump "safelen\\(32\\)" "omplower" { target { { nvptx_offloading_enabled } && { ! amdgcn_offloading_enabled } } } } } */
return [check_configured_with "--enable-offload-targets"]
}
+# Return 1 if compiled with --enable-offload-targets=amdgcn
+proc check_effective_target_amdgcn_offloading_enabled {} {
+ return [check_configured_with {--enable-offload-targets=[^ ]*amdgcn}]
+}
+
+# Return 1 if compiled with --enable-offload-targets=amdgcn
+proc check_effective_target_nvptx_offloading_enabled {} {
+ return [check_configured_with {--enable-offload-targets=[^ ]*nvptx}]
+}
+
# Return 1 if compilation with -fopenacc is error-free for trivial
# code, 0 otherwise.