Hi! In gomp-4_0-branch's r208648, I have just committed some ;-) support for OpenACC num_gangs, num_workers, vector_length clauses (OpenACC parallel directive), that is, just passing them through the compiler -- now, libgomp just needs to do something useful with that information.
commit 0104aa41048603ecc0bcfe747b735068557e4431 Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Tue Mar 18 13:09:24 2014 +0000 OpenACC num_gangs, num_workers, vector_length clauses. gcc/c-family/ * c-pragma.h (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS, PRAGMA_OMP_CLAUSE_VECTOR_LENGTH. gcc/c/ * c-parser.c (c_parser_omp_clause_num_gangs) (c_parser_omp_clause_num_workers) (c_parser_omp_clause_vector_length): New functions. (c_parser_omp_clause_name, c_parser_oacc_all_clauses): Handle PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS, PRAGMA_OMP_CLAUSE_VECTOR_LENGTH. (OACC_PARALLEL_CLAUSE_MARK): Add these. * c-typeck.c (c_finish_omp_clauses): Handle these. gcc/ * builtin-types.def (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type. * oacc-builtins.def (BUILT_IN_GOACC_KERNELS) (BUILT_IN_GOACC_PARALLEL): Switch to that one. * gimplify.c (gimplify_scan_omp_clauses) (gimplify_adjust_omp_clauses): Handle OMP_CLAUSE_NUM_GANGS, OMP_CLAUSE_NUM_WORKERS, OMP_CLAUSE_VECTOR_LENGTH. * omp-low.c (scan_sharing_clauses, expand_oacc_offload): Likewise. gcc/ada/ * gcc-interface/utils.c (DEF_FUNCTION_TYPE_10): Define. gcc/c-family/ * c-common.c (DEF_FUNCTION_TYPE_10): Define. gcc/fortran/ * f95-lang.c (DEF_FUNCTION_TYPE_10): Define. * types.def (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type. gcc/lto/ * c-common.c (DEF_FUNCTION_TYPE_10): Define. libgomp/ * libgomp_g.h (GOACC_kernels, GOACC_parallel): Add three additional int arguments. * oacc-parallel.c (GOACC_kernels, GOACC_parallel): Handle these. * testsuite/libgomp.oacc-c/goacc_kernels.c: Adjust. * testsuite/libgomp.oacc-c/goacc_parallel.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@208648 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog.gomp | 11 ++ gcc/ada/ChangeLog.gomp | 6 +- gcc/ada/gcc-interface/utils.c | 7 + gcc/builtin-types.def | 4 + gcc/c-family/ChangeLog.gomp | 8 ++ gcc/c-family/c-common.c | 7 + gcc/c-family/c-pragma.h | 3 + gcc/c/ChangeLog.gomp | 11 ++ gcc/c/c-parser.c | 160 +++++++++++++++++++++- gcc/c/c-typeck.c | 3 + gcc/fortran/ChangeLog.gomp | 8 +- gcc/fortran/f95-lang.c | 18 +++ gcc/fortran/types.def | 4 + gcc/gimplify.c | 12 +- gcc/lto/ChangeLog.gomp | 6 +- gcc/lto/lto-lang.c | 7 + gcc/oacc-builtins.def | 6 +- gcc/omp-low.c | 49 +++++-- libgomp/ChangeLog.gomp | 8 ++ libgomp/libgomp_g.h | 6 +- libgomp/oacc-parallel.c | 19 ++- libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c | 4 +- libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c | 4 +- 23 files changed, 343 insertions(+), 28 deletions(-) diff --git gcc/ChangeLog.gomp gcc/ChangeLog.gomp index 9b8aec0..d35cbee 100644 --- gcc/ChangeLog.gomp +++ gcc/ChangeLog.gomp @@ -1,3 +1,14 @@ +2014-03-18 Thomas Schwinge <tho...@codesourcery.com> + + * builtin-types.def + (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type. + * oacc-builtins.def (BUILT_IN_GOACC_KERNELS) + (BUILT_IN_GOACC_PARALLEL): Switch to that one. + * gimplify.c (gimplify_scan_omp_clauses) + (gimplify_adjust_omp_clauses): Handle OMP_CLAUSE_NUM_GANGS, + OMP_CLAUSE_NUM_WORKERS, OMP_CLAUSE_VECTOR_LENGTH. + * omp-low.c (scan_sharing_clauses, expand_oacc_offload): Likewise. + 2014-03-13 Thomas Schwinge <tho...@codesourcery.com> * tree.h (OMP_CLAUSE_VECTOR_EXPR): Check for OMP_CLAUSE_VECTOR diff --git gcc/ada/ChangeLog.gomp gcc/ada/ChangeLog.gomp index 0bb4618..eff84ec 100644 --- gcc/ada/ChangeLog.gomp +++ gcc/ada/ChangeLog.gomp @@ -1,8 +1,12 @@ +2014-03-18 Thomas Schwinge <tho...@codesourcery.com> + + * gcc-interface/utils.c (DEF_FUNCTION_TYPE_10): Define. + 2013-04-10 Jakub Jelinek <ja...@redhat.com> * gcc-interface/utils.c (DEF_FUNCTION_TYPE_8): Define. -Copyright (C) 2013 Free Software Foundation, Inc. +Copyright (C) 2013-2014 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright diff --git gcc/ada/gcc-interface/utils.c gcc/ada/gcc-interface/utils.c index 014fe36..6267f20 100644 --- gcc/ada/gcc-interface/utils.c +++ gcc/ada/gcc-interface/utils.c @@ -5822,6 +5822,7 @@ enum c_builtin_type #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, ARG10) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, @@ -5841,6 +5842,7 @@ enum c_builtin_type #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 @@ -5940,6 +5942,10 @@ install_builtin_function_types (void) ARG6, ARG7, ARG8) \ def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8); +#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10) \ + def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9, ARG10); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ def_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -5964,6 +5970,7 @@ install_builtin_function_types (void) #undef DEF_FUNCTION_TYPE_4 #undef DEF_FUNCTION_TYPE_5 #undef DEF_FUNCTION_TYPE_6 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 diff --git gcc/builtin-types.def gcc/builtin-types.def index fba9c7d..c09a62d 100644 --- gcc/builtin-types.def +++ gcc/builtin-types.def @@ -524,6 +524,10 @@ DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, BT_BOOL, BT_UINT, BT_PTR) +DEF_FUNCTION_TYPE_10 (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT, + BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_PTR, BT_SIZE, + BT_PTR, BT_PTR, BT_PTR, BT_INT, BT_INT, BT_INT) + DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID) DEF_FUNCTION_TYPE_VAR_0 (BT_FN_INT_VAR, BT_INT) DEF_FUNCTION_TYPE_VAR_0 (BT_FN_PTR_VAR, BT_PTR) diff --git gcc/c-family/ChangeLog.gomp gcc/c-family/ChangeLog.gomp index 3b4a335..5067a85 100644 --- gcc/c-family/ChangeLog.gomp +++ gcc/c-family/ChangeLog.gomp @@ -1,3 +1,11 @@ +2014-03-18 Thomas Schwinge <tho...@codesourcery.com> + + * c-pragma.h (enum pragma_omp_clause): Add + PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS, + PRAGMA_OMP_CLAUSE_VECTOR_LENGTH. + + * c-common.c (DEF_FUNCTION_TYPE_10): Define. + 2014-02-28 Thomas Schwinge <tho...@codesourcery.com> * c-pragma.c (oacc_pragmas): Add "kernels". diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index abd96fb..c4c7125 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -5114,6 +5114,7 @@ enum c_builtin_type #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, ARG10) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, @@ -5133,6 +5134,7 @@ enum c_builtin_type #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 @@ -5219,6 +5221,10 @@ c_define_builtins (tree va_list_ref_type_node, tree va_list_arg_type_node) ARG6, ARG7, ARG8) \ def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8); +#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10) \ + def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9, ARG10); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ def_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -5243,6 +5249,7 @@ c_define_builtins (tree va_list_ref_type_node, tree va_list_arg_type_node) #undef DEF_FUNCTION_TYPE_4 #undef DEF_FUNCTION_TYPE_5 #undef DEF_FUNCTION_TYPE_6 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 diff --git gcc/c-family/c-pragma.h gcc/c-family/c-pragma.h index d55a511..f08e40f 100644 --- gcc/c-family/c-pragma.h +++ gcc/c-family/c-pragma.h @@ -95,8 +95,10 @@ typedef enum pragma_omp_clause { PRAGMA_OMP_CLAUSE_MERGEABLE, PRAGMA_OMP_CLAUSE_NOTINBRANCH, PRAGMA_OMP_CLAUSE_NOWAIT, + PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_TEAMS, PRAGMA_OMP_CLAUSE_NUM_THREADS, + PRAGMA_OMP_CLAUSE_NUM_WORKERS, PRAGMA_OMP_CLAUSE_ORDERED, PRAGMA_OMP_CLAUSE_PARALLEL, PRAGMA_OMP_CLAUSE_PRESENT, @@ -117,6 +119,7 @@ typedef enum pragma_omp_clause { PRAGMA_OMP_CLAUSE_TO, PRAGMA_OMP_CLAUSE_UNIFORM, PRAGMA_OMP_CLAUSE_UNTIED, + PRAGMA_OMP_CLAUSE_VECTOR_LENGTH, /* Clauses for Cilk Plus SIMD-enabled function. */ PRAGMA_CILK_CLAUSE_NOMASK, diff --git gcc/c/ChangeLog.gomp gcc/c/ChangeLog.gomp index 0551026..4f648ea 100644 --- gcc/c/ChangeLog.gomp +++ gcc/c/ChangeLog.gomp @@ -1,3 +1,14 @@ +2014-04-18 Thomas Schwinge <tho...@codesourcery.com> + + * c-parser.c (c_parser_omp_clause_num_gangs) + (c_parser_omp_clause_num_workers) + (c_parser_omp_clause_vector_length): New functions. + (c_parser_omp_clause_name, c_parser_oacc_all_clauses): Handle + PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS, + PRAGMA_OMP_CLAUSE_VECTOR_LENGTH. + (OACC_PARALLEL_CLAUSE_MARK): Add these. + * c-typeck.c (c_finish_omp_clauses): Handle these. + 2014-02-28 Thomas Schwinge <tho...@codesourcery.com> * c-parser.c (OACC_KERNELS_CLAUSE_MASK): New macro definition. diff --git gcc/c/c-parser.c gcc/c/c-parser.c index 3d8c0de..9161577 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -9671,10 +9671,14 @@ c_parser_omp_clause_name (c_parser *parser) result = PRAGMA_OMP_CLAUSE_NOTINBRANCH; else if (!strcmp ("nowait", p)) result = PRAGMA_OMP_CLAUSE_NOWAIT; + else if (!strcmp ("num_gangs", p)) + result = PRAGMA_OMP_CLAUSE_NUM_GANGS; else if (!strcmp ("num_teams", p)) result = PRAGMA_OMP_CLAUSE_NUM_TEAMS; else if (!strcmp ("num_threads", p)) result = PRAGMA_OMP_CLAUSE_NUM_THREADS; + else if (!strcmp ("num_workers", p)) + result = PRAGMA_OMP_CLAUSE_NUM_WORKERS; else if (flag_cilkplus && !strcmp ("nomask", p)) result = PRAGMA_CILK_CLAUSE_NOMASK; break; @@ -9735,7 +9739,9 @@ c_parser_omp_clause_name (c_parser *parser) result = PRAGMA_OMP_CLAUSE_UNTIED; break; case 'v': - if (flag_cilkplus && !strcmp ("vectorlength", p)) + if (!strcmp ("vector_length", p)) + result = PRAGMA_OMP_CLAUSE_VECTOR_LENGTH; + else if (flag_cilkplus && !strcmp ("vectorlength", p)) result = PRAGMA_CILK_CLAUSE_VECTORLENGTH; break; } @@ -10198,6 +10204,51 @@ c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list) return c; } +/* OpenACC: + num_gangs ( expression ) */ + +static tree +c_parser_omp_clause_num_gangs (c_parser *parser, tree list) +{ + location_t num_gangs_loc = c_parser_peek_token (parser)->location; + if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) + { + location_t expr_loc = c_parser_peek_token (parser)->location; + tree c, t = c_parser_expression (parser).value; + mark_exp_read (t); + t = c_fully_fold (t, false, NULL); + + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); + + if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) + { + c_parser_error (parser, "expected integer expression"); + return list; + } + + /* Attempt to statically determine when the number isn't positive. */ + c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, + build_int_cst (TREE_TYPE (t), 0)); + if (CAN_HAVE_LOCATION_P (c)) + SET_EXPR_LOCATION (c, expr_loc); + if (c == boolean_true_node) + { + warning_at (expr_loc, 0, + "%<num_gangs%> value must be positive"); + t = integer_one_node; + } + + check_no_duplicate_clause (list, OMP_CLAUSE_NUM_GANGS, "num_gangs"); + + c = build_omp_clause (num_gangs_loc, OMP_CLAUSE_NUM_GANGS); + OMP_CLAUSE_NUM_GANGS_EXPR (c) = t; + OMP_CLAUSE_CHAIN (c) = list; + list = c; + } + + return list; +} + /* OpenMP 2.5: num_threads ( expression ) */ @@ -10243,6 +10294,51 @@ c_parser_omp_clause_num_threads (c_parser *parser, tree list) return list; } +/* OpenACC: + num_workers ( expression ) */ + +static tree +c_parser_omp_clause_num_workers (c_parser *parser, tree list) +{ + location_t num_workers_loc = c_parser_peek_token (parser)->location; + if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) + { + location_t expr_loc = c_parser_peek_token (parser)->location; + tree c, t = c_parser_expression (parser).value; + mark_exp_read (t); + t = c_fully_fold (t, false, NULL); + + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); + + if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) + { + c_parser_error (parser, "expected integer expression"); + return list; + } + + /* Attempt to statically determine when the number isn't positive. */ + c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, + build_int_cst (TREE_TYPE (t), 0)); + if (CAN_HAVE_LOCATION_P (c)) + SET_EXPR_LOCATION (c, expr_loc); + if (c == boolean_true_node) + { + warning_at (expr_loc, 0, + "%<num_workers%> value must be positive"); + t = integer_one_node; + } + + check_no_duplicate_clause (list, OMP_CLAUSE_NUM_WORKERS, "num_workers"); + + c = build_omp_clause (num_workers_loc, OMP_CLAUSE_NUM_WORKERS); + OMP_CLAUSE_NUM_WORKERS_EXPR (c) = t; + OMP_CLAUSE_CHAIN (c) = list; + list = c; + } + + return list; +} + /* OpenMP 2.5: ordered */ @@ -10494,6 +10590,51 @@ c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list) return c; } +/* OpenACC: + vector_length ( expression ) */ + +static tree +c_parser_omp_clause_vector_length (c_parser *parser, tree list) +{ + location_t vector_length_loc = c_parser_peek_token (parser)->location; + if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) + { + location_t expr_loc = c_parser_peek_token (parser)->location; + tree c, t = c_parser_expression (parser).value; + mark_exp_read (t); + t = c_fully_fold (t, false, NULL); + + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); + + if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) + { + c_parser_error (parser, "expected integer expression"); + return list; + } + + /* Attempt to statically determine when the number isn't positive. */ + c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, + build_int_cst (TREE_TYPE (t), 0)); + if (CAN_HAVE_LOCATION_P (c)) + SET_EXPR_LOCATION (c, expr_loc); + if (c == boolean_true_node) + { + warning_at (expr_loc, 0, + "%<vector_length%> value must be positive"); + t = integer_one_node; + } + + check_no_duplicate_clause (list, OMP_CLAUSE_VECTOR_LENGTH, "vector_length"); + + c = build_omp_clause (vector_length_loc, OMP_CLAUSE_VECTOR_LENGTH); + OMP_CLAUSE_VECTOR_LENGTH_EXPR (c) = t; + OMP_CLAUSE_CHAIN (c) = list; + list = c; + } + + return list; +} + /* OpenMP 4.0: inbranch notinbranch */ @@ -11079,6 +11220,14 @@ c_parser_oacc_all_clauses (c_parser *parser, omp_clause_mask mask, clauses = c_parser_oacc_data_clause_deviceptr (parser, clauses); c_name = "deviceptr"; break; + case PRAGMA_OMP_CLAUSE_NUM_GANGS: + clauses = c_parser_omp_clause_num_gangs (parser, clauses); + c_name = "num_gangs"; + break; + case PRAGMA_OMP_CLAUSE_NUM_WORKERS: + clauses = c_parser_omp_clause_num_workers (parser, clauses); + c_name = "num_workers"; + break; case PRAGMA_OMP_CLAUSE_PRESENT: clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); c_name = "present"; @@ -11099,6 +11248,10 @@ c_parser_oacc_all_clauses (c_parser *parser, omp_clause_mask mask, clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); c_name = "present_or_create"; break; + case PRAGMA_OMP_CLAUSE_VECTOR_LENGTH: + clauses = c_parser_omp_clause_vector_length (parser, clauses); + c_name = "vector_length"; + break; default: c_parser_error (parser, "expected clause"); goto saw_error; @@ -11452,11 +11605,14 @@ c_parser_oacc_kernels (location_t loc, c_parser *parser) | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYOUT) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_CREATE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICEPTR) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_GANGS) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_WORKERS) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT) \ - | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE) ) + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_VECTOR_LENGTH) ) static tree c_parser_oacc_parallel (location_t loc, c_parser *parser) diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c index 729ea49..da8f344 100644 --- gcc/c/c-typeck.c +++ gcc/c/c-typeck.c @@ -12187,6 +12187,9 @@ c_finish_omp_clauses (tree clauses) case OMP_CLAUSE_SECTIONS: case OMP_CLAUSE_TASKGROUP: case OMP_CLAUSE_PROC_BIND: + case OMP_CLAUSE_NUM_GANGS: + case OMP_CLAUSE_NUM_WORKERS: + case OMP_CLAUSE_VECTOR_LENGTH: pc = &OMP_CLAUSE_CHAIN (c); continue; diff --git gcc/fortran/ChangeLog.gomp gcc/fortran/ChangeLog.gomp index e1ab335..1ee6a7c 100644 --- gcc/fortran/ChangeLog.gomp +++ gcc/fortran/ChangeLog.gomp @@ -1,3 +1,9 @@ +2014-03-18 Thomas Schwinge <tho...@codesourcery.com> + + * f95-lang.c (DEF_FUNCTION_TYPE_10): Define. + * types.def + (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type. + 2014-03-13 Ilmir Usmanov <i.usma...@samsung.com> OpenACC 1.0 support. @@ -171,7 +177,7 @@ * f95-lang.c (ATTR_NULL): Define. -Copyright (C) 2013 Free Software Foundation, Inc. +Copyright (C) 2013-2014 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright diff --git gcc/fortran/f95-lang.c gcc/fortran/f95-lang.c index 727059b..2888df7 100644 --- gcc/fortran/f95-lang.c +++ gcc/fortran/f95-lang.c @@ -620,6 +620,7 @@ gfc_init_builtin_functions (void) #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, ARG10) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_POINTER_TYPE(NAME, TYPE) NAME, #include "types.def" @@ -633,6 +634,7 @@ gfc_init_builtin_functions (void) #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_POINTER_TYPE BT_LAST @@ -1008,6 +1010,21 @@ gfc_init_builtin_functions (void) builtin_types[(int) ARG7], \ builtin_types[(int) ARG8], \ NULL_TREE); +#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10) \ + builtin_types[(int) ENUM] \ + = build_function_type_list (builtin_types[(int) RETURN], \ + builtin_types[(int) ARG1], \ + builtin_types[(int) ARG2], \ + builtin_types[(int) ARG3], \ + builtin_types[(int) ARG4], \ + builtin_types[(int) ARG5], \ + builtin_types[(int) ARG6], \ + builtin_types[(int) ARG7], \ + builtin_types[(int) ARG8], \ + builtin_types[(int) ARG9], \ + builtin_types[(int) ARG10], \ + NULL_TREE); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ builtin_types[(int) ENUM] \ = build_varargs_function_type_list (builtin_types[(int) RETURN], \ @@ -1023,6 +1040,7 @@ gfc_init_builtin_functions (void) #undef DEF_FUNCTION_TYPE_4 #undef DEF_FUNCTION_TYPE_5 #undef DEF_FUNCTION_TYPE_6 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_POINTER_TYPE builtin_types[(int) BT_LAST] = NULL_TREE; diff --git gcc/fortran/types.def gcc/fortran/types.def index 78fc679..cba1f7e 100644 --- gcc/fortran/types.def +++ gcc/fortran/types.def @@ -214,4 +214,8 @@ DEF_FUNCTION_TYPE_8 (BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR, BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG, BT_BOOL, BT_UINT, BT_PTR) +DEF_FUNCTION_TYPE_10 (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT, + BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_PTR, BT_SIZE, + BT_PTR, BT_PTR, BT_PTR, BT_INT, BT_INT, BT_INT) + DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID) diff --git gcc/gimplify.c gcc/gimplify.c index f3c34f9..8f6da3f 100644 --- gcc/gimplify.c +++ gcc/gimplify.c @@ -6176,6 +6176,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, case OMP_CLAUSE_THREAD_LIMIT: case OMP_CLAUSE_DIST_SCHEDULE: case OMP_CLAUSE_DEVICE: + case OMP_CLAUSE_NUM_GANGS: + case OMP_CLAUSE_NUM_WORKERS: + case OMP_CLAUSE_VECTOR_LENGTH: if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL, is_gimple_val, fb_rvalue) == GS_ERROR) remove = true; @@ -6192,9 +6195,6 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_WORKER: case OMP_CLAUSE_VECTOR: - case OMP_CLAUSE_NUM_GANGS: - case OMP_CLAUSE_NUM_WORKERS: - case OMP_CLAUSE_VECTOR_LENGTH: remove = true; break; @@ -6539,6 +6539,9 @@ gimplify_adjust_omp_clauses (tree *list_p) case OMP_CLAUSE_PROC_BIND: case OMP_CLAUSE_SAFELEN: case OMP_CLAUSE_DEPEND: + case OMP_CLAUSE_NUM_GANGS: + case OMP_CLAUSE_NUM_WORKERS: + case OMP_CLAUSE_VECTOR_LENGTH: break; case OMP_CLAUSE_HOST: @@ -6552,9 +6555,6 @@ gimplify_adjust_omp_clauses (tree *list_p) case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_WORKER: case OMP_CLAUSE_VECTOR: - case OMP_CLAUSE_NUM_GANGS: - case OMP_CLAUSE_NUM_WORKERS: - case OMP_CLAUSE_VECTOR_LENGTH: default: gcc_unreachable (); } diff --git gcc/lto/ChangeLog.gomp gcc/lto/ChangeLog.gomp index 96cf420..b82833e 100644 --- gcc/lto/ChangeLog.gomp +++ gcc/lto/ChangeLog.gomp @@ -1,8 +1,12 @@ +2014-03-18 Thomas Schwinge <tho...@codesourcery.com> + + * c-common.c (DEF_FUNCTION_TYPE_10): Define. + 2013-04-10 Jakub Jelinek <ja...@redhat.com> * lto-lang.c (DEF_FUNCTION_TYPE_8): Define. -Copyright (C) 2013 Free Software Foundation, Inc. +Copyright (C) 2013-2014 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright diff --git gcc/lto/lto-lang.c gcc/lto/lto-lang.c index 28eac6f..b7a7d05 100644 --- gcc/lto/lto-lang.c +++ gcc/lto/lto-lang.c @@ -149,6 +149,7 @@ enum lto_builtin_type #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) NAME, +#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, ARG10) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, @@ -168,6 +169,7 @@ enum lto_builtin_type #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 #undef DEF_FUNCTION_TYPE_8 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 @@ -645,6 +647,10 @@ lto_define_builtins (tree va_list_ref_type_node ATTRIBUTE_UNUSED, ARG6, ARG7, ARG8) \ def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ ARG7, ARG8); +#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8, ARG9, ARG10) \ + def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8, ARG9, ARG10); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ def_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -669,6 +675,7 @@ lto_define_builtins (tree va_list_ref_type_node ATTRIBUTE_UNUSED, #undef DEF_FUNCTION_TYPE_4 #undef DEF_FUNCTION_TYPE_5 #undef DEF_FUNCTION_TYPE_6 +#undef DEF_FUNCTION_TYPE_10 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 diff --git gcc/oacc-builtins.def gcc/oacc-builtins.def index 2d5c22c..3935da4 100644 --- gcc/oacc-builtins.def +++ gcc/oacc-builtins.def @@ -32,6 +32,8 @@ DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DATA_START, "GOACC_data_start", DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DATA_END, "GOACC_data_end", BT_FN_VOID, ATTR_NOTHROW_LIST) DEF_GOACC_BUILTIN (BUILT_IN_GOACC_KERNELS, "GOACC_kernels", - BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST) + BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT, + ATTR_NOTHROW_LIST) DEF_GOACC_BUILTIN (BUILT_IN_GOACC_PARALLEL, "GOACC_parallel", - BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST) + BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT, + ATTR_NOTHROW_LIST) diff --git gcc/omp-low.c gcc/omp-low.c index aa2dd32..f1b0fa5 100644 --- gcc/omp-low.c +++ gcc/omp-low.c @@ -1622,6 +1622,9 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) case OMP_CLAUSE_DIST_SCHEDULE: case OMP_CLAUSE_DEPEND: gcc_assert (!is_gimple_omp_oacc_specifically (ctx->stmt)); + case OMP_CLAUSE_NUM_GANGS: + case OMP_CLAUSE_NUM_WORKERS: + case OMP_CLAUSE_VECTOR_LENGTH: if (ctx->outer) scan_omp_op (&OMP_CLAUSE_OPERAND (c, 0), ctx->outer); break; @@ -1759,9 +1762,6 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_WORKER: case OMP_CLAUSE_VECTOR: - case OMP_CLAUSE_NUM_GANGS: - case OMP_CLAUSE_NUM_WORKERS: - case OMP_CLAUSE_VECTOR_LENGTH: sorry ("Clause not supported yet"); break; @@ -1886,6 +1886,9 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) case OMP_CLAUSE_TO: case OMP_CLAUSE_FROM: gcc_assert (!is_gimple_omp_oacc_specifically (ctx->stmt)); + case OMP_CLAUSE_NUM_GANGS: + case OMP_CLAUSE_NUM_WORKERS: + case OMP_CLAUSE_VECTOR_LENGTH: break; case OMP_CLAUSE_HOST: @@ -1899,9 +1902,6 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_WORKER: case OMP_CLAUSE_VECTOR: - case OMP_CLAUSE_NUM_GANGS: - case OMP_CLAUSE_NUM_WORKERS: - case OMP_CLAUSE_VECTOR_LENGTH: sorry ("Clause not supported yet"); break; @@ -5039,7 +5039,9 @@ expand_oacc_offload (struct omp_region *region) } /* Emit a library call to launch CHILD_FN. */ - tree t1, t2, t3, t4, device, c, clauses; + tree t1, t2, t3, t4, + t_num_gangs, t_num_workers, t_vector_length, + device, c, clauses; enum built_in_function start_ix; location_t clause_loc; tree (*gimple_omp_clauses) (const_gimple); @@ -5059,6 +5061,36 @@ expand_oacc_offload (struct omp_region *region) clauses = gimple_omp_clauses (entry_stmt); + /* Default values for NUM_GANGS, NUM_WORKERS, and VECTOR_LENGTH. */ + t_num_gangs = t_num_workers = t_vector_length + = fold_convert_loc (gimple_location (entry_stmt), + integer_type_node, integer_one_node); + switch (region->type) + { + case GIMPLE_OACC_PARALLEL: + /* ..., but if present, use the values specified by the respective + clauses, making sure these are of the correct type. */ + c = find_omp_clause (clauses, OMP_CLAUSE_NUM_GANGS); + if (c) + t_num_gangs = fold_convert_loc (OMP_CLAUSE_LOCATION (c), + integer_type_node, + OMP_CLAUSE_NUM_GANGS_EXPR (c)); + c = find_omp_clause (clauses, OMP_CLAUSE_NUM_WORKERS); + if (c) + t_num_workers = fold_convert_loc (OMP_CLAUSE_LOCATION (c), + integer_type_node, + OMP_CLAUSE_NUM_WORKERS_EXPR (c)); + c = find_omp_clause (clauses, OMP_CLAUSE_VECTOR_LENGTH); + if (c) + t_vector_length = fold_convert_loc (OMP_CLAUSE_LOCATION (c), + integer_type_node, + OMP_CLAUSE_VECTOR_LENGTH_EXPR (c)); + break; + + default: + break; + } + /* By default, the value of DEVICE is -1 (let runtime library choose). */ device = build_int_cst (integer_type_node, -1); @@ -5100,7 +5132,8 @@ expand_oacc_offload (struct omp_region *region) tree openmp_target = build_zero_cst (ptr_type_node); tree fnaddr = build_fold_addr_expr (child_fn); g = gimple_build_call (builtin_decl_explicit (start_ix), - 7, device, fnaddr, openmp_target, t1, t2, t3, t4); + 10, device, fnaddr, openmp_target, t1, t2, t3, t4, + t_num_gangs, t_num_workers, t_vector_length); gimple_set_location (g, gimple_location (entry_stmt)); gsi_insert_before (&gsi, g, GSI_SAME_STMT); } diff --git libgomp/ChangeLog.gomp libgomp/ChangeLog.gomp index 7f9ce11..187c0701 100644 --- libgomp/ChangeLog.gomp +++ libgomp/ChangeLog.gomp @@ -1,3 +1,11 @@ +2014-03-18 Thomas Schwinge <tho...@codesourcery.com> + + * libgomp_g.h (GOACC_kernels, GOACC_parallel): Add three + additional int arguments. + * oacc-parallel.c (GOACC_kernels, GOACC_parallel): Handle these. + * testsuite/libgomp.oacc-c/goacc_kernels.c: Adjust. + * testsuite/libgomp.oacc-c/goacc_parallel.c: Likewise. + 2014-02-28 Thomas Schwinge <tho...@codesourcery.com> * testsuite/libgomp.oacc-c/goacc_kernels.c: New file. diff --git libgomp/libgomp_g.h libgomp/libgomp_g.h index 9681566..9dca76a9 100644 --- libgomp/libgomp_g.h +++ libgomp/libgomp_g.h @@ -220,8 +220,10 @@ extern void GOACC_data_start (int, const void *, size_t, void **, size_t *, unsigned short *); extern void GOACC_data_end (void); extern void GOACC_kernels (int, void (*) (void *), const void *, - size_t, void **, size_t *, unsigned short *); + size_t, void **, size_t *, unsigned short *, + int, int, int); extern void GOACC_parallel (int, void (*) (void *), const void *, - size_t, void **, size_t *, unsigned short *); + size_t, void **, size_t *, unsigned short *, + int, int, int); #endif /* LIBGOMP_G_H */ diff --git libgomp/oacc-parallel.c libgomp/oacc-parallel.c index cb883a8..b1fd898 100644 --- libgomp/oacc-parallel.c +++ libgomp/oacc-parallel.c @@ -31,7 +31,8 @@ void GOACC_parallel (int device, void (*fn) (void *), const void *openmp_target, size_t mapnum, void **hostaddrs, size_t *sizes, - unsigned short *kinds) + unsigned short *kinds, + int num_gangs, int num_workers, int vector_length) { unsigned char kinds_[mapnum]; size_t i; @@ -49,6 +50,16 @@ GOACC_parallel (int device, void (*fn) (void *), const void *openmp_target, kinds_[i] = kind | align << 3; } + if (num_gangs != 1) + gomp_fatal ("num_gangs (%d) different from one is not yet supported", + num_gangs); + if (num_workers != 1) + gomp_fatal ("num_workers (%d) different from one is not yet supported", + num_workers); + if (vector_length != 1) + gomp_fatal ("vector_length (%d) different from one is not yet supported", + vector_length); + GOMP_target (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds_); } @@ -86,8 +97,10 @@ GOACC_data_end (void) void GOACC_kernels (int device, void (*fn) (void *), const void *openmp_target, size_t mapnum, void **hostaddrs, size_t *sizes, - unsigned short *kinds) + unsigned short *kinds, + int num_gangs, int num_workers, int vector_length) { /* TODO. */ - GOACC_parallel (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds); + GOACC_parallel (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds, + num_gangs, num_workers, vector_length); } diff --git libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c index db1a37d..b41e558 100644 --- libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c +++ libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c @@ -17,7 +17,9 @@ f (void *data) int main(void) { i = -1; - GOACC_kernels (0, f, (const void *) 0, 0, (void *) 0, (void *) 0, (void *) 0); + GOACC_kernels (0, f, (const void *) 0, + 0, (void *) 0, (void *) 0, (void *) 0, + 1, 1, 1); if (i != 42) abort (); diff --git libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c index b9bdffa..4ab1e9b 100644 --- libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c +++ libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c @@ -17,7 +17,9 @@ f (void *data) int main(void) { i = -1; - GOACC_parallel (0, f, (const void *) 0, 0, (void *) 0, (void *) 0, (void *) 0); + GOACC_parallel (0, f, (const void *) 0, + 0, (void *) 0, (void *) 0, (void *) 0, + 1, 1, 1); if (i != 42) abort (); Grüße, Thomas
pgptQJm3LOHVi.pgp
Description: PGP signature