From 6de447d7a07c88a2a09eec2e6193784af8ca656d Mon Sep 17 00:00:00 2001 From: Greg Eisenhauer Date: Wed, 2 Mar 2022 16:09:46 -0500 Subject: [PATCH 1/2] Partial fix of BP5 decomposition printing --- source/utils/bpls/bpls.cpp | 187 +++++++++++++++++++++++++++++++++++-- 1 file changed, 180 insertions(+), 7 deletions(-) diff --git a/source/utils/bpls/bpls.cpp b/source/utils/bpls/bpls.cpp index be74ea4bb9..f0cfa6f0bc 100644 --- a/source/utils/bpls/bpls.cpp +++ b/source/utils/bpls/bpls.cpp @@ -3147,12 +3147,60 @@ std::pair get_local_array_signature(core::Engine *fp, } else { - std::map::BPInfo>> - allblocks = fp->AllStepsBlocksInfo(*variable); - bool firstStep = true; bool firstBlock = true; + MinVarInfo *minBlocksInfo = nullptr; + minBlocksInfo = fp->MinBlocksInfo(*variable, 0 /* relative step 0 */); + + // first step + if (minBlocksInfo) + { + dims.resize(minBlocksInfo->Dims); + delete minBlocksInfo; + size_t RelStep = 0; + for (RelStep = 0; RelStep < variable->m_AvailableStepsCount; + RelStep++) + { + minBlocksInfo = fp->MinBlocksInfo(*variable, RelStep); + + auto coreBlocksInfo = minBlocksInfo->BlocksInfo; + if (firstStep) + { + nblocks = coreBlocksInfo.size(); + } + else if (nblocks != coreBlocksInfo.size()) + { + nblocks = 0; + } + for (auto &coreBlockInfo : coreBlocksInfo) + { + if (firstBlock) + { + for (size_t k = 0; k < dims.size(); k++) + { + dims[k] = coreBlockInfo.Count[k]; + } + } + else + { + for (size_t k = 0; k < dims.size(); k++) + { + if (dims[k] != coreBlockInfo.Count[k]) + { + dims[k] = 0; + } + } + } + firstBlock = false; + } + firstStep = false; + } + } + + std::map::BPInfo>> + allblocks = fp->AllStepsBlocksInfo(*variable); + for (auto &blockpair : allblocks) { std::vector::BPInfo> &blocks = @@ -3188,11 +3236,140 @@ std::pair get_local_array_signature(core::Engine *fp, return std::make_pair(nblocks, dims); } +static int ndigits_dims[32] = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; template void print_decomp(core::Engine *fp, core::IO *io, core::Variable *variable) { /* Print block info */ DataType adiosvartype = variable->m_Type; + + MinVarInfo *minBlocksInfo = nullptr; + minBlocksInfo = fp->MinBlocksInfo( + *variable, variable->m_AvailableStepsCount - 1 /* relative step 0 */); + + // first step + if (minBlocksInfo) + { + delete minBlocksInfo; + size_t laststep = minBlocksInfo->Step; // used relative last step above + int ndigits_nsteps = ndigits(laststep); + if (variable->m_ShapeID == ShapeID::GlobalValue || + variable->m_ShapeID == ShapeID::LocalValue) + { + for (size_t RelStep = 0; RelStep < variable->m_AvailableStepsCount; + RelStep++) + { + minBlocksInfo = + fp->MinBlocksInfo(*variable, 0 /* relative step 0 */); + auto coreBlocksInfo = minBlocksInfo->BlocksInfo; + } + } + else + { + // arrays + for (size_t RelStep = 0; RelStep < variable->m_AvailableStepsCount; + RelStep++) + { + minBlocksInfo = fp->MinBlocksInfo(*variable, RelStep); + auto blocks = minBlocksInfo->BlocksInfo; + size_t ndim = variable->m_Count.size(); + int ndigits_nblocks; + for (size_t k = 0; k < ndim; k++) + { + // get digit lengths for each dimension + if (variable->m_ShapeID == ShapeID::GlobalArray) + { + ndigits_dims[k] = ndigits(variable->m_Shape[k] - 1); + } + else + { + ndigits_dims[k] = ndigits(variable->m_Count[k] - 1); + } + } + + size_t stepAbsolute = minBlocksInfo->Step; + + fprintf(outf, "%c step %*zu: ", commentchar, + ndigits_nsteps, stepAbsolute); + fprintf(outf, "\n"); + const size_t blocksSize = blocks.size(); + ndigits_nblocks = ndigits(blocksSize - 1); + + for (size_t j = 0; j < blocksSize; j++) + { + fprintf(outf, "%c block %*zu: [", commentchar, + ndigits_nblocks, j); + + // just in case ndim for a block changes in LocalArrays: + ndim = variable->m_Count.size(); + + for (size_t k = 0; k < ndim; k++) + { + if (blocks[j].Count[k]) + { + if (variable->m_ShapeID == ShapeID::GlobalArray) + { + fprintf(outf, "%*zu:%*zu", ndigits_dims[k], + blocks[j].Start[k], ndigits_dims[k], + blocks[j].Start[k] + + blocks[j].Count[k] - 1); + } + else + { + // blockStart is empty vector for LocalArrays + fprintf(outf, "0:%*zu", ndigits_dims[k], + blocks[j].Count[k] - 1); + } + } + else + { + fprintf(outf, "%-*s", 2 * ndigits_dims[k] + 1, + "null"); + } + if (k < ndim - 1) + fprintf(outf, ", "); + } + fprintf(outf, "]"); + + /* Print per-block statistics if available */ + if (longopt) + { + if (true /* TODO: variable->has_minmax */) + { + fprintf(outf, " = "); + print_data(&blocks[j].MinMax.MinUnion, 0, + adiosvartype, false); + + fprintf(outf, " / "); + print_data(&blocks[j].MinMax.MaxUnion, 0, + adiosvartype, false); + } + else + { + fprintf(outf, "N/A / N/A"); + } + } + fprintf(outf, "\n"); + if (dump) + { + static bool first = true; + if (first) + { + printf("BP5 dump TBD\n"); + first = false; + } + // readVarBlock(fp, io, variable, RelStep, j, + //blocks[j]); + } + } + } + } + return; + } + std::map::BPInfo>> allblocks = fp->AllStepsBlocksInfo(*variable); if (allblocks.empty()) @@ -3253,10 +3430,6 @@ void print_decomp(core::Engine *fp, core::IO *io, core::Variable *variable) // arrays size_t ndim = variable->m_Count.size(); int ndigits_nblocks; - int ndigits_dims[32] = { - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - }; for (size_t k = 0; k < ndim; k++) { // get digit lengths for each dimension From 76031b847509d0d07e0ecc3a81ad376c0105151e Mon Sep 17 00:00:00 2001 From: Greg Eisenhauer Date: Wed, 2 Mar 2022 16:22:11 -0500 Subject: [PATCH 2/2] clang-format --- source/utils/bpls/bpls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/utils/bpls/bpls.cpp b/source/utils/bpls/bpls.cpp index f0cfa6f0bc..05a0205cd0 100644 --- a/source/utils/bpls/bpls.cpp +++ b/source/utils/bpls/bpls.cpp @@ -3362,7 +3362,7 @@ void print_decomp(core::Engine *fp, core::IO *io, core::Variable *variable) first = false; } // readVarBlock(fp, io, variable, RelStep, j, - //blocks[j]); + // blocks[j]); } } }