使用pycuda(lerp)进行线性插值

时间:2012-01-05 23:15:44

标签: python cuda interpolation pycuda

我是一名刚刚进入pyCUDA的娱乐pythonista。我试图弄清楚如何使用pyCUDA实现线性插值(lerp)。 CUDA CG功能是:http://http.developer.nvidia.com/Cg/lerp.html

我的最终目标是从一组加权随机点中的pycuda中进行双线性插值。我从来没有编写过C或CUDA,而且我正在学习。

这是我走了多远:

import pycuda.autoinit
import pycuda.driver as drv
import pycuda.compiler as comp

lerpFunction = """__global__ float lerp(float a, float b, float w)
{
    return a + w*(b-a);
}"""

mod = comp.SourceModule(lerpFunction) # This returns an error telling me a global must return a void. :(

对此的任何帮助都太棒了!

1 个答案:

答案 0 :(得分:1)

错误消息非常明确--CUDA内核不能返回值,它们必须声明为void,并且可修改的参数作为指针传递。将lerp实现声明为这样的设备函数会更有意义:

__device__ float lerp(float a, float b, float w)
{
    return a + w*(b-a);
}

然后从内核中调用每个需要插值的值。你的lerp功能缺乏很多基础设施和#34;成为一个有用的CUDA内核。


编辑:沿着相同行的一个非常基本的内核可能看起来像这样:

__global__ void lerp_kernel(const float *a, const float *b, const float w, float *y)
{
    int tid = threadIdx.x + blockIdx.x*blockDim.x; // unique thread number in the grid
    y[tid] = a[tid] + w*(b[tid]-a[tid]);
}