0

マトリックスの次元を含むヘッダーとマトリックスを含むテキスト ファイルがあります。3x3 マトリックスの例を次に示します。

3 3
1 56 8
12 3 0
9 44 81

私は MPI-IO でガベージ値を取得し続けましたが、テキスト ファイルではなく、バイナリでのみ機能することがわかりました。

文字ストリームを読み込んで整数に変換すると思っていましたが、行列要素の桁数が可変であるため、この問題にどのように対処すればよいかわかりません。これにアプローチする方法が本当にわかりませんか?

4

2 に答える 2

1

通常、バイナリ ファイルに書き込まれるもののタイプと数はわかっています (たとえば、すべての整数、10 int3floatなど)。バイト数として読み取ることができますが、MPI バイナリ ファイルは通常、型の整数として読み取り/書き込みが行われます。この場合、9 つの整数です (したがって、桁数は重要ではありません)。ファイルを開いて、次のように読み取ります。

    call MPI_FILE_OPEN(MPI_COMM_WORLD, filename, & 
                   MPI_MODE_RDONLY , MPI_INFO_NULL, fh, ierr)

    bufsize = 3*3
    allocate(buf(bufsize))
    call MPI_FILE_READ_ALL(fh, buf, bufsize, MPI_integer, & 
                           MPI_STATUS_IGNORE, ierr)

可変行列サイズの場合MPI_File_get_size、サイズを取得したり、読み取る要素の数を計算したりできます。混合データの場合、バイナリ ファイルの最初 (または最後) の部分をヘッダーとして持つことができます。これを最初に読み取り、ファイルの残りの部分をデコードするために使用します。コード/ヘッダーの形式を変更すると、下位互換性が失われるため、ヘッダーの形式を知る必要があります。これは、HDF5 https://support.hdfgroup.org/HDF5/のようなデータ形式の理由の一部です。

于 2017-01-11T16:12:24.980 に答える
0

テキストファイルは、「数値」ではなく「バイト」を知る必要があるため、注意が必要です。たとえば1 1 1、 は よりも短いです10 15 123355

今、あなたの慣習が「すべての数字がゼロで埋められて6桁になる」と言っている場合、各プロセスを (size/nprocs)*rank -th から読み取ることができます

または、ファイルを読み取り、マトリックスの各行が開始するオフセットを記録するインデクサーが必要になります。

または、ご覧のとおり、バイナリ データを使用すると、すべてがはるかに簡単になります。

于 2017-01-11T18:35:44.647 に答える