2016-04-24 1 views
0

私のOpenCLカーネルでは、通常は4つのエントリの小さな配列を使用する必要がありますが、その配列が(おそらく通常の変数よりもはるかに低速な種類のメモリに)保存されるかどうかという懸念から4つの別個の変数とswitch-caseステートメントを使用して、インデックスに基づいて正しいものにアクセスします。小さな配列はカーネルに変数のように保存されていますか?

4つのfloat4の小さな配列を4つの別々のfloat4変数として高速かつシームレスに作成する方法はありますか?

これは私がやろうとしていることです:私のカーネルは、vに適用する操作のリストを調べることで、float4変数を1つ生成します。順番に実行され、リストの操作後の操作はvに適用されますが、そのリストにはブラケット/かっこのような種類があります。演算のように、操作のグループを分離して分離してからそのブラケットは残りと一緒に戻される。

ブラケット(0のブラケットの深さでの電流値を表すように)、私は一時的のがv0を言わせにvの値を格納する必要が開かれているのであれば、その後vを0にリセットすることができ、内部動作を行いますブラケット内に別のブラケットがある場合は、vv1に入れてv2v3に入れ、入れ子になった括弧を詳しく説明します。これは、例えば、ブラケット内で生成された他のものにのみ影響を与えるブラケット内に乗算を適用できるようにするためです。

一度ブラケットが閉じると、私は検索します。 v3を追加してvを追加し、最後にすべての括弧が閉じ、vが一連の操作の最終的な望ましい値を表し、グローバルバッファに書き込まれます。これは、switch-caseステートメントを使って現在のブラケットの深さに応じて正しい変数を選択することで可能ですが、これは配列のためのものであるため、これは非常に不合理です。だから、私がするべき最良のことが何であるか分かりません。

+1

「配列がどのように格納されるかに関する私の懸念」コンパイラは通常、小さな配列を直接レジスタに入れますが、もちろんこれは多くのことに依存します。いつものように、確実に確認する唯一の方法は分解をチェックすることです。 –

+0

ああ、知っておいてよかった。それはどんな配列ですか?プライベート? –

+1

はい、「プライベート」です。それはローカルに宣言された変数のデフォルトのアドレス空間なので、明示的に指定する必要はありません。 –

答えて

2

コンパイラは通常、アドレス空間に宣言された小さな配列を直接レジスタに配置します。もちろん、これは保証ではなく、おそらくそのような最適化の起動に介入する異なるパラメータがあります:

  • アレイサイズ;
  • 登録圧力;
  • こぼれた費用;
  • その他。

通常、最適化では、生成されたアセンブリをチェックすることによってコンパイラが何をしているかを確認するしかありません。

したがって、ブラケットが開いている場合、vの値をv0(ブラケットの深さが0の現在の値を表す)に一時的に保存してからvを0にリセットし、そのブラケットの中に別のブラケットがある場合は、vをv1に入れ、v2とv3を使用して入れ子にします。これは、例えば、ブラケット内で生成された他のものにのみ影響を与えるブラケット内に乗算を適用できるようにするためです。

私はそれが役に立たないと思います。コンパイラは、とにかくスコープを超えて最適化します。単純なことをして、オプティマイザがその仕事をするようにしてください。 の場合は、最適ではないcodegenに気づいた場合は、ではなく、の代わりに解決策を考え始めることがあります。

関連する問題