0

配列に 1000 個の float データがあります。4つのクラスとしましょう。それらのサイズは予測できません。CPU 実装のリンク リストにそれらを簡単に保持できますが、OpenCL カーネルでは、そのような機会はありますか? 私の考えでは、この問題には3つの解決策があります。まず、長さが 1000 の配列がクラスの数で構築されます。これはメモリ コストがかかります。次に、長さ 1000 の配列を割り当て、それらをパーツに分割します。ただし、各クラスのサイズがわからず、それぞれに指定したサイズを超える可能性があるため、インデックスから値を別のインデックスに転送する場合があります。

3番目に、私の意見では、同じ長さの2つの異なる配列を取得します。1 つはデータを格納し、もう 1 つはポインタを格納します。たとえば、データ配列の i 番目のインデックスには、2 番目のクラスに属する値が格納されます。さらに、2 番目のクラスに属する次のデータへのポインターの i 番目のインデックス。ただし、これはアトミック型 (int、float、char など) のリンク リストにのみ適しています。

私はOpenCLの初心者です。私はまだそれの多くの機能を知りません。より良い方法がある場合は、私や他の人と共有しないでください。

4

1 に答える 1

3

通常、GPU でポインターを使用することは非常に悪い考えです。大部分のデータはグローバル メモリに存在し、すばやくフェッチするには、アクセスを結合する必要があります。ポインターを使用すると、アクセス パターンが完全に壊れ、本質的にランダムになります。多くのキャッシュ ミスが発生するため、CPU にもあまり適していませんが、CPU にはより大きなキャッシュと「よりスマートな」内部ロジックがあるため、通常はそれほど重要ではありませんが、キャッシュを認識するメモリ アクセス パターンにより、CPU アプリケーションの速度がほぼ向上する場合があります。桁違い。GPU では、結合されたグローバル メモリ アクセスは最も重要な最適化の 1 つであり、ポインターはそれを提供できません。

メモリが極端に不足していない場合は、最初の方法を使用して、すべてのデータを保持するのに十分な大きさの配列を事前に割り当てることをお勧めします。メモリが非常に不足している場合は、テクスチャを使用してデータとポインタ配列を保存できますが、利点があるかどうかはアルゴリズムによって異なります。

于 2012-05-03T17:28:56.590 に答える