Files
TheRock/rocm-libraries/shared/rocroller/test/unit/UtilsTest.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

313 lines
9.2 KiB
C++

// Copyright Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include <rocRoller/Utilities/EnumBitset.hpp>
#include <rocRoller/Utilities/Utils.hpp>
#include "SimpleFixture.hpp"
#include "SourceMatcher.hpp"
#include "Utilities.hpp"
class UtilsTest : public SimpleFixture
{
};
class EnumBitsetTest : public SimpleFixture
{
};
TEST_F(UtilsTest, StreamTuple)
{
std::string str = "foo";
auto test = std::make_tuple(4, 5.6, str);
std::ostringstream msg;
msg << test;
EXPECT_EQ("[4, 5.6, foo]", msg.str());
}
TEST_F(UtilsTest, StreamTuple2)
{
std::string str = "foo";
auto test = std::make_tuple(str);
std::ostringstream msg;
msg << test;
EXPECT_EQ("[foo]", msg.str());
}
enum class TestEnum : int
{
A1,
A2,
A3,
A4,
A5,
A6,
A7,
A8,
A9,
A10,
A11,
A12,
A13,
A14,
A15,
A16,
A17,
A18,
A19,
A20,
A21,
A22,
A23,
A24,
A25,
A26,
A27,
A28,
A29,
A30,
A31,
A32,
A33,
Count
};
std::string toString(TestEnum e)
{
using namespace rocRoller;
if(e == TestEnum::Count)
Throw<FatalError>("Invalid TestEnum");
auto idx = static_cast<int>(e) + 1;
return concatenate("A", idx);
}
TEST_F(EnumBitsetTest, LargeEnum)
{
using LargeBitset = rocRoller::EnumBitset<TestEnum>;
LargeBitset a1{TestEnum::A1};
LargeBitset a33{TestEnum::A33};
LargeBitset combined{TestEnum::A1, TestEnum::A33};
EXPECT_NE(a1, a33);
EXPECT_TRUE(a1[TestEnum::A1]);
EXPECT_FALSE(a1[TestEnum::A33]);
EXPECT_TRUE(a33[TestEnum::A33]);
EXPECT_EQ(combined, a1 | a33);
EXPECT_TRUE(combined[TestEnum::A1]);
EXPECT_TRUE(combined[TestEnum::A33]);
a1.set(TestEnum::A33, true);
a1.set(TestEnum::A1, false);
EXPECT_FALSE(a1[TestEnum::A1]);
EXPECT_TRUE(a1[TestEnum::A33]);
auto expected = R"(
A1: false
A2: false
A3: false
A4: false
A5: false
A6: false
A7: false
A8: false
A9: false
A10: false
A11: false
A12: false
A13: false
A14: false
A15: false
A16: false
A17: false
A18: false
A19: false
A20: false
A21: false
A22: false
A23: false
A24: false
A25: false
A26: false
A27: false
A28: false
A29: false
A30: false
A31: false
A32: false
A33: true
)";
EXPECT_EQ(NormalizedSource(expected), NormalizedSource(rocRoller::concatenate(a1)));
}
TEST_F(UtilsTest, SetIdentityMatrix)
{
using namespace rocRoller;
std::vector<float> mat(3 * 5);
SetIdentityMatrix(mat, 3, 5);
// clang-format off
std::vector<float> expected = { 1, 0, 0,
0, 1, 0,
0, 0, 1,
0, 0, 0,
0, 0, 0,
};
// clang-format on
EXPECT_EQ(mat, expected);
SetIdentityMatrix(mat, 5, 3);
// clang-format off
expected = { 1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0 };
// clang-format on
EXPECT_EQ(mat, expected);
}
TEST_F(UtilsTest, SetIdentityMatrixFP4)
{
using namespace rocRoller;
size_t const rows = 8;
size_t const cols = 8;
auto rng = RandomGenerator(12345);
auto mat = rng.vector<FP4>(rows * cols, -6.0f, 6.0f);
SetIdentityMatrix(mat, rows, cols);
// clang-format off
auto const expected = std::to_array<uint8_t> ({
0b00100000, 0b00000000, 0b00000000, 0b00000000,
0b00000010, 0b00000000, 0b00000000, 0b00000000,
0b00000000, 0b00100000, 0b00000000, 0b00000000,
0b00000000, 0b00000010, 0b00000000, 0b00000000,
0b00000000, 0b00000000, 0b00100000, 0b00000000,
0b00000000, 0b00000000, 0b00000010, 0b00000000,
0b00000000, 0b00000000, 0b00000000, 0b00100000,
0b00000000, 0b00000000, 0b00000000, 0b00000010,
});
// clang-format on
EXPECT_EQ(std::memcmp(mat.data(), expected.data(), expected.size()), 0);
}
template <typename F6Type>
std::string createF6IdentityMatrix(float min, float max)
{
using namespace rocRoller;
size_t constexpr rows = 16;
size_t constexpr cols = 16;
size_t constexpr numBits = rows * cols * 6;
auto rng = RandomGenerator(12345);
auto mat = rng.vector<F6Type>(rows * cols, min, max);
SetIdentityMatrix(mat, rows, cols);
auto ptr = reinterpret_cast<uint8_t*>(mat.data());
std::string bits;
bits.reserve(numBits);
for(int i = 0; i < (numBits / 8); i++, ptr++)
{
uint8_t value = *ptr;
std::bitset<8> valueBits(value);
for(int j = 7; j >= 0; j--)
{
if(valueBits.test(j))
bits.push_back('1');
else
bits.push_back('0');
}
}
return bits;
}
TEST_F(UtilsTest, SetIdentityMatrixF6)
{
auto fp6_bits = createF6IdentityMatrix<rocRoller::FP6>(-7.5f, 7.5f);
#define ZERO "000000"
// clang-format off
std::string_view expected_fp6_bits(
"001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000" ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001000"
);
// clang-format on
#undef ZERO
EXPECT_EQ(fp6_bits, expected_fp6_bits);
auto bf6_bits = createF6IdentityMatrix<rocRoller::BF6>(-28.0f, 28.0f);
#define ZERO "000000"
// clang-format off
std::string_view const expected_bf6_bits(
"001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100" ZERO
ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO ZERO "001100"
);
// clang-format on
#undef ZERO
EXPECT_EQ(bf6_bits, expected_bf6_bits);
}
TEST_F(UtilsTest, SingleVariant)
{
using namespace rocRoller;
EXPECT_EQ(std::variant<int>(5), singleVariant(5));
std::string value = "five";
auto var = singleVariant(value);
EXPECT_EQ(std::variant<std::string>(value), var);
auto visitor = [&](int value) { EXPECT_EQ(value, 15); };
std::visit(visitor, singleVariant(15));
}