diff mbox

Use DO_PRAGMA in libgomp.oacc-c-c++-common/reduction-1.c

Message ID 54EB5FFB.70907@mentor.com
State New
Headers show

Commit Message

Tom de Vries Feb. 23, 2015, 5:14 p.m. UTC
On 23-02-15 17:08, Jakub Jelinek wrote:
> On Mon, Feb 23, 2015 at 04:52:56PM +0100, Tom de Vries wrote:
>> The only thing I'm not sure about is the two-level pragma expansion using
>> the apply pragmas. It maximizes factoring out common parts, but it makes
>> things less readable.
>>
>> Tested on x86_64.
>>
>> OK for stage4?
>
> If Thomas is ok with that, it is ok with me too.

For comparison, this is a less convoluted, but longer version.

Thanks,
- Tom

Comments

Thomas Schwinge Feb. 25, 2015, 11:40 a.m. UTC | #1
Hi!

On Mon, 23 Feb 2015 18:14:35 +0100, Tom de Vries <Tom_deVries@mentor.com> wrote:
> On 23-02-15 17:08, Jakub Jelinek wrote:
> > On Mon, Feb 23, 2015 at 04:52:56PM +0100, Tom de Vries wrote:
> >> The only thing I'm not sure about is the two-level pragma expansion using
> >> the apply pragmas. It maximizes factoring out common parts, but it makes
> >> things less readable.
> >>
> >> Tested on x86_64.
> >>
> >> OK for stage4?
> >
> > If Thomas is ok with that, it is ok with me too.

OK, thanks!

> For comparison, this is a less convoluted, but longer version.

Hmm, I can't quite decide which of the two to prefer.  Your call.  ;-P
(Maybe, toss a coin if it takes more than a minute to decide.)


Grüße,
 Thomas
diff mbox

Patch

/* { dg-do run } */

/* Integer reductions.  */

#include <stdlib.h>
#include <stdbool.h>

#define vl 32

#define DO_PRAGMA(x) _Pragma (#x)

#define check_reduction_int(op, init, res, vres)	\
  res = (init);						\
DO_PRAGMA (acc parallel vector_length (vl))\
DO_PRAGMA (acc loop reduction (op:res))\
  for (i = 0; i < n; i++)				\
    res = res op array[i];				\
							\
  vres = (init);					\
  for (i = 0; i < n; i++)				\
    vres = vres op array[i];				\
							\
  if (res != vres)					\
    abort ();

static void
test_reductions_int (void)
{
  const int n = 1000;
  int i;
  int vresult, result, array[n];

  for (i = 0; i < n; i++)
    array[i] = i;

  check_reduction_int (+, 0, result, vresult);
  check_reduction_int (*, 1, result, vresult);
  check_reduction_int (&, -1, result, vresult);
  check_reduction_int (|, 0, result, vresult);
  check_reduction_int (^, 0, result, vresult);
}

#define check_reduction_minmax(pragmaop, op, init, res, vres)	\
  res = (init);							\
DO_PRAGMA (acc parallel vector_length (vl))\
DO_PRAGMA (acc loop reduction (pragmaop:res))\
  for (i = 0; i < n; i++)					\
    res = op (res, array[i]);					\
								\
  vres = (init);						\
  for (i = 0; i < n; i++)					\
    vres = op (vres, array[i]);					\
								\
  if (res != vres)						\
    abort ();

#define max_op(a, b) (((a) > (b)) ? (a) : (b))
#define min_op(a, b) (((a) < (b)) ? (a) : (b))

static void
test_reductions_minmax (void)
{
  const int n = 1000;
  int i;
  int vresult, result, array[n];

  for (i = 0; i < n; i++)
    array[i] = i;

  check_reduction_minmax (min, min_op, n + 1, vresult, result);
  check_reduction_minmax (max, max_op, -1, vresult, result);
}

#define check_reduction_bool(op, init, res, vres)	\
  res = (init);						\
DO_PRAGMA (acc parallel vector_length (vl))\
DO_PRAGMA (acc loop reduction (op:res))\
  for (i = 0; i < n; i++)				\
    res = res op (cmp_val > array[i]);			\
							\
  vres = (init);					\
  for (i = 0; i < n; i++)				\
    vres = vres op (cmp_val > array[i]);		\
							\
  if (res != vres)					\
    abort ();

static void
test_reductions_bool (void)
{
  const int n = 1000;
  int i;
  int array[n];
  bool lvresult, lresult;
  int cmp_val;

  for (i = 0; i < n; i++)
    array[i] = i;

  cmp_val = 5;
  check_reduction_bool (&&, true, lresult, lvresult);
  check_reduction_bool (||, false, lresult, lvresult);
}

int
main (void)
{
  test_reductions_int ();
  test_reductions_minmax ();
  test_reductions_bool ();
  return 0;
}

2015-02-23  Tom de Vries  <tom@codesourcery.com>

	* testsuite/libgomp.oacc-c-c++-common/reduction-1.c
	(DO_PRAGMA, check_reduction_int, max_op, min_op, check_reduction_minmax)
	(check_reduction_bool): Declare.
	(test_reductions_int, test_reductions_minmax, test_reductions_bool): New
	function.
	(main): Use new functions.
---
 .../libgomp.oacc-c-c++-common/reduction-1.c        | 220 ++++++++-------------
 1 file changed, 79 insertions(+), 141 deletions(-)

diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/reduction-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/reduction-1.c
index acf9540..c30bb65 100644
--- a/libgomp/testsuite/libgomp.oacc-c-c++-common/reduction-1.c
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/reduction-1.c
@@ -7,168 +7,106 @@ 
 
 #define vl 32
 
-int
-main(void)
+#define DO_PRAGMA(x) _Pragma (#x)
+
+#define check_reduction_int(op, init, res, vres)	\
+  res = (init);						\
+DO_PRAGMA (acc parallel vector_length (vl))\
+DO_PRAGMA (acc loop reduction (op:res))\
+  for (i = 0; i < n; i++)				\
+    res = res op array[i];				\
+							\
+  vres = (init);					\
+  for (i = 0; i < n; i++)				\
+    vres = vres op array[i];				\
+							\
+  if (res != vres)					\
+    abort ();
+
+static void
+test_reductions_int (void)
 {
   const int n = 1000;
   int i;
   int vresult, result, array[n];
-  bool lvresult, lresult;
 
   for (i = 0; i < n; i++)
     array[i] = i;
 
-  result = 0;
-  vresult = 0;
-
-  /* '+' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (+:result)
-  for (i = 0; i < n; i++)
-    result += array[i];
-
-  /* Verify the reduction.  */
-  for (i = 0; i < n; i++)
-    vresult += array[i];
-
-  if (result != vresult)
-    abort ();
-
-  result = 0;
-  vresult = 0;
-
-  /* '*' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (*:result)
-  for (i = 0; i < n; i++)
-    result *= array[i];
-
-  /* Verify the reduction.  */
-  for (i = 0; i < n; i++)
-    vresult *= array[i];
-
-  if (result != vresult)
-    abort ();
-
-//   result = 0;
-//   vresult = 0;
-// 
-//   /* 'max' reductions.  */
-// #pragma acc parallel vector_length (vl)
-// #pragma acc loop reduction (+:result)
-//   for (i = 0; i < n; i++)
-//       result = result > array[i] ? result : array[i];
-// 
-//   /* Verify the reduction.  */
-//   for (i = 0; i < n; i++)
-//       vresult = vresult > array[i] ? vresult : array[i];
-// 
-//   printf("%d != %d\n", result, vresult);
-//   if (result != vresult)
-//     abort ();
-// 
-//   result = 0;
-//   vresult = 0;
-// 
-//   /* 'min' reductions.  */
-// #pragma acc parallel vector_length (vl)
-// #pragma acc loop reduction (+:result)
-//   for (i = 0; i < n; i++)
-//       result = result < array[i] ? result : array[i];
-// 
-//   /* Verify the reduction.  */
-//   for (i = 0; i < n; i++)
-//       vresult = vresult < array[i] ? vresult : array[i];
-// 
-//   printf("%d != %d\n", result, vresult);
-//   if (result != vresult)
-//     abort ();
-
-  result = 0;
-  vresult = 0;
-
-  /* '&' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (&:result)
-  for (i = 0; i < n; i++)
-    result &= array[i];
-
-  /* Verify the reduction.  */
-  for (i = 0; i < n; i++)
-    vresult &= array[i];
-
-  if (result != vresult)
-    abort ();
-
-  result = 0;
-  vresult = 0;
-
-  /* '|' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (|:result)
-  for (i = 0; i < n; i++)
-    result |= array[i];
-
-  /* Verify the reduction.  */
-  for (i = 0; i < n; i++)
-    vresult |= array[i];
-
-  if (result != vresult)
-    abort ();
-
-  result = 0;
-  vresult = 0;
-
-  /* '^' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (^:result)
-  for (i = 0; i < n; i++)
-    result ^= array[i];
-
-  /* Verify the reduction.  */
-  for (i = 0; i < n; i++)
-    vresult ^= array[i];
+  check_reduction_int (+, 0, result, vresult);
+  check_reduction_int (*, 1, result, vresult);
+  check_reduction_int (&, -1, result, vresult);
+  check_reduction_int (|, 0, result, vresult);
+  check_reduction_int (^, 0, result, vresult);
+}
 
-  if (result != vresult)
+#define check_reduction_minmax(pragmaop, op, init, res, vres)	\
+  res = (init);							\
+DO_PRAGMA (acc parallel vector_length (vl))\
+DO_PRAGMA (acc loop reduction (pragmaop:res))\
+  for (i = 0; i < n; i++)					\
+    res = op (res, array[i]);					\
+								\
+  vres = (init);						\
+  for (i = 0; i < n; i++)					\
+    vres = op (vres, array[i]);					\
+								\
+  if (res != vres)						\
     abort ();
 
-  result = 5;
-  vresult = 5;
+#define max_op(a, b) (((a) > (b)) ? (a) : (b))
+#define min_op(a, b) (((a) < (b)) ? (a) : (b))
 
-  lresult = false;
-  lvresult = false;
+static void
+test_reductions_minmax (void)
+{
+  const int n = 1000;
+  int i;
+  int vresult, result, array[n];
 
-  /* '&&' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (&&:lresult)
   for (i = 0; i < n; i++)
-    lresult = lresult && (result > array[i]);
+    array[i] = i;
 
-  /* Verify the reduction.  */
-  for (i = 0; i < n; i++)
-    lvresult = lresult && (result > array[i]);
+  check_reduction_minmax (min, min_op, n + 1, vresult, result);
+  check_reduction_minmax (max, max_op, -1, vresult, result);
+}
 
-  if (lresult != lvresult)
+#define check_reduction_bool(op, init, res, vres)	\
+  res = (init);						\
+DO_PRAGMA (acc parallel vector_length (vl))\
+DO_PRAGMA (acc loop reduction (op:res))\
+  for (i = 0; i < n; i++)				\
+    res = res op (cmp_val > array[i]);			\
+							\
+  vres = (init);					\
+  for (i = 0; i < n; i++)				\
+    vres = vres op (cmp_val > array[i]);		\
+							\
+  if (res != vres)					\
     abort ();
 
-  result = 5;
-  vresult = 5;
-
-  lresult = false;
-  lvresult = false;
-
-  /* '||' reductions.  */
-#pragma acc parallel vector_length (vl)
-#pragma acc loop reduction (||:lresult)
-  for (i = 0; i < n; i++)
-    lresult = lresult || (result > array[i]);
+static void
+test_reductions_bool (void)
+{
+  const int n = 1000;
+  int i;
+  int array[n];
+  bool lvresult, lresult;
+  int cmp_val;
 
-  /* Verify the reduction.  */
   for (i = 0; i < n; i++)
-    lvresult = lresult || (result > array[i]);
+    array[i] = i;
 
-  if (lresult != lvresult)
-    abort ();
+  cmp_val = 5;
+  check_reduction_bool (&&, true, lresult, lvresult);
+  check_reduction_bool (||, false, lresult, lvresult);
+}
 
+int
+main (void)
+{
+  test_reductions_int ();
+  test_reductions_minmax ();
+  test_reductions_bool ();
   return 0;
 }
-- 
1.9.1