… | |
… | |
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 | |
|
|
108 | static void * |
|
|
109 | tmpbuf (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 | |
108 | MODULE = OpenCL PACKAGE = OpenCL |
124 | MODULE = OpenCL PACKAGE = OpenCL |
109 | |
125 | |
110 | PROTOTYPES: ENABLE |
126 | PROTOTYPES: ENABLE |
111 | |
127 | |
112 | BOOT: |
128 | BOOT: |
… | |
… | |
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 | |
157 | void |
171 | void |
158 | context_from_type_simple (cl_device_type type = CL_DEVICE_TYPE_DEFAULT) |
172 | context_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 | |
206 | void |
218 | void |
207 | context_from_type_simple (OpenCL::Platform this, cl_device_type type = CL_DEVICE_TYPE_DEFAULT) |
219 | context_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 */ |
575 | void |
|
|
576 | enqueue_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 | |
565 | void |
629 | void |
566 | enqueue_marker (OpenCL::Queue this) |
630 | enqueue_marker (OpenCL::Queue this) |
567 | PPCODE: |
631 | PPCODE: |
568 | { |
632 | { |