我的曲线如下:
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来做到这一点!即使点[]不是说统一(通过常数步长增加)也是可能的
有什么想法吗?
答案 0 :(得分:1)
看起来这个问题可以分为两部分:
Cuda纹理记忆可以使第2步非常快。但是,我猜你的内核中的大部分时间都花在了第1步上,我不认为纹理内存可以帮助你。
如果您尚未利用共享内存,将阵列移动到共享内存将比使用纹理内存带来更大的加速。最近的硬件上有48k的共享内存,所以如果你的阵列少于24k(6k元素),它们都应该适合共享内存。步骤1可以从共享内存中获益很大,因为它需要非连续读取点[],这在全局内存中非常慢。
如果你的数组不适合共享内存,你应该将数组分成相同大小的片段,每个片段有6k个元素,并将每个片段分配给一个块。让每个块读取您正在进行的所有点,并且如果它不在存储在其共享存储器中的points []数组的部分内,则忽略该点。