updated CUDA hybridAPI and added a CUDA hello example
[charm.git] / src / arch / cuda / hybridAPI / wr.h
1 /* 
2  * wr.h
3  *
4  * by Lukasz Wesolowski
5  * 06.02.2008
6  *
7  * header containing declarations needed by the user of hybridAPI
8  *
9  */
10
11 #ifndef __WR_H__
12 #define __WR_H__
13
14 /* struct workRequest
15  * 
16  * purpose:  
17  * structure for holding information about work requests on the GPU
18  *
19  * usage model: 
20  * 1. declare a pointer to a workRequest 
21  * 2. allocate dynamic memory for the work request
22  * 3. call setupMemory to copy over the data to the GPU 
23  * 4. enqueue the work request by using addWorkRequest
24  */
25 typedef struct workRequest {
26
27   /* parameters for kernel execution */
28
29   dim3 dimGrid; 
30   dim3 dimBlock; 
31   int smemSize;
32   
33   /* pointers to queues and their lengths on the device(gpu) and
34      host(cpu)  */
35
36   void *readWriteDevicePtr;
37   void *readWriteHostPtr; 
38   int readWriteLen; 
39
40   void *readOnlyDevicePtr; 
41   void *readOnlyHostPtr; 
42   int readOnlyLen; 
43
44   void *writeOnlyDevicePtr;
45   void *writeOnlyHostPtr; 
46   int writeOnlyLen; 
47
48   /* to be called after the kernel finishes executing on the GPU */ 
49
50   void (*callbackFn)(); 
51
52   /* id to select the correct kernel in kernelSelect */
53
54   int id; 
55
56   /* event which will be polled to check if kernel has finished
57      execution */
58
59   cudaEvent_t completionEvent;  
60
61   /* flags */
62
63   int executing; 
64
65 } workRequest; 
66
67
68 /* struct workRequestQueue 
69  *
70  * purpose: container/mechanism for GPU work requests 
71  *
72  * usage model: 
73  * 1. declare a workRequestQueue
74  * 2. call init to allocate memory for the queue and initialize
75  *    bookkeeping variables
76  * 3. call enqueue for each request which needs to be 
77  *    executed on the GPU
78  * 4. in the hybrid API gpuProgressFn will execute periodically to
79  *    handle the details of executing the work request on the GPU
80  *             
81  * implementation notes: 
82  * the queue is implemented using a circular array; if the array fills
83  * up, requests are transferred to a queue having additional
84  * QUEUE_EXPANSION_SIZE slots, and the memory for the old queue is freed
85  */
86 typedef struct {
87
88   /* array of requests */
89   workRequest* requests; 
90
91   /* array index for the logically first item in the queue */
92   int head; 
93
94   /* array index for the last item in the queue */ 
95   int tail; 
96
97   /* number of work requests in the queue */
98   int size; 
99
100   /* size of the array of work requests */ 
101   int capacity; 
102
103 } workRequestQueue; 
104
105 /* enqueue
106  *
107  * add a work request to the queue to be later executed on the GPU
108  *
109  */
110 void enqueue(workRequestQueue *q, workRequest *wr); 
111
112
113 #endif
114
115