Hi,
    how do I write a kernel that reads from a PIL.Image and writes to
another, without doing using any unnecessary malloc and memcpy operations?

So far I could only implement it like this:

SHAPE = (16,16)
def some_filter(src):
        fmt = cl.ImageFormat(cl.channel_order.RGBA,
cl.channel_type.UNORM_INT8)
        src_np = numpy.fromstring(src.tostring(),
dtype=numpy.uint32).reshape(src.size)
        dst_np = numpy.empty(src.size, dtype=numpy.uint32)

        src_buf = cl.Image(self.ctx, flags=mf.READ_ONLY, format=fmt,
shape=src.size)
        dst_buf = cl.Image(self.ctx, flags=mf.WRITE_ONLY, format=fmt,
shape=src.size)
        cl.enqueue_copy(self.queue, src_buf, src_np, origin=(0,0),
region=src.size)
        self.prg.somefilter(queue, src.size, SHAPE, src_buf, dst_buf)
        cl.enqueue_copy(self.queue, dst_np, dst_buf, origin=(0,0),
region=src.size)

        dst = Image.frombytes('RGBA', src.size, dst_np)
        return dst

Kernel code:

__constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE |
CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
kernel void somefilter(
    __read_only image2d_t srcImage,
    __write_only image2d_t dstImage,
) {
    const int2 pos = {get_global_id(0), get_global_id(1)};
    float4 pixel = read_imagef(srcImage, SAMPLER, pos);
    //omissis: actual filter operation
    write_imagef(dstImage, pos, pixel);
}

The above is terrible, because:
1) performs a first copy when I invoke PIL.Image.tostring()
2) performs a second copy when I invoke numpy.fromstring()
3) performs a third copy with Image.frombytes()

How do I read/write directly from/to a PIL.Image to/from the GPU memory?

TIA
_______________________________________________
PyOpenCL mailing list
[email protected]
http://lists.tiker.net/listinfo/pyopencl

Reply via email to