1/* { dg-do run } */ 2 3#include <pthread.h> 4#include <stdio.h> 5#include <stdlib.h> 6#include <errno.h> 7#include <ctype.h> 8#include <openacc.h> 9 10unsigned char **x; 11void **d_x; 12const int N = 32; 13const int NTHREADS = 32; 14 15static void * 16test (void *arg) 17{ 18 int i; 19 int tid; 20 unsigned char *p; 21 int devnum; 22 23 tid = (int) (long) arg; 24 25 devnum = acc_get_device_num (acc_device_nvidia); 26 acc_set_device_num (devnum, acc_device_nvidia); 27 28 if (acc_get_current_cuda_context () == NULL) 29 abort (); 30 31 acc_copyout (x[tid], N); 32 33 p = x[tid]; 34 35 for (i = 0; i < N; i++) 36 { 37 if (p[i] != i) 38 abort (); 39 } 40 41 return 0; 42} 43 44int 45main (int argc, char **argv) 46{ 47 int i; 48 pthread_attr_t attr; 49 pthread_t *tid; 50 unsigned char *p; 51 52 if (acc_get_num_devices (acc_device_nvidia) == 0) 53 return 0; 54 55 acc_init (acc_device_nvidia); 56 57 x = (unsigned char **) malloc (NTHREADS * N); 58 d_x = (void **) malloc (NTHREADS * N); 59 60 for (i = 0; i < N; i++) 61 { 62 int j; 63 64 p = (unsigned char *) malloc (N); 65 66 x[i] = p; 67 68 for (j = 0; j < N; j++) 69 { 70 p[j] = j; 71 } 72 73 d_x[i] = acc_copyin (p, N); 74 } 75 76 if (pthread_attr_init (&attr) != 0) 77 perror ("pthread_attr_init failed"); 78 79 tid = (pthread_t *) malloc (NTHREADS * sizeof (pthread_t)); 80 81 acc_get_cuda_stream (1); 82 83 for (i = 0; i < NTHREADS; i++) 84 { 85 if (pthread_create (&tid[i], &attr, &test, (void *) (unsigned long) (i)) 86 != 0) 87 perror ("pthread_create failed"); 88 } 89 90 if (pthread_attr_destroy (&attr) != 0) 91 perror ("pthread_attr_destroy failed"); 92 93 for (i = 0; i < NTHREADS; i++) 94 { 95 void *res; 96 97 if (pthread_join (tid[i], &res) != 0) 98 perror ("pthread join failed"); 99 } 100 101 for (i = 0; i < NTHREADS; i++) 102 { 103 if (acc_is_present (x[i], N) != 0) 104 abort (); 105 } 106 107 acc_shutdown (acc_device_nvidia); 108 109 return 0; 110} 111 112/* { dg-output "" } */ 113