【发布时间】:2020-09-24 09:20:09
【问题描述】:
我有两个向量 '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 以便我可以使用权重向量来解决这个问题。
【问题讨论】:
-
上面有a whole blog article。并且您提供的 lerp 链接不是 CUDA,而是 Cg.
-
哎呀,你是对的,它是 Cg。将相应地更新帖子。我以前看过那篇博客文章。如果我理解正确,t 需要是 0 到 1 之间的数字。如何将我的 x 向量转换成那个?我应该使用 min(xp) 和 max(fp) 重新缩放“x”吗?
标签: python c++ numpy cuda lerp