12

私は、大学のコースで 1 つまたは 2 つのガイド付き実験室を通じて、ソフトウェア トランザクショナル メモリの使用法を教える可能性について考えています。私は Haskell の STM についてしか知りませんが、コースの学生はおそらくそれについて一言も聞いたことがありません。

そのようなライブラリのリストをオンラインまたは他の質問ですでにいくつか見つけました (例: http://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B )。あなたがこれを読んでいるときに私はそれらをチェックしていますが、それらの多くはあまり良いドキュメントを持っていないようです (ほとんどは論文で漠然と説明されているだけの研究プロトタイプであり、より使用され、よく文書化されているものについて教えたいと思います)。さらに、ウィキペディアが提供するリンクの多くがぶら下がっています。

要約すると、産業プロジェクト (または少なくともおもちゃ以外のプロジェクトを対象として、一定レベルの品質を確保するため) を目的とした STM 実装があり、十分に文書化されています (学生に良い指針を与えるため)。

編集: 私はコースの教師ではありません。実験室で彼を手伝っているだけです。もちろん、学生は並行性と分散アルゴリズムの基礎を事前に教えられます。これは、コースの終わりに向かって何か違うことを提案するための単なるアイデアでした.

4

3 に答える 3

5

制作品質のSTMライブラリは、「ベストプラクティス」としても、教育ツールとしても意図されていません。大学/大学のコースで学ぶ価値があるのは、おそらくコードの1%です。残りの99%は、プラットフォームに依存する本質的なコーナーケースです。興味深い1%はまったく強調表示されていないため、見つける方法がありません。

私が大学/大学のコースに推奨するのは(入門か上級かに関係なく)、STMビルディングブロックを自分で実装することです(1つのプラットフォームのみ)。

問題を紹介することから始めます:並行性、キャッシュ...

次に、私たちが持っているアトミックヘルパーを紹介します:cas / cmpxchg、fence。

次に、生徒と一緒に例を作成します。最初は簡単で、次に難しく、より複雑です。

于 2013-02-25T10:38:28.873 に答える
3

問題を紹介することから始めます: 並行性、キャッシュ...

eznmeに続いて、私が大学在学中にカバーしたいくつかの優れた問題concurrency

  • 食の哲学者問題

    コンピューター サイエンスでは、食事する哲学者の問題は、同期の問題とそれらを解決するための手法を説明するために並列アルゴリズム設計でよく使用される問題の例です。

    ダイニングフィル
    (出典: wikimedia.org )

Je Magee と Je Kramer によるhereの同じ実装を使用し、モニターを使用して問題を解決します。

Integersほとんどの共有メモリ アプリケーションは、文字列よりも効率的です( AtomicIntegerJava のクラスのため)。shared memoryしたがって、私の意見では、デモンストレーションを行う最善の方法は、学生に、a を使用しthreadpoolて素数を計算するアプリケーション、またはいくつかの を計算するアプリケーションを作成させることintegralです。

または、スレッドと共有メモリの良い例は、生産者と消費者の問題です。

生産者と消費者の問題 (バウンド バッファーの問題とも呼ばれます) は、マルチプロセス同期の問題の典型的な例です。

プロデューサー
(出典: csusb.edu )

実装はここにあります。また、 Software Eng Jenz Dietrichの教授によるMasseyの実装もあります。

分散アルゴリズムの場合、 MapReduceHadoopは高度に文書化された分散データ構造です。また、分散プログラミング ライブラリについては、MPI (Message Passing Interface)OpenMP (またはC++ のプラグマ) を調べてください。ダイクストラ最短経路アルゴリズム並列実装もあります。

于 2013-02-25T10:43:48.160 に答える
1

今日、STM を行うには 3 つの良い方法があります。

最初の方法は、gcc を使用し、C または C++ で TM を実行することです。gcc 4.7 以降、-fgnu-tm フラグを介してトランザクション メモリがサポートされます。gcc の保守担当者は多くの作業を行っており、4.9 (trunk) ブランチの時点で、ハードウェア TM (Intel Haswell TSX など) を使用することさえできます。http://justingottschlich.com/tm-specification-for-cv-1-1/にTM へのインターフェースのドラフト仕様がありますが、それほど面倒ではありません。TM コミュニティから gcc の TM の使用例を見つけることもできます (たとえば、transact 2014 のアプリケーション トラック ペーパーを参照してください: http://transact2014.cse.lehigh.edu )。

実装自体は少し複雑ですが、それが正しいことです。特に C や C++ のようなタイプ セーフでない言語では、問題が発生する可能性があることについて多くの文献があります。GCC はこれらすべてを正しく処理します。本当。

2 番目の方法は、Java を使用することです。拡張が非常に簡単な DeuceSTM を使用するか (型安全性により TM の実装がはるかに簡単になります!)、STM 用の Scala の Akka ライブラリを使用できます。Deuce の方が拡張しやすく、使いやすいため、私は Deuce の方が好みです (メソッドに @Atomic のアノテーションを付けるだけで、残りは Deuce の Java エージェントが行います)。

3 番目の方法は、Scala を使用することです。私はこの分野で多くのことをしたことはありませんが、研究者は Akka を気に入っているようです。並列/分散クラスに所属している場合は、すでに Scala を使用している可能性もあります。

于 2013-09-04T01:32:16.813 に答える