[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
This commit is contained in:
Tom de Vries 2019-01-03 15:08:36 +00:00 committed by Tom de Vries
parent 2498a6abcc
commit 0d06e8c794
3 changed files with 51 additions and 0 deletions

View File

@ -1,3 +1,10 @@
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.

View File

@ -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. */

View File

@ -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. */