Path: blob/master/thirdparty/embree/kernels/bvh/bvh_statistics.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "bvh.h"6#include <sstream>78namespace embree9{10template<int N>11class BVHNStatistics12{13typedef BVHN<N> BVH;14typedef typename BVH::AABBNode AABBNode;15typedef typename BVH::OBBNode OBBNode;16typedef typename BVH::AABBNodeMB AABBNodeMB;17typedef typename BVH::AABBNodeMB4D AABBNodeMB4D;18typedef typename BVH::OBBNodeMB OBBNodeMB;19typedef typename BVH::QuantizedNode QuantizedNode;2021typedef typename BVH::NodeRef NodeRef;2223struct Statistics24{25template<typename Node>26struct NodeStat27{28NodeStat ( double nodeSAH = 0,29size_t numNodes = 0,30size_t numChildren = 0)31: nodeSAH(nodeSAH),32numNodes(numNodes),33numChildren(numChildren) {}3435double sah(BVH* bvh) const {36return nodeSAH/bvh->getLinearBounds().expectedHalfArea();37}3839size_t bytes() const {40return numNodes*sizeof(Node);41}4243size_t size() const {44return numNodes;45}4647double fillRateNom () const { return double(numChildren); }48double fillRateDen () const { return double(numNodes*N); }49double fillRate () const { return fillRateNom()/fillRateDen(); }5051__forceinline friend NodeStat operator+ ( const NodeStat& a, const NodeStat& b)52{53return NodeStat(a.nodeSAH + b.nodeSAH,54a.numNodes+b.numNodes,55a.numChildren+b.numChildren);56}5758std::string toString(BVH* bvh, double sahTotal, size_t bytesTotal) const59{60std::ostringstream stream;61stream.setf(std::ios::fixed, std::ios::floatfield);62stream << "sah = " << std::setw(7) << std::setprecision(3) << sah(bvh);63stream << " (" << std::setw(6) << std::setprecision(2) << 100.0*sah(bvh)/sahTotal << "%), ";64stream << "#bytes = " << std::setw(7) << std::setprecision(2) << bytes()/1E6 << " MB ";65stream << "(" << std::setw(6) << std::setprecision(2) << 100.0*double(bytes())/double(bytesTotal) << "%), ";66stream << "#nodes = " << std::setw(7) << numNodes << " (" << std::setw(6) << std::setprecision(2) << 100.0*fillRate() << "% filled), ";67stream << "#bytes/prim = " << std::setw(6) << std::setprecision(2) << double(bytes())/double(bvh->numPrimitives);68return stream.str();69}7071public:72double nodeSAH;73size_t numNodes;74size_t numChildren;75};7677struct LeafStat78{79static const int NHIST = 8;8081LeafStat ( double leafSAH = 0.0f,82size_t numLeaves = 0,83size_t numPrimsActive = 0,84size_t numPrimsTotal = 0,85size_t numPrimBlocks = 0,86size_t numBytes = 0)87: leafSAH(leafSAH),88numLeaves(numLeaves),89numPrimsActive(numPrimsActive),90numPrimsTotal(numPrimsTotal),91numPrimBlocks(numPrimBlocks),92numBytes(numBytes)93{94for (size_t i=0; i<NHIST; i++)95numPrimBlocksHistogram[i] = 0;96}9798double sah(BVH* bvh) const {99return leafSAH/bvh->getLinearBounds().expectedHalfArea();100}101102size_t bytes(BVH* bvh) const {103return numBytes;104}105106size_t size() const {107return numLeaves;108}109110double fillRateNom (BVH* bvh) const { return double(numPrimsActive); }111double fillRateDen (BVH* bvh) const { return double(numPrimsTotal); }112double fillRate (BVH* bvh) const { return fillRateNom(bvh)/fillRateDen(bvh); }113114__forceinline friend LeafStat operator+ ( const LeafStat& a, const LeafStat& b)115{116LeafStat stat(a.leafSAH + b.leafSAH,117a.numLeaves+b.numLeaves,118a.numPrimsActive+b.numPrimsActive,119a.numPrimsTotal+b.numPrimsTotal,120a.numPrimBlocks+b.numPrimBlocks,121a.numBytes+b.numBytes);122for (size_t i=0; i<NHIST; i++) {123stat.numPrimBlocksHistogram[i] += a.numPrimBlocksHistogram[i];124stat.numPrimBlocksHistogram[i] += b.numPrimBlocksHistogram[i];125}126return stat;127}128129std::string toString(BVH* bvh, double sahTotal, size_t bytesTotal) const130{131std::ostringstream stream;132stream.setf(std::ios::fixed, std::ios::floatfield);133stream << "sah = " << std::setw(7) << std::setprecision(3) << sah(bvh);134stream << " (" << std::setw(6) << std::setprecision(2) << 100.0*sah(bvh)/sahTotal << "%), ";135stream << "#bytes = " << std::setw(7) << std::setprecision(2) << double(bytes(bvh))/1E6 << " MB ";136stream << "(" << std::setw(6) << std::setprecision(2) << 100.0*double(bytes(bvh))/double(bytesTotal) << "%), ";137stream << "#nodes = " << std::setw(7) << numLeaves << " (" << std::setw(6) << std::setprecision(2) << 100.0*fillRate(bvh) << "% filled), ";138stream << "#bytes/prim = " << std::setw(6) << std::setprecision(2) << double(bytes(bvh))/double(bvh->numPrimitives);139return stream.str();140}141142std::string histToString() const143{144std::ostringstream stream;145stream.setf(std::ios::fixed, std::ios::floatfield);146for (size_t i=0; i<NHIST; i++)147stream << std::setw(6) << std::setprecision(2) << 100.0f*float(numPrimBlocksHistogram[i])/float(numLeaves) << "% ";148return stream.str();149}150151public:152double leafSAH; //!< SAH of the leaves only153size_t numLeaves; //!< Number of leaf nodes.154size_t numPrimsActive; //!< Number of active primitives (155size_t numPrimsTotal; //!< Number of active and inactive primitives156size_t numPrimBlocks; //!< Number of primitive blocks.157size_t numBytes; //!< Number of bytes of leaves.158size_t numPrimBlocksHistogram[8];159};160161public:162Statistics (size_t depth = 0,163LeafStat statLeaf = LeafStat(),164NodeStat<AABBNode> statAABBNodes = NodeStat<AABBNode>(),165NodeStat<OBBNode> statOBBNodes = NodeStat<OBBNode>(),166NodeStat<AABBNodeMB> statAABBNodesMB = NodeStat<AABBNodeMB>(),167NodeStat<AABBNodeMB4D> statAABBNodesMB4D = NodeStat<AABBNodeMB4D>(),168NodeStat<OBBNodeMB> statOBBNodesMB = NodeStat<OBBNodeMB>(),169NodeStat<QuantizedNode> statQuantizedNodes = NodeStat<QuantizedNode>())170171: depth(depth),172statLeaf(statLeaf),173statAABBNodes(statAABBNodes),174statOBBNodes(statOBBNodes),175statAABBNodesMB(statAABBNodesMB),176statAABBNodesMB4D(statAABBNodesMB4D),177statOBBNodesMB(statOBBNodesMB),178statQuantizedNodes(statQuantizedNodes) {}179180double sah(BVH* bvh) const181{182return statLeaf.sah(bvh) +183statAABBNodes.sah(bvh) +184statOBBNodes.sah(bvh) +185statAABBNodesMB.sah(bvh) +186statAABBNodesMB4D.sah(bvh) +187statOBBNodesMB.sah(bvh) +188statQuantizedNodes.sah(bvh);189}190191size_t bytes(BVH* bvh) const {192return statLeaf.bytes(bvh) +193statAABBNodes.bytes() +194statOBBNodes.bytes() +195statAABBNodesMB.bytes() +196statAABBNodesMB4D.bytes() +197statOBBNodesMB.bytes() +198statQuantizedNodes.bytes();199}200201size_t size() const202{203return statLeaf.size() +204statAABBNodes.size() +205statOBBNodes.size() +206statAABBNodesMB.size() +207statAABBNodesMB4D.size() +208statOBBNodesMB.size() +209statQuantizedNodes.size();210}211212double fillRate (BVH* bvh) const213{214double nom = statLeaf.fillRateNom(bvh) +215statAABBNodes.fillRateNom() +216statOBBNodes.fillRateNom() +217statAABBNodesMB.fillRateNom() +218statAABBNodesMB4D.fillRateNom() +219statOBBNodesMB.fillRateNom() +220statQuantizedNodes.fillRateNom();221double den = statLeaf.fillRateDen(bvh) +222statAABBNodes.fillRateDen() +223statOBBNodes.fillRateDen() +224statAABBNodesMB.fillRateDen() +225statAABBNodesMB4D.fillRateDen() +226statOBBNodesMB.fillRateDen() +227statQuantizedNodes.fillRateDen();228return nom/den;229}230231friend Statistics operator+ ( const Statistics& a, const Statistics& b )232{233return Statistics(max(a.depth,b.depth),234a.statLeaf + b.statLeaf,235a.statAABBNodes + b.statAABBNodes,236a.statOBBNodes + b.statOBBNodes,237a.statAABBNodesMB + b.statAABBNodesMB,238a.statAABBNodesMB4D + b.statAABBNodesMB4D,239a.statOBBNodesMB + b.statOBBNodesMB,240a.statQuantizedNodes + b.statQuantizedNodes);241}242243static Statistics add ( const Statistics& a, const Statistics& b ) {244return a+b;245}246247public:248size_t depth;249LeafStat statLeaf;250NodeStat<AABBNode> statAABBNodes;251NodeStat<OBBNode> statOBBNodes;252NodeStat<AABBNodeMB> statAABBNodesMB;253NodeStat<AABBNodeMB4D> statAABBNodesMB4D;254NodeStat<OBBNodeMB> statOBBNodesMB;255NodeStat<QuantizedNode> statQuantizedNodes;256};257258public:259260/* Constructor gathers statistics. */261BVHNStatistics (BVH* bvh);262263/*! Convert statistics into a string */264std::string str();265266double sah() const {267return stat.sah(bvh);268}269270size_t bytesUsed() const {271return stat.bytes(bvh);272}273274private:275Statistics statistics(NodeRef node, const double A, const BBox1f dt);276277private:278BVH* bvh;279Statistics stat;280};281282typedef BVHNStatistics<4> BVH4Statistics;283typedef BVHNStatistics<8> BVH8Statistics;284}285286287