Looks like I've found a workaround. It involves setting the set_args
parameters as object properties.
def run_set_args(self):
> mf = cl.mem_flags
> self.a_g = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,
> hostbuf=a_np)
> self.b_g = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,
> hostbuf=b_np)
> self.res_g = cl.Buffer(self.ctx, mf.WRITE_ONLY, a_np.nbytes)
> self.sum_k = self.prg.sum
> self.sum_k.set_args(self.a_g, self.b_g, self.res_g)
On Sun, Oct 18, 2015 at 4:13 PM, Blair Azzopardi <[email protected]> wrote:
> Hi
>
> I'm trying to split my kernel invocations into class methods. Basically,
> I'd like to call set_args in one method and then enqueue_nd_range_kernel in
> another. However, when I try this I receive a "clEnqueueNDRangeKernel
> failed: invalid mem object" exception.
>
> I've adapted the front page example into a short snippet that demonstrates
> the problem. Can anyone see if there's something obvious I', missing. If
> not, I'll file an issue on gitbub.
>
>
>> import numpy as np
>> import pyopencl as cl
>> a_np = np.random.rand(50000).astype(np.float32)
>> b_np = np.random.rand(50000).astype(np.float32)
>> class Test(object):
>> def __init__(self):
>> self.ctx = cl.create_some_context()
>> self.queue = cl.CommandQueue(self.ctx)
>> self.prg = cl.Program(self.ctx, """
>> __kernel void sum(__global const float *a_g, __global const float
>> *b_g, __global float *res_g) {
>> int gid = get_global_id(0);
>> res_g[gid] = a_g[gid] + b_g[gid];
>> }
>> """).build()
>> def run_all(self):
>> mf = cl.mem_flags
>> a_g = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,
>> hostbuf=a_np)
>> b_g = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,
>> hostbuf=b_np)
>> res_g = cl.Buffer(self.ctx, mf.WRITE_ONLY, a_np.nbytes)
>> sum_k = self.prg.sum
>> sum_k.set_args(a_g, b_g, res_g)
>> cl.enqueue_nd_range_kernel(self.queue, sum_k, a_np.shape, None)
>> def run_set_args(self):
>> mf = cl.mem_flags
>> a_g = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,
>> hostbuf=a_np)
>> b_g = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR,
>> hostbuf=b_np)
>> res_g = cl.Buffer(self.ctx, mf.WRITE_ONLY, a_np.nbytes)
>> self.sum_k = self.prg.sum
>> self.sum_k.set_args(a_g, b_g, res_g)
>>
>> def run_enqueue(self):
>> cl.enqueue_nd_range_kernel(self.queue, self.sum_k, a_np.shape,
>> None)
>> o = Test()
>> # runs fine
>> o.run_all()
>> # run separately gives "clEnqueueNDRangeKernel failed: invalid mem object"
>> o.run_set_args()
>> o.run_enqueue()
>
>
> Thanks
> Blair
>
_______________________________________________
PyOpenCL mailing list
[email protected]
http://lists.tiker.net/listinfo/pyopencl