From: Tom de Vries Date: Thu, 3 Jan 2019 15:08:36 +0000 (+0000) Subject: [nvptx] Add nvptx_mach_vector_length, nvptx_mach_max_workers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0d06e8c794f37ded34e902ead35e7c70c3b112d1;p=gcc.git [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 * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b57031801b..40b1fdf22dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-01-03 Tom de Vries + + * 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 * config/nvptx/nvptx.c (struct offload_attrs): New. diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 15425337939..5d0bab65d07 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 64134d46128..a05ff7ec9be 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. */