使用纹理的Cuda线性插值

使用纹理的Cuda线性插值,cuda,textures,linear-interpolation,Cuda,Textures,Linear Interpolation,我有一条曲线如下: float points[] = {1, 4, 6, 9, 14, 25, 69}; float images[] = {0.3, 0.4, 0.7, 0.9, 1, 2.5, 5.3}; 为了插值,比如说f(3),我会在1和4之间使用线性插值 为了插值,让我们假设F(15)在点数组上应用二值搜索,得到25的下界,并在区间[14,25]等等中考虑插值。 我发现这种方法使我的设备运行非常缓慢。我听说我可以使用纹理记忆和tex1D来实现这一点!即使点[]不是均匀的(通过常数步递

我有一条曲线如下:

float points[] = {1, 4, 6, 9, 14, 25, 69};
float images[] = {0.3, 0.4, 0.7, 0.9, 1, 2.5, 5.3};
为了插值,比如说f(3),我会在1和4之间使用线性插值 为了插值,让我们假设F(15)在点数组上应用二值搜索,得到25的下界,并在区间[14,25]等等中考虑插值。 我发现这种方法使我的设备运行非常缓慢。我听说我可以使用纹理记忆和tex1D来实现这一点!即使点[]不是均匀的(通过常数步递增),也有可能吗


有什么想法吗?

看起来这个问题可以分为两部分:

  • 使用点数组将f(x)中的x值转换为介于0和7之间的浮点索引(需要对点[]进行二进制搜索)
  • 使用该浮点索引从图像数组中获取线性插值
  • Cuda纹理内存可以使步骤2非常快。然而,我猜内核中的大部分时间都花在了步骤1上,我认为纹理内存在这方面帮不了你

    如果您还没有利用共享内存,那么将阵列移动到共享内存将比使用纹理内存带来更大的加速。在最近的硬件上有48k的共享内存,所以如果您的阵列少于24k(6k个元素),那么它们都应该适合共享内存。步骤1可以从共享内存中受益匪浅,因为它需要点[]的非连续读取,这在全局内存中非常缓慢

    如果数组不适合共享内存,则应将数组分成大小相等的块,每个块包含6k个元素,并将每个块分配给一个块。让每个块读取所有要重新定位的点,如果该点不在存储在共享内存中的points[]数组部分内,则让它忽略该点