From 430ceeab8017de62d58f5bd002af0b8e747694dd Mon Sep 17 00:00:00 2001 From: Bernhard Manfred Gruber Date: Mon, 30 Jan 2023 19:02:51 +0100 Subject: [PATCH] Improve and rename recordCoordTags into prettyRecordCoord --- docs/pages/api.rst | 2 +- include/llama/DumpMapping.hpp | 6 +- include/llama/StructName.hpp | 55 ++++++++++------- include/llama/mapping/FieldAccessCount.hpp | 6 +- tests/common.hpp | 42 +++++++++++++ tests/core.cpp | 68 ++++++++++++++-------- tests/dump.cpp | 5 ++ 7 files changed, 134 insertions(+), 50 deletions(-) diff --git a/docs/pages/api.rst b/docs/pages/api.rst index 39637d96ec..0b194fbb2c 100644 --- a/docs/pages/api.rst +++ b/docs/pages/api.rst @@ -81,7 +81,7 @@ Record dimension .. doxygenfunction:: llama::forEachLeafCoord(Functor &&functor, Tags... baseTags) .. doxygenfunction:: llama::forEachLeafCoord(Functor &&functor, RecordCoord baseCoord) -.. doxygenfunction:: llama::recordCoordTags +.. doxygenfunction:: llama::prettyRecordCoord Record coordinates ------------------ diff --git a/include/llama/DumpMapping.hpp b/include/llama/DumpMapping.hpp index 06ed5ae14b..cba58e6546 100644 --- a/include/llama/DumpMapping.hpp +++ b/include/llama/DumpMapping.hpp @@ -121,7 +121,7 @@ namespace llama using RecordDim = typename Mapping::RecordDim; auto emitInfo = [&](auto nrAndOffset, std::size_t size) { - infos.push_back({ai, internal::toVec(rc), recordCoordTags(rc), nrAndOffset, size}); + infos.push_back({ai, internal::toVec(rc), prettyRecordCoord(rc), nrAndOffset, size}); }; using Type = GetType; @@ -210,7 +210,7 @@ namespace llama infos.push_back( {ai, internal::toVec(rc), - recordCoordTags(rc), + prettyRecordCoord(rc), {static_cast(nr), static_cast(off)}, sizeof(Type)}); } @@ -463,7 +463,7 @@ namespace llama background-color: #{:X}; }} )", - internal::cssClass(std::string{recordCoordTags(rc)}), + internal::cssClass(std::string{prettyRecordCoord(rc)}), byteSizeInPixel * size, internal::color(internal::toVec(rc))); }); diff --git a/include/llama/StructName.hpp b/include/llama/StructName.hpp index 24ff172598..3dd1bccfa8 100644 --- a/include/llama/StructName.hpp +++ b/include/llama/StructName.hpp @@ -4,6 +4,7 @@ #include "Core.hpp" +#include #include namespace llama @@ -302,59 +303,73 @@ namespace llama mp_for_each( [&](auto tag) { - if(s != 0) - s++; // for the '.'s using Tag = decltype(tag); if constexpr(isRecordCoord) - s += intToStrSize(s); + { + // handle array indices + static_assert(Tag::size == 1); + s += 2; // for the '[' and ']' + s += intToStrSize(Tag::front); + } else + { + if(s != 0) + s++; // for the '.'s s += structName(tag).size(); + } }); return s; }(); llama::Array a{}; - auto w = a.begin(); + auto it = a.begin(); mp_for_each( [&](auto tag) constexpr { - if(w != a.begin()) - { - *w = '.'; - w++; - } using Tag = decltype(tag); if constexpr(isRecordCoord) { - // handle array indices - static_assert(Tag::size == 1); - // convert to string auto n = Tag::front; - w += intToStrSize(n) - 1; + *it = '['; + it++; + it += intToStrSize(n); + auto it2 = it; // take copy because we write number backward do { - *w = '0' + n % 10; - w--; + it2--; + *it2 = '0' + n % 10; n /= 10; } while(n != 0); + *it = ']'; + it++; } else { + if(it != a.begin()) + { + *it = '.'; + it++; + } constexpr auto sn = structName(tag); - constexprCopy(sn.begin(), sn.end(), w); - w += sn.size(); + constexprCopy(sn.begin(), sn.end(), it); + it += sn.size(); } }); + + if(!a.empty() && a.back() == 0) + throw std::logic_error{"Implementation error: Array should have been completely overwritten."}; + return a; }(); } // namespace internal - /// Returns the tags interspersed by '.' represented by the given record coord in the given record dimension. + /// Returns a pretty representation of the record coordinate inside the given record dimension. Tags are + /// interspersed by '.' and arrays are represented using subscript notation ("[123]"). template - constexpr auto recordCoordTags(RecordCoord = {}) -> std::string_view + constexpr auto prettyRecordCoord(RecordCoord = {}) -> std::string_view { constexpr auto& value = internal::recordCoordTagsStorage; - return std::string_view{&value[0], value.size()}; + return std::string_view{value.data(), value.size()}; } template diff --git a/include/llama/mapping/FieldAccessCount.hpp b/include/llama/mapping/FieldAccessCount.hpp index 370e8dd4c1..4198aaaee0 100644 --- a/include/llama/mapping/FieldAccessCount.hpp +++ b/include/llama/mapping/FieldAccessCount.hpp @@ -190,11 +190,11 @@ namespace llama::mapping { const size_type i = flatRecordCoord; if constexpr(MyCodeHandlesProxyReferences) - std::cout << std::left << std::setw(columnWidth) << recordCoordTags(rc) << ' ' + std::cout << std::left << std::setw(columnWidth) << prettyRecordCoord(rc) << ' ' << std::right << std::setw(columnWidth) << hits[i].reads << ' ' << std::right << std::setw(columnWidth) << hits[i].writes << '\n'; else - std::cout << std::left << std::setw(columnWidth) << recordCoordTags(rc) << ' ' + std::cout << std::left << std::setw(columnWidth) << prettyRecordCoord(rc) << ' ' << std::right << std::setw(columnWidth) << hits[i].memLocsComputed << '\n'; }); std::cout << std::internal; @@ -216,7 +216,7 @@ namespace llama::mapping [&](auto rc) { const size_type i = flatRecordCoord; - constexpr auto fieldName = recordCoordTags(rc); + constexpr auto fieldName = prettyRecordCoord(rc); char fieldNameZT[fieldName.size() + 1]{}; // nvcc does not handle the %*.*s parameter correctly llama::internal::constexprCopy(fieldName.begin(), fieldName.end(), fieldNameZT); if constexpr(MyCodeHandlesProxyReferences) diff --git a/tests/common.hpp b/tests/common.hpp index eb8d623ce4..5031130fb5 100644 --- a/tests/common.hpp +++ b/tests/common.hpp @@ -388,3 +388,45 @@ namespace picongpu llama::Field>>; } // namespace picongpu // NOLINTEND(readability-identifier-naming) + +// clang-format off +struct RngState {}; +struct Energy {}; +struct NumIALeft {}; +struct InitialRange {}; +struct DynamicRangeFactor {}; +struct TlimitMin {}; +struct Pos {}; +struct Dir {}; +struct NavState {}; +// clang-format on + +struct RanluxppDouble +{ +}; + +namespace vecgeom +{ + using Precision = double; + + template + struct Vector3D + { + }; + + struct NavStateIndex + { + }; +} // namespace vecgeom + +// from AdePT: +using Track = llama::Record< + llama::Field, + llama::Field, + llama::Field, + llama::Field, + llama::Field, + llama::Field, + llama::Field>, + llama::Field>, + llama::Field>; diff --git a/tests/core.cpp b/tests/core.cpp index 4c2a442f0e..f56288f07a 100644 --- a/tests/core.cpp +++ b/tests/core.cpp @@ -519,32 +519,54 @@ TEST_CASE("structName") CHECK(llama::structName() == "AnonNs2"); } -TEST_CASE("recordCoordTags.Particle") -{ - CHECK(llama::recordCoordTags(llama::RecordCoord<0, 0>{}) == "Pos.X"); - CHECK(llama::recordCoordTags(llama::RecordCoord<0, 1>{}) == "Pos.Y"); - CHECK(llama::recordCoordTags(llama::RecordCoord<0, 2>{}) == "Pos.Z"); - CHECK(llama::recordCoordTags(llama::RecordCoord<1>{}) == "Mass"); - CHECK(llama::recordCoordTags(llama::RecordCoord<2, 0>{}) == "Vel.X"); - CHECK(llama::recordCoordTags(llama::RecordCoord<2, 1>{}) == "Vel.Y"); - CHECK(llama::recordCoordTags(llama::RecordCoord<2, 2>{}) == "Vel.Z"); - CHECK(llama::recordCoordTags(llama::RecordCoord<3, 0>{}) == "Flags.0"); - CHECK(llama::recordCoordTags(llama::RecordCoord<3, 1>{}) == "Flags.1"); - CHECK(llama::recordCoordTags(llama::RecordCoord<3, 2>{}) == "Flags.2"); - CHECK(llama::recordCoordTags(llama::RecordCoord<3, 3>{}) == "Flags.3"); -} - -TEST_CASE("recordCoordTags.picongpu") -{ - CHECK(llama::recordCoordTags(llama::RecordCoord<0>{}) == "multiMask"); - CHECK(llama::recordCoordTags(llama::RecordCoord<1>{}) == "localCellIdx"); +TEST_CASE("prettyRecordCoord.Particle") +{ + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<>{}).empty()); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0>{}) == "Pos"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 0>{}) == "Pos.X"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 1>{}) == "Pos.Y"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 2>{}) == "Pos.Z"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<1>{}) == "Mass"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2>{}) == "Vel"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2, 0>{}) == "Vel.X"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2, 1>{}) == "Vel.Y"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2, 2>{}) == "Vel.Z"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<3>{}) == "Flags"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<3, 0>{}) == "Flags[0]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<3, 1>{}) == "Flags[1]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<3, 2>{}) == "Flags[2]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<3, 3>{}) == "Flags[3]"); + + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2>{}) == "NumIALeft"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2, 0>{}) == "NumIALeft[0]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2, 1>{}) == "NumIALeft[1]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<2, 2>{}) == "NumIALeft[2]"); + + using Row = llama::Record>; + using Matrix = llama::Record>; + + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0>{}) == "B"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 0>{}) == "B[0]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 1>{}) == "B[1]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 2>{}) == "B[2]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 0, 0>{}) == "B[0].A"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 0, 0, 0>{}) == "B[0].A[0]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 0, 0, 1>{}) == "B[0].A[1]"); + STATIC_REQUIRE(llama::prettyRecordCoord(llama::RecordCoord<0, 2, 0, 2>{}) == "B[2].A[2]"); +} + +TEST_CASE("prettyRecordCoord.picongpu") +{ + CHECK(llama::prettyRecordCoord(llama::RecordCoord<0>{}) == "multiMask"); + CHECK(llama::prettyRecordCoord(llama::RecordCoord<1>{}) == "localCellIdx"); #if defined(__NVCOMPILER) || defined(_MSC_VER) || (defined(__clang__) && __clang_major__ < 12) - CHECK(llama::recordCoordTags(llama::RecordCoord<2>{}) == "position"); + CHECK( + llama::prettyRecordCoord(llama::RecordCoord<2>{}) == "position"); #else - CHECK(llama::recordCoordTags(llama::RecordCoord<2>{}) == "position"); + CHECK(llama::prettyRecordCoord(llama::RecordCoord<2>{}) == "position"); #endif - CHECK(llama::recordCoordTags(llama::RecordCoord<3>{}) == "momentum"); - CHECK(llama::recordCoordTags(llama::RecordCoord<4>{}) == "weighting"); + CHECK(llama::prettyRecordCoord(llama::RecordCoord<3>{}) == "momentum"); + CHECK(llama::prettyRecordCoord(llama::RecordCoord<4>{}) == "weighting"); } namespace diff --git a/tests/dump.cpp b/tests/dump.cpp index 94aa5f0a30..4607917574 100644 --- a/tests/dump.cpp +++ b/tests/dump.cpp @@ -383,4 +383,9 @@ TEST_CASE("dump.picongpu.frame_openPMD.25") auto mapping = Mapping{ArrayExtents{25}}; dump(mapping); } + +TEST_CASE("dump.AdePT.track") +{ + dump(llama::mapping::AoS, Track>{{}}); +} #endif