Skip to content

Commit

Permalink
Improve and rename recordCoordTags into prettyRecordCoord
Browse files Browse the repository at this point in the history
  • Loading branch information
bernhardmgruber committed Jan 31, 2023
1 parent f55f1c8 commit 430ceea
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 50 deletions.
2 changes: 1 addition & 1 deletion docs/pages/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Record dimension
.. doxygenfunction:: llama::forEachLeafCoord(Functor &&functor, Tags... baseTags)
.. doxygenfunction:: llama::forEachLeafCoord(Functor &&functor, RecordCoord<Coords...> baseCoord)

.. doxygenfunction:: llama::recordCoordTags
.. doxygenfunction:: llama::prettyRecordCoord

Record coordinates
------------------
Expand Down
6 changes: 3 additions & 3 deletions include/llama/DumpMapping.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<RecordDim>(rc), nrAndOffset, size});
infos.push_back({ai, internal::toVec(rc), prettyRecordCoord<RecordDim>(rc), nrAndOffset, size});
};

using Type = GetType<RecordDim, decltype(rc)>;
Expand Down Expand Up @@ -210,7 +210,7 @@ namespace llama
infos.push_back(
{ai,
internal::toVec(rc),
recordCoordTags<RecordDim>(rc),
prettyRecordCoord<RecordDim>(rc),
{static_cast<std::size_t>(nr), static_cast<std::size_t>(off)},
sizeof(Type)});
}
Expand Down Expand Up @@ -463,7 +463,7 @@ namespace llama
background-color: #{:X};
}}
)",
internal::cssClass(std::string{recordCoordTags<RecordDim>(rc)}),
internal::cssClass(std::string{prettyRecordCoord<RecordDim>(rc)}),
byteSizeInPixel * size,
internal::color(internal::toVec(rc)));
});
Expand Down
55 changes: 35 additions & 20 deletions include/llama/StructName.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "Core.hpp"

#include <stdexcept>
#include <string_view>

namespace llama
Expand Down Expand Up @@ -302,59 +303,73 @@ namespace llama
mp_for_each<Tags>(
[&](auto tag)
{
if(s != 0)
s++; // for the '.'s
using Tag = decltype(tag);
if constexpr(isRecordCoord<Tag>)
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<char, size> a{};
auto w = a.begin();
auto it = a.begin();

mp_for_each<Tags>(
[&](auto tag) constexpr
{
if(w != a.begin())
{
*w = '.';
w++;
}
using Tag = decltype(tag);
if constexpr(isRecordCoord<Tag>)
{
// 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<typename RecordDim, std::size_t... Coords>
constexpr auto recordCoordTags(RecordCoord<Coords...> = {}) -> std::string_view
constexpr auto prettyRecordCoord(RecordCoord<Coords...> = {}) -> std::string_view
{
constexpr auto& value = internal::recordCoordTagsStorage<RecordDim, Coords...>;
return std::string_view{&value[0], value.size()};
return std::string_view{value.data(), value.size()};
}

template<typename RecordDim>
Expand Down
6 changes: 3 additions & 3 deletions include/llama/mapping/FieldAccessCount.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,11 @@ namespace llama::mapping
{
const size_type i = flatRecordCoord<RecordDim, decltype(rc)>;
if constexpr(MyCodeHandlesProxyReferences)
std::cout << std::left << std::setw(columnWidth) << recordCoordTags<RecordDim>(rc) << ' '
std::cout << std::left << std::setw(columnWidth) << prettyRecordCoord<RecordDim>(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<RecordDim>(rc) << ' '
std::cout << std::left << std::setw(columnWidth) << prettyRecordCoord<RecordDim>(rc) << ' '
<< std::right << std::setw(columnWidth) << hits[i].memLocsComputed << '\n';
});
std::cout << std::internal;
Expand All @@ -216,7 +216,7 @@ namespace llama::mapping
[&](auto rc)
{
const size_type i = flatRecordCoord<RecordDim, decltype(rc)>;
constexpr auto fieldName = recordCoordTags<RecordDim>(rc);
constexpr auto fieldName = prettyRecordCoord<RecordDim>(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)
Expand Down
42 changes: 42 additions & 0 deletions tests/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,3 +388,45 @@ namespace picongpu
llama::Field<totalCellIdx, pmacc::DataSpace<3>>>;
} // 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<typename T>
struct Vector3D
{
};

struct NavStateIndex
{
};
} // namespace vecgeom

// from AdePT:
using Track = llama::Record<
llama::Field<RngState, RanluxppDouble>,
llama::Field<Energy, double>,
llama::Field<NumIALeft, double[3]>,
llama::Field<InitialRange, double>,
llama::Field<DynamicRangeFactor, double>,
llama::Field<TlimitMin, double>,
llama::Field<Pos, vecgeom::Vector3D<vecgeom::Precision>>,
llama::Field<Dir, vecgeom::Vector3D<vecgeom::Precision>>,
llama::Field<NavState, vecgeom::NavStateIndex>>;
68 changes: 45 additions & 23 deletions tests/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -519,32 +519,54 @@ TEST_CASE("structName")
CHECK(llama::structName<ns::AnonNs2>() == "AnonNs2");
}

TEST_CASE("recordCoordTags.Particle")
{
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<0, 0>{}) == "Pos.X");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<0, 1>{}) == "Pos.Y");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<0, 2>{}) == "Pos.Z");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<1>{}) == "Mass");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<2, 0>{}) == "Vel.X");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<2, 1>{}) == "Vel.Y");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<2, 2>{}) == "Vel.Z");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<3, 0>{}) == "Flags.0");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<3, 1>{}) == "Flags.1");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<3, 2>{}) == "Flags.2");
CHECK(llama::recordCoordTags<Particle>(llama::RecordCoord<3, 3>{}) == "Flags.3");
}

TEST_CASE("recordCoordTags.picongpu")
{
CHECK(llama::recordCoordTags<picongpu::Frame>(llama::RecordCoord<0>{}) == "multiMask");
CHECK(llama::recordCoordTags<picongpu::Frame>(llama::RecordCoord<1>{}) == "localCellIdx");
TEST_CASE("prettyRecordCoord.Particle")
{
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<>{}).empty());
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<0>{}) == "Pos");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<0, 0>{}) == "Pos.X");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<0, 1>{}) == "Pos.Y");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<0, 2>{}) == "Pos.Z");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<1>{}) == "Mass");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<2>{}) == "Vel");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<2, 0>{}) == "Vel.X");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<2, 1>{}) == "Vel.Y");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<2, 2>{}) == "Vel.Z");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<3>{}) == "Flags");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<3, 0>{}) == "Flags[0]");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<3, 1>{}) == "Flags[1]");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<3, 2>{}) == "Flags[2]");
STATIC_REQUIRE(llama::prettyRecordCoord<Particle>(llama::RecordCoord<3, 3>{}) == "Flags[3]");

STATIC_REQUIRE(llama::prettyRecordCoord<Track>(llama::RecordCoord<2>{}) == "NumIALeft");
STATIC_REQUIRE(llama::prettyRecordCoord<Track>(llama::RecordCoord<2, 0>{}) == "NumIALeft[0]");
STATIC_REQUIRE(llama::prettyRecordCoord<Track>(llama::RecordCoord<2, 1>{}) == "NumIALeft[1]");
STATIC_REQUIRE(llama::prettyRecordCoord<Track>(llama::RecordCoord<2, 2>{}) == "NumIALeft[2]");

using Row = llama::Record<llama::Field<tag::A, double[3]>>;
using Matrix = llama::Record<llama::Field<tag::B, Row[3]>>;

STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0>{}) == "B");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 0>{}) == "B[0]");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 1>{}) == "B[1]");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 2>{}) == "B[2]");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 0, 0>{}) == "B[0].A");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 0, 0, 0>{}) == "B[0].A[0]");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 0, 0, 1>{}) == "B[0].A[1]");
STATIC_REQUIRE(llama::prettyRecordCoord<Matrix>(llama::RecordCoord<0, 2, 0, 2>{}) == "B[2].A[2]");
}

TEST_CASE("prettyRecordCoord.picongpu")
{
CHECK(llama::prettyRecordCoord<picongpu::Frame>(llama::RecordCoord<0>{}) == "multiMask");
CHECK(llama::prettyRecordCoord<picongpu::Frame>(llama::RecordCoord<1>{}) == "localCellIdx");
#if defined(__NVCOMPILER) || defined(_MSC_VER) || (defined(__clang__) && __clang_major__ < 12)
CHECK(llama::recordCoordTags<picongpu::Frame>(llama::RecordCoord<2>{}) == "position<position_pic,pmacc_isAlias>");
CHECK(
llama::prettyRecordCoord<picongpu::Frame>(llama::RecordCoord<2>{}) == "position<position_pic,pmacc_isAlias>");
#else
CHECK(llama::recordCoordTags<picongpu::Frame>(llama::RecordCoord<2>{}) == "position<position_pic>");
CHECK(llama::prettyRecordCoord<picongpu::Frame>(llama::RecordCoord<2>{}) == "position<position_pic>");
#endif
CHECK(llama::recordCoordTags<picongpu::Frame>(llama::RecordCoord<3>{}) == "momentum");
CHECK(llama::recordCoordTags<picongpu::Frame>(llama::RecordCoord<4>{}) == "weighting");
CHECK(llama::prettyRecordCoord<picongpu::Frame>(llama::RecordCoord<3>{}) == "momentum");
CHECK(llama::prettyRecordCoord<picongpu::Frame>(llama::RecordCoord<4>{}) == "weighting");
}

namespace
Expand Down
5 changes: 5 additions & 0 deletions tests/dump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<llama::ArrayExtents<int, 8>, Track>{{}});
}
#endif

0 comments on commit 430ceea

Please sign in to comment.