keyval, seek (reported by Bert Wesarg)
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 sion_generic_paropen( aid=0, fname="test-key-mpi.2.2.1.dat", mode="bw,keyval=inline", chunksize=4194304, fsblksize=-1, global, grank=0, gsize=2, filenumber=0, numfiles=1, lrank=0, lsize=2, fp=NULL, newfname=NULL ) sion_generic_paropen( aid=0, fname="test-key-mpi.2.2.1.dat", mode="bw,keyval=inline", chunksize=4194304, fsblksize=-1, global, grank=1, gsize=2, filenumber=0, numfiles=1, lrank=1, lsize=2, fp=NULL, newfname=NULL ) sion_generic_paropen( ..., grank=1, gsize=2, ... ) = ( sid=1 ) sion_generic_paropen( ..., grank=0, gsize=2, ... ) = ( sid=1 ) 0: writing for key 0, chunk 0 sion_fwrite_key( 0x1842360, key=0, size=4194304, 1, sid=1 ) 1: writing for key 1, chunk 0 sion_fwrite_key( 0x18d1320, key=1, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x1842360, key=0, size=4194304, 1, sid=1 ) = 1 0: writing for key 2, chunk 0 sion_fwrite_key( 0x1842360, key=2, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x18d1320, key=1, size=4194304, 1, sid=1 ) = 1 1: writing for key 3, chunk 0 sion_fwrite_key( 0x18d1320, key=3, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x1842360, key=2, size=4194304, 1, sid=1 ) = 1 0: writing for key 0, chunk 1 sion_fwrite_key( 0x1842360, key=0, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x18d1320, key=3, size=4194304, 1, sid=1 ) = 1 1: writing for key 1, chunk 1 sion_fwrite_key( 0x18d1320, key=1, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x1842360, key=0, size=4194304, 1, sid=1 ) = 1 0: writing for key 2, chunk 1 sion_fwrite_key( 0x1842360, key=2, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x18d1320, key=1, size=4194304, 1, sid=1 ) = 1 1: writing for key 3, chunk 1 sion_fwrite_key( 0x18d1320, key=3, size=4194304, 1, sid=1 ) sion_fwrite_key( 0x1842360, key=2, size=4194304, 1, sid=1 ) = 1 sion_fwrite_key( 0x18d1320, key=3, size=4194304, 1, sid=1 ) = 1
Nur rank 0 lesen
$ ./test-sion-key-reader test-key-mpi.2.2.1.dat 2 1 0 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 0: reading from rank 0, key 0, chunk 0 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 1 0: sion_seek_key( sid=1, key=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek_key( sid=1, key=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 0 0: error seeking for key 0 0: reading from rank 0, key 2, chunk 0 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 1 0: sion_seek_key( sid=1, key=2, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek_key( sid=1, key=2, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 0 0: error seeking for key 2 0: reading from rank 0, key 0, chunk 1 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 1 0: sion_seek_key( sid=1, key=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek_key( sid=1, key=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 0 0: error seeking for key 0 0: reading from rank 0, key 2, chunk 1 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek( sid=1, rank=0, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 1 0: sion_seek_key( sid=1, key=2, SION_CURRENT_CHUNK, SION_CURRENT_POS ) 0: sion_seek_key( sid=1, key=2, SION_CURRENT_CHUNK, SION_CURRENT_POS ) = 0 0: error seeking for key 2
Ich habe meine tests auch schon vorbereitet, damit ich ein nicht-keyval file oeffnen kann. Dazu muss man beim schreiben eine '0' als Anzahl der keys mit geben:
2 ranks schreiben in ein file ohne key API
$ mpirun -np 2 ./test-sion-key-writer-mpi test-key-mpi.2.0.1.dat 0 1 sion_generic_paropen( aid=0, fname="test-key-mpi.2.0.1.dat", mode="bw", chunksize=4194304, fsblksize=-1, global, grank=0, gsize=2, filenumber=0, numfiles=1, lrank=0, lsize=2, fp=NULL, newfname=NULL ) sion_generic_paropen( aid=0, fname="test-key-mpi.2.0.1.dat", mode="bw", chunksize=4194304, fsblksize=-1, global, grank=1, gsize=2, filenumber=0, numfiles=1, lrank=1, lsize=2, fp=NULL, newfname=NULL ) sion_generic_paropen( ..., grank=1, gsize=2, ... ) = ( sid=1 ) sion_generic_paropen( ..., grank=0, gsize=2, ... ) = ( sid=1 ) 1: writing chunk 0 sion_fwrite( 0xa2e320, size=4194304, 1, sid=1 ) 0: writing chunk 0 sion_fwrite( 0xc40360, size=4194304, 1, sid=1 ) sion_fwrite( 0xa2e320, size=4194304, 1, sid=1 ) = 1 1: writing chunk 1 sion_fwrite( 0xa2e320, size=4194304, 1, sid=1 ) sion_fwrite( 0xc40360, size=4194304, 1, sid=1 ) = 1 0: writing chunk 1 sion_fwrite( 0xc40360, size=4194304, 1, sid=1 ) sion_fwrite( 0xa2e320, size=4194304, 1, sid=1 ) = 1 sion_fwrite( 0xc40360, size=4194304, 1, sid=1 ) = 1
Wenn ich das jetzt mit "keyval=unknown" offne, bekomme ich trotzdem als keyval_mode SION_KEYVAL_INLINE:
Lese alle 2 ranks aus dem file, und erwarte keine keys
$ ./test-sion-key-reader test-key-mpi.2.0.1.dat 2 2 0 1 0: sion_get_endianness() = 0 0: sion_generic_paropen_mapped( aid=0, fname="test-key-mpi.2.0.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 Speicherzugriffsfehler (Speicherabzug geschrieben)
Der Speicherzugriffsfehler kommt dann von mir, weil ich keine Argument angegeben habe, wieviel keys im file sind. Aber da mir sion_get_keyval_mode 51 (=SION_KEYVAL_INLINE) leifert, erwartet das Programm aber noch die Anzalh der keys als Kommandozeilenargument.