1

RS カーネルの出力として不定サイズの配列を処理する最も効率的な方法に頭を悩ませようとしています。out 割り当てで最後の関連する配列スロットのインデックスを送信しますが、前の質問への回答で学びました。カーネルの実行後にグローバルを Java に戻す良い方法はありません。以下のパターンにつながるプロセスを再び「ズームアウト」することにしました。

たとえば、極座標の 2 つの配列を含む構造体 (または構造体) を含む入力割り当てがあるとします。以下の set_pair のようなもの:

typedef struct polar_tag{
  uint8_t angle;
  uint32_t mag;
} polar;

typedef struct polar_set_tag{
  uint8_t filled_slots;
  polar coordinates[60];
} polar_set;

typedef struct set_pair_tag{
  polar_set probe_set;
  polar_set candidate_set;
} set_pair;

セット間で類似した座標ペアを見つけたいので、カーネルをセットアップして、どの極座標が類似しているか (存在する場合) を決定します。それらが類似している場合は、「matching_set」のような出力割り当てにロードします。

typedef struct matching_pair_tag{
  uint8_t probe_index;
  uint8_t candidate_index;
} matching_pair;

typedef struct matching_set_tag{
  matching_pair pairs[120];
  uint8_t filled_slots;
} matching_set;

「filled_slots」のような命令で割り当てを作成することは、RS でこの種の不確定な I/O を処理する最も効率的な (または唯一の) 方法ですか、それとももっと良い方法がありますか?

4

1 に答える 1

2

私がこれにアプローチしようとする方法は、ツーパスを行うことだと思います。

0-2 の場合:

セットアップ: 座標ごとに、予想される最大ペア数 (2) を保持する配列を割り当てます。

パス 1: 座標を実行し、現在のアイテムを他の座標のサブセットと比較してペアを探します。サブセットを選択して、カーネルが比較対象の他の座標で実行されるときに重複する回答を回避します。

パス 2: #1 の結果をマージして、リストまたはその他の必要なデータ構造に戻します。座標の数が少ない場合は、呼び出し可能として実行できます。

0-N の場合:

これは非常に難しくなります。上記と同様のことを行う可能性がありますが、典型的なペア数のサイズの座標ごとの配列を使用します。(できれば小さい) オーバーフローの数については、アトミックを使用してオーバーフロー バッファーにスロットを予約します。ここでの問題は、ほとんどの GPU ドライバーが現在のアトミックにあまり満足していないと思うことです。CPU ref で非常にうまく動作します。

これには多くの方法があります。重要な意思決定ポイントの 1 つは、ポイントを見つけるのにかかるコストと結果を書き込むコストを比較することです。

于 2013-10-23T21:04:06.680 に答える