2016-08-29 9 views
3

これは概念的な質問です。私が働いているレガシーコードには、並列ファイルの読み込みをエミュレートするC++スレッド実装があります。マルチスレッドファイルの読み込み方法は、ファイルからchar* arrayまでのデータブロック(2^20 bytesと言う)をストリーミングして、この配列の専用セクションを読み取る複数のスレッドになります。スレッドが完了すると、他のすべてのスレッドが完了するのを待ちます(unique_lockで共有されたcondition_variableを使用)。最後のスレッドを完了し、ファイルから次のブロックのデータを配列にロードし、ファイル全体が読む。並列読み込みの理由は、これらのファイルが1 GB以上であり、それ以外の時間がかかることが多いからです。スピードアップは約6x以上です。仮想マシン上で実行されるC++マルチスレッドファイルの読み込み

私はいくつかの奇妙な動作を観察しました。物理的なマシンでコードが実行されている場合(リモート接続されている場合でも)、マルチスレッドファイルの読み取りは常に正しく動作します。ただし、仮想マシン上で実行されている場合、読み取り後にデータが失われることがあります。私は各スレッドが1行しか読んでいない状態でデバッグしましたが、結果が間違っていることがあります。これは、間違った結果が読み取られたのではなく、入力ファイル(a .txt)から行全体が欠落していないことを示しています。スレッド数を増やす(スレッド数が増えるほど頻繁に失敗する)、ファイルサイズを大きくする(つまり、ファイルサイズがchar* arrayのサイズより大きい場合)、エラーの結果をより頻繁に再現できます。これは、問題がマルチスレッドファイルの読み込みではなく、実行時環境(物理マシンと仮想マシン)との関係であると考えています。

私は大声で考えてみて、誰かが似たような行動を経験しているのか、そのような行動が起こるのかについての洞察を見たいと思っています。私はbuffer overflowの問題を調査していますが、これまで何も見つかりませんでした。

EDIT:は、私はVisual Studios 2013はそうMS Visual C++コンパイラを利用し、すべての物理マシンと仮想マシンが利用可能64-bitx64-based processors最小メモリが32GBあるとWindows Server 2012 R2またはWindows Server 2008 R2をしている使用している環境

に関するより多くの情報を追加します上昇して120GBになる可能性があります。サーバーは異なるバージョンのIntel Xeon E5 CPUを使用します。

+1

ちょっとしたコードを再現することは可能ですか?さらに、より多くの文脈が答えに役立つはずです。どのプラットフォームが物理マシンですか?バーチャルはどうですか?どのようにコンパイルしますか? 2つの環境の違いをより詳しく説明してください。 –

+0

@BiagioFestaコメントありがとうございます。詳細をいくつか追加しましたが、レガシーコードは他の多くの関数と相互依存しており、正確なスニペットを再現することは困難です。 – kishansudu

答えて

3

ほとんどの場合、あなたのコードには、通常はめったに発生しないが、VMの条件によって引き出される競合状態があることをほぼ確実に意味します。

断続的に利用可能なコアまたは異なるタイムスライシングによるスレッドスケジューリングの多さ、または比較的自主的なタスク切り替えからより優先的なタスク切り替えへの変更さえも、この問題を強調しています。エラーチェックがどこかで行方不明になっている可能性もあります。おそらく、実際にアイロンで起こることはほとんどありません。しかし、あなたはコードを投稿していないので、私はそれをデバッグすることはできません。

TLDRコードがバグではなく、VM実装(主流のハイパーバイザーであると仮定)ではないことはほとんど確実です。

これはあなたの質問とは関係ありませんが、ファイルをmmap'ingしてスレッドをmmapから読み込ませるのではなく、なぜこのようにファイルIOを行うのか分かりません。これは、ほとんどの場合、大幅に効率的になり、ほとんどのOSで本質的にスレッドセーフです。

+1

ありがとうございました。私はまた、メモリマップの実装を行うことを考えていました。コードは少なくとも数年前のものであり、現在の設計の背後にある決定を正確には知らない。 – kishansudu

+0

@kishansudu心配する必要はありませんが、私は答えが少なくとも多少役に立ったことをうれしく思っています。 – Vality

関連する問題