【问题标题】:Cuda linear interpolation using textures使用纹理的 Cuda 线性插值
【发布时间】:2019-08-01 06:33:09
【问题描述】:

我的曲线如下:

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 来做到这一点!即使 points[] 不是统一的(以恒定步长递增),是否有可能

有什么想法吗?

【问题讨论】:

    标签: cuda textures linear-interpolation


    【解决方案1】:

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

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

    Cuda 纹理内存可以使第 2 步非常快。不过,我猜你内核中的大部分时间都花在了第 1 步上,我认为纹理内存在这方面对你没有帮助。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多