114209Sandreas.sandberg@arm.com/* 214209Sandreas.sandberg@arm.com * Copyright (c) 2016-2019 Arm Limited 314209Sandreas.sandberg@arm.com * All rights reserved 414209Sandreas.sandberg@arm.com * 514209Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 614209Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 714209Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 814209Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 914209Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1014209Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1114209Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1214209Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1314209Sandreas.sandberg@arm.com * 1414209Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 1514209Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 1614209Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 1714209Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1814209Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1914209Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 2014209Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 2114209Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 2214209Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 2314209Sandreas.sandberg@arm.com * this software without specific prior written permission. 2414209Sandreas.sandberg@arm.com * 2514209Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2614209Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2714209Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2814209Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2914209Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3014209Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3114209Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3214209Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3314209Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3414209Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3514209Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3614209Sandreas.sandberg@arm.com * 3714209Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 3814209Sandreas.sandberg@arm.com */ 3914209Sandreas.sandberg@arm.com 4014209Sandreas.sandberg@arm.com#ifndef __BASE_STATS_HDF5_HH__ 4114209Sandreas.sandberg@arm.com#define __BASE_STATS_HDF5_HH__ 4214209Sandreas.sandberg@arm.com 4314209Sandreas.sandberg@arm.com#include <H5Cpp.h> 4414209Sandreas.sandberg@arm.com 4514209Sandreas.sandberg@arm.com#include <memory> 4614209Sandreas.sandberg@arm.com#include <stack> 4714209Sandreas.sandberg@arm.com#include <string> 4814209Sandreas.sandberg@arm.com#include <vector> 4914209Sandreas.sandberg@arm.com 5014209Sandreas.sandberg@arm.com#include "base/output.hh" 5114209Sandreas.sandberg@arm.com#include "base/stats/output.hh" 5214209Sandreas.sandberg@arm.com#include "base/stats/types.hh" 5314209Sandreas.sandberg@arm.com 5414209Sandreas.sandberg@arm.comnamespace Stats { 5514209Sandreas.sandberg@arm.com 5614209Sandreas.sandberg@arm.comclass Hdf5 : public Output 5714209Sandreas.sandberg@arm.com{ 5814209Sandreas.sandberg@arm.com public: 5914209Sandreas.sandberg@arm.com Hdf5(const std::string &file, unsigned chunking, bool desc, bool formulas); 6014209Sandreas.sandberg@arm.com 6114209Sandreas.sandberg@arm.com ~Hdf5(); 6214209Sandreas.sandberg@arm.com 6314209Sandreas.sandberg@arm.com Hdf5() = delete; 6414209Sandreas.sandberg@arm.com Hdf5(const Hdf5 &other) = delete; 6514209Sandreas.sandberg@arm.com 6614209Sandreas.sandberg@arm.com public: // Output interface 6714209Sandreas.sandberg@arm.com void begin() override; 6814209Sandreas.sandberg@arm.com void end() override; 6914209Sandreas.sandberg@arm.com bool valid() const override; 7014209Sandreas.sandberg@arm.com 7114209Sandreas.sandberg@arm.com void beginGroup(const char *name) override; 7214209Sandreas.sandberg@arm.com void endGroup() override; 7314209Sandreas.sandberg@arm.com 7414209Sandreas.sandberg@arm.com void visit(const ScalarInfo &info) override; 7514209Sandreas.sandberg@arm.com void visit(const VectorInfo &info) override; 7614209Sandreas.sandberg@arm.com void visit(const DistInfo &info) override; 7714209Sandreas.sandberg@arm.com void visit(const VectorDistInfo &info) override; 7814209Sandreas.sandberg@arm.com void visit(const Vector2dInfo &info) override; 7914209Sandreas.sandberg@arm.com void visit(const FormulaInfo &info) override; 8014209Sandreas.sandberg@arm.com void visit(const SparseHistInfo &info) override; 8114209Sandreas.sandberg@arm.com 8214209Sandreas.sandberg@arm.com protected: 8314209Sandreas.sandberg@arm.com /** 8414209Sandreas.sandberg@arm.com * Helper function to append vector stats and set their metadata. 8514209Sandreas.sandberg@arm.com */ 8614209Sandreas.sandberg@arm.com H5::DataSet appendVectorInfo(const VectorInfo &info); 8714209Sandreas.sandberg@arm.com 8814209Sandreas.sandberg@arm.com /** 8914209Sandreas.sandberg@arm.com * Helper function to append an n-dimensional double stat to the 9014209Sandreas.sandberg@arm.com * file. 9114209Sandreas.sandberg@arm.com * 9214209Sandreas.sandberg@arm.com * This helper function assumes that all stats include a time 9314209Sandreas.sandberg@arm.com * component. I.e., a Stat::Scalar is a 1-dimensional stat. 9414209Sandreas.sandberg@arm.com * 9514209Sandreas.sandberg@arm.com * @param info Stat info structure. 9614209Sandreas.sandberg@arm.com * @param rank Stat dimensionality (including time). 9714209Sandreas.sandberg@arm.com * @param dims Size of each of the dimensions. 9814209Sandreas.sandberg@arm.com */ 9914209Sandreas.sandberg@arm.com H5::DataSet appendStat(const Info &info, int rank, hsize_t *dims, 10014209Sandreas.sandberg@arm.com const double *data); 10114209Sandreas.sandberg@arm.com 10214209Sandreas.sandberg@arm.com /** 10314209Sandreas.sandberg@arm.com * Helper function to add a string vector attribute to a stat. 10414209Sandreas.sandberg@arm.com * 10514209Sandreas.sandberg@arm.com * @param loc Parent location in the file. 10614209Sandreas.sandberg@arm.com * @param name Attribute name. 10714209Sandreas.sandberg@arm.com * @param values Attribute value. 10814209Sandreas.sandberg@arm.com */ 10914209Sandreas.sandberg@arm.com void addMetaData(H5::DataSet &loc, const char *name, 11014209Sandreas.sandberg@arm.com const std::vector<const char *> &values); 11114209Sandreas.sandberg@arm.com 11214209Sandreas.sandberg@arm.com /** 11314209Sandreas.sandberg@arm.com * Helper function to add a string vector attribute to a stat. 11414209Sandreas.sandberg@arm.com * 11514209Sandreas.sandberg@arm.com * @param loc Parent location in the file. 11614209Sandreas.sandberg@arm.com * @param name Attribute name. 11714209Sandreas.sandberg@arm.com * @param values Attribute value. 11814209Sandreas.sandberg@arm.com */ 11914209Sandreas.sandberg@arm.com void addMetaData(H5::DataSet &loc, const char *name, 12014209Sandreas.sandberg@arm.com const std::vector<std::string> &values); 12114209Sandreas.sandberg@arm.com 12214209Sandreas.sandberg@arm.com /** 12314209Sandreas.sandberg@arm.com * Helper function to add a string attribute to a stat. 12414209Sandreas.sandberg@arm.com * 12514209Sandreas.sandberg@arm.com * @param loc Parent location in the file. 12614209Sandreas.sandberg@arm.com * @param name Attribute name. 12714209Sandreas.sandberg@arm.com * @param value Attribute value. 12814209Sandreas.sandberg@arm.com */ 12914209Sandreas.sandberg@arm.com void addMetaData(H5::DataSet &loc, const char *name, 13014209Sandreas.sandberg@arm.com const std::string &value); 13114209Sandreas.sandberg@arm.com 13214209Sandreas.sandberg@arm.com /** 13314209Sandreas.sandberg@arm.com * Helper function to add a double attribute to a stat. 13414209Sandreas.sandberg@arm.com * 13514209Sandreas.sandberg@arm.com * @param loc Parent location in the file. 13614209Sandreas.sandberg@arm.com * @param name Attribute name. 13714209Sandreas.sandberg@arm.com * @param value Attribute value. 13814209Sandreas.sandberg@arm.com */ 13914209Sandreas.sandberg@arm.com void addMetaData(H5::DataSet &loc, const char *name, double value); 14014209Sandreas.sandberg@arm.com 14114209Sandreas.sandberg@arm.com protected: 14214209Sandreas.sandberg@arm.com const std::string fname; 14314209Sandreas.sandberg@arm.com const hsize_t timeChunk; 14414209Sandreas.sandberg@arm.com const bool enableDescriptions; 14514209Sandreas.sandberg@arm.com const bool enableFormula; 14614209Sandreas.sandberg@arm.com 14714209Sandreas.sandberg@arm.com std::stack<H5::Group> path; 14814209Sandreas.sandberg@arm.com 14914209Sandreas.sandberg@arm.com unsigned dumpCount; 15014209Sandreas.sandberg@arm.com H5::H5File h5File; 15114209Sandreas.sandberg@arm.com}; 15214209Sandreas.sandberg@arm.com 15314209Sandreas.sandberg@arm.comstd::unique_ptr<Output> initHDF5( 15414209Sandreas.sandberg@arm.com const std::string &filename,unsigned chunking = 10, 15514209Sandreas.sandberg@arm.com bool desc = true, bool formulas = true); 15614209Sandreas.sandberg@arm.com 15714209Sandreas.sandberg@arm.com} // namespace Stats 15814209Sandreas.sandberg@arm.com 15914209Sandreas.sandberg@arm.com#endif // __BASE_STATS_HDF5_HH__ 160