Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将tex2D与PyCuda一起使用?_Python_Image Processing_Cuda_Pycuda - Fatal编程技术网

Python 如何将tex2D与PyCuda一起使用?

Python 如何将tex2D与PyCuda一起使用?,python,image-processing,cuda,pycuda,Python,Image Processing,Cuda,Pycuda,我是一名Python程序员,最近开始使用PyCuda,因为我需要编写一个用于图像处理的自定义过滤器。 我发现了tex2D,它在处理填充和超出范围的问题时显得非常优雅。 我的问题是,我对如何将数据传递到cuda内核感到非常困惑 现在我已经做到了这一点: #/usr/bin/env蟒蛇3 “”“最简单的示例:使用纹理返回输入的cuda内核”“” 将numpy作为np导入 将pycuda.driver导入为cuda 从pycuda.compiler导入SourceModule 导入pycuda.aut

我是一名Python程序员,最近开始使用PyCuda,因为我需要编写一个用于图像处理的自定义过滤器。 我发现了
tex2D
,它在处理填充和超出范围的问题时显得非常优雅。 我的问题是,我对如何将数据传递到cuda内核感到非常困惑

现在我已经做到了这一点:

#/usr/bin/env蟒蛇3
“”“最简单的示例:使用纹理返回输入的cuda内核”“”
将numpy作为np导入
将pycuda.driver导入为cuda
从pycuda.compiler导入SourceModule
导入pycuda.autoinit
从pycuda.tools将数据类型导入到
#cuda内核
mod=SourceModule(“”)
#包括
纹理我的_tex;
__全局无效返回输入(常量输入宽度、常量输入高度、浮点*输出)
{
int row=blockIdx.x*blockDim.x+threadIdx.x;
int col=blockIdx.y*blockDim.y+threadIdx.y;
if(行<输入高度和列<输入宽度)
{
int index=col*输入宽度+行;
输出[索引]=tex2D(my_tex,row,col);
}
}
""")
#从cuda内核获取
return\u input=mod.get\u函数(“return\u input”)
my_-tex=mod.get_-texref('my_-tex'))
#设置纹理
形状=(5,5)
img_cpu=np.random.rand(*shape).astype(np.float32)
打印(img_cpu)
img_gpu=cuda.matrix_to_array(img_cpu,order='C',allow_double_hack=True)
my_tex.set_阵列(img_gpu)
#设置输出
out\u cpu=np.zeros((shape),dtype=np.float32)
out\U gpu=cuda.to\U设备(out\U cpu)
#构建网格
块大小=32
img_高度,img_宽度=np.形状(img_cpu)
网格=(int(np.ceil(img_高度/块大小)),
int(np.ceil(img_宽度/块大小)),
1)
#调用cuda内核
返回\u输入(img\u宽度,
img_高度,
在gpu之外,
块=(块大小,块大小,1),
网格=网格)
#复制回主机
cuda.memcpy\u dtoh(输出gpu,输出cpu)
打印(输出cpu)

对于每个遇到同样问题的人,我的解决方案如下:

Cuda文件名为
minimal\u kernel.cu

#包括
纹理我的_tex;
__全局无效返回输入(常量输入宽度、常量输入高度、浮点*输出)
{
int row=blockIdx.x*blockDim.x+threadIdx.x;
int col=blockIdx.y*blockDim.y+threadIdx.y;
if(行<输入高度和列<输入宽度)
{
int index=col*输入宽度+行;
输出[索引]=tex2D(my_tex,row,col);
}
}
Python文件:

#/usr/bin/env蟒蛇3
“”“最简单的示例:使用纹理返回输入的cuda内核”“”
将numpy作为np导入
将pycuda.driver导入为cuda
从pycuda.compiler导入SourceModule
导入pycuda.autoinit
#从cuda内核获取
将open('./最小_kernel.cu',r')作为f:
mod=SourceModule(f.read())
return\u input=mod.get\u函数(“return\u input”)
my_-tex=mod.get_-texref('my_-tex'))
#设置纹理
形状=(5,5)
img_in=np.random.rand(*shape).astype(np.float32)
打印(img_英寸)
cuda.matrix_to_texref(img_in,my_tex,order='C')
#设置输出
img_out=np.zeros(shape,dtype=np.float32)
#构建网格
块大小=32
img_高度,img_宽度=np.int32(np.shape(img_in))
网格=(int(np.ceil(img_高度/块大小)),
int(np.ceil(img_宽度/块大小)),
1)
#调用cuda内核
返回\u输入(img\u宽度,
img_高度,
cuda.Out(img_Out),
texrefs=[my_tex],
块=(块大小,块大小,1),
网格=网格)
打印(图像输出)

谢谢,我已经找到了这个,并试图提取相关信息,但这对我没有多大帮助。我可能需要一个如何使用这个的最小的例子。在非常感谢中有一个非常简短的例子!我最近发现了错误!:)