0

全パース最短経路問題を解決するコードがいくつかあり、各プロセッサには結果の一部があります。出力ファイルへのマルティックスであるこの結果を書き込もうとしています。したがって、ソリューションの一部を持つ各プロセスは、結果を出力ファイルの正しい位置に書き込みます。今、私はこれに fseek を使用しようとしていますが、整数のサイズが異なるために少し行き詰まっています。2 と -199 のように、より多くのスペースが必要になります。プロセッサが互いに上書きしないようにするにはどうすればよいですか? また、書き込みには競合状態が発生する可能性があります。

これを別の方法で行う必要がありますか、これを達成する方法はありますか? すべての結果を 1 つのプロセス (ランク 0) に送信し、配列を作成してファイルに書き込むことを考えていました。

4

3 に答える 3

1

ASCII 出力を使用しないでください。サイズが明確に定義されているバイナリを使用します。

したがって、fstream と double を使用している場合:

fstream filewriter("file.bin",ios::out | ios::binary);

vector<double> mylist;
mylist.push_back(2.5);
mylist.push_back(7.6);
mylist.push_back(2.1);
mylist.push_back(3.2);
mylist.push_back(4.2);

filewriter.write((char*)&mylist[0],mylist.size()*sizeof(double));

これは正確に 40 バイトを書き込みます。これは、リストのサイズ (5 要素) の 2 倍 (8) 倍のサイズです。fseek の使用は非常に簡単です。

科学的な環境では、大量の出力がある場合、バイナリ データを使用することを強くお勧めします。でも:

1-エンディアンの概念(ビッグエンディアン、リトルエンディアン)について学ぶ必要があります。2- 再利用のために適切に作業を文書化する必要があります (目的、サイズ、要素の数、次元)。文書化するのを忘れると、大きな誤解に直面します (私は物理学者であり、シミュレーションをプログラムしています)。

したがって、データ分析用の ASCII は適切な選択ではありません。

幸いなことに、HDF5 と呼ばれる、整理に特化した完全なライブラリがあります。エンディアンと移植性を整理します。ただし、これに対処するのは簡単ではなく、学習曲線が急勾配です。後の話は難しいと思います。

私がお勧めするのは、バイナリ ファイルの扱い方と読み取り方を学び、それらの問題を理解することです。MPI を使用しているので、バイナリ ファイルを扱うのに十分な専門家だと思います。

バイナリ ファイルの簡単なチュートリアルを次に示します。

http://courses.cs.vt.edu/cs2604/fall02/binio.html

乾杯。

于 2013-04-06T21:28:31.253 に答える
0

これは、メモリ マップト ファイルに適しています。これらはシステムに依存しますが、POSIX と Windows OS ファミリの両方に実装されているため、最新の OS を使用している場合は機能します。boost には移植可能で C++ に適した実装が用意されています (mapped_file_source、mapped_file_sink、mapped_file クラス)。インタープロセス出力は、その使用法の古典的な例です。

それらはバイナリであるため、Samer が回答で述べたほとんどのことも当てはまります。唯一の違いは、シークの代わりにポインター演算を使用することです。

于 2013-04-08T11:59:30.633 に答える
0

最後のプロセスが完了した後にマージしてクリーンアップできる形式で、各プロセスに出力を書き込むことができます。(x, y, z), (x, y, z)...のように、x は行のインデックス、y は列、z は値です。

于 2013-04-06T21:21:33.073 に答える