我是一个刚接触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. :(
任何帮助都太棒了!
最佳答案
错误消息非常明显-CUDA内核无法返回值,必须将其声明为void
,并且将可修改的参数作为指针传递。将lerp实现声明为这样的设备函数会更有意义:
__device__ float lerp(float a, float b, float w)
{
return a + w*(b-a);
}
然后从内核内部为每个需要插值的值调用。您的lerp函数缺少很多“基础结构”,无法用作有用的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]);
}
关于python - 使用pycuda(lerp)进行线性插值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8751310/