aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2019-01-03 15:08:36 +0000
committerTom de Vries <vries@gcc.gnu.org>2019-01-03 15:08:36 +0000
commit0d06e8c794f37ded34e902ead35e7c70c3b112d1 (patch)
tree48bb70600a1e76eff608fa85c6316541c9992bf0 /gcc
parent2498a6abcc83bcad1d33249f9a15b32daade2595 (diff)
downloadgcc-0d06e8c794f37ded34e902ead35e7c70c3b112d1.zip
gcc-0d06e8c794f37ded34e902ead35e7c70c3b112d1.tar.gz
gcc-0d06e8c794f37ded34e902ead35e7c70c3b112d1.tar.bz2
[nvptx] Add nvptx_mach_vector_length, nvptx_mach_max_workers
The vector length and maximum number of workers are known compile-time. Make these easily available during code generation via new functions. 2019-01-03 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.c (MACH_VECTOR_LENGTH, MACH_MAX_WORKERS): Define. (init_axis_dim, nvptx_mach_max_workers, nvptx_mach_vector_length): New function. * config/nvptx/nvptx.h (struct machine_function): Add axis_dims. From-SVN: r267558
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/nvptx/nvptx.c41
-rw-r--r--gcc/config/nvptx/nvptx.h3
3 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1b57031..40b1fdf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2019-01-03 Tom de Vries <tdevries@suse.de>
+ * config/nvptx/nvptx.c (MACH_VECTOR_LENGTH, MACH_MAX_WORKERS): Define.
+ (init_axis_dim, nvptx_mach_max_workers, nvptx_mach_vector_length): New
+ function.
+ * config/nvptx/nvptx.h (struct machine_function): Add axis_dims.
+
+2019-01-03 Tom de Vries <tdevries@suse.de>
+
* config/nvptx/nvptx.c (struct offload_attrs): New.
(populate_offload_attrs): New function. Factor mask extraction out of
nvptx_reorg. Add extraction of dimensions.
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index 1542533..5d0bab6 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -2883,6 +2883,47 @@ struct offload_attrs
int vector_length;
};
+/* Define entries for cfun->machine->axis_dim. */
+
+#define MACH_VECTOR_LENGTH 0
+#define MACH_MAX_WORKERS 1
+
+static void populate_offload_attrs (offload_attrs *oa);
+
+static void
+init_axis_dim (void)
+{
+ offload_attrs oa;
+ int max_workers;
+
+ populate_offload_attrs (&oa);
+
+ if (oa.num_workers == 0)
+ max_workers = PTX_CTA_SIZE / oa.vector_length;
+ else
+ max_workers = oa.num_workers;
+
+ cfun->machine->axis_dim[MACH_VECTOR_LENGTH] = oa.vector_length;
+ cfun->machine->axis_dim[MACH_MAX_WORKERS] = max_workers;
+ cfun->machine->axis_dim_init_p = true;
+}
+
+static int ATTRIBUTE_UNUSED
+nvptx_mach_max_workers ()
+{
+ if (!cfun->machine->axis_dim_init_p)
+ init_axis_dim ();
+ return cfun->machine->axis_dim[MACH_MAX_WORKERS];
+}
+
+static int ATTRIBUTE_UNUSED
+nvptx_mach_vector_length ()
+{
+ if (!cfun->machine->axis_dim_init_p)
+ init_axis_dim ();
+ return cfun->machine->axis_dim[MACH_VECTOR_LENGTH];
+}
+
/* Loop structure of the function. The entire function is described as
a NULL loop. */
diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h
index 64134d4..a05ff7e 100644
--- a/gcc/config/nvptx/nvptx.h
+++ b/gcc/config/nvptx/nvptx.h
@@ -218,6 +218,9 @@ struct GTY(()) machine_function
int return_mode; /* Return mode of current fn.
(machine_mode not defined yet.) */
rtx axis_predicate[2]; /* Neutering predicates. */
+ int axis_dim[2]; /* Maximum number of threads on each axis, dim[0] is
+ vector_length, dim[1] is num_workers. */
+ bool axis_dim_init_p;
rtx unisimt_master; /* 'Master lane index' for -muniform-simt. */
rtx unisimt_predicate; /* Predicate for -muniform-simt. */
rtx unisimt_location; /* Mask location for -muniform-simt. */