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 を使用できると聞きました。ポイント[]が均一でなくても可能ですか(一定のステップでインクリメントされます)

何か案が ?

4

1 に答える 1

1

この問題は2つの部分に分けることができるようです。

  1. points配列を使用して、f(x)のx値を0から7までの浮動小数点インデックスに変換します(points []での二分探索が必要です)
  2. その浮動小数点インデックスを使用して、画像配列から線形補間された値を取得します

Cudaテクスチャメモリはステップ2を非常に速くすることができます。ただし、カーネル内のほとんどの時間はステップ1に費やされていると思います。また、テクスチャメモリがそこで役立つとは思いません。

共有メモリをまだ利用していない場合は、配列を共有メモリに移動すると、テクスチャメモリを使用するよりもはるかに高速化されます。最近のハードウェアには48kの共有メモリがあるため、アレイが24k(6k要素)未満の場合は、両方とも共有メモリに収まるはずです。ステップ1は、グローバルメモリでは非常に遅いpoints []の非連続読み取りを必要とするため、共有メモリから大きなメリットを得ることができます。

配列が共有メモリに収まらない場合は、配列をそれぞれ6kの要素を持つ同じサイズの断片に分割し、各断片をブロックに割り当てる必要があります。各ブロックに、補間するすべてのポイントを読み取らせ、共有メモリに格納されているpoints []配列の部分内にない場合は、そのポイントを無視するようにします。

于 2011-12-14T23:10:11.190 に答える