ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.xs
(Generate patch)

Comparing OpenCL/OpenCL.xs (file contents):
Revision 1.3 by root, Tue Nov 15 20:38:07 2011 UTC vs.
Revision 1.4 by root, Tue Nov 15 21:13:42 2011 UTC

103 return (void *)SvIV (SvRV (sv)); 103 return (void *)SvIV (SvRV (sv));
104 104
105 croak ("%s: %s is not of type %s", func, svname, pkg); 105 croak ("%s: %s is not of type %s", func, svname, pkg);
106} 106}
107 107
108static void *
109tmpbuf (size_t size)
110{
111 static void *buf;
112 static size_t len;
113
114 if (len < size)
115 {
116 free (buf);
117 len = ((size + 31) & ~4095) + 4096 - 32;
118 buf = malloc (len);
119 }
120
121 return buf;
122}
123
108MODULE = OpenCL PACKAGE = OpenCL 124MODULE = OpenCL PACKAGE = OpenCL
109 125
110PROTOTYPES: ENABLE 126PROTOTYPES: ENABLE
111 127
112BOOT: 128BOOT:
142 cl_platform_id *list; 158 cl_platform_id *list;
143 cl_uint count; 159 cl_uint count;
144 int i; 160 int i;
145 161
146 NEED_SUCCESS (GetPlatformIDs, (0, 0, &count)); 162 NEED_SUCCESS (GetPlatformIDs, (0, 0, &count));
147 Newx (list, count, cl_platform_id); 163 list = tmpbuf (sizeof (*list) * count);
148 NEED_SUCCESS (GetPlatformIDs, (count, list, 0)); 164 NEED_SUCCESS (GetPlatformIDs, (count, list, 0));
149 165
150 EXTEND (SP, count); 166 EXTEND (SP, count);
151 for (i = 0; i < count; ++i) 167 for (i = 0; i < count; ++i)
152 PUSHs (NEW_MORTAL_OBJ ("OpenCL::Platform", list [i])); 168 PUSHs (NEW_MORTAL_OBJ ("OpenCL::Platform", list [i]));
153
154 Safefree (list);
155} 169}
156 170
157void 171void
158context_from_type_simple (cl_device_type type = CL_DEVICE_TYPE_DEFAULT) 172context_from_type_simple (cl_device_type type = CL_DEVICE_TYPE_DEFAULT)
159 PPCODE: 173 PPCODE:
191 cl_device_id *list; 205 cl_device_id *list;
192 cl_uint count; 206 cl_uint count;
193 int i; 207 int i;
194 208
195 NEED_SUCCESS (GetDeviceIDs, (this, type, 0, 0, &count)); 209 NEED_SUCCESS (GetDeviceIDs, (this, type, 0, 0, &count));
196 Newx (list, count, cl_device_id); 210 list = tmpbuf (sizeof (*list) * count);
197 NEED_SUCCESS (GetDeviceIDs, (this, type, count, list, 0)); 211 NEED_SUCCESS (GetDeviceIDs, (this, type, count, list, 0));
198 212
199 EXTEND (SP, count); 213 EXTEND (SP, count);
200 for (i = 0; i < count; ++i) 214 for (i = 0; i < count; ++i)
201 PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i])); 215 PUSHs (sv_setref_pv (sv_newmortal (), "OpenCL::Device", list [i]));
202
203 Safefree (list);
204} 216}
205 217
206void 218void
207context_from_type_simple (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_DEFAULT) 219context_from_type_simple (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_DEFAULT)
208 PPCODE: 220 PPCODE:
558 570
559 if (ev) 571 if (ev)
560 XPUSH_NEW_OBJ ("OpenCL::Event", ev); 572 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
561} 573}
562 574
563 /*TODO http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html */ 575void
576enqueue_nd_range_kernel (OpenCL::Queue this, OpenCL::Kernel kernel, SV *global_work_offset, SV *global_work_size, SV *local_work_size = &PL_sv_undef, ...)
577 PPCODE:
578{
579 cl_event ev = 0;
580 size_t *gwo = 0, *gws, *lws = 0;
581 int gws_len;
582 size_t *lists;
583 int i;
584 EVENT_LIST (2, items - 2);
585
586 if (!SvROK (global_work_size) || SvTYPE (SvRV (global_work_size)) != SVt_PVAV)
587 croak ("clEnqueueNDRangeKernel: global_work_size must be an array reference");
588
589 gws_len = AvFILLp (SvRV (global_work_size)) + 1;
590
591 lists = tmpbuf (sizeof (size_t) * 3 * gws_len);
592
593 gws = lists + gws_len * 0;
594 for (i = 0; i < gws_len; ++i)
595 gws [i] = SvIV (AvARRAY (SvRV (global_work_size))[i]);
596
597 if (SvOK (global_work_offset))
598 {
599 if (!SvROK (global_work_offset) || SvTYPE (SvRV (global_work_offset)) != SVt_PVAV)
600 croak ("clEnqueueNDRangeKernel: global_work_offset must be undef or an array reference");
601
602 if (AvFILLp (SvRV (global_work_size)) + 1 != gws_len)
603 croak ("clEnqueueNDRangeKernel: global_work_offset must be undef or an array of same size as global_work_size");
604
605 gwo = lists + gws_len * 1;
606 for (i = 0; i < gws_len; ++i)
607 gwo [i] = SvIV (AvARRAY (SvRV (global_work_offset))[i]);
608 }
609
610 if (SvOK (local_work_size))
611 {
612 if (SvOK (local_work_size) && !SvROK (local_work_size) || SvTYPE (SvRV (local_work_size)) != SVt_PVAV)
613 croak ("clEnqueueNDRangeKernel: global_work_size must be undef or an array reference");
614
615 if (AvFILLp (SvRV (local_work_size)) + 1 != gws_len)
616 croak ("clEnqueueNDRangeKernel: local_work_local must be undef or an array of same size as global_work_size");
617
618 lws = lists + gws_len * 2;
619 for (i = 0; i < gws_len; ++i)
620 lws [i] = SvIV (AvARRAY (SvRV (local_work_size))[i]);
621 }
622
623 NEED_SUCCESS (EnqueueNDRangeKernel, (this, kernel, gws_len, gwo, gws, lws, event_list_count, event_list_ptr, GIMME_V != G_VOID ? &ev : 0));
624
625 if (ev)
626 XPUSH_NEW_OBJ ("OpenCL::Event", ev);
627}
564 628
565void 629void
566enqueue_marker (OpenCL::Queue this) 630enqueue_marker (OpenCL::Queue this)
567 PPCODE: 631 PPCODE:
568{ 632{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines