Add a testcase for PR target/66821
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / lib-69.c
blob5462f1253522ecd65506503458d07911512dc49a
1 /* { dg-do run { target openacc_nvidia_accel_selected } } */
2 /* { dg-additional-options "-lcuda" } */
4 #include <stdio.h>
5 #include <unistd.h>
6 #include <openacc.h>
7 #include <cuda.h>
9 int
10 main (int argc, char **argv)
12 CUdevice dev;
13 CUfunction delay;
14 CUmodule module;
15 CUresult r;
16 CUstream stream;
17 unsigned long *a, *d_a, dticks;
18 int nbytes;
19 float dtime;
20 void *kargs[2];
21 int clkrate;
22 int devnum, nprocs;
24 acc_init (acc_device_nvidia);
26 devnum = acc_get_device_num (acc_device_nvidia);
28 r = cuDeviceGet (&dev, devnum);
29 if (r != CUDA_SUCCESS)
31 fprintf (stderr, "cuDeviceGet failed: %d\n", r);
32 abort ();
35 r =
36 cuDeviceGetAttribute (&nprocs, CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT,
37 dev);
38 if (r != CUDA_SUCCESS)
40 fprintf (stderr, "cuDeviceGetAttribute failed: %d\n", r);
41 abort ();
44 r = cuDeviceGetAttribute (&clkrate, CU_DEVICE_ATTRIBUTE_CLOCK_RATE, dev);
45 if (r != CUDA_SUCCESS)
47 fprintf (stderr, "cuDeviceGetAttribute failed: %d\n", r);
48 abort ();
51 r = cuModuleLoad (&module, "subr.ptx");
52 if (r != CUDA_SUCCESS)
54 fprintf (stderr, "cuModuleLoad failed: %d\n", r);
55 abort ();
58 r = cuModuleGetFunction (&delay, module, "delay");
59 if (r != CUDA_SUCCESS)
61 fprintf (stderr, "cuModuleGetFunction failed: %d\n", r);
62 abort ();
65 nbytes = nprocs * sizeof (unsigned long);
67 dtime = 200.0;
69 dticks = (unsigned long) (dtime * clkrate);
71 a = (unsigned long *) malloc (nbytes);
72 d_a = (unsigned long *) acc_malloc (nbytes);
74 acc_map_data (a, d_a, nbytes);
76 kargs[0] = (void *) &d_a;
77 kargs[1] = (void *) &dticks;
79 stream = (CUstream) acc_get_cuda_stream (0);
80 if (stream != NULL)
81 abort ();
83 r = cuStreamCreate (&stream, CU_STREAM_DEFAULT);
84 if (r != CUDA_SUCCESS)
86 fprintf (stderr, "cuStreamCreate failed: %d\n", r);
87 abort ();
90 if (!acc_set_cuda_stream (0, stream))
91 abort ();
93 r = cuLaunchKernel (delay, 1, 1, 1, 1, 1, 1, 0, stream, kargs, 0);
94 if (r != CUDA_SUCCESS)
96 fprintf (stderr, "cuLaunchKernel failed: %d\n", r);
97 abort ();
100 if (acc_async_test (0) != 0)
102 fprintf (stderr, "asynchronous operation not running\n");
103 abort ();
106 sleep (1);
108 if (acc_async_test (0) != 1)
110 fprintf (stderr, "found asynchronous operation still running\n");
111 abort ();
114 acc_unmap_data (a);
116 free (a);
117 acc_free (d_a);
119 acc_shutdown (acc_device_nvidia);
121 exit (0);
124 /* { dg-output "" } */