How to properly sion_dup/sion_dedup
reported by Bert Wesarg
bei mir steht als nächstes das nutzen von sion_dup() auf dem Plan. Ich konnte jetzt nichts genaues darüber finden, aber ich muss nach dem sion_dup auf jeden Fall ein sion_seek() machen, um danach ungestört meine Daten mit sion_fread_key() zu lesen, so das ich dort ohne ein seek auskommen. Ein seek/seek_key vor dem sion_dup() funktioniert auch nicht.
Es gibt ja auch noch das sion_dedup(). Wann soll das denn benutzt werden? Ich dächte, das das mein dup schließt, aber ich bekomme für diese fds ein:
SION_ERROR_RETURN on rank 0, rc=0: _sion_dedup[ 0]: descriptor is not a duplicate, returning ...
Womit kann ich also die resourcen eines dup fd wieder freigeben?
Im Anhang wieder mein aktueller code und hier die Befehle:
(nichts neues) 2 ranks schreiben je 2 keys in ein file
$ mpirun -np 2 ./test-sion-key-writer-mpi test-key-mpi.2.2.1.dat 2 1
einen rank lesen, mit dup, aber ohne ein seek vorher und nachher
argv[argc - 2]: bitmask: 0: use dup; 1: seek vor dup; 2: seek nach dup; 3: auch seek_key vor bzw. nach dup
$ ./test-sion-key-reader test-key-mpi.2.2.1.dat 2 1 0 1 2 0: sion_get_endianness() = 0 0: sion_generic_paropen_mapped( aid=0, fname="test-key-mpi.2.2.1.dat", mode="br,keyval=unknown", numfiles=&, global, grank=0, gsize=1, nlocaltasks=1, globalranks=[], chunksizes=&[], mapping_filenrs=&[], mapping_lranks=&[], fsblksize=&, fp=NULL ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ..., globalranks[0]=0, ... ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( sid=1, numfiles=1, fsblksize=-1 ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( chunksizes[0]=4194304, mapping_filenrs[0]=0, mapping_lranks[0]=0 ) 0: sion_get_keyval_mode( sid=1 ) = 51 (=SION_KEYVAL_INLINE) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=0 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=0 ) = ( dup=3 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=2 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=2 ) = ( dup=4 ) 0: reading from rank 0, key 0, chunk 0 0: sion_fread_key( 0x7f9fe5b3c010, key=0, size=4194304, 1, sid=3 ) 0: sion_fread_key( 0x7f9fe5b3c010, key=0, size=4194304, 1, sid=3 ) = 1 0: reading from rank 0, key 2, chunk 0 0: sion_fread_key( 0x7f9fe5b3c010, key=2, size=4194304, 1, sid=4 ) 0: sion_fread_key( 0x7f9fe5b3c010, key=2, size=4194304, 1, sid=4 ) = 1 0: reading from rank 0, key 0, chunk 1 0: sion_fread_key( 0x7f9fe5b3c010, key=0, size=4194304, 1, sid=3 ) 0: sion_fread_key( 0x7f9fe5b3c010, key=0, size=4194304, 1, sid=3 ) = 1 0: reading from rank 0, key 2, chunk 1 0: sion_fread_key( 0x7f9fe5b3c010, key=2, size=4194304, 1, sid=4 ) 0: sion_fread_key( 0x7f9fe5b3c010, key=2, size=4194304, 1, sid=4 ) = 1 0: sion_dedup( sid=3 ) SION_ERROR_RETURN on rank 0, rc=0: _sion_dedup[ 0]: descriptor is not a duplicate, returning ... 0: sion_dedup( sid=3 ) = 0 0: sion_dedup( sid=4 ) SION_ERROR_RETURN on rank 0, rc=0: _sion_dedup[ 0]: descriptor is not a duplicate, returning ... 0: sion_dedup( sid=4 ) = 0
Das funktioniert also wieder, aber das dedup meckert.
alle ranks lesen, mit dup, aber kein seek vorher und nachher:
$ ./test-sion-key-reader test-key-mpi.2.2.1.dat 2 2 0 1 1 2 0: sion_get_endianness() = 0 0: sion_generic_paropen_mapped( aid=0, fname="test-key-mpi.2.2.1.dat", mode="br,keyval=unknown", numfiles=&, global, grank=0, gsize=1, nlocaltasks=2, globalranks=[], chunksizes=&[], mapping_filenrs=&[], mapping_lranks=&[], fsblksize=&, fp=NULL ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ..., globalranks[0]=0, ... ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ..., globalranks[1]=1, ... ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( sid=1, numfiles=1, fsblksize=-1 ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( chunksizes[0]=4194304, mapping_filenrs[0]=0, mapping_lranks[0]=0 ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( chunksizes[1]=4194304, mapping_filenrs[1]=0, mapping_lranks[1]=1 ) 0: sion_get_keyval_mode( sid=1 ) = 51 (=SION_KEYVAL_INLINE) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=0 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=0 ) = ( dup=3 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=2 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=2 ) = ( dup=4 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=1 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=1 ) = ( dup=5 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=3 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=3 ) = ( dup=6 ) 0: reading from rank 0, key 0, chunk 0 0: sion_fread_key( 0x7f6d8881b010, key=0, size=4194304, 1, sid=3 ) 0: sion_fread_key( 0x7f6d8881b010, key=0, size=4194304, 1, sid=3 ) = 1 0: reading from rank 1, key 1, chunk 0 0: sion_fread_key( 0x7f6d8841a010, key=1, size=4194304, 1, sid=5 ) 0: sion_fread_key( 0x7f6d8841a010, key=1, size=4194304, 1, sid=5 ) = 0 0: error reading for rank 1, key 1
Lesen schlägt fehl.
alle ranks lesen, mit dup, und seek nach dem dup (kein seek_key)
$ ./test-sion-key-reader test-key-mpi.2.2.1.dat 2 2 0 1 5 2 0: sion_get_endianness() = 0 0: sion_generic_paropen_mapped( aid=0, fname="test-key-mpi.2.2.1.dat", mode="br,keyval=unknown", numfiles=&, global, grank=0, gsize=1, nlocaltasks=2, globalranks=[], chunksizes=&[], mapping_filenrs=&[], mapping_lranks=&[], fsblksize=&, fp=NULL ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ..., globalranks[0]=0, ... ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ..., globalranks[1]=1, ... ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( sid=1, numfiles=1, fsblksize=-1 ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( chunksizes[0]=4194304, mapping_filenrs[0]=0, mapping_lranks[0]=0 ) 0: sion_generic_paropen_mapped( ..., grank=0, gsize=1, ... ) = ( chunksizes[1]=4194304, mapping_filenrs[1]=0, mapping_lranks[1]=1 ) 0: sion_get_keyval_mode( sid=1 ) = 51 (=SION_KEYVAL_INLINE) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=0 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=0 ) = ( dup=3 ) 0: sion_seek( sid=3, rank=0, SION_ABSOLUTE_POS, 0 ) 0: sion_seek( sid=3, rank=0, SION_ABSOLUTE_POS, 0 ) = 1 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=2 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=0, key=2 ) = ( dup=4 ) 0: sion_seek( sid=4, rank=0, SION_ABSOLUTE_POS, 0 ) 0: sion_seek( sid=4, rank=0, SION_ABSOLUTE_POS, 0 ) = 1 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=1 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=1 ) = ( dup=5 ) 0: sion_seek( sid=5, rank=1, SION_ABSOLUTE_POS, 0 ) 0: sion_seek( sid=5, rank=1, SION_ABSOLUTE_POS, 0 ) = 1 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=3 ) 0: sion_dup( sid=1, SION_DUP_RANK_KEY, rank=1, key=3 ) = ( dup=6 ) 0: sion_seek( sid=6, rank=1, SION_ABSOLUTE_POS, 0 ) 0: sion_seek( sid=6, rank=1, SION_ABSOLUTE_POS, 0 ) = 1 0: reading from rank 0, key 0, chunk 0 0: sion_fread_key( 0x7f2b16a21010, key=0, size=4194304, 1, sid=3 ) 0: sion_fread_key( 0x7f2b16a21010, key=0, size=4194304, 1, sid=3 ) = 1 0: reading from rank 1, key 1, chunk 0 0: sion_fread_key( 0x7f2b16620010, key=1, size=4194304, 1, sid=5 ) 0: sion_fread_key( 0x7f2b16620010, key=1, size=4194304, 1, sid=5 ) = 1 0: reading from rank 0, key 2, chunk 0 0: sion_fread_key( 0x7f2b16a21010, key=2, size=4194304, 1, sid=4 ) 0: sion_fread_key( 0x7f2b16a21010, key=2, size=4194304, 1, sid=4 ) = 1 0: reading from rank 1, key 3, chunk 0 0: sion_fread_key( 0x7f2b16620010, key=3, size=4194304, 1, sid=6 ) 0: sion_fread_key( 0x7f2b16620010, key=3, size=4194304, 1, sid=6 ) = 1 0: reading from rank 0, key 0, chunk 1 0: sion_fread_key( 0x7f2b16a21010, key=0, size=4194304, 1, sid=3 ) 0: sion_fread_key( 0x7f2b16a21010, key=0, size=4194304, 1, sid=3 ) = 1 0: reading from rank 1, key 1, chunk 1 0: sion_fread_key( 0x7f2b16620010, key=1, size=4194304, 1, sid=5 ) 0: sion_fread_key( 0x7f2b16620010, key=1, size=4194304, 1, sid=5 ) = 1 0: reading from rank 0, key 2, chunk 1 0: sion_fread_key( 0x7f2b16a21010, key=2, size=4194304, 1, sid=4 ) 0: sion_fread_key( 0x7f2b16a21010, key=2, size=4194304, 1, sid=4 ) = 1 0: reading from rank 1, key 3, chunk 1 0: sion_fread_key( 0x7f2b16620010, key=3, size=4194304, 1, sid=6 ) 0: sion_fread_key( 0x7f2b16620010, key=3, size=4194304, 1, sid=6 ) = 1 0: sion_dedup( sid=3 ) SION_ERROR_RETURN on rank 0, rc=0: _sion_dedup[ 0]: descriptor is not a duplicate, returning ... 0: sion_dedup( sid=3 ) = 0 0: sion_dedup( sid=4 ) SION_ERROR_RETURN on rank 0, rc=0: _sion_dedup[ 0]: descriptor is not a duplicate, returning ... 0: sion_dedup( sid=4 ) = 0 0: sion_dedup( sid=5 ) SION_ERROR_RETURN on rank 1, rc=0: _sion_dedup[ 1]: descriptor is not a duplicate, returning ... 0: sion_dedup( sid=5 ) = 0 0: sion_dedup( sid=6 ) SION_ERROR_RETURN on rank 1, rc=0: _sion_dedup[ 1]: descriptor is not a duplicate, returning ... 0: sion_dedup( sid=6 ) = 0
Klappt auch. Ein seek_key ist nicht nötig.