私のOpenCLカーネルでは、通常は4つのエントリの小さな配列を使用する必要がありますが、その配列が(おそらく通常の変数よりもはるかに低速な種類のメモリに)保存されるかどうかという懸念から4つの別個の変数とswitch-caseステートメントを使用して、インデックスに基づいて正しいものにアクセスします。小さな配列はカーネルに変数のように保存されていますか?
4つのfloat4の小さな配列を4つの別々のfloat4変数として高速かつシームレスに作成する方法はありますか?
これは私がやろうとしていることです:私のカーネルは、v
に適用する操作のリストを調べることで、float4変数を1つ生成します。順番に実行され、リストの操作後の操作はv
に適用されますが、そのリストにはブラケット/かっこのような種類があります。演算のように、操作のグループを分離して分離してからそのブラケットは残りと一緒に戻される。
ブラケット(0のブラケットの深さでの電流値を表すように)、私は一時的のがv0
を言わせにv
の値を格納する必要が開かれているのであれば、その後v
を0にリセットすることができ、内部動作を行いますブラケット内に別のブラケットがある場合は、v
をv1
に入れてv2
とv3
に入れ、入れ子になった括弧を詳しく説明します。これは、例えば、ブラケット内で生成された他のものにのみ影響を与えるブラケット内に乗算を適用できるようにするためです。
一度ブラケットが閉じると、私は検索します。 v3
を追加してv
を追加し、最後にすべての括弧が閉じ、v
が一連の操作の最終的な望ましい値を表し、グローバルバッファに書き込まれます。これは、switch-caseステートメントを使って現在のブラケットの深さに応じて正しい変数を選択することで可能ですが、これは配列のためのものであるため、これは非常に不合理です。だから、私がするべき最良のことが何であるか分かりません。
「配列がどのように格納されるかに関する私の懸念」コンパイラは通常、小さな配列を直接レジスタに入れますが、もちろんこれは多くのことに依存します。いつものように、確実に確認する唯一の方法は分解をチェックすることです。 –
ああ、知っておいてよかった。それはどんな配列ですか?プライベート? –
はい、「プライベート」です。それはローカルに宣言された変数のデフォルトのアドレス空間なので、明示的に指定する必要はありません。 –