問題タブ [transactional-memory]
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.
c++ - システムまたは IO 呼び出しなしでスリープする
ハードウェア トランザクション メモリを使用するシナリオでは、システムまたは IO 呼び出しを発行しないスリープが必要です (これらの呼び出しは中止につながります)。のように 1 マイクロ秒スリープするusleep(1)
だけで十分です。
This questionは、ネストされたループを実装して、プログラムをビジー状態に保ち、しばらく遅らせることを提案しています。ただし、これらのループを削除する最適化を使用してコンパイルできるようにしたいと考えています。
アイデアは、洗練された数学の方程式を計算することです。これに対するアプローチはありますか?実際の待機時間は正確である必要はありません。ただし、複数の実行で漠然と同じである必要があります。
c++ - Intel TSX ハードウェア トランザクション メモリ 非トランザクション スレッドは何を認識しますか?
2 つのスレッドがあり、1 つが TSX トランザクションを作成し、データ構造を変更するとします。もう一方のスレッドは、いかなる種類の同期も行わず、同じデータ構造を読み取ります。トランザクションはアトミックですか?トランザクションによって変更されたキャッシュラインを読み取ろうとすると、ブロックまたは再起動する方法がないため、実際にはそれが真実であるとは想像できません。
トランザクションがアトミックでない場合でも、x86 の書き込み順序規則は尊重されますか? 書き込み #2 を認識した場合、前の書き込み #1 を認識できなければならないことが保証されます。これは、トランザクションの一部として発生する書き込みにも当てはまりますか?
これらの質問に対する答えはどこにも見つかりませんでした.SOの誰もが知っているとは思えませんが、少なくとも誰かがこれが答えを出すのにGoogleフレンドリーな場所であることを知ったとき.
compiler-construction - 現在、Haswell トランザクショナル メモリをサポートしているコンパイラはどれですか?
どのコンパイラ (2014 年 5 月現在) がトランザクショナル メモリ機能を使用するコードを生成できますか?
c - bluegene/q の XLC コンパイラが「-qtm」をサポートしないのはなぜですか?
BlueGene/q の xlc コンパイラに問題があります。xlc コンパイラのバージョンは 12.1 です。
ドキュメント1によると、トランザクション メモリを有効にするために使用されるコンパイラ オプション「-qtm」をサポートする必要があります。ただし、常に次のエラー メッセージが表示されます。
どうすればそれを理解できますか?どんな助けでも大歓迎です。
x86 - Haswell トランザクション メモリの読み取りセットと書き込みセットの情報
最近、Intel はトランザクション同期拡張機能 (TSX) と呼ばれるハードウェア トランザクション メモリをサポートする haswell マシンをリリースしました。
Intel のマニュアルによると、投機的なメモリ操作である書き込みセットと読み取りセットは、L1 キャッシュと L2 キャッシュにそれぞれバッファリングされます。(ではない正確に)
次に、トランザクショナル メモリ操作を追跡して、アドレスや読み取り/書き込みセットの値などの情報を取得できますか?
c++ - haswell tsx を使用した不思議な rtm の中止
私は haswell の tsx 拡張機能を試しています。既存の中規模 (数千行) のコードベースを、粗粒度のロックの代わりに GCC トランザクション メモリ拡張機能 (このマシンでは間接的に haswell tsx を使用しています) を使用するように適応させています。私は GCC の transactional_memory 拡張機能を使用しており、独自の _xbegin / _xend を直接記述していません。ITM_DEFAULT_METHOD=htm を使用しています
不可解な理由でハードウェア トランザクションが異常終了する率が高いため、十分な速度で動作させるのに問題があります。以下に示すように、これらの中止は競合や容量制限によるものではありません。
以下は、失敗率と根本的な原因を定量化するために使用した perf コマンドです。
したがって、プログラムはトランザクションを含むコードを 3000 万回実行します。各リクエストには、1 つのトランザクション gcc__transaction_atomic
ブロックが含まれます。この実行には 1 つのスレッドしかありません。
この特定のコマンドは、 Intel ソフトウェア開発者マニュアル vol 3perf
に記載されている関連する tsx パフォーマンス イベントのほとんどをキャプチャします。
からの出力perf stat
は次のとおりです。
出力からわかるように:
rtm_retired_start
カウントは 3000 万 (プログラムへの入力と一致)- カウントはほぼ同じです(
rtm_retired_abort
コミットはまったくありません) abort_conflict
とのabort_capacity
カウントは 0 であるため、これらは理由ではありません。また、実行中のスレッドは 1 つだけであることを思い出してください。競合はめったに発生しないはずです。- ここでの唯一の実際のリードは と の高い値で
tx_exec_misc1
ありrtm_retired_aborted_misc3
、説明が多少似ています。
Intel のマニュアル (第 3 巻) では、rtm_retired_aborted_misc3
カウンターを次のように定義しています。
コード:C9H 20H
ニーモニック: RTM_RETIRED.ABORTED_MISC3
説明: HLE に適していない命令が原因で RTM 実行が中止された回数。
の定義にtx_exec_misc1
は、似たような言葉がいくつかあります。
コード: 5DH 01H
ニーモニック: TX_EXEC.MISC1
説明: トランザクションのアボートを引き起こす可能性のあるクラスの命令が実行された回数をカウントします。これは実行回数であるため、必ずしもトランザクションのアボートが発生するとは限りません。
の高精度 (PEBS) サポートを使用したパフォーマンス レコード/パフォーマンス レポートを使用して、アボートのアセンブリの場所を確認しましたrtm_retired_aborted
。場所には、mov
レジスタからレジスタへの命令があります。変な命令名は近くにありません。
アップデート:
それ以来、私が試した2つのことは次のとおりです。
1) ここで見られる tx_exec_misc1 および rtm_retired_aborted_misc3 署名は、たとえば、次の形式のダミー ブロックによって取得できます。
またはいずれかの形式
どちらの場合も、パフォーマンス カウンターは私が見たものと似ています。ただし、どちらの場合も、perf report
for-e cpu/tx-abort/
は直観的に正しいアセンブリ ラインを指しています。xabort
最初の例の命令とsyscall
2 番目の例の命令です。実際のコードベースでは、perf レポートは、関数の開始時にスタック プッシュが行われたことを示しています。
Intel ソフトウェア開発エミュレーターでも同じコマンドを実行しました。その場合、問題はなくなることがわかりました。アプリケーションに関する限り、アボートは発生しません。
cloud - インテル TSX を試す
Intel のトランザクショナル メモリ機能を試してみたいと思っていますが、そのために新しいサーバーを購入する必要はありません。TSX をサポートする CPU を備えたクラウド サービスはありますか?
haskell - GHCランタイムシステムへのフック
Haskell でトランザクション メモリがどのように実装されているかを調べてきましたが、プログラマーに公開された STM 操作が C で記述されたランタイム システム関数にどのようにフックされるかを理解できていませんghc/libraries/base/GHC/Conc/Sync.hs
。git リポジトリには、次の定義が表示されます。
次にghc/rts/PrimOps.cmm
、次の C-- 定義が表示されます。
私の質問:
- の最初と最後
#
はどういう意味ですか(# s2#, TVar tvar# #)
. 変数の後に aを置くことは、何かがボックス化されていないことを示す命名規則にすぎないことを以前に読んだことが#
ありますが、それ自体の場合はどういう意味ですか? newTVar#
からまでどうやって行くのstg_newTVarzh
?これら2つの間に別の定義が欠けているようです。コンパイラはnewTVar#
リストされた C 関数への呼び出しに書き直しますか?- C コードの
P_
andは何ですか?W_
他に 1 つしか見つかりませんでしnewTVar#
たghc/compiler/prelude/primops.txt.pp
https://ghc.haskell.org/trac/ghc/wiki/Commentary/PrimOpsによると、これはプリミティブがどのように定義され、コンパイラーがそれらについて認識できるようにするかです。
haskell - Haskell の STM モナドに乱数生成を追加する
私は現在、Haskell でいくつかのトランザクション メモリ ベンチマークに取り組んでおり、トランザクション内で乱数を利用できるようにしたいと考えています。現在、ここからランダムモナド/モナドトランスフォーマーを使用しています。次の例では、整数を含む TVar の配列と、配列内の 10 個の tvar をランダムに選択してインクリメントするトランザクションがあります。
私の質問は、「これがこれを行うための最良の方法ですか?」ということだと思います。逆の方法、つまりランダムモナドを STM モナドに持ち上げる方がより自然で効率的であるように思われます。各トランザクションは多くの STM 操作を実行し、ランダム操作はほとんど実行しません。それぞれlift
がある程度のオーバーヘッドを追加すると思います。だけにする方が効率的ではないでしょうかlift
ランダムな計算を行い、STM の計算はそのままにしておきますか? これを行っても安全ですか?STM モナド トランスフォーマーを定義すると、STM モナドで得られる優れた静的分離特性が損なわれるようです (つまり、IO を STM モナドに持ち上げることはできますが、トランザクションが中止された場合に IO アクションを元に戻すことについて心配する必要があります。問題数)。モナド変換子に関する私の知識はかなり限られています。トランスを使用する場合のパフォーマンスと相対的なオーバーヘッドに関する簡単な説明をいただければ幸いです。
c++ - __transaction_atomic トランザクション メモリ サポートが有効になっていない
を使用して C/C++ コードをコンパイルして__transaction_atomic
いましたが、コンパイラ エラーが発生しました
[Error] __transaction_atomic' without transactional memory support enabled
コードは次のとおりです。
それを理解する方法は?私のコンパイラはGCC 4.9です