Skip to main content

auto-creation of OpenCL kernels from pure Python code

Project description

=========
py2OpenCL
=========

OpenCL is a powerful means of applying the same simple function (a "kernel") to
large arrays of similar data.

py2OpenCL uses Python's AST module to convert a Python function to an OpenCL
kernel (written in a C-like language), then uses Andreas Klöckner's PyOpenCL
module to submit the kernel to the GPU. It is not meant to convert arbitrary
Python code to OpenCL, as that would be impossible. Instead, it is limited to
simple Python lambdas and functions containing only simple mathematical operations
and built-in OpenCL functions.


Examples
========

The following code returns a new numpy array holding the results of the lambda function:


import numpy as np
from py2opencl import Py2OpenCL, F

py2 = Py2OpenCL( lambda x: -x if x < 0.5 else F.sin(x) )
a = py2.map( np.random.rand(10000000) )

print py2.kernel

>> __kernel void sum( __global const float *x, __global float *res_g) {
>> int gid = get_global_id(0);
>> res_g[gid] = (((x[gid] < 0.5)) ? -x[gid] : sin( x[gid] ));
>> }


More complex functions are supported, though there are many constraints. The following function
averages the pixels of an image:

import numpy as np
from py2opencl import Py2OpenCL, F
import Image

img_path = 'py2opencl/test/Lenna.png'

img = np.array( Image.open( img_path ).convert('RGB') )

def avg( x, y, z, dest, src ):
# note that the C code produced will handle wrapping automatically
right = src[ x+1, y, z ]
left = src[ x-1, y, z ]
up = src[ x, y-1, z ]
down = src[ x, y+1, z ]
dest[x,y,z] = (right / 4) + (left / 4) + (up / 4) + (down / 4)

dest = Py2OpenCL( avg ).map( img )
Image.fromarray( dest, 'RGB').save('foo.png')


OpenCL Drivers
==============

Py2OpenCL should work out-of-the-box on Mac OS X. If you're on Linux and don't have a fancy GPU,
I'd suggest AMD's ICD, found `here http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-tools-sdks/amd-accelerated-parallel-processing-app-sdk/`
(as of 26 Jul 2014). It supports modern Intel CPU's, no GPU required. (Presumably it supports AMD CPUs as well.)

As of this writing, Intel's beignet driver appears to be broken on Ubuntu 14.04.


Tested Platforms
================

- NVIDIA CUDA / nvidia-opencl-icd-331 on Ubuntu 14.04
- AMD Accelerated Parallel Processing (AMD-APP-SDK-v2.9) on Intel Core i7-3610QM, Ubuntu 14.04
- Apple's OpenCL drivers for the Intel Core i5-4258U, OS X 10.9
- Apple's OpenCL drivers for the Intel "Iris" (Intel HD 4000), OS X 10.9


TODO
====

- support while loops and C-style for loops (ie, 'for i in range(n)')
- performance writeup

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

py2opencl-0.4.0.linux-x86_64.tar.gz (26.6 kB view details)

Uploaded Source

File details

Details for the file py2opencl-0.4.0.linux-x86_64.tar.gz.

File metadata

File hashes

Hashes for py2opencl-0.4.0.linux-x86_64.tar.gz
Algorithm Hash digest
SHA256 890d7b60aa892e274a9f1a9e70dd1b7e747317301eb8a1cec3f96da082f1bb41
MD5 9db005f40dba27035ddc3d498a56e9e9
BLAKE2b-256 e0a572e5e8d26511149ffbd0fecdf62cf7123ccea4a3c2cbb314ec18742f0d0e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page