diff --git a/examples/hello/bpWriter/helloBPWriter.cpp b/examples/hello/bpWriter/helloBPWriter.cpp index 9097f0089cb67d2f03162dba13edf8d74be9ab5b..2251ecdf38bc3f7988369ab1ec8af0e03e0126c0 100644 --- a/examples/hello/bpWriter/helloBPWriter.cpp +++ b/examples/hello/bpWriter/helloBPWriter.cpp @@ -41,11 +41,16 @@ int main( int argc, char* argv [] ) myMatrix.push_back( 7 ); myMatrix.push_back( 8 ), myMatrix.push_back( 8 ); } + std::vector<float> myMatrix2 = { -1, -2, -3, + -4, -5, -6, + -7, -8, -9 }; + try { //Define variable and local size adios::Variable<double>& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", {Nx} ); adios::Variable<float>& ioMyMatrix = adios.DefineVariable<float>( "myMatrix", {rows,columns} ); + adios::Variable<float>& ioMyMatrix2 = adios.DefineVariable<float>( "myMatrix2", {rows,columns} ); //Define method for engine creation, it is basically straight-forward parameters adios::Method& bpWriterSettings = adios.DeclareMethod( "SingleFile" ); //default method type is BPWriter @@ -61,7 +66,10 @@ int main( int argc, char* argv [] ) bpWriter->Write<double>( ioMyDoubles, myDoubles.data() ); // Base class Engine own the Write<T> that will call overloaded Write from Derived if( rank % 2 == 0 ) //even rank + { bpWriter->Write<float>( ioMyMatrix, myMatrix.data() ); + bpWriter->Write<float>( ioMyMatrix2, myMatrix2.data() ); + } bpWriter->Close( ); } diff --git a/examples/hello/bpWriter/helloBPWriter_nompi.cpp b/examples/hello/bpWriter/helloBPWriter_nompi.cpp index f995623d21f998c3e63532e24b29e7452bcf9c92..3cec9144dc15b58a28ffdb11c81a52020e378273 100644 --- a/examples/hello/bpWriter/helloBPWriter_nompi.cpp +++ b/examples/hello/bpWriter/helloBPWriter_nompi.cpp @@ -50,7 +50,7 @@ int main( int argc, char* argv [] ) bpWriter->Write<double>( ioMyDoubles, myDoubles.data() ); // Base class Engine own the Write<T> that will call overloaded Write from Derived bpWriter->Write<float>( ioMyMatrix, myMatrix.data() ); //2d Example - //bpWriter->Write<float>( ioMyMatrix2, myMatrix2.data() ); //2d Example + bpWriter->Write<float>( ioMyMatrix2, myMatrix2.data() ); //2d Example bpWriter->Close( ); // } diff --git a/include/format/BP1Writer.h b/include/format/BP1Writer.h index 86a21d31dcbc18caa4e875e5d06ec22ab75815eb..6f9daa0e3d1afb5586618660d07addcdf2f071ac 100644 --- a/include/format/BP1Writer.h +++ b/include/format/BP1Writer.h @@ -221,7 +221,8 @@ public: void WriteVariablePayload( const Variable<T>& variable, capsule::STLVector& buffer, const unsigned int cores = 1 ) const noexcept { std::size_t payloadSize = variable.PayLoadSize(); - MemcpyThreads( buffer.m_Data.data(), variable.m_AppValues, payloadSize, cores ); //EXPENSIVE part, might want to use threads if large. + //serial for now, expensive part + MemcpyThreads( &buffer.m_Data[buffer.m_DataPosition], variable.m_AppValues, payloadSize, cores ); //EXPENSIVE part, might want to use threads if large. //update indices buffer.m_DataPosition += payloadSize; buffer.m_DataAbsolutePosition += payloadSize; @@ -289,8 +290,10 @@ private: MovePositions( 4, metadataPositions ); //length of var, will come at the end from this offset MovePositions( 8, dataPositions ); //length of var, will come at the end from this offset - //memberID + //memberID in metadata and data MemcpyToBuffers( metadataBuffers, metadataPositions, variablesCount, 4 ); + MemcpyToBuffers( dataBuffers, dataPositions, variablesCount, 4 ); + //skipping 2 bytes for length of group name which is zero, only in metadata MovePositions( 2, metadataPositions ); //length of var, will come at the end from this offset @@ -308,15 +311,16 @@ private: MemcpyToBuffers( metadataBuffers, metadataPositions, &dataType, 1 ); MemcpyToBuffers( dataBuffers, dataPositions, &dataType, 1 ); - //Characteristics Sets in Metadata and Data - //const std::vector<std::size_t> metadataCharacteristicsSetsCountPosition( metadataPositions ); //very important piece - std::vector<std::size_t> dataCharacteristicsCountPositions( dataPositions ); //very important piece + //write in data if it's a dimension variable (scalar) y or n + const char dimensionYorN = ( variable.m_IsDimension ) ? 'y' : 'n'; + MemcpyToBuffers( dataBuffers, dataPositions, &dimensionYorN, 1 ); + //Characteristics Sets in Metadata and Data const std::uint64_t sets = 1; //write one for now MemcpyToBuffers( metadataBuffers, metadataPositions, &sets, 8 ); - std::vector<std::size_t> metadataCharacteristicsCountPositions( metadataPositions ); //very important, can't be const as it is updated by MemcpyToBuffer std::uint8_t characteristicsCounter = 0; //used for characteristics count, characteristics length will be calculated at the end + std::vector<std::size_t> metadataCharacteristicsCountPositions( metadataPositions ); //very important, can't be const as it is updated by MemcpyToBuffer //here move positions 5 bytes in data and metadata for characteristics count + length MovePositions( 5, metadataPositions ); @@ -332,14 +336,13 @@ private: const std::uint16_t dimensionsLength = dimensions * 24; //24 is from 8 bytes for each: local dimension, global dimension, global offset MemcpyToBuffers( metadataBuffers, metadataPositions, &dimensionsLength, 2 ); - //write in data if it's a dimension variable (scalar) y or n - const char dimensionYorN = ( variable.m_IsDimension ) ? 'y' : 'n'; - MemcpyToBuffers( dataBuffers, dataPositions, &dimensionYorN, 1 ); - + //write dimensions count and length in data MemcpyToBuffers( dataBuffers, dataPositions, &dimensions, 1 ); const std::uint16_t dimensionsLengthInData = dimensions * 27; //27 is from 9 bytes for each: var y/n + local, var y/n + global dimension, var y/n + global offset MemcpyToBuffers( dataBuffers, dataPositions, &dimensionsLengthInData, 2 ); + std::vector<std::size_t> dataCharacteristicsCountPositions( dataPositions ); //very important piece, will redefine later + if( variable.m_GlobalDimensions.empty() ) //local variable { WriteDimensionRecord( metadataBuffers, metadataPositions, localDimensions, 16 ); @@ -382,15 +385,14 @@ private: if( variable.m_IsScalar ) //scalar //just doing string scalars for now (by name), needs to be modified when user passes value { characteristicID = characteristic_value; - const std::int16_t lengthOfName = variable.m_Name.length(); - //metadata MemcpyToBuffers( metadataBuffers, metadataPositions, &characteristicID, 1 ); - WriteNameRecord( variable.m_Name, lengthOfName, metadataBuffers, metadataPositions ); + MemcpyToBuffers( metadataBuffers, metadataPositions, variable.m_AppValues, sizeof(T) ); //data MemcpyToBuffers( dataBuffers, dataPositions, &characteristicID, 1 ); - MemcpyToBuffers( dataBuffers, dataPositions, &lengthOfName, 2 ); //add length of characteristic in data - WriteNameRecord( variable.m_Name, lengthOfName, dataBuffers, dataPositions ); + const std::uint16_t lengthOfValue = sizeof( T ); + MemcpyToBuffers( dataBuffers, dataPositions, &lengthOfValue, 2 ); //add length of characteristic in data + MemcpyToBuffers( dataBuffers, dataPositions, variable.m_AppValues, sizeof(T) ); ++characteristicsCounter; } diff --git a/include/functions/adiosTemplates.h b/include/functions/adiosTemplates.h index 5b9e0a48216f4714542376474a61daac73b7c85e..3af61fe0ea98ec1ce5871413fbb4baf20aa1d82c 100644 --- a/include/functions/adiosTemplates.h +++ b/include/functions/adiosTemplates.h @@ -140,7 +140,7 @@ void MemcpyThreads( T* destination, const U* source, std::size_t count, const un { if( cores == 1 ) { - std::memcpy( &destination[0], &source[0], count ); + std::memcpy( destination, source, count ); //here is the bug!!! return; } diff --git a/src/format/BP1Writer.cpp b/src/format/BP1Writer.cpp index e70a7183d49d207e5ecc4e46030cc0289221e88b..da5044d49c3596c227625965fa0125f33ac9e900 100644 --- a/src/format/BP1Writer.cpp +++ b/src/format/BP1Writer.cpp @@ -45,11 +45,10 @@ void BP1Writer::WriteProcessGroupIndex( const bool isFortran, const std::string dataBuffers, dataPositions, dataAbsolutePositions, metadataBuffers, metadataPositions ); - buffer.m_DataPosition = dataPositions[0]; - buffer.m_DataAbsolutePosition = dataAbsolutePositions[0]; metadataSet.PGIndexPosition = metadataPositions[0]; - metadataSet.DataVarsCountPosition = dataPositions[0]; + buffer.m_DataPosition = dataPositions[0] + 12; //add 12 for vars count and vars length + buffer.m_DataAbsolutePosition = dataAbsolutePositions[0] + 12; //add 12 for vars count and vars length metadataSet.PGCount += 1; } @@ -93,11 +92,9 @@ void BP1Writer::WriteProcessGroupIndex( const bool isFortran, const std::string for( unsigned int i = 0; i < buffersSize; ++i ) { metadataSets[i].PGIndexPosition = metadataPositions[i]; - - capsules[i]->m_DataPosition = dataPositions[i]; - capsules[i]->m_DataAbsolutePosition = dataAbsolutePositions[i]; metadataSets[i].DataVarsCountPosition = dataPositions[i]; - + capsules[i]->m_DataPosition = dataPositions[i] + 12; //add 12 for vars count and vars length + capsules[i]->m_DataAbsolutePosition = dataAbsolutePositions[i] + 12; //add 12 for vars count and vars length metadataSets[i].PGCount += 1; } } @@ -135,7 +132,7 @@ void BP1Writer::WriteProcessGroupIndexCommon( const bool isFortran, const std::s std::vector<char*>& metadataBuffers, std::vector<std::size_t>& metadataPositions ) const noexcept { - const std::vector<std::size_t> pgLengthDataPositions( dataPositions ); + const std::vector<std::size_t> pgLengthDataPositions( dataPositions ); //needed to update dataAbsolutePositions std::vector<std::size_t> pgLengthPositions( metadataPositions ); //get length of pg position MovePositions( 2, metadataPositions ); //skip length of pg in metadata, 2 bytes, would write at the end @@ -182,7 +179,10 @@ void BP1Writer::WriteProcessGroupIndexCommon( const bool isFortran, const std::s MemcpyToBuffers( dataBuffers, dataPositions, &methodsSize, 2 ); //method length, assume one byte for methodID for now for( auto& methodID : methodIDs ) - MemcpyToBuffers( dataBuffers, dataPositions, &methodID, 1 ); //method ID, unknown for now + { + MemcpyToBuffers( dataBuffers, dataPositions, &methodID, 1 ); //method ID, unknown for now + MovePositions( 2, dataPositions ); //method params length = 0 for now + } //dataAbsolutePositions need to be updated for( unsigned int i = 0; i < dataPositions.size(); ++i )