使用纹理的Cuda线性插值

时间:2011-12-14 12:23:06

标签: cuda textures interpolation linear

我的曲线如下:

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的lowerBound并考虑在区间[14,25]中的插值等等。

我发现这种方法使我的设备功能非常慢。我听说我可以使用纹理记忆和tex1D来做到这一点!即使点[]不是说统一(通过常数步长增加)也是可能的

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 使用points数组将f(x)中的x值转换为0到7之间的浮点索引(需要对点[]进行二进制搜索)
  2. 使用该浮点索引从图像数组
  3. 获取线性插值

    Cuda纹理记忆可以使第2步非常快。但是,我猜你的内核中的大部分时间都花在了第1步上,我不认为纹理内存可以帮助你。

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

    如果你的数组不适合共享内存,你应该将数组分成相同大小的片段,每个片段有6k个元素,并将每个片段分配给一个块。让每个块读取您正在进行的所有点,并且如果它不在存储在其共享存储器中的points []数组的部分内,则忽略该点。