问题描述
我有两个向量“ xp”和“ fp”,分别对应于数据的x和y值。第三个向量“ x”是我要评估插值的x坐标。我使用NumPy的interp函数在python中得到的结果与预期的一样。
import numpy as np
xp = np.array([1.0,1.5,2.0,2.5,3.5,4.0,4.5,7.0,8.0,9.0,10.0,14.0,17.0,18.0,20.0])
yp = xp**2
x = np.array([3,5])
np.interp(x,xp,yp) #array([ 9.25,26. ])
我的问题是如何在cuda内核中复制此算法?
这是我的尝试:
大小-> len(xp)== len(fp), x_size-> len(x)。
__global__ void lerp_kernel(double* xp,double* yp,double* output_result,double* x,unsigned int size,unsigned int x_size)
{
for( unsigned int idx = blockIdx.x*blockDim.x + threadIdx.x ; idx < size ; idx +=
blockDim.x*gridDim.x )
{
if(idx > size - 2){
idx = size - 2;
}
double dx = xp[idx + 1] - xp[idx];
double dy = yp[idx + 1] - yp[idx];
double dydx = dy/dx ;
double lerp_result = yp[idx] + (dydx * (x[idx] - xp[idx]));
output_result[idx] = lerp_result;
}
}
我认为我犯的一个错误是我没有在xp中搜索包含x的索引范围(使用python中的numpy.searchsorted之类的东西)。我不确定如何在CUDA中实现这一部分。如果有人知道在cuda中做lerp的更好方法,请告诉我。
我在Cg(https://developer.download.nvidia.com/cg/lerp.html)文档中看到了lerp函数,但是对于x向量,它们需要权重向量(0-1之间的分数)。我不确定如何重新缩放x,以便可以使用权重向量来解决此问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)