問題タブ [register-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
604 参照

memory - ブロック内のcuda最大数と割り当て管理

私はCUDAカーネルを書いており、このデバイスで実行する必要があります:

最小形式のカーネルは次のとおりです。

ここで、Ndim=2、Nbins=128、devParameters は、メソッド p.lId が (ブロック内の) ローカル スレッドの ID をカウントするためのクラスであり、din2Cec は、dim Ndim*Nbins の Vector を新しいコマンドで作成するためのクラスです (そのデストラクタで、対応するdelete []を実装しました)。nvcc の出力は次のとおりです。

スレッドの数は、MultiProcessors の制限と互換性があります: 最大共有メモリ、スレッドごとの最大レジスタ、および MP ごとの MP とワープ。64 スレッド X 30 ブロック (ブロックあたりの共有メモリは 4128) を起動すると問題ありませんが、30 ブロックを超えるとエラーが発生します。

これは単一スレッドのメモリを割り当てる際の問題だと思いますが、MP ごとの制限と合計ブロックの制限がわかりません...誰かが私を助けたり、適切なトピックを思い出させたりできますか?

PS: 提示されたカーネルが何もしないことは知っていますが、それは私の限界の問題を理解するためのものです。

0 投票する
2 に答える
1486 参照

cuda - Cudaシングルスレッドスコープ変数

関数の外部で宣言されたシングルスレッドスコープの変数(レジスタまたはローカルメモリ)をcudaに使用させることは可能ですか?

私のデバイス関数のほとんどは、同じ変数を使用する必要があります。

すべてのデバイス関数にパラメーターと同じ変数を渡す代わりに、関数の外部で変数を宣言したいと思います。

それは可能ですか?

私の計算能力は1.2です。

編集:例:

3つのデバイス関数は、同じ変数を操作する必要があります。各変数は、スレッドごとに依存して計算されます。私の理解では、各スレッドに対してローカルになるように変数を宣言できないため、上記のコードを使用することはできません。

代わりに、カーネル関数内ですべての変数を宣言してから、変数へのポインターを他のすべての関数に渡す必要があります。

0 投票する
2 に答える
277 参照

fortran - Fortran の「同等性」

Fortran の Equivalence(a1,a2) ステートメントに a1 と a2 という 2 つの変数が表示され、同じメモリ空間を占有することを理解しています。これは、a1 と a2 の両方がそのプロシージャ内のローカル変数であるプロシージャで発生するとします。

これは、メモリ内に a1 と a2 のコピーしか持てないということですよね?値の 1 つが上書きされるためです。プロシージャ全体で a1 をメモリ ロケーションに保持し、a2 をレジスタに保持することができますが、これで問題ありませんか?

私の質問は基本的に次のとおりです。手順全体で a1 を登録簿に保管できますか?

はい...レジスタを使い果たし、a1をメモリに保存しなければならない場合を除きます。次に、a2 を上書きしてその値を失い、変数 a1 と a2 の両方が実際に a1 の値を指します。

0 投票する
2 に答える
1200 参照

llvm - 新しいレジスタ割り当てパス llvm を追加します

llvm で新しいレジスタ割り当てパスを作成しています。ここの指示に従いましたhttp://llvm.org/docs/WritingAnLLVMPass.html#the-machinefunctionpass-class

パスは llc --help に表示されません。貪欲な割り当てアルゴリズムを「貪欲な」という名前で登録するように変更して構築しました。これでもllcには反映されていないようです。誰でも助けることができますか?

0 投票する
2 に答える
586 参照

c++ - SSE レジスタとスタックの間でデータが移動するのはいつですか?

を呼び出すとどうなるか正確にはわかりません_mm_load_ps。つまり、4 つの浮動小数点数の配列を にロードし__m128、これを使用して SIMD アクセラレーション演算を実行し、それらを元に戻すことができますが、この__m128データ型はまだスタックにありませんか? つまり、任意の量のベクトルをロードするのに十分なレジスターがないことは明らかです。したがって、これらの 128 ビットのデータは、SIMD 命令を使用して計算を行うたびに前後に移動しますか? もしそうなら、のポイントは_mm_load_ps何ですか?

多分私はそれをすべて間違っていますか?

0 投票する
1 に答える
1294 参照

c - x86 レジスタの名前変更のコスト

amd64 で gcc または clang を使用してコンパイルする次のコード

次のアセンブリを生成します。

ビット単位は連想である必要があるため、ペア単位で 2 つのレジスタに蓄積し、次にそれらの 2 つandのレジスタに蓄積する方が効率的であると想定されます。andこれにより、依存関係が解消され、複数の ALU を持つ CPU での並列実行が可能になります。

コンパイラーはandすべての操作で同じレジスターに対して行うため、依存関係自体を破壊するためにレジスターの名前変更を実行できる CPU に依存していると想定しています。

CPU のレジスタ名変更機能にはコストがかからず、amd64 で常に利用できますか、それともコンパイラがこのようなコードをコンパイルするのはなぜですか?

アップデート:

tree-assoc-width に高い値を渡すと、gcc が予想される依存関係チェーンの切断を実行できることがわかりました。

0 投票する
1 に答える
82 参照

compiler-construction - 複数のこぼれた値を単一の命令のオペランドとして処理する方法は?

Poletto と Sarkar によって提案されたLinear Scan Register Allocationアルゴリズムを実装したいと考えています。これは非常に簡単で、すべてのライブ間隔にレジスタまたはスタックの場所を割り当てます。

スタック位置は、レジスタが割り当てられたアクティブな間隔の数がレジスタの数と等しい (つまり、空きレジスタがもうない) 場合にのみ間隔に割り当てられます。

アルゴリズム:

リニア スキャン レジスタ アロケータ

x86 命令add a, ba、 とbが両方ともこのアルゴリズムによってスタック位置に割り当てられた (スピルされた) 変数であるとします。この命令を2 つのメモリ オペランドでエンコードする方法はないため、オペランドの少なくとも 1 つがレジスタに存在する必要があります。命令の前にa を挿入しmov REG, aますが、アルゴリズムを理解しているので、コードのこの時点で空きレジスタはありません。これは通常どのように解決されますか?