Files
TheRock/rocm-libraries/dnn-providers/hipblaslt-provider/tests/engines/TestHipblasltEngine.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

241 lines
8.9 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include <gtest/gtest.h>
#include <memory>
#include <set>
#include <hipdnn_data_sdk/utilities/EngineNames.hpp>
#include <hipdnn_flatbuffers_sdk/data_objects/graph_generated.h>
#include <hipdnn_flatbuffers_sdk/flatbuffer_utilities/EngineDetailsWrapper.hpp>
#include <hipdnn_test_sdk/utilities/FlatbufferGraphTestUtils.hpp>
#include <hipdnn_test_sdk/utilities/MockGraph.hpp>
#include "engines/HipblasltEngine.hpp"
#include "mocks/MockHipdnnEnginePluginExecutionContext.hpp"
#include "mocks/MockPlanBuilder.hpp"
using namespace hipblaslt_plugin;
using namespace hipdnn_test_sdk::utilities;
using namespace hipdnn_plugin_sdk;
using namespace hipdnn_flatbuffers_sdk::flatbuffer_utilities;
TEST(TestHipblasltEngine, ConstructorAndId)
{
HipblasltEngine const engine(42);
EXPECT_EQ(engine.id(), 42);
}
TEST(TestHipblasltEngine, WorkspaceSizeReturnsZeroIfNoPlanBuilders)
{
HipblasltEngine const engine(1);
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
EXPECT_EQ(engine.getWorkspaceSize(dummyHandle, mockGraph), 0u);
}
TEST(TestHipblasltEngine, WorkspaceSizeReturnsPlanBuilderWorkspace)
{
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
EXPECT_CALL(*mockPlanBuilder, getWorkspaceSize(::testing::_, ::testing::_))
.WillOnce(::testing::Return(1337u));
HipblasltEngine engine(1);
engine.addPlanBuilder(std::move(mockPlanBuilder));
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
EXPECT_EQ(engine.getWorkspaceSize(dummyHandle, mockGraph), 1337u);
}
TEST(TestHipblasltEngine, WorkspaceSizeReturnsMaxPlanBuilderWorkspace)
{
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
EXPECT_CALL(*mockPlanBuilder, getWorkspaceSize(::testing::_, ::testing::_))
.WillOnce(::testing::Return(1337u));
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
EXPECT_CALL(*mockPlanBuilder2, getWorkspaceSize(::testing::_, ::testing::_))
.WillOnce(::testing::Return(45000u));
HipblasltEngine engine(1);
engine.addPlanBuilder(std::move(mockPlanBuilder));
engine.addPlanBuilder(std::move(mockPlanBuilder2));
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
EXPECT_EQ(engine.getWorkspaceSize(dummyHandle, mockGraph), 45000u);
}
TEST(TestHipblasltEngine, WorkspaceSizeReturnsZeroIfNoPlanBuilderApplicable)
{
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(false));
HipblasltEngine engine(1);
engine.addPlanBuilder(std::move(mockPlanBuilder));
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
EXPECT_EQ(engine.getWorkspaceSize(dummyHandle, mockGraph), 0u);
}
TEST(TestHipblasltEngine, IsApplicableReturnsTrueIfAnyPlanBuilderApplicable)
{
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
HipblasltEngine engine(0);
engine.addPlanBuilder(std::move(mockPlanBuilder));
MockGraph const mockGraph;
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
HipdnnEnginePluginHandle dummyHandle;
EXPECT_TRUE(engine.isApplicable(dummyHandle, mockGraph));
}
TEST(TestHipblasltEngine, IsApplicableReturnsAfterTheFirstApplicablePlanBuilder)
{
auto mockPlanBuilder1 = std::make_unique<MockPlanBuilder>();
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder1, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_)).Times(0);
HipblasltEngine engine(0);
engine.addPlanBuilder(std::move(mockPlanBuilder1));
engine.addPlanBuilder(std::move(mockPlanBuilder2));
MockGraph const mockGraph;
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
HipdnnEnginePluginHandle dummyHandle;
EXPECT_TRUE(engine.isApplicable(dummyHandle, mockGraph));
}
TEST(TestHipblasltEngine, IsApplicableReturnsFalseIfNoPlanBuilders)
{
HipblasltEngine const engine(0);
MockGraph const mockGraph;
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
HipdnnEnginePluginHandle dummyHandle;
EXPECT_FALSE(engine.isApplicable(dummyHandle, mockGraph));
}
TEST(TestHipblasltEngine, IsApplicableReturnsFalseIfNoPlanBuilderApplicable)
{
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(false));
HipblasltEngine engine(0);
engine.addPlanBuilder(std::move(mockPlanBuilder));
MockGraph const mockGraph;
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
HipdnnEnginePluginHandle dummyHandle;
EXPECT_FALSE(engine.isApplicable(dummyHandle, mockGraph));
}
TEST(TestHipblasltEngine, GetDetailsReturnsSerializedEngineDetails)
{
HipblasltEngine const engine(hipdnn_data_sdk::utilities::HIPBLASLT_ENGINE_ID);
HipdnnEnginePluginHandle dummyHandle;
hipdnnPluginConstData_t result;
engine.getDetails(dummyHandle, result);
hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineDetailsWrapper const engineDetails(
result.ptr, result.size);
EXPECT_EQ(engineDetails.engineId(), hipdnn_data_sdk::utilities::HIPBLASLT_ENGINE_ID);
}
TEST(TestHipblasltEngine, InitializeExecutionContextInvokesFirstApplicablePlanBuilder)
{
auto mockPlanBuilder1 = std::make_unique<MockPlanBuilder>();
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
// Only the first plan builder is applicable
EXPECT_CALL(*mockPlanBuilder1, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
EXPECT_CALL(*mockPlanBuilder1, buildPlan(::testing::_, ::testing::_, ::testing::_)).Times(1);
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_)).Times(0);
EXPECT_CALL(*mockPlanBuilder2, buildPlan(::testing::_, ::testing::_, ::testing::_)).Times(0);
HipblasltEngine engine(1);
engine.addPlanBuilder(std::move(mockPlanBuilder1));
engine.addPlanBuilder(std::move(mockPlanBuilder2));
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
MockHipdnnEnginePluginExecutionContext ctx;
engine.initializeExecutionContext(dummyHandle, mockGraph, ctx);
}
TEST(TestHipblasltEngine, InitializeExecutionContextSkipsNonApplicableBuilders)
{
auto mockPlanBuilder1 = std::make_unique<MockPlanBuilder>();
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
// First plan builder not applicable, second is
EXPECT_CALL(*mockPlanBuilder1, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(false));
EXPECT_CALL(*mockPlanBuilder1, buildPlan(::testing::_, ::testing::_, ::testing::_)).Times(0);
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(true));
EXPECT_CALL(*mockPlanBuilder2, buildPlan(::testing::_, ::testing::_, ::testing::_)).Times(1);
HipblasltEngine engine(1);
engine.addPlanBuilder(std::move(mockPlanBuilder1));
engine.addPlanBuilder(std::move(mockPlanBuilder2));
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
MockHipdnnEnginePluginExecutionContext ctx;
engine.initializeExecutionContext(dummyHandle, mockGraph, ctx);
}
TEST(TestHipblasltEngine, InitializeExecutionContextDoesNotCallBuildPlanIfNoApplicableBuilders)
{
auto mockPlanBuilder1 = std::make_unique<MockPlanBuilder>();
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
EXPECT_CALL(*mockPlanBuilder1, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(false));
EXPECT_CALL(*mockPlanBuilder1, buildPlan(::testing::_, ::testing::_, ::testing::_)).Times(0);
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_))
.WillOnce(::testing::Return(false));
EXPECT_CALL(*mockPlanBuilder2, buildPlan(::testing::_, ::testing::_, ::testing::_)).Times(0);
HipblasltEngine engine(1);
engine.addPlanBuilder(std::move(mockPlanBuilder1));
engine.addPlanBuilder(std::move(mockPlanBuilder2));
MockGraph const mockGraph;
HipdnnEnginePluginHandle const dummyHandle;
MockHipdnnEnginePluginExecutionContext ctx;
engine.initializeExecutionContext(dummyHandle, mockGraph, ctx);
}