OpenACC 2.5 kernels construct: num_gangs, num_workers, vector_length clauses
authorThomas Schwinge <thomas@codesourcery.com>
Tue, 23 May 2017 15:47:32 +0000 (17:47 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Tue, 23 May 2017 15:47:32 +0000 (17:47 +0200)
gcc/c/
* c-parser.c (OACC_KERNELS_CLAUSE_MASK): Add
"PRAGMA_OACC_CLAUSE_NUM_GANGS", "PRAGMA_OACC_CLAUSE_NUM_WORKERS",
"VECTOR_LENGTH".
gcc/cp/
* parser.c (OACC_KERNELS_CLAUSE_MASK): Add
"PRAGMA_OACC_CLAUSE_NUM_GANGS", "PRAGMA_OACC_CLAUSE_NUM_WORKERS",
"VECTOR_LENGTH".
gcc/fortran/
* openmp.c (OACC_KERNELS_CLAUSES): Add "OMP_CLAUSE_NUM_GANGS",
"OMP_CLAUSE_NUM_WORKERS", "OMP_CLAUSE_VECTOR_LENGTH".
gcc/
* omp-offload.c (execute_oacc_device_lower): Remove the
parallelism dimensions function attributes for unparallelized
OpenACC kernels constructs.
gcc/testsuite/
* c-c++-common/goacc/parallel-dims-1.c: Update.
* c-c++-common/goacc/parallel-dims-2.c: Likewise.
* c-c++-common/goacc/routine-1.c: Likewise.
* c-c++-common/goacc/uninit-dim-clause.c: Likewise.
* g++.dg/goacc/template.C: Likewise.
* gfortran.dg/goacc/kernels-tree.f95: Likewise.
* gfortran.dg/goacc/routine-3.f90: Likewise.
* gfortran.dg/goacc/sie.f95: Likewise.
* gfortran.dg/goacc/uninit-dim-clause.f95: Likewise.
libgomp/
* testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c: Update.
* testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Likewise.
* testsuite/libgomp.oacc-fortran/kernels-loop-2.f95: Likewise.

From-SVN: r248370

22 files changed:
gcc/ChangeLog
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/fortran/ChangeLog
gcc/fortran/openmp.c
gcc/omp-offload.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/parallel-dims-1.c
gcc/testsuite/c-c++-common/goacc/parallel-dims-2.c
gcc/testsuite/c-c++-common/goacc/routine-1.c
gcc/testsuite/c-c++-common/goacc/uninit-dim-clause.c
gcc/testsuite/g++.dg/goacc/template.C
gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95
gcc/testsuite/gfortran.dg/goacc/routine-3.f90
gcc/testsuite/gfortran.dg/goacc/sie.f95
gcc/testsuite/gfortran.dg/goacc/uninit-dim-clause.f95
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c
libgomp/testsuite/libgomp.oacc-c-c++-common/parallel-dims.c
libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95

index d2e846e1a79795c8e0c733ed4fe819c63ea2fcc4..b38a31d66c5f5de92e1160b18238f87ea894aed7 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-23  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * omp-offload.c (execute_oacc_device_lower): Remove the
+       parallelism dimensions function attributes for unparallelized
+       OpenACC kernels constructs.
+
 2017-05-23  Martin Liska  <mliska@suse.cz>
 
        * cgraph.c (cgraph_node::get_create): Use symtab_node::dump_{asm_,}name
index d768d93564c145529354cf3b105346999de288e2..cb04d4acb5a9a51bad97f42a74f36ad035d5fabf 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-23  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-parser.c (OACC_KERNELS_CLAUSE_MASK): Add
+       "PRAGMA_OACC_CLAUSE_NUM_GANGS", "PRAGMA_OACC_CLAUSE_NUM_WORKERS",
+       "VECTOR_LENGTH".
+
 2017-05-23  Marek Polacek  <polacek@redhat.com>
 
        * c-parser.c (c_parser_compound_statement_nostart): Remove redundant
index f3bcbeed9915f80978a39e14fd699ea0332a3a1c..03c711bd52852300a7cd75232ba556ca451281a8 100644 (file)
@@ -13984,11 +13984,14 @@ c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name,
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEFAULT)             \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR)           \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)                  \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_GANGS)           \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_WORKERS)         \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT)             \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY)     \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)   \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT)  \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE)   \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR_LENGTH)       \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
 
 #define OACC_PARALLEL_CLAUSE_MASK                                      \
index aaf39c25cbe968466ae11ffe8d77fce3adcb04f2..bfe718fae78a751eab05f52a90f35c4964223cd4 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-23  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * parser.c (OACC_KERNELS_CLAUSE_MASK): Add
+       "PRAGMA_OACC_CLAUSE_NUM_GANGS", "PRAGMA_OACC_CLAUSE_NUM_WORKERS",
+       "VECTOR_LENGTH".
+
 2017-05-23  Nathan Sidwell  <nathan@acm.org>
 
        * cp-tree.h (OVL_P): New.
index 23d979cc2f63daf3ff4f880e22187bb7dc222817..b39e624734b0ccb57cfcdedfa775f5090c41c2c9 100644 (file)
@@ -36432,11 +36432,14 @@ cp_parser_oacc_loop (cp_parser *parser, cp_token *pragma_tok, char *p_name,
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEFAULT)             \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR)           \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)                  \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_GANGS)           \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_WORKERS)         \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT)             \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY)     \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)   \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT)  \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE)   \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR_LENGTH)       \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
 
 #define OACC_PARALLEL_CLAUSE_MASK                                      \
index 6977bd1372a96d3b650b017445cc54deb17425fa..b3179e073c77dc471bc927b62be3544890cfba0b 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-23  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * openmp.c (OACC_KERNELS_CLAUSES): Add "OMP_CLAUSE_NUM_GANGS",
+       "OMP_CLAUSE_NUM_WORKERS", "OMP_CLAUSE_VECTOR_LENGTH".
+
 2017-05-22  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/80766
index 80146e2f1dc96177c9ec2468e6652545ed55570e..5a2b774079be0a90627f8e59cd561a426d7c2a8b 100644 (file)
@@ -1932,7 +1932,8 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
    | OMP_CLAUSE_PRESENT_OR_CREATE | OMP_CLAUSE_DEVICEPTR | OMP_CLAUSE_PRIVATE \
    | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_DEFAULT | OMP_CLAUSE_WAIT)
 #define OACC_KERNELS_CLAUSES \
-  (omp_mask (OMP_CLAUSE_IF) | OMP_CLAUSE_ASYNC | OMP_CLAUSE_DEVICEPTR        \
+  (omp_mask (OMP_CLAUSE_IF) | OMP_CLAUSE_ASYNC | OMP_CLAUSE_NUM_GANGS        \
+   | OMP_CLAUSE_NUM_WORKERS | OMP_CLAUSE_VECTOR_LENGTH | OMP_CLAUSE_DEVICEPTR \
    | OMP_CLAUSE_COPY | OMP_CLAUSE_COPYIN | OMP_CLAUSE_COPYOUT                \
    | OMP_CLAUSE_CREATE | OMP_CLAUSE_PRESENT | OMP_CLAUSE_PRESENT_OR_COPY      \
    | OMP_CLAUSE_PRESENT_OR_COPYIN | OMP_CLAUSE_PRESENT_OR_COPYOUT            \
index f02b4f8905e3e9b057f32e8665458ad9b7fdf6eb..54a4e90f70ca2853181699a75aa0a34e6246d994 100644 (file)
@@ -1451,6 +1451,15 @@ execute_oacc_device_lower ()
     = (lookup_attribute ("oacc kernels parallelized",
                         DECL_ATTRIBUTES (current_function_decl)) != NULL);
 
+  /* Unparallelized OpenACC kernels constructs must get launched as 1 x 1 x 1
+     kernels, so remove the parallelism dimensions function attributes
+     potentially set earlier on.  */
+  if (is_oacc_kernels && !is_oacc_kernels_parallelized)
+    {
+      oacc_set_fn_attrib (current_function_decl, NULL, NULL);
+      attrs = oacc_get_fn_attrib (current_function_decl);
+    }
+
   /* Discover, partition and process the loops.  */
   oacc_loop *loops = oacc_loop_discovery ();
   int fn_level = oacc_fn_attrib_level (attrs);
index 7b42abc6378ff307010a3d2f406752728f102fb1..cef3ba62ddb07a8eb43aa60c5bbffd6f618a123b 100644 (file)
@@ -1,3 +1,15 @@
+2017-05-23  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-c++-common/goacc/parallel-dims-1.c: Update.
+       * c-c++-common/goacc/parallel-dims-2.c: Likewise.
+       * c-c++-common/goacc/routine-1.c: Likewise.
+       * c-c++-common/goacc/uninit-dim-clause.c: Likewise.
+       * g++.dg/goacc/template.C: Likewise.
+       * gfortran.dg/goacc/kernels-tree.f95: Likewise.
+       * gfortran.dg/goacc/routine-3.f90: Likewise.
+       * gfortran.dg/goacc/sie.f95: Likewise.
+       * gfortran.dg/goacc/uninit-dim-clause.f95: Likewise.
+
 2017-05-23  Nathan Sidwell  <nathan@acm.org>
 
        * g++.dg/lookup/using13.C: Adjust expected error.
index a85d3d3a0d444b055782b3c51b1b956c634ad88c..57f682f7a0de16150b4edec660d934d488b02a41 100644 (file)
@@ -3,6 +3,9 @@
 
 void f(int i)
 {
+#pragma acc kernels num_gangs(i) num_workers(i) vector_length(i)
+  ;
+
 #pragma acc parallel num_gangs(i) num_workers(i) vector_length(i)
   ;
 }
index 30a3d1770ace4837ce56cb6cba622c7d966c6364..acfbe7ff031a9fafbda278003d0172b02cb72fee 100644 (file)
@@ -1,18 +1,15 @@
 /* Invalid use of OpenACC parallelism dimensions clauses: num_gangs,
    num_workers, vector_length.  */
 
-void acc_kernels(int i)
+void f(int i, float f)
 {
-#pragma acc kernels num_gangs(i) /* { dg-error "'num_gangs' is not valid for '#pragma acc kernels'" } */
+#pragma acc kernels num_gangs /* { dg-error "expected '\\(' before end of line" } */
   ;
-#pragma acc kernels num_workers(i) /* { dg-error "'num_workers' is not valid for '#pragma acc kernels'" } */
+#pragma acc kernels num_workers /* { dg-error "expected '\\(' before end of line" } */
   ;
-#pragma acc kernels vector_length(i) /* { dg-error "'vector_length' is not valid for '#pragma acc kernels'" } */
+#pragma acc kernels vector_length /* { dg-error "expected '\\(' before end of line" } */
   ;
-}
 
-void acc_parallel(int i, float f)
-{
 #pragma acc parallel num_gangs /* { dg-error "expected '\\(' before end of line" } */
   ;
 #pragma acc parallel num_workers /* { dg-error "expected '\\(' before end of line" } */
@@ -20,6 +17,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length /* { dg-error "expected '\\(' before end of line" } */
   ;
 
+
+#pragma acc kernels num_gangs( /* { dg-error "expected (primary-|)expression before end of line" } */
+  ;
+#pragma acc kernels num_workers( /* { dg-error "expected (primary-|)expression before end of line" } */
+  ;
+#pragma acc kernels vector_length( /* { dg-error "expected (primary-|)expression before end of line" } */
+  ;
+
 #pragma acc parallel num_gangs( /* { dg-error "expected (primary-|)expression before end of line" } */
   ;
 #pragma acc parallel num_workers( /* { dg-error "expected (primary-|)expression before end of line" } */
@@ -27,6 +32,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length( /* { dg-error "expected (primary-|)expression before end of line" } */
   ;
 
+
+#pragma acc kernels num_gangs() /* { dg-error "expected (primary-|)expression before '\\)' token" } */
+  ;
+#pragma acc kernels num_workers() /* { dg-error "expected (primary-|)expression before '\\)' token" } */
+  ;
+#pragma acc kernels vector_length() /* { dg-error "expected (primary-|)expression before '\\)' token" } */
+  ;
+
 #pragma acc parallel num_gangs() /* { dg-error "expected (primary-|)expression before '\\)' token" } */
   ;
 #pragma acc parallel num_workers() /* { dg-error "expected (primary-|)expression before '\\)' token" } */
@@ -34,6 +47,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length() /* { dg-error "expected (primary-|)expression before '\\)' token" } */
   ;
 
+
+#pragma acc kernels num_gangs(1 /* { dg-error "expected '\\)' before end of line" } */
+  ;
+#pragma acc kernels num_workers(1 /* { dg-error "expected '\\)' before end of line" } */
+  ;
+#pragma acc kernels vector_length(1 /* { dg-error "expected '\\)' before end of line" } */
+  ;
+
 #pragma acc parallel num_gangs(1 /* { dg-error "expected '\\)' before end of line" } */
   ;
 #pragma acc parallel num_workers(1 /* { dg-error "expected '\\)' before end of line" } */
@@ -41,6 +62,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(1 /* { dg-error "expected '\\)' before end of line" } */
   ;
 
+
+#pragma acc kernels num_gangs(i /* { dg-error "expected '\\)' before end of line" } */
+  ;
+#pragma acc kernels num_workers(i /* { dg-error "expected '\\)' before end of line" } */
+  ;
+#pragma acc kernels vector_length(i /* { dg-error "expected '\\)' before end of line" } */
+  ;
+
 #pragma acc parallel num_gangs(i /* { dg-error "expected '\\)' before end of line" } */
   ;
 #pragma acc parallel num_workers(i /* { dg-error "expected '\\)' before end of line" } */
@@ -48,6 +77,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(i /* { dg-error "expected '\\)' before end of line" } */
   ;
 
+
+#pragma acc kernels num_gangs(1 i /* { dg-error "expected '\\)' before 'i'" } */
+  ;
+#pragma acc kernels num_workers(1 i /* { dg-error "expected '\\)' before 'i'" } */
+  ;
+#pragma acc kernels vector_length(1 i /* { dg-error "expected '\\)' before 'i'" } */
+  ;
+
 #pragma acc parallel num_gangs(1 i /* { dg-error "expected '\\)' before 'i'" } */
   ;
 #pragma acc parallel num_workers(1 i /* { dg-error "expected '\\)' before 'i'" } */
@@ -55,6 +92,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(1 i /* { dg-error "expected '\\)' before 'i'" } */
   ;
 
+
+#pragma acc kernels num_gangs(1 i) /* { dg-error "expected '\\)' before 'i'" } */
+  ;
+#pragma acc kernels num_workers(1 i) /* { dg-error "expected '\\)' before 'i'" } */
+  ;
+#pragma acc kernels vector_length(1 i) /* { dg-error "expected '\\)' before 'i'" } */
+  ;
+
 #pragma acc parallel num_gangs(1 i) /* { dg-error "expected '\\)' before 'i'" } */
   ;
 #pragma acc parallel num_workers(1 i) /* { dg-error "expected '\\)' before 'i'" } */
@@ -62,6 +107,17 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(1 i) /* { dg-error "expected '\\)' before 'i'" } */
   ;
 
+
+#pragma acc kernels num_gangs(1, i /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
+  /* { dg-bogus "expected '\\)' before end of line" "TODO" { xfail c } .-1 } */
+  ;
+#pragma acc kernels num_workers(1, i /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
+  /* { dg-bogus "expected '\\)' before end of line" "TODO" { xfail c } .-1 } */
+  ;
+#pragma acc kernels vector_length(1, i /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
+  /* { dg-bogus "expected '\\)' before end of line" "TODO" { xfail c } .-1 } */
+  ;
+
 #pragma acc parallel num_gangs(1, i /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
   /* { dg-bogus "expected '\\)' before end of line" "TODO" { xfail c } .-1 } */
   ;
@@ -72,6 +128,14 @@ void acc_parallel(int i, float f)
   /* { dg-bogus "expected '\\)' before end of line" "TODO" { xfail c } .-1 } */
   ;
 
+
+#pragma acc kernels num_gangs(1, i) /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
+  ;
+#pragma acc kernels num_workers(1, i) /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
+  ;
+#pragma acc kernels vector_length(1, i) /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
+  ;
+
 #pragma acc parallel num_gangs(1, i) /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
   ;
 #pragma acc parallel num_workers(1, i) /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
@@ -79,11 +143,27 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(1, i) /* { dg-error "expected '\\)' before ',' token" "TODO" { xfail c } } */
   ;
 
-#pragma acc parallel num_gangs(num_gangs) /* { dg-error "'num_gangs' (un|was not )declared" } */
+
+#pragma acc kernels num_gangs(num_gangs_k) /* { dg-error "'num_gangs_k' (un|was not )declared" } */
+  ;
+#pragma acc kernels num_workers(num_workers_k) /* { dg-error "'num_workers_k' (un|was not )declared" } */
+  ;
+#pragma acc kernels vector_length(vector_length_k) /* { dg-error "'vector_length_k' (un|was not )declared" } */
+  ;
+
+#pragma acc parallel num_gangs(num_gangs_p) /* { dg-error "'num_gangs_p' (un|was not )declared" } */
+  ;
+#pragma acc parallel num_workers(num_workers_p) /* { dg-error "'num_workers_p' (un|was not )declared" } */
+  ;
+#pragma acc parallel vector_length(vector_length_p) /* { dg-error "'vector_length_p' (un|was not )declared" } */
+  ;
+
+
+#pragma acc kernels num_gangs(f) /* { dg-error "'num_gangs' expression must be integral" } */
   ;
-#pragma acc parallel num_workers(num_workers) /* { dg-error "'num_workers' (un|was not )declared" } */
+#pragma acc kernels num_workers(f) /* { dg-error "'num_workers' expression must be integral" } */
   ;
-#pragma acc parallel vector_length(vector_length) /* { dg-error "'vector_length' (un|was not )declared" } */
+#pragma acc kernels vector_length(f) /* { dg-error "'vector_length' expression must be integral" } */
   ;
 
 #pragma acc parallel num_gangs(f) /* { dg-error "'num_gangs' expression must be integral" } */
@@ -93,6 +173,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(f) /* { dg-error "'vector_length' expression must be integral" } */
   ;
 
+
+#pragma acc kernels num_gangs((float) 1) /* { dg-error "'num_gangs' expression must be integral" } */
+  ;
+#pragma acc kernels num_workers((float) 1) /* { dg-error "'num_workers' expression must be integral" } */
+  ;
+#pragma acc kernels vector_length((float) 1) /* { dg-error "'vector_length' expression must be integral" } */
+  ;
+
 #pragma acc parallel num_gangs((float) 1) /* { dg-error "'num_gangs' expression must be integral" } */
   ;
 #pragma acc parallel num_workers((float) 1) /* { dg-error "'num_workers' expression must be integral" } */
@@ -100,6 +188,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length((float) 1) /* { dg-error "'vector_length' expression must be integral" } */
   ;
 
+
+#pragma acc kernels num_gangs(0) /* { dg-warning "'num_gangs' value must be positive" } */
+  ;
+#pragma acc kernels num_workers(0) /* { dg-warning "'num_workers' value must be positive" } */
+  ;
+#pragma acc kernels vector_length(0) /* { dg-warning "'vector_length' value must be positive" } */
+  ;
+
 #pragma acc parallel num_gangs(0) /* { dg-warning "'num_gangs' value must be positive" } */
   ;
 #pragma acc parallel num_workers(0) /* { dg-warning "'num_workers' value must be positive" } */
@@ -107,6 +203,14 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length(0) /* { dg-warning "'vector_length' value must be positive" } */
   ;
 
+
+#pragma acc kernels num_gangs((int) -1.2) /* { dg-warning "'num_gangs' value must be positive" } */
+  ;
+#pragma acc kernels num_workers((int) -1.2) /* { dg-warning "'num_workers' value must be positive" } */
+  ;
+#pragma acc kernels vector_length((int) -1.2) /* { dg-warning "'vector_length' value must be positive" } */
+  ;
+
 #pragma acc parallel num_gangs((int) -1.2) /* { dg-warning "'num_gangs' value must be positive" } */
   ;
 #pragma acc parallel num_workers((int) -1.2) /* { dg-warning "'num_workers' value must be positive" } */
@@ -114,7 +218,8 @@ void acc_parallel(int i, float f)
 #pragma acc parallel vector_length((int) -1.2) /* { dg-warning "'vector_length' value must be positive" } */
   ;
 
-#pragma acc parallel \
+
+#pragma acc kernels \
   num_gangs(1) /* { dg-error "too many 'num_gangs' clauses" "" { target c } } */ \
   num_workers(1) /* { dg-error "too many 'num_workers' clauses" "" { target c } } */ \
   vector_length(1) /* { dg-error "too many 'vector_length' clauses" "" { target c } } */ \
@@ -123,12 +228,31 @@ void acc_parallel(int i, float f)
   num_gangs(1) /* { dg-error "too many 'num_gangs' clauses" "" { target c++ } } */
   ;
 
-#pragma acc parallel \
+#pragma acc parallel                                                   \
+  num_gangs(1) /* { dg-error "too many 'num_gangs' clauses" "" { target c } } */ \
+  num_workers(1) /* { dg-error "too many 'num_workers' clauses" "" { target c } } */ \
+  vector_length(1) /* { dg-error "too many 'vector_length' clauses" "" { target c } } */ \
+  num_workers(1) /* { dg-error "too many 'num_workers' clauses" "" { target c++ } } */ \
+  vector_length(1) /* { dg-error "too many 'vector_length' clauses" "" { target c++ } } */ \
+  num_gangs(1) /* { dg-error "too many 'num_gangs' clauses" "" { target c++ } } */
+  ;
+
+
+#pragma acc kernels \
+  num_gangs(-1) /* { dg-warning "'num_gangs' value must be positive" } */ \
+  num_workers() /* { dg-error "expected (primary-|)expression before '\\)' token" } */ \
+  vector_length(abc_k) /* { dg-error "'abc_k' (un|was not )declared" } */ \
+  num_workers(0.5) /* { dg-error "'num_workers' expression must be integral" } */ \
+  vector_length(&f) /* { dg-error "'vector_length' expression must be integral" } */ \
+  num_gangs( /* { dg-error "expected (primary-|)expression before end of line" "TODO" { xfail c } } */
+  ;
+
+#pragma acc parallel                                                   \
   num_gangs(-1) /* { dg-warning "'num_gangs' value must be positive" } */ \
   num_workers() /* { dg-error "expected (primary-|)expression before '\\)' token" } */ \
-  vector_length(abc) /* { dg-error "'abc' (un|was not )declared" } */ \
+  vector_length(abc_p) /* { dg-error "'abc_p' (un|was not )declared" } */ \
   num_workers(0.5) /* { dg-error "'num_workers' expression must be integral" } */ \
-  vector_length(&acc_parallel) /* { dg-error "'vector_length' expression must be integral" } */ \
+  vector_length(&f) /* { dg-error "'vector_length' expression must be integral" } */ \
   num_gangs( /* { dg-error "expected (primary-|)expression before end of line" "TODO" { xfail c } } */
   ;
 }
index a5e0d696f7c59c03281a722d6aecc7955d62c053..a75692246b64c7fdd6a79cc33c409cddc21a0a3c 100644 (file)
@@ -21,6 +21,13 @@ void seq (void)
 
 int main ()
 {
+#pragma acc kernels num_gangs (32) num_workers (32) vector_length (32)
+  {
+    gang ();
+    worker ();
+    vector ();
+    seq ();
+  }
 
 #pragma acc parallel num_gangs (32) num_workers (32) vector_length (32)
   {
index 0a006e370e40f1dfbd2dca9cbb4ab2faedae3062..9f11196bdbe81c1bc7612f93bc9e8dd403398267 100644 (file)
@@ -1,10 +1,6 @@
-/* { dg-do compile } */
 /* { dg-additional-options "-Wuninitialized" } */
 
-#include <stdbool.h>
-
-int
-main (void)
+void acc_parallel()
 {
   int i, j, k;
 
@@ -17,3 +13,17 @@ main (void)
   #pragma acc parallel vector_length(k) /* { dg-warning "is used uninitialized in this function" } */
   ;
 }
+
+void acc_kernels()
+{
+  int i, j, k;
+
+  #pragma acc kernels num_gangs(i) /* { dg-warning "is used uninitialized in this function" } */
+  ;
+
+  #pragma acc kernels num_workers(j) /* { dg-warning "is used uninitialized in this function" } */
+  ;
+
+  #pragma acc kernels vector_length(k) /* { dg-warning "is used uninitialized in this function" } */
+  ;
+}
index 74f40d8922e736ce42411849e3f754bff8f959d5..852f42f2b42776d0eeb55925cf81d292ab611819 100644 (file)
@@ -100,6 +100,10 @@ oacc_kernels_copy (T a)
   float y = 3;
   double z = 4;
 
+#pragma acc kernels num_gangs (a) num_workers (a) vector_length (a) default (none) copyout (b) copyin (a)
+  for (int i = 0; i < 1; i++)
+    b = a;
+
 #pragma acc kernels copy (w, x, y, z)
   {
     w = accDouble<char>(w);
index 4ec66de346d8c0c04103dcc3f47574903083f653..7daca59020ed6679385cff071f65a0a3e50a97e8 100644 (file)
@@ -6,7 +6,8 @@ program test
   integer :: q, i, j, k, m, n, o, p, r, s, t, u, v, w
   logical :: l = .true.
 
-  !$acc kernels if(l) async copy(i), copyin(j), copyout(k), create(m) &
+  !$acc kernels if(l) async num_gangs(i) num_workers(i) vector_length(i) &
+  !$acc copy(i), copyin(j), copyout(k), create(m) &
   !$acc present(o), pcopy(p), pcopyin(r), pcopyout(s), pcreate(t) &
   !$acc deviceptr(u)
   !$acc end kernels
@@ -16,6 +17,9 @@ end program test
 
 ! { dg-final { scan-tree-dump-times "if" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "async" 1 "original" } } 
+! { dg-final { scan-tree-dump-times "num_gangs" 1 "original" } } 
+! { dg-final { scan-tree-dump-times "num_workers" 1 "original" } } 
+! { dg-final { scan-tree-dump-times "vector_length" 1 "original" } } 
 
 ! { dg-final { scan-tree-dump-times "map\\(force_tofrom:i\\)" 1 "original" } } 
 ! { dg-final { scan-tree-dump-times "map\\(force_to:j\\)" 1 "original" } } 
index ca9b928fa02fc169aaf3d641cd32ec04e6c57514..6773f62f0f45d79df336d79767638f9144396a83 100644 (file)
@@ -4,6 +4,12 @@ CONTAINS
     INTEGER  :: i
     REAL(KIND=8), ALLOCATABLE :: un(:),  ua(:)
 
+    !$acc kernels num_gangs(2) num_workers(4) vector_length(32)
+    DO jj = 1, 100
+       un(i) = ua(i)
+    END DO
+    !$acc end kernels
+
     !$acc parallel num_gangs(2) num_workers(4) vector_length(32)
     DO jj = 1, 100
        un(i) = ua(i)
index 2d66026b4c59ee72a640b7636251496f0eda12ef..abfe28bc5337b99b0ee14be4a88201751a34ebde 100644 (file)
@@ -95,6 +95,34 @@ program test
   !$acc parallel num_gangs("1") ! { dg-error "scalar INTEGER expression" }
   !$acc end parallel
 
+  !$acc kernels num_gangs ! { dg-error "Unclassifiable OpenACC directive" }
+
+  !$acc kernels num_gangs(3)
+  !$acc end kernels
+
+  !$acc kernels num_gangs(i)
+  !$acc end kernels
+
+  !$acc kernels num_gangs(i+1)
+  !$acc end kernels
+
+  !$acc kernels num_gangs(-1) ! { dg-warning "must be positive" }
+  !$acc end kernels
+
+  !$acc kernels num_gangs(0) ! { dg-warning "must be positive" }
+  !$acc end kernels
+
+  !$acc kernels num_gangs() ! { dg-error "Invalid character in name" }
+
+  !$acc kernels num_gangs(1.5) ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
+  !$acc kernels num_gangs(.true.) ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
+  !$acc kernels num_gangs("1") ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
 
   !$acc parallel num_workers ! { dg-error "Unclassifiable OpenACC directive" }
 
@@ -124,6 +152,34 @@ program test
   !$acc parallel num_workers("1") ! { dg-error "scalar INTEGER expression" }
   !$acc end parallel
 
+  !$acc kernels num_workers ! { dg-error "Unclassifiable OpenACC directive" }
+
+  !$acc kernels num_workers(3)
+  !$acc end kernels
+
+  !$acc kernels num_workers(i)
+  !$acc end kernels
+
+  !$acc kernels num_workers(i+1)
+  !$acc end kernels
+
+  !$acc kernels num_workers(-1) ! { dg-warning "must be positive" }
+  !$acc end kernels
+
+  !$acc kernels num_workers(0) ! { dg-warning "must be positive" }
+  !$acc end kernels
+
+  !$acc kernels num_workers() ! { dg-error "Invalid character in name" }
+
+  !$acc kernels num_workers(1.5) ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
+  !$acc kernels num_workers(.true.) ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
+  !$acc kernels num_workers("1") ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
 
   !$acc parallel vector_length ! { dg-error "Unclassifiable OpenACC directive" }
 
@@ -153,6 +209,34 @@ program test
   !$acc parallel vector_length("1") ! { dg-error "scalar INTEGER expression" }
   !$acc end parallel
 
+  !$acc kernels vector_length ! { dg-error "Unclassifiable OpenACC directive" }
+
+  !$acc kernels vector_length(3)
+  !$acc end kernels
+
+  !$acc kernels vector_length(i)
+  !$acc end kernels
+
+  !$acc kernels vector_length(i+1)
+  !$acc end kernels
+
+  !$acc kernels vector_length(-1) ! { dg-warning "must be positive" }
+  !$acc end kernels
+
+  !$acc kernels vector_length(0) ! { dg-warning "must be positive" }
+  !$acc end kernels
+
+  !$acc kernels vector_length() ! { dg-error "Invalid character in name" }
+
+  !$acc kernels vector_length(1.5) ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
+  !$acc kernels vector_length(.true.) ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
+  !$acc kernels vector_length("1") ! { dg-error "scalar INTEGER expression" }
+  !$acc end kernels
+
 
   !$acc loop gang
   do i = 1,10
@@ -249,4 +333,4 @@ program test
   do i = 1,10
   enddo
 
-end program test
\ No newline at end of file
+end program test
index b87d26f521fbc801e6c905c0acdb1b3ee3af672e..5dea42b2e7e0577d5a2cee7d4ea85df5a2078e1b 100644 (file)
@@ -1,7 +1,6 @@
-! { dg-do compile }
 ! { dg-additional-options "-Wuninitialized" }
 
-program test
+subroutine acc_parallel
   implicit none
   integer :: i, j, k
 
@@ -13,5 +12,18 @@ program test
 
   !$acc parallel vector_length(k) ! { dg-warning "is used uninitialized in this function" }
   !$acc end parallel
+end subroutine acc_parallel
 
-end program test
+subroutine acc_kernels
+  implicit none
+  integer :: i, j, k
+
+  !$acc kernels num_gangs(i) ! { dg-warning "is used uninitialized in this function" }
+  !$acc end kernels
+
+  !$acc kernels num_workers(j) ! { dg-warning "is used uninitialized in this function" }
+  !$acc end kernels
+
+  !$acc kernels vector_length(k) ! { dg-warning "is used uninitialized in this function" }
+  !$acc end kernels
+end subroutine acc_kernels
index 8fd5f07e9fa3c000e264d3d51ed754c3306943e3..32f8bf10b2b70c870bba1d9d271196136577ba7b 100644 (file)
@@ -1,5 +1,9 @@
 2017-05-23  Thomas Schwinge  <thomas@codesourcery.com>
 
+       * testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c: Update.
+       * testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Likewise.
+       * testsuite/libgomp.oacc-fortran/kernels-loop-2.f95: Likewise.
+
        * testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Rewrite.
        * testsuite/lib/libgomp.exp
        (check_effective_target_openacc_nvidia_accel_configured): New
index c7592d6a34066b04c809809f035f49b0d843db09..b84088879c659c56db42f0207c411388af2e5048 100644 (file)
@@ -14,27 +14,40 @@ main (void)
   b = (unsigned int *__restrict)malloc (N * sizeof (unsigned int));
   c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int));
 
+  /* Parallelism dimensions: compiler/runtime decides.  */
 #pragma acc kernels copyout (a[0:N])
   {
     for (COUNTERTYPE i = 0; i < N; i++)
       a[i] = i * 2;
   }
 
-#pragma acc kernels copyout (b[0:N])
+  /* Parallelism dimensions: variable.  */
+#pragma acc kernels copyout (b[0:N]) \
+  num_gangs (3 + a[3]) num_workers (5 + a[5]) vector_length (7 + a[7])
+  /* { dg-prune-output "using vector_length \\(32\\), ignoring runtime setting" } */
   {
     for (COUNTERTYPE i = 0; i < N; i++)
       b[i] = i * 4;
   }
 
-#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N])
+  /* Parallelism dimensions: literal.  */
+#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) \
+  num_gangs (3) num_workers (5) vector_length (7)
+  /* { dg-prune-output "using vector_length \\(32\\), ignoring 7" } */
   {
     for (COUNTERTYPE ii = 0; ii < N; ii++)
       c[ii] = a[ii] + b[ii];
   }
 
   for (COUNTERTYPE i = 0; i < N; i++)
-    if (c[i] != a[i] + b[i])
-      abort ();
+    {
+      if (a[i] != i * 2)
+       abort ();
+      if (b[i] != i * 4)
+       abort ();
+      if (c[i] != a[i] + b[i])
+       abort ();
+    }
 
   free (a);
   free (b);
index d8af5463b6b95324185eb3eb531951e86d5f28e9..8308f7c541f80eb7a21e0d9e253019bc6269fde8 100644 (file)
@@ -520,5 +520,40 @@ int main ()
   }
 
 
+  /* Unparallelized OpenACC kernels constructs must get launched as 1 x 1 x 1
+     kernels even when there are explicit num_gangs, num_workers, or
+     vector_length clauses.  */
+  {
+    int gangs = 5;
+#define WORKERS 5
+#define VECTORS 13
+    int gangs_min, gangs_max, workers_min, workers_max, vectors_min, vectors_max;
+    gangs_min = workers_min = vectors_min = INT_MAX;
+    gangs_max = workers_max = vectors_max = INT_MIN;
+#pragma acc kernels \
+  num_gangs (gangs) \
+  num_workers (WORKERS) \
+  vector_length (VECTORS)
+    {
+      /* This is to make the OpenACC kernels construct unparallelizable.  */
+      asm volatile ("" : : : "memory");
+
+#pragma acc loop reduction (min: gangs_min, workers_min, vectors_min) reduction (max: gangs_max, workers_max, vectors_max)
+      for (int i = 100; i > -100; --i)
+       {
+         gangs_min = gangs_max = acc_gang ();
+         workers_min = workers_max = acc_worker ();
+         vectors_min = vectors_max = acc_vector ();
+       }
+    }
+    if (gangs_min != 0 || gangs_max != 1 - 1
+       || workers_min != 0 || workers_max != 1 - 1
+       || vectors_min != 0 || vectors_max != 1 - 1)
+      __builtin_abort ();
+#undef VECTORS
+#undef WORKERS
+  }
+
+
   return 0;
 }
index 163e8d5359b49587a67d2dc121ec7a979e09feba..b88ca67f2c7e83b185d7f6389ad68c65b5d5d4ff 100644 (file)
@@ -6,25 +6,34 @@ program main
   integer, dimension (0:n-1) :: a, b, c
   integer                    :: i, ii
 
+  ! Parallelism dimensions: compiler/runtime decides.
   !$acc kernels copyout (a(0:n-1))
   do i = 0, n - 1
      a(i) = i * 2
   end do
   !$acc end kernels
 
-  !$acc kernels copyout (b(0:n-1))
+  ! Parallelism dimensions: variable.
+  !$acc kernels copyout (b(0:n-1)) &
+  !$acc num_gangs (3 + a(3)) num_workers (5 + a(5)) vector_length (7 + a(7))
+  ! { dg-prune-output "using vector_length \\(32\\), ignoring runtime setting" }
   do i = 0, n -1
      b(i) = i * 4
   end do
   !$acc end kernels
 
-  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
+  ! Parallelism dimensions: literal.
+  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) &
+  !$acc num_gangs (3) num_workers (5) vector_length (7)
+  ! { dg-prune-output "using vector_length \\(32\\), ignoring 7" }
   do ii = 0, n - 1
      c(ii) = a(ii) + b(ii)
   end do
   !$acc end kernels
 
   do i = 0, n - 1
+     if (a(i) .ne. i * 2) call abort
+     if (b(i) .ne. i * 4) call abort
      if (c(i) .ne. a(i) + b(i)) call abort
   end do