0

我有一条曲线如下:

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[] 不是统一的(以恒定步长递增),是否有可能

任何的想法 ?

4

1 回答 1

1

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

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

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

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

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

于 2011-12-14T23:10:11.190 回答