2016-07-02 11 views
3

私はChudnovsky式からPiを計算するプログラムを持っています。これはJavaで書かれており、要素のインデックスを含む階乗やべき乗などの中間計算を保存するために使用される共有Vectorを使用します。共有メモリを使用する場合のプログラムの高速化

しかし、私はそれが同期のベクトル(デフォルトではスレッドセーフ)ですので、一つだけのスレッドが読み取りまたはそれに書き込むことができると信じています。だから、スピードアップを増やすのではなく、スレッドがたくさんある場合、計算時間が一定になることがわかります。

これを回避するためにできることはありますか?同じ共有メモリーに読み書きするスレッドが多すぎる場合はどうすればよいですか?

答えて

1

アクセスパターンの読み取りがたくさんおよび随時の書き込みである場合には、あなたがReentrantReadWriteLockとunsyncronizedデータ構造を保護することができます。それは複数の読者を許すが、ただ1人のライターしか許さない。

あなたの実装に応じて、あなたもConcurrentHashMapを使用しての恩恵を受ける可能性があります。

あなたビットをカンニングしてFutures/CompletionStagesAtomicIntegerArrayまたはAtomicReferenceArrayのいずれかを使用することができるかもしれません。

+0

HashMapは本当に良いアイデアでした。私はそれを完全に忘れていました。それは私の計算済みのもののほとんどを保存するための明らかな完璧な選択でした – Mackiavelli

1

各スレッドの結果をスタックに格納します。 1つのスレッドはすべてのスレッドから結果を収集し、それらを一緒に追加します。もちろん、スタックは空であってはいけません。

あなたは複数のスレッドが階乗結果のリストを生成したスレッドまたは2を作成していない理由を階乗で仕事をしたい場合。必要に応じて、他のスレッドで結果を検索することもできます。

+0

を、しかし、これは私の問題を完全には解決しません。あなたがWikipediaから見ることができるように、Chudnovsky式には階乗があります。したがって、すべてのスレッドは、それらの階乗を計算する共有メモリ/ベクトルにアクセスする必要があります。あるスレッドがいくつかの大きな階乗を計算すると、他のスレッドはそれにアクセスしてさらに階乗を計算する必要があります。 – Mackiavelli

+0

私の投稿を拡大しました。 – Shiro

+0

階乗結果のリストを作成するとはどういう意味ですか?他のスレッドは、数式の要素を計算するための階乗に依存します。さらに、階乗が式の要素より速く計算されることを保証する方法はありません。 – Mackiavelli

0

同じ共有メモリを持つ代わりに、スタック内の個々のメモリを持つ複数のスレッドを持つことができます。最終的には、これらをすべて1つのスレッドで一緒に(または時々)追加してください!

+0

他人の回答をコピーするだけではありません。 – Shiro

+0

ああ、ただ気づいた。私はあなたがちょうどそれを掲示したと思いますが、私はあなたのチェックを気にしませんでしたが、私の答えを入力していました。 – Michael

+0

ああ、ちょうどコピー&ペーストして文句を変えたと思った。 – Shiro

0

高スループットが必要な場合は、DisruptorとRingBufferの使用を検討できます。あなたは生産者が別の下流のキューを介して並列消費のためにすべての消費者に送信され、その上にオブジェクトを置くキューのマルチキャストグラフとしてかく乱と考えることができ、粗レベルで

。内部を見ると、このキューのネットワークは実際には単一のデータ構造(リングバッファ)であることがわかります。

各生産者と消費者は、現在取り組んでのバッファ中のどのスロット示すシーケンスカウンタを有しています。各プロデューサ/コンシューマは、独自のシーケンスカウンタを書き込みますが、他人のシーケンスが

少数の便利なリンクカウンター読むことができます:これは良い答えです

https://lmax-exchange.github.io/disruptor

http://martinfowler.com/articles/lmax.html

https://softwareengineering.stackexchange.com/questions/244826/can-someone-explain-in-simple-terms-what-is-the-disruptor-pattern

関連する問題