02889d23ee
2017-02-09 Nathan Sidwell <nathan@codesourcery.com> Cesar Philippidis <cesar@codesourcery.com> Joseph Myers <joseph@codesourcery.com> Chung-Lin Tang <cltang@codesourcery.com> gcc/ * gimplify.c (gimplify_scan_omp_clauses): No special handling for OMP_CLAUSE_TILE. (gimplify_adjust_omp_clauses): Don't delete TILE. (gimplify_omp_for): Deal with TILE. * internal-fn.c (expand_GOACC_TILE): New function. * internal-fn.def (GOACC_DIM_POS): Comment may be overly conservative. (GOACC_TILE): New. * omp-expand.c (struct oacc_collapse): Add tile and outer fields. (expand_oacc_collapse_init): Add LOC paramter. Initialize tile element fields. (expand_oacc_collapse_vars): Add INNER parm, adjust for tiling, avoid DIV for outermost collapse var. (expand_oacc_for): Insert tile element loop as needed. Adjust. Remove out of date comments, fix whitespace. * omp-general.c (omp_extract_for_data): Deal with tiling. * omp-general.h (enum oacc_loop_flags): Add OLF_TILE flag, adjust OLF_DIM_BASE value. (struct omp_for_data): Add tiling field. * omp-low.c (scan_sharing_clauses): Allow OMP_CLAUSE_TILE. (lower_oacc_head_mark): Add OLF_TILE as appropriate. Ensure 2 levels for auto loops. Remove default auto determining, moved to oacc_loop_fixed_partitions. * omp-offload.c (struct oacc_loop): Change 'ifns' to vector of call stmts, add e_mask field. (oacc_dim_call): New function, abstracted out from oacc_thread_numbers. (oacc_thread_numbers): Use oacc_dim_call. (oacc_xform_tile): New. (new_oacc_loop_raw): Initialize e_mask, adjust for ifns vector. (finish_oacc_loop): Adjust for ifns vector. (oacc_loop_discover_walk): Append loop abstraction sites to list, add case for GOACC_TILE fns. (oacc_loop_xform_loop): Delete. (oacc_loop_process): Iterate over call list directly, and add handling for GOACC_TILE fns. (oacc_loop_fixed_partitions): Determine default auto, deal with TILE, dump partitioning. (oacc_loop_auto_partitions): Add outer_assign parm. Assign all but vector partitioning to outer loops. Assign 2 partitions to loops when available. Add TILE handling. (oacc_loop_partition): Adjust oacc_loop_auto_partitions call. (execite_oacc_device_lower): Process GOACC_TILE fns, ignore unknown specs. * tree-nested.c (convert_nonlocal_omp_clauses): Allow OMP_CLAUSE_TILE. * tree.c (omp_clause_num_ops): Adjust TILE ops. * tree.h (OMP_CLAUSE_TILE_ITERVAR, OMP_CLAUSE_TILE_COUNT): New. gcc/c/ * c-parser.c (c_parser_omp_clause_collapse): Disallow tile. (c_parser_oacc_clause_tile): Disallow collapse. Fix parsing and semantic checking. * c-parser.c (c_parser_omp_for_loop): Accept tiling constructs. gcc/cp/ * parser.c (cp_parser_oacc_clause_tile): Disallow collapse. Fix parsing. Parse constant expression. Remove semantic checking. (cp_parser_omp_clause_collapse): Disallow tile. (cp_parser_omp_for_loop): Deal with tile clause. Don't emit a parse error about missing for after already emitting one. Use more conventional for idiom for unbounded loop. * pt.c (tsubst_omp_clauses): Handle OMP_CLAUSE_TILE. * semantics.c (finish_omp_clauses): Correct TILE semantic check. (finish_omp_for): Deal with tile clause. gcc/fortran/ * openmp.c (resolve_omp_clauses): Error on directives containing both tile and collapse clauses. (resolve_oacc_loop_blocks): Represent '*' tile arguments as zero. * trans-openmp.c (gfc_trans_omp_do): Lower tiled loops like collapsed loops. gcc/testsuite/ * c-c++-common/goacc/combined-directives.c: Remove xfail. * c-c++-common/goacc/loop-auto-1.c: Adjust and add additional case. * c-c++-common/goacc/loop-auto-2.c: New. * c-c++-common/goacc/tile.c: Include stdbool, fix expected errors. * c-c++-common/goacc/tile-2.c: New. * g++.dg/goacc/template.C: Test tile subst. Adjust erroneous uses. * g++.dg/goacc/tile-1.C: New, check tile subst. * gcc.dg/goacc/loop-processing-1.c: Adjust dg-final pattern. * gfortran.dg/goacc/combined-directives.f90: Remove xfail. * gfortran.dg/goacc/tile-1.f90: New test. * gfortran.dg/goacc/tile-2.f90: New test. * gfortran.dg/goacc/tile-lowering.f95: New test. libgomp/ * testsuite/libgomp.oacc-c-c++-common/tile-1.c: New. * testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c: Adjust and add additional case. * testsuite/libgomp.oacc-c-c++-common/vprop.c: XFAIL under "openacc_nvidia_accel_selected". * libgomp.oacc-fortran/nested-function-1.f90 (test2): Add num_workers(8) clause. From-SVN: r245300
94 lines
3.2 KiB
C
94 lines
3.2 KiB
C
/* General types and functions that are uselful for processing of OpenMP,
|
|
OpenACC and similar directivers at various stages of compilation.
|
|
|
|
Copyright (C) 2005-2017 Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GCC_OMP_GENERAL_H
|
|
#define GCC_OMP_GENERAL_H
|
|
|
|
#include "gomp-constants.h"
|
|
|
|
/* Flags for an OpenACC loop. */
|
|
|
|
enum oacc_loop_flags {
|
|
OLF_SEQ = 1u << 0, /* Explicitly sequential */
|
|
OLF_AUTO = 1u << 1, /* Compiler chooses axes. */
|
|
OLF_INDEPENDENT = 1u << 2, /* Iterations are known independent. */
|
|
OLF_GANG_STATIC = 1u << 3, /* Gang partitioning is static (has op). */
|
|
OLF_TILE = 1u << 4, /* Tiled loop. */
|
|
|
|
/* Explicitly specified loop axes. */
|
|
OLF_DIM_BASE = 5,
|
|
OLF_DIM_GANG = 1u << (OLF_DIM_BASE + GOMP_DIM_GANG),
|
|
OLF_DIM_WORKER = 1u << (OLF_DIM_BASE + GOMP_DIM_WORKER),
|
|
OLF_DIM_VECTOR = 1u << (OLF_DIM_BASE + GOMP_DIM_VECTOR),
|
|
|
|
OLF_MAX = OLF_DIM_BASE + GOMP_DIM_MAX
|
|
};
|
|
|
|
/* A structure holding the elements of:
|
|
for (V = N1; V cond N2; V += STEP) [...] */
|
|
|
|
struct omp_for_data_loop
|
|
{
|
|
tree v, n1, n2, step;
|
|
enum tree_code cond_code;
|
|
};
|
|
|
|
/* A structure describing the main elements of a parallel loop. */
|
|
|
|
struct omp_for_data
|
|
{
|
|
struct omp_for_data_loop loop;
|
|
tree chunk_size;
|
|
gomp_for *for_stmt;
|
|
tree pre, iter_type;
|
|
tree tiling; /* Tiling values (if non null). */
|
|
int collapse; /* Collapsed loops, 1 for a non-collapsed loop. */
|
|
int ordered;
|
|
bool have_nowait, have_ordered, simd_schedule;
|
|
unsigned char sched_modifiers;
|
|
enum omp_clause_schedule_kind sched_kind;
|
|
struct omp_for_data_loop *loops;
|
|
};
|
|
|
|
#define OACC_FN_ATTRIB "oacc function"
|
|
|
|
extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
|
|
extern bool omp_is_reference (tree decl);
|
|
extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
|
|
tree *n2);
|
|
extern tree omp_get_for_step_from_incr (location_t loc, tree incr);
|
|
extern void omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd,
|
|
struct omp_for_data_loop *loops);
|
|
extern gimple *omp_build_barrier (tree lhs);
|
|
extern int omp_max_vf (void);
|
|
extern int omp_max_simt_vf (void);
|
|
extern tree oacc_launch_pack (unsigned code, tree device, unsigned op);
|
|
extern void oacc_replace_fn_attrib (tree fn, tree dims);
|
|
extern void oacc_set_fn_attrib (tree fn, tree clauses, bool is_kernel,
|
|
vec<tree> *args);
|
|
extern tree oacc_build_routine_dims (tree clauses);
|
|
extern tree oacc_get_fn_attrib (tree fn);
|
|
extern bool oacc_fn_attrib_kernels_p (tree attr);
|
|
extern int oacc_get_fn_dim_size (tree fn, int axis);
|
|
extern int oacc_get_ifn_dim_arg (const gimple *stmt);
|
|
|
|
#endif /* GCC_OMP_GENERAL_H */
|