从纯python代码自动创建opencl内核
py2opencl的Python项目详细描述
===
py2oppencl
==
内核(用类似c的语言编写),然后使用andreas klóckner的pyopencl
模块提交GPU的内核。它不是要将任意的
python代码转换为opencl,因为这是不可能的。相反,它仅限于
简单的python lambda和只包含简单数学运算的函数
和内置的opencl函数。
Py2Pencl,F
Py2=Py2Pencl(Lambda x:-x如果x和lt;0.5否则f.sin(x))
a=Py2.map(np.ran随机.rand(10000000))
>打印Py2.kernel
>>;
>gt;
>gt;int-g id=get_global const float*x,全局float*resu g;
>>>;gt;int-gid=get_global_id(0)id(0);
>>>
>>>;res_g[gid]=((x[gid]<;0.5))?-x[gid]:sin(x[gid]);
>;}
>虽然有许多约束,但支持更复杂的函数。以下函数对图像像素进行平均:
import numpy as np
from py2oppencl import py2oppencl,f
import image
img_path='py2oppencl/test/lenna.png'
img=np.array(image.open(img_path).convert('rgb')
def avg(x,y,z,dest,src):
注意,生成的c代码将自动处理包装
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,(右/4)+(左/4)+(上/4)+(上/4)+(下/4)
dest=py2oppencl(avg.map(img)
image.fromarray(dest'rgb').save('foo.png')
opencl驱动程序应该在mac os x上开箱即用。如果你在linux上,没有一个好的gpu,我应该在macos x上开箱即用。如果你在linux上,又没有一个好的gpu,那么我应该在macos x上开箱即用py2oppencl。如果你在linux上,如果你在linux上,没有一个好的gpu,我建议AMD的ICD,发现`这里是http://developer.amd.com/tools and sdks/opencl zone/opencl tools sdks/amd accelerated parallel processing app sdk/`
(截至2014年7月26日)。它支持现代英特尔CPU,不需要GPU。(可能它也支持AMD CPU。)
截至本文撰写之时,Intel的Beignet驱动程序在Ubuntu14.04上似乎已被破坏。
>在Ubuntu14.04上经过测试的平台
==
-nvidia cuda/nvidia-opencl-icd-331在Ubuntu14.04上
-amd加速并行处理(AMD-app-sdk-v2.9)在Intel Core i7-3610qm上,ubuntu 14.04
-苹果针对intel core i5-4258u的opencl驱动程序,os x 10.9
-苹果针对intel“iris”(intel hd 4000)的opencl驱动程序,os x 10.9
=====
-支持while循环和c-style循环(即,for i i n range(n)
-性能写入
py2oppencl
==
模块提交GPU的内核。它不是要将任意的
python代码转换为opencl,因为这是不可能的。相反,它仅限于
简单的python lambda和只包含简单数学运算的函数
和内置的opencl函数。
Py2Pencl,F
Py2=Py2Pencl(Lambda x:-x如果x和lt;0.5否则f.sin(x))
a=Py2.map(np.ran随机.rand(10000000))
>打印Py2.kernel
>>;
>gt;
>gt;int-g id=get_global const float*x,全局float*resu g;
>>>;gt;int-gid=get_global_id(0)id(0);
>>>
>>>;res_g[gid]=((x[gid]<;0.5))?-x[gid]:sin(x[gid]);
>;}
>虽然有许多约束,但支持更复杂的函数。以下函数对图像像素进行平均:
import numpy as np
from py2oppencl import py2oppencl,f
import image
img_path='py2oppencl/test/lenna.png'
img=np.array(image.open(img_path).convert('rgb')
def avg(x,y,z,dest,src):
注意,生成的c代码将自动处理包装
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,(右/4)+(左/4)+(上/4)+(上/4)+(下/4)
dest=py2oppencl(avg.map(img)
image.fromarray(dest'rgb').save('foo.png')
(截至2014年7月26日)。它支持现代英特尔CPU,不需要GPU。(可能它也支持AMD CPU。)
截至本文撰写之时,Intel的Beignet驱动程序在Ubuntu14.04上似乎已被破坏。
>在Ubuntu14.04上经过测试的平台
==
-nvidia cuda/nvidia-opencl-icd-331在Ubuntu14.04上
-amd加速并行处理(AMD-app-sdk-v2.9)在Intel Core i7-3610qm上,ubuntu 14.04
-苹果针对intel core i5-4258u的opencl驱动程序,os x 10.9
-苹果针对intel“iris”(intel hd 4000)的opencl驱动程序,os x 10.9
-支持while循环和c-style循环(即,for i i n range(n)
-性能写入