ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.xs
Revision: 1.1
Committed: Tue Nov 15 06:50:30 2011 UTC (12 years, 6 months ago) by root
Branch: MAIN
CVS Tags: rel-0_01
Log Message:
0.01

File Contents

# User Rev Content
1 root 1.1 #include "EXTERN.h"
2     #include "perl.h"
3     #include "XSUB.h"
4    
5     #include <CL/opencl.h>
6    
7     typedef cl_platform_id OpenCL__Platform;
8     typedef cl_device_id OpenCL__Device;
9     typedef cl_context OpenCL__Context;
10     typedef cl_command_queue OpenCL__Queue;
11    
12     static const struct {
13     IV iv;
14     const char *name;
15     } cl_error[] = {
16     #define def_error(name) { (IV)CL_ ## name, # name },
17     #include "invalid.h"
18     };
19    
20     static const char *
21     clstrerror (cl_int res)
22     {
23     int i;
24     static char numbuf [32];
25    
26     for (i = sizeof (cl_error) / sizeof (cl_error [0]); i--; )
27     if (cl_error [i].iv == res)
28     return cl_error [i].name;
29    
30     snprintf (numbuf, sizeof (numbuf), "ERROR(%d)", res);
31    
32     return numbuf;
33     }
34    
35     #define FAIL(name,res) \
36     croak (# name ": %s", clstrerror (res));
37    
38     #define NEED_SUCCESS(name,args) \
39     do { \
40     cl_int res = name args; \
41     \
42     if (res) \
43     FAIL (name, res); \
44     } while (0)
45    
46     MODULE = OpenCL PACKAGE = OpenCL
47    
48     BOOT:
49     {
50     HV *stash = gv_stashpv ("OpenCL", 1);
51     static const struct {
52     const char *name;
53     IV iv;
54     } *civ, const_iv[] = {
55     #define const_iv(name) { # name, (IV)CL_ ## name },
56     #include "constiv.h"
57     };
58     for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
59     newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
60     }
61    
62     void
63     platforms ()
64     PPCODE:
65     {
66     cl_platform_id *list;
67     cl_uint count;
68     int i;
69    
70     NEED_SUCCESS (clGetPlatformIDs, (0, 0, &count));
71     Newx (list, count, cl_platform_id);
72     NEED_SUCCESS (clGetPlatformIDs, (count, list, 0));
73    
74     EXTEND (SP, count);
75     for (i = 0; i < count; ++i)
76     PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Platform", list [i]));
77    
78     Safefree (list);
79     }
80    
81     void
82     context_from_type_simple (cl_device_type type = CL_DEVICE_TYPE_DEFAULT)
83     PPCODE:
84     {
85     cl_int res;
86     cl_context ctx = clCreateContextFromType (0, type, 0, 0, &res);
87    
88     if (res)
89     FAIL (clCreateContextFromType, res);
90    
91     XPUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Context", ctx));
92     }
93    
94     MODULE = OpenCL PACKAGE = OpenCL::Platform
95    
96     void
97     info (OpenCL::Platform this, cl_platform_info name)
98     PPCODE:
99     {
100     size_t size;
101     SV *sv;
102    
103     NEED_SUCCESS (clGetPlatformInfo, (this, name, 0, 0, &size));
104     sv = sv_2mortal (newSV (size));
105     SvUPGRADE (sv, SVt_PV);
106     SvPOK_only (sv);
107     SvCUR_set (sv, size);
108     NEED_SUCCESS (clGetPlatformInfo, (this, name, size, SvPVX (sv), 0));
109     XPUSHs (sv);
110     }
111    
112     void
113     devices (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_ALL)
114     PPCODE:
115     {
116     cl_device_id *list;
117     cl_uint count;
118     int i;
119    
120     NEED_SUCCESS (clGetDeviceIDs, (this, type, 0, 0, &count));
121     Newx (list, count, cl_device_id);
122     NEED_SUCCESS (clGetDeviceIDs, (this, type, count, list, 0));
123    
124     EXTEND (SP, count);
125     for (i = 0; i < count; ++i)
126     PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i]));
127    
128     Safefree (list);
129     }
130    
131     void
132     context_from_type_simple (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_DEFAULT)
133     PPCODE:
134     {
135     cl_int res;
136     cl_context_properties props[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)this, 0 };
137     cl_context ctx = clCreateContextFromType (props, type, 0, 0, &res);
138    
139     if (res)
140     FAIL (clCreateContextFromType, res);
141    
142     XPUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Context", ctx));
143     }
144    
145     MODULE = OpenCL PACKAGE = OpenCL::Device
146    
147     void
148     info (OpenCL::Device this, cl_device_info name)
149     PPCODE:
150     {
151     size_t size;
152     SV *sv;
153    
154     NEED_SUCCESS (clGetDeviceInfo, (this, name, 0, 0, &size));
155     sv = sv_2mortal (newSV (size));
156     SvUPGRADE (sv, SVt_PV);
157     SvPOK_only (sv);
158     SvCUR_set (sv, size);
159     NEED_SUCCESS (clGetDeviceInfo, (this, name, size, SvPVX (sv), 0));
160     XPUSHs (sv);
161     }
162    
163     void
164     context_simple (OpenCL::Device this)
165     PPCODE:
166     {
167     cl_int res;
168     cl_context ctx = clCreateContext (0, 1, &this, 0, 0, &res);
169    
170     if (res)
171     FAIL (clCreateContext, res);
172    
173     XPUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Context", ctx));
174     }
175    
176     MODULE = OpenCL PACKAGE = OpenCL::Context
177    
178     void
179     DESTROY (OpenCL::Context context)
180     CODE:
181     clReleaseContext (context);
182    
183     void
184     info (OpenCL::Context this, cl_context_info name)
185     PPCODE:
186     {
187     size_t size;
188     SV *sv;
189    
190     NEED_SUCCESS (clGetContextInfo, (this, name, 0, 0, &size));
191     sv = sv_2mortal (newSV (size));
192     SvUPGRADE (sv, SVt_PV);
193     SvPOK_only (sv);
194     SvCUR_set (sv, size);
195     NEED_SUCCESS (clGetContextInfo, (this, name, size, SvPVX (sv), 0));
196     XPUSHs (sv);
197     }
198    
199     void
200     command_queue_simple (OpenCL::Context this, OpenCL::Device device)
201     PPCODE:
202     {
203     cl_int res;
204     cl_command_queue queue = clCreateCommandQueue (this, device, 0, &res);
205    
206     if (res)
207     FAIL (clCreateCommandQueue, res);
208    
209     XPUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Queue", queue));
210     }
211    
212     MODULE = OpenCL PACKAGE = OpenCL::Queue
213    
214     void
215     DESTROY (OpenCL::Queue this)
216     CODE:
217     clReleaseCommandQueue (this);
218    
219     void
220     info (OpenCL::Queue this, cl_command_queue_info name)
221     PPCODE:
222     {
223     size_t size;
224     SV *sv;
225    
226     NEED_SUCCESS (clGetCommandQueueInfo, (this, name, 0, 0, &size));
227     sv = sv_2mortal (newSV (size));
228     SvUPGRADE (sv, SVt_PV);
229     SvPOK_only (sv);
230     SvCUR_set (sv, size);
231     NEED_SUCCESS (clGetCommandQueueInfo, (this, name, size, SvPVX (sv), 0));
232     XPUSHs (sv);
233     }
234