1 /* { dg-do run { target openacc_nvidia_accel_selected } } */
2 /* { dg-additional-options "-lcuda" } */
12 main (int argc
, char **argv
)
21 unsigned long *a
, *d_a
, dticks
;
23 float atime
, dtime
, hitime
, lotime
;
28 acc_init (acc_device_nvidia
);
30 devnum
= acc_get_device_num (acc_device_nvidia
);
32 r
= cuDeviceGet (&dev
, devnum
);
33 if (r
!= CUDA_SUCCESS
)
35 fprintf (stderr
, "cuDeviceGet failed: %d\n", r
);
40 cuDeviceGetAttribute (&nprocs
, CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT
,
42 if (r
!= CUDA_SUCCESS
)
44 fprintf (stderr
, "cuDeviceGetAttribute failed: %d\n", r
);
48 r
= cuDeviceGetAttribute (&clkrate
, CU_DEVICE_ATTRIBUTE_CLOCK_RATE
, dev
);
49 if (r
!= CUDA_SUCCESS
)
51 fprintf (stderr
, "cuDeviceGetAttribute failed: %d\n", r
);
55 r
= cuModuleLoad (&module
, "subr.ptx");
56 if (r
!= CUDA_SUCCESS
)
58 fprintf (stderr
, "cuModuleLoad failed: %d\n", r
);
62 r
= cuModuleGetFunction (&delay
, module
, "delay");
63 if (r
!= CUDA_SUCCESS
)
65 fprintf (stderr
, "cuModuleGetFunction failed: %d\n", r
);
69 nbytes
= nprocs
* sizeof (unsigned long);
73 dticks
= (unsigned long) (dtime
* clkrate
);
77 a
= (unsigned long *) malloc (nbytes
);
78 d_a
= (unsigned long *) acc_malloc (nbytes
);
80 acc_map_data (a
, d_a
, nbytes
);
82 streams
= (CUstream
*) malloc (N
* sizeof (void *));
84 for (i
= 0; i
< N
; i
++)
86 streams
[i
] = (CUstream
) acc_get_cuda_stream (i
);
87 if (streams
[i
] != NULL
)
90 r
= cuStreamCreate (&streams
[i
], CU_STREAM_DEFAULT
);
91 if (r
!= CUDA_SUCCESS
)
93 fprintf (stderr
, "cuStreamCreate failed: %d\n", r
);
97 if (!acc_set_cuda_stream (i
, streams
[i
]))
103 kargs
[0] = (void *) &d_a
;
104 kargs
[1] = (void *) &dticks
;
108 for (i
= 0; i
< N
; i
++)
110 r
= cuLaunchKernel (delay
, 1, 1, 1, 1, 1, 1, 0, streams
[i
], kargs
, 0);
111 if (r
!= CUDA_SUCCESS
)
113 fprintf (stderr
, "cuLaunchKernel failed: %d\n", r
);
120 atime
= stop_timer (0);
123 hitime
+= hitime
* 0.02;
126 lotime
-= lotime
* 0.02;
128 if (atime
> hitime
|| atime
< lotime
)
130 fprintf (stderr
, "actual time < delay time\n");
142 acc_shutdown (acc_device_nvidia
);
147 /* { dg-output "" } */