xpra icon
Bug tracker and wiki

Ticket #925: test_opencl.py

File test_opencl.py, 3.0 KB (added by Antoine Martin, 4 years ago)

example code that does work

Line 
1#!/usr/bin/env python
2
3import pyopencl as cl
4import sys
5from PIL import Image
6import numpy
7
8def RoundUp(groupSize, globalSize):
9    r = globalSize % groupSize;
10    if r == 0:
11        return globalSize;
12    else:
13        return globalSize + groupSize - r;
14
15GRAYSCALE_CL = """
16const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE |
17                          CLK_ADDRESS_CLAMP_TO_EDGE |
18                          CLK_FILTER_NEAREST;
19 
20__kernel void rgbaToGrayscale(__read_only image2d_t srcImg,
21                              __write_only image2d_t dstImg)
22{
23    // Converts RGBA image to gray scale intensity using the following formula:
24    // I = 0.2126 * R + 0.7152 * G + 0.0722 * B
25 
26    int2 coord = (int2) (get_global_id(0), get_global_id(1));
27    int width = get_image_width(srcImg);
28    int height = get_image_height(srcImg);
29 
30    if (coord.x < width && coord.y < height)
31    {
32        uint4 color = read_imageui(srcImg, sampler, coord);
33        float luminance = 0.2126f * color.x + 0.7152f * color.y + 0.0722f * color.z;
34        color.x = color.y = color.z = (uint)luminance;
35         
36        // Write the output value to image
37        write_imageui(dstImg, coord, color);
38    }
39}
40"""
41
42def main():
43    imageObjects = [ 0, 0 ]
44    if len(sys.argv) != 3:
45        print "USAGE: " + sys.argv[0] + " <inputImageFile> <outputImageFile>"
46        return 1
47    # create context and command queue
48    ctx = cl.create_some_context()
49    queue = cl.CommandQueue(ctx)
50    # load image
51    im = Image.open(sys.argv[1])
52    if im.mode != "RGBA":
53        im = im.convert("RGBA")
54    imgSize = im.size
55    buf = im.tobytes()
56    # Create ouput image object
57    clImageFormat = cl.ImageFormat(cl.channel_order.RGBA, cl.channel_type.UNSIGNED_INT8)
58    imageObjects[0] = cl.Image(ctx,
59                                cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR,
60                                clImageFormat,
61                                imgSize,
62                                None,
63                                buf)
64    imageObjects[1] = cl.Image(ctx,
65                            cl.mem_flags.WRITE_ONLY,
66                            clImageFormat,
67                            imgSize)
68 
69    # Create OpenCL program
70    program = cl.Program(ctx, GRAYSCALE_CL).build()
71    # Call the kernel directly
72    localWorkSize = ( 16, 16 )
73    globalWorkSize = ( RoundUp(localWorkSize[0], imgSize[0]),
74                    RoundUp(localWorkSize[1], imgSize[1]) )
75    program.rgbaToGrayscale(queue,
76                            globalWorkSize,
77                            localWorkSize,
78                            imageObjects[0],
79                            imageObjects[1])
80    # Read the output buffer back to the Host
81    buf = numpy.zeros(imgSize[0] * imgSize[1] * 4, numpy.uint8)
82    origin = ( 0, 0, 0 )
83    region = ( imgSize[0], imgSize[1], 1 )
84    cl.enqueue_read_image(queue, imageObjects[1],
85                        origin, region, buf).wait()
86    print "Executed program succesfully."
87    # Save the image to disk
88    gsim = Image.fromstring("RGBA", imgSize, buf.tobytes())
89    gsim.save(sys.argv[2])
90
91main()