1f62d6375b
2018-05-02 Tom de Vries <tom@codesourcery.com> PR libgomp/82428 * builtins.def (DEF_GOACC_BUILTIN_ONLY): Define. * omp-builtins.def (BUILT_IN_GOACC_PARLEVEL_ID) (BUILT_IN_GOACC_PARLEVEL_SIZE): New builtin. * builtins.c (expand_builtin_goacc_parlevel_id_size): New function. (expand_builtin): Call expand_builtin_goacc_parlevel_id_size. * doc/extend.texi (Other Builtins): Add __builtin_goacc_parlevel_id and __builtin_goacc_parlevel_size. * f95-lang.c (DEF_GOACC_BUILTIN_ONLY): Define. * c-c++-common/goacc/builtin-goacc-parlevel-id-size-2.c: New test. * c-c++-common/goacc/builtin-goacc-parlevel-id-size.c: New test. * testsuite/libgomp.oacc-c-c++-common/gang-static-2.c: Use __builtin_goacc_parlevel_{id,size}. * testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-dim-default.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-g-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-g-2.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-gwv-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-g-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-gwv-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-v-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-v-2.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-w-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-w-2.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-red-wv-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-v-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-w-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/loop-wv-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Same. * testsuite/libgomp.oacc-c-c++-common/routine-g-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/routine-gwv-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/routine-v-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/routine-w-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/routine-wv-1.c: Same. * testsuite/libgomp.oacc-c-c++-common/routine-wv-2.c: Same. * testsuite/libgomp.oacc-c-c++-common/tile-1.c: Same. From-SVN: r259850
72 lines
1.5 KiB
C
72 lines
1.5 KiB
C
#include <stdio.h>
|
|
#include <openacc.h>
|
|
#include <gomp-constants.h>
|
|
|
|
#define NUM_WORKERS 16
|
|
#define NUM_VECTORS 32
|
|
#define WIDTH 64
|
|
#define HEIGHT 32
|
|
|
|
#define WORK_ID(I,N) \
|
|
(acc_on_device (acc_device_not_host) \
|
|
? __builtin_goacc_parlevel_id (GOMP_DIM_WORKER) \
|
|
: (I % N))
|
|
#define VEC_ID(I,N) \
|
|
(acc_on_device (acc_device_not_host) \
|
|
? __builtin_goacc_parlevel_id (GOMP_DIM_VECTOR) \
|
|
: (I % N))
|
|
|
|
#pragma acc routine worker
|
|
void __attribute__ ((noinline))
|
|
WorkVec (int *ptr, int w, int h, int nw, int nv)
|
|
{
|
|
#pragma acc loop worker
|
|
for (int i = 0; i < h; i++)
|
|
#pragma acc loop vector
|
|
for (int j = 0; j < w; j++)
|
|
ptr[i*w + j] = (WORK_ID (i, nw) << 8) | VEC_ID(j, nv);
|
|
}
|
|
|
|
int DoWorkVec (int nw)
|
|
{
|
|
int ary[HEIGHT][WIDTH];
|
|
int err = 0;
|
|
|
|
for (int ix = 0; ix != HEIGHT; ix++)
|
|
for (int jx = 0; jx != WIDTH; jx++)
|
|
ary[ix][jx] = 0xdeadbeef;
|
|
|
|
printf ("spawning %d ...", nw); fflush (stdout);
|
|
|
|
#pragma acc parallel num_workers(nw) vector_length (NUM_VECTORS) copy (ary)
|
|
{
|
|
WorkVec ((int *)ary, WIDTH, HEIGHT, nw, NUM_VECTORS);
|
|
}
|
|
|
|
for (int ix = 0; ix != HEIGHT; ix++)
|
|
for (int jx = 0; jx != WIDTH; jx++)
|
|
{
|
|
int exp = ((ix % nw) << 8) | (jx % NUM_VECTORS);
|
|
|
|
if (ary[ix][jx] != exp)
|
|
{
|
|
printf ("\nary[%d][%d] = %#x expected %#x", ix, jx,
|
|
ary[ix][jx], exp);
|
|
err = 1;
|
|
}
|
|
}
|
|
printf (err ? " failed\n" : " ok\n");
|
|
|
|
return err;
|
|
}
|
|
|
|
int main ()
|
|
{
|
|
int err = 0;
|
|
|
|
for (int W = 1; W <= NUM_WORKERS; W <<= 1)
|
|
err |= DoWorkVec (W);
|
|
|
|
return err;
|
|
}
|