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
241 lines
8.9 KiB
C++
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);
|
|
}
|