質問

私は Intel の「whatif」サイトとそのトランザクション メモリ コンパイラをチェックしていました (データベースと同様に、各スレッドはアトミック コミットを行うか、システム メモリをロールバックする必要があります)。

ロックとミューテックスを置き換える有望な方法のように思えますが、多くの証言が見つかりません。ここに何か意見がある人はいますか?

役に立ちましたか?

解決

私は Intel のコンパイラを使用したことがありませんが、Herb Sutter がそれについて興味深いコメントを寄せていました...

から サッター氏は次のように話します。同時実行の未来

トランザクション メモリの使用とその使用に多くの関心が寄せられていますか? それとも、この概念はほとんどの開発者にとって難しすぎて理解できないのでしょうか?

まだ市場に投入されていないため、誰が使用しているかについてはまだ答えることができません。Intel にはソフトウェア トランザクション メモリ コンパイラのプロトタイプがあります。しかし、質問が「開発者が使用するのが難しすぎるのでしょうか?」答えは、私は確かに望んでいないということです。重要なのは、ロックよりもはるかに簡単であるということです。これは、研究の範囲内でロックの使用を大幅に減らすことができる唯一の主要な事柄です。ロックを完全に置き換えることはできませんが、部分的に置き換えることが唯一の大きな希望です。

いくつかの制限があります。特に、一部の I/O は本質的にトランザクション的ではありません。ユーザーに名前の入力を求めるアトミック ブロックを取得してコンソールから名前を読み取り、別のトランザクションと競合する場合にブロックを自動的に中止して再試行することはできません。ユーザーに 2 回プロンプトを表示すると、違いがわかります。ただし、トランザクション メモリはメモリにのみアクセスするものには最適です。

私が知っている主要なハードウェアおよびソフトウェア ベンダーはすべて、研究開発において複数のトランザクション メモリ ツールを持っています。基本的な質問に対する理論的な答えについての会議や学術論文があります。まだモデル T を出荷できる段階には達していません。おそらく、初期の限定されたプロトタイプでは、無制限のトランザクション メモリを実行できず、たとえば 100 個のメモリ位置しか読み書きできません。ただし、これは、よりロックフリーのアルゴリズムを有効にする場合には依然として非常に役立ちます。

他のヒント

博士。Dobb's は昨年、このコンセプトに関する記事を掲載しました。Calum Grant によるトランザクション プログラミング -- http://www.ddj.com/cpp/202802978

これには、彼のサンプル ライブラリを使用したいくつかの例、比較、結論が含まれています。

私は、いくつかの関数型プログラミングのアイデアに基づいて、組み合わせ STM ライブラリを構築しました。コンパイラのサポートは必要なく (C++17 を使用する場合を除く)、新しい構文も導入されません。一般に、のインターフェイスを採用しています。 STMライブラリ ハスケルから。

したがって、私のライブラリにはいくつかの優れたプロパティがあります。

  • 単項的組み合わせ。すべてのトランザクションは、という名前のカスタムモナド内の計算です。 STML. 。モナディック トランザクションを結合して、より大きなモナディック トランザクションを作成できます。
  • トランザクションはデータモデルから分離されています。トランザクション変数 (TVars) を使用してトランザクションを実行します。
  • がある retry コンビネーター。これにより、トランザクションを再実行できます。短くてわかりやすいトランザクションを構築するのに非常に役立ちます。
  • 計算をすぐに表現するためのさまざまなモナド コンビネータがあります。
  • がある Context. 。すべての計算は、グローバル ランタイムではなく、何らかのコンテキストで実行する必要があります。したがって、複数の独立した STM クラスターが必要な場合は、さまざまなコンテキストを使用できます。
  • 実装は概念的には非常に単純です。少なくとも、 リファレンス実装 Haskell でもそうですが、関数型プログラミングの適切なサポートが不足していたため、C++ 実装のためのいくつかのアプローチを再発明する必要がありました。

このライブラリは、実験的であると考えても、非常に優れた安定性と堅牢性を示しています。さらに、私のアプローチは、パフォーマンス、機能、包括性などによってライブラリを改善する多くの可能性を開きます。

その動作を実証するために、私は次のことを解決しました。 Dining Philosophers タスク。コードは以下のリンクで見つけることができます。サンプルトランザクション:

STML<bool> takeFork(const TVar<Fork>& tFork)
{
    STML<bool> alreadyTaken = withTVar(tFork, isForkTaken);
    STML<Unit> takenByUs    = modifyTVar(tFork, setForkTaken);
    STML<bool> success      = sequence(takenByUs, pure(true));
    STML<bool> fail         = pure(false);
    STML<bool> result       = ifThenElse(alreadyTaken, fail, success);
    return result;
};

アップデートチュートリアルを書きましたので、見つけてください ここ.

Sun Microsystems は、トランザクション メモリをハードウェアでサポートする新しいプロセッサ (開発コード名: Rock) を来年リリースすると発表しました。いくつかの制限がありますが、プログラマがロック/ミューテックスをトランザクションに置き換えるのを容易にする良い最初のステップです。 そして 良いパフォーマンスが期待できます。

Sun の研究者の 1 人でトランザクション メモリとロックに取り組んでいる Mark Moir 氏による、このテーマに関する興味深い講演については、こちらをご覧ください。 リンク.

Rock およびトランザクション メモリ全般に関する Sun からの詳細および発表については、こちらをご覧ください。 リンク.

義務的な ウィキペディアのエントリ :)

ついに、 このリンク, ウィスコンシン大学マディソン校の には、ハードウェア関連かソフトウェア関連かにかかわらず、トランザクション メモリに関してこれまで行われ、現在行われている研究のほとんどに関する参考文献が含まれています。

場合によっては、これが便利であり、必要であるとさえ考えることができます。

ただし、プロセッサがこのプロセスを容易にする特別な命令を備えている場合でも、ミューテックスやセマフォと比較すると、依然として大きなオーバーヘッドが存在します。実装方法によっては、リアルタイムのパフォーマンスに影響を与える可能性もあります (割り込みを停止するか、共有領域への書き込みを防止する必要があります)。

私の予想では、これが実装されたとしても、特定のメモリ空間の一部でのみ必要となるため、影響は限定的になる可能性があります。

-アダム

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top