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
559 lines
21 KiB
C++
559 lines
21 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/StringUtil.hpp>
|
|
#include <hipdnn_flatbuffers_sdk/data_objects/engine_config_generated.h>
|
|
#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 <hipdnn_test_sdk/utilities/TestUtilities.hpp>
|
|
|
|
#include "engines/MiopenEngine.hpp"
|
|
#include "mocks/MockHipdnnMiopenContext.hpp"
|
|
#include "mocks/MockPlanBuilder.hpp"
|
|
#include <hipdnn_test_sdk/utilities/MockEngineConfig.hpp>
|
|
|
|
using namespace miopen_plugin;
|
|
using namespace hipdnn_test_sdk::utilities;
|
|
using namespace hipdnn_flatbuffers_sdk::flatbuffer_utilities;
|
|
|
|
TEST(TestMiopenEngine, ConstructorAndId)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(42);
|
|
EXPECT_EQ(engine.id(), 42);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, WorkspaceSizeReturnsZeroIfNoPlanBuilders)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillOnce(::testing::Return(false));
|
|
|
|
EXPECT_EQ(engine.getMaxWorkspaceSize(dummyHandle, mockGraph, mockConfig), 0u);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, WorkspaceSizeReturnsPlanBuilderWorkspace)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
|
|
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(true));
|
|
EXPECT_CALL(*mockPlanBuilder,
|
|
initializeExecutionSettings(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
EXPECT_CALL(*mockPlanBuilder, getMaxWorkspaceSize(::testing::_, ::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(1337u));
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder));
|
|
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillOnce(::testing::Return(false));
|
|
|
|
EXPECT_EQ(engine.getMaxWorkspaceSize(dummyHandle, mockGraph, mockConfig), 1337u);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, WorkspaceSizeReturnsMaxPlanBuilderWorkspace)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
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,
|
|
initializeExecutionSettings(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
EXPECT_CALL(*mockPlanBuilder, getMaxWorkspaceSize(::testing::_, ::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(1337u));
|
|
|
|
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(true));
|
|
EXPECT_CALL(*mockPlanBuilder2,
|
|
initializeExecutionSettings(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
EXPECT_CALL(*mockPlanBuilder2, getMaxWorkspaceSize(::testing::_, ::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(45000u));
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder));
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder2));
|
|
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillRepeatedly(::testing::Return(false));
|
|
|
|
EXPECT_EQ(engine.getMaxWorkspaceSize(dummyHandle, mockGraph, mockConfig), 45000u);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, WorkspaceSizeReturnsZeroIfNoPlanBuilderApplicable)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
|
|
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(false));
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder));
|
|
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillOnce(::testing::Return(false));
|
|
|
|
EXPECT_EQ(engine.getMaxWorkspaceSize(dummyHandle, mockGraph, mockConfig), 0u);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, IsApplicableReturnsTrueIfAnyPlanBuilderApplicable)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
|
|
|
|
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(true));
|
|
|
|
MiopenEngine engine(0);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder));
|
|
|
|
const MockGraph mockGraph;
|
|
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
|
|
|
|
HipdnnMiopenHandle dummyHandle;
|
|
EXPECT_TRUE(engine.isApplicable(dummyHandle, mockGraph));
|
|
}
|
|
|
|
TEST(TestMiopenEngine, IsApplicableReturnsAfterTheFirstApplicablePlanBuilder)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
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);
|
|
|
|
MiopenEngine engine(0);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder1));
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder2));
|
|
|
|
const MockGraph mockGraph;
|
|
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
|
|
|
|
HipdnnMiopenHandle dummyHandle;
|
|
EXPECT_TRUE(engine.isApplicable(dummyHandle, mockGraph));
|
|
}
|
|
|
|
TEST(TestMiopenEngine, IsApplicableReturnsFalseIfNoPlanBuilders)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(0);
|
|
|
|
const MockGraph mockGraph;
|
|
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
|
|
|
|
HipdnnMiopenHandle dummyHandle;
|
|
EXPECT_FALSE(engine.isApplicable(dummyHandle, mockGraph));
|
|
}
|
|
|
|
TEST(TestMiopenEngine, IsApplicableReturnsFalseIfNoPlanBuilderApplicable)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
auto mockPlanBuilder = std::make_unique<MockPlanBuilder>();
|
|
EXPECT_CALL(*mockPlanBuilder, isApplicable(::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(false));
|
|
|
|
MiopenEngine engine(0);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder));
|
|
|
|
const MockGraph mockGraph;
|
|
auto graphBuilder = hipdnn_test_sdk::utilities::createEmptyValidGraph();
|
|
|
|
HipdnnMiopenHandle dummyHandle;
|
|
EXPECT_FALSE(engine.isApplicable(dummyHandle, mockGraph));
|
|
}
|
|
|
|
TEST(TestMiopenEngine, GetDetailsReturnsSerializedEngineDetails)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
|
|
hipdnnPluginConstData_t result;
|
|
engine.getDetails(dummyHandle, mockGraph, result);
|
|
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineDetailsWrapper engineDetails(
|
|
result.ptr, result.size);
|
|
EXPECT_EQ(engineDetails.engineId(), 1);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, GetDetailsContainsBenchmarkingKnob)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
|
|
hipdnnPluginConstData_t result;
|
|
engine.getDetails(dummyHandle, mockGraph, result);
|
|
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineDetailsWrapper engineDetails(
|
|
result.ptr, result.size);
|
|
ASSERT_EQ(engineDetails.knobCount(), 1u);
|
|
|
|
const auto& knob = engineDetails.getKnobByName("global.benchmarking");
|
|
EXPECT_EQ(knob.knobId(), "global.benchmarking");
|
|
EXPECT_EQ(knob.description(), "Enable benchmarking");
|
|
|
|
ASSERT_TRUE(knob.hasDefaultValue());
|
|
EXPECT_EQ(knob.defaultValueType(), hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
|
|
const auto& defaultValue
|
|
= knob.defaultValueAs<hipdnn_flatbuffers_sdk::data_objects::IntValue>();
|
|
EXPECT_EQ(defaultValue.value(), 0);
|
|
|
|
ASSERT_TRUE(knob.hasConstraint());
|
|
EXPECT_EQ(knob.constraintType(),
|
|
hipdnn_flatbuffers_sdk::data_objects::KnobConstraint::IntConstraint);
|
|
const auto& constraint
|
|
= knob.constraintAs<hipdnn_flatbuffers_sdk::data_objects::IntConstraint>();
|
|
EXPECT_EQ(constraint.min_value(), 0);
|
|
EXPECT_EQ(constraint.max_value(), 1);
|
|
EXPECT_EQ(constraint.step(), 1);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, GetDetailsOnlyUsesFirstPlanBuilderCustomKnobs)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
auto mockPlanBuilder1 = std::make_unique<MockPlanBuilder>();
|
|
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
|
|
|
|
// Set up first plan builder to return a custom knob
|
|
hipdnn_flatbuffers_sdk::data_objects::KnobT knob1;
|
|
knob1.knob_id = "custom.knob1";
|
|
knob1.description = "First custom knob";
|
|
hipdnn_flatbuffers_sdk::data_objects::IntValueT defaultValue1;
|
|
defaultValue1.value = 1;
|
|
knob1.default_value.Set(defaultValue1);
|
|
|
|
std::vector<hipdnn_flatbuffers_sdk::data_objects::KnobT> customKnobs1;
|
|
customKnobs1.push_back(knob1);
|
|
|
|
EXPECT_CALL(*mockPlanBuilder1, getCustomKnobs(::testing::_, ::testing::_))
|
|
.WillOnce(::testing::Return(customKnobs1));
|
|
|
|
// Set up second plan builder to also return a custom knob (this should be ignored)
|
|
hipdnn_flatbuffers_sdk::data_objects::KnobT knob2;
|
|
knob2.knob_id = "custom.knob2";
|
|
knob2.description = "Second custom knob";
|
|
hipdnn_flatbuffers_sdk::data_objects::IntValueT defaultValue2;
|
|
defaultValue2.value = 2;
|
|
knob2.default_value.Set(defaultValue2);
|
|
|
|
std::vector<hipdnn_flatbuffers_sdk::data_objects::KnobT> customKnobs2;
|
|
customKnobs2.push_back(knob2);
|
|
|
|
// This should NOT be called because we break after first non-empty custom knobs
|
|
EXPECT_CALL(*mockPlanBuilder2, getCustomKnobs(::testing::_, ::testing::_)).Times(0);
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder1));
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder2));
|
|
|
|
HipdnnMiopenHandle dummyHandle;
|
|
const MockGraph mockGraph;
|
|
|
|
hipdnnPluginConstData_t result;
|
|
engine.getDetails(dummyHandle, mockGraph, result);
|
|
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineDetailsWrapper engineDetails(
|
|
result.ptr, result.size);
|
|
|
|
// Should have 2 knobs: benchmarking (always present) + custom.knob1 (from first builder)
|
|
ASSERT_EQ(engineDetails.knobCount(), 2u);
|
|
|
|
// Verify benchmarking knob is present
|
|
const auto& benchmarkingKnob = engineDetails.getKnobByName("global.benchmarking");
|
|
EXPECT_EQ(benchmarkingKnob.knobId(), "global.benchmarking");
|
|
|
|
// Verify first custom knob is present
|
|
const auto& customKnob1 = engineDetails.getKnobByName("custom.knob1");
|
|
EXPECT_EQ(customKnob1.knobId(), "custom.knob1");
|
|
EXPECT_EQ(customKnob1.description(), "First custom knob");
|
|
|
|
// Verify second custom knob is NOT present (would throw if we tried to access it)
|
|
EXPECT_THROW(engineDetails.getKnobByName("custom.knob2"), std::out_of_range);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextInvokesFirstApplicablePlanBuilder)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
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::_))
|
|
.Times(2)
|
|
.WillRepeatedly(::testing::Return(true));
|
|
EXPECT_CALL(*mockPlanBuilder1,
|
|
initializeExecutionSettings(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
EXPECT_CALL(*mockPlanBuilder1,
|
|
buildPlan(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_)).Times(0);
|
|
EXPECT_CALL(*mockPlanBuilder2,
|
|
buildPlan(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(0);
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder1));
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder2));
|
|
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillRepeatedly(::testing::Return(false));
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, mockConfig, ctx);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextThrowsOnInvalidBenchmarkingKnobType)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
|
|
flatbuffers::FlatBufferBuilder builder;
|
|
auto knobIdOffset = builder.CreateString("global.benchmarking");
|
|
auto stringValueOffset = builder.CreateString("invalid_value");
|
|
auto knobValue
|
|
= hipdnn_flatbuffers_sdk::data_objects::CreateStringValue(builder, stringValueOffset);
|
|
hipdnn_flatbuffers_sdk::data_objects::KnobSettingBuilder knobSettingBuilder(builder);
|
|
knobSettingBuilder.add_knob_id(knobIdOffset);
|
|
knobSettingBuilder.add_value_type(hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue);
|
|
knobSettingBuilder.add_value(knobValue.Union());
|
|
auto knobSetting = knobSettingBuilder.Finish();
|
|
|
|
std::vector<flatbuffers::Offset<hipdnn_flatbuffers_sdk::data_objects::KnobSetting>> knobsVector;
|
|
knobsVector.push_back(knobSetting);
|
|
auto knobs = builder.CreateVector(knobsVector);
|
|
|
|
auto engineConfig = hipdnn_flatbuffers_sdk::data_objects::CreateEngineConfig(builder, 1, knobs);
|
|
builder.Finish(engineConfig);
|
|
|
|
auto buffer = builder.Release();
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineConfigWrapper configWrapper(
|
|
buffer.data(), buffer.size());
|
|
|
|
EXPECT_THROW(engine.initializeExecutionContext(dummyHandle, mockGraph, configWrapper, ctx),
|
|
hipdnn_plugin_sdk::HipdnnPluginException);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextSetsBenchmarkingEnabled)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
|
|
flatbuffers::FlatBufferBuilder builder;
|
|
auto knobIdOffset = builder.CreateString("global.benchmarking");
|
|
auto knobValue = hipdnn_flatbuffers_sdk::data_objects::CreateIntValue(builder, 1);
|
|
hipdnn_flatbuffers_sdk::data_objects::KnobSettingBuilder knobSettingBuilder(builder);
|
|
knobSettingBuilder.add_knob_id(knobIdOffset);
|
|
knobSettingBuilder.add_value_type(hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
|
|
knobSettingBuilder.add_value(knobValue.Union());
|
|
auto knobSetting = knobSettingBuilder.Finish();
|
|
|
|
std::vector<flatbuffers::Offset<hipdnn_flatbuffers_sdk::data_objects::KnobSetting>> knobsVector;
|
|
knobsVector.push_back(knobSetting);
|
|
auto knobs = builder.CreateVector(knobsVector);
|
|
|
|
auto engineConfig = hipdnn_flatbuffers_sdk::data_objects::CreateEngineConfig(builder, 1, knobs);
|
|
builder.Finish(engineConfig);
|
|
|
|
auto buffer = builder.Release();
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineConfigWrapper configWrapper(
|
|
buffer.data(), buffer.size());
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, configWrapper, ctx);
|
|
|
|
EXPECT_TRUE(ctx.executionSettings().benchmarkingEnabled());
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextSetsBenchmarkingDisabled)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
|
|
flatbuffers::FlatBufferBuilder builder;
|
|
auto knobIdOffset = builder.CreateString("global.benchmarking");
|
|
auto knobValue
|
|
= hipdnn_flatbuffers_sdk::data_objects::CreateIntValue(builder, static_cast<int64_t>(0));
|
|
hipdnn_flatbuffers_sdk::data_objects::KnobSettingBuilder knobSettingBuilder(builder);
|
|
knobSettingBuilder.add_knob_id(knobIdOffset);
|
|
knobSettingBuilder.add_value_type(hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue);
|
|
knobSettingBuilder.add_value(knobValue.Union());
|
|
auto knobSetting = knobSettingBuilder.Finish();
|
|
|
|
std::vector<flatbuffers::Offset<hipdnn_flatbuffers_sdk::data_objects::KnobSetting>> knobsVector;
|
|
knobsVector.push_back(knobSetting);
|
|
auto knobs = builder.CreateVector(knobsVector);
|
|
|
|
auto engineConfig = hipdnn_flatbuffers_sdk::data_objects::CreateEngineConfig(builder, 1, knobs);
|
|
builder.Finish(engineConfig);
|
|
|
|
auto buffer = builder.Release();
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineConfigWrapper configWrapper(
|
|
buffer.data(), buffer.size());
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, configWrapper, ctx);
|
|
|
|
EXPECT_FALSE(ctx.executionSettings().benchmarkingEnabled());
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextDefaultsBenchmarkingDisabledWhenConfigInvalid)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
const MockEngineConfig mockConfig;
|
|
|
|
EXPECT_CALL(mockConfig, isValid()).WillRepeatedly(::testing::Return(false));
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, mockConfig, ctx);
|
|
|
|
EXPECT_FALSE(ctx.executionSettings().benchmarkingEnabled());
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextDefaultsBenchmarkingDisabledWhenNoKnobs)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
const MiopenEngine engine(1);
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
|
|
flatbuffers::FlatBufferBuilder builder;
|
|
auto engineConfig = hipdnn_flatbuffers_sdk::data_objects::CreateEngineConfig(builder, 1, 0);
|
|
builder.Finish(engineConfig);
|
|
|
|
auto buffer = builder.Release();
|
|
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineConfigWrapper configWrapper(
|
|
buffer.data(), buffer.size());
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, configWrapper, ctx);
|
|
|
|
EXPECT_FALSE(ctx.executionSettings().benchmarkingEnabled());
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextSkipsNonApplicableBuilders)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
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::_))
|
|
.Times(2)
|
|
.WillRepeatedly(::testing::Return(false));
|
|
EXPECT_CALL(*mockPlanBuilder1,
|
|
buildPlan(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(0);
|
|
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_))
|
|
.Times(2)
|
|
.WillRepeatedly(::testing::Return(true));
|
|
EXPECT_CALL(*mockPlanBuilder2,
|
|
initializeExecutionSettings(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
EXPECT_CALL(*mockPlanBuilder2,
|
|
buildPlan(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(1);
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder1));
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder2));
|
|
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillRepeatedly(::testing::Return(false));
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, mockConfig, ctx);
|
|
}
|
|
|
|
TEST(TestMiopenEngine, InitializeExecutionContextDoesNotCallBuildPlanIfNoApplicableBuilders)
|
|
{
|
|
SKIP_IF_NO_DEVICES();
|
|
|
|
auto mockPlanBuilder1 = std::make_unique<MockPlanBuilder>();
|
|
auto mockPlanBuilder2 = std::make_unique<MockPlanBuilder>();
|
|
|
|
EXPECT_CALL(*mockPlanBuilder1, isApplicable(::testing::_, ::testing::_))
|
|
.Times(2)
|
|
.WillRepeatedly(::testing::Return(false));
|
|
EXPECT_CALL(*mockPlanBuilder1,
|
|
buildPlan(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(0);
|
|
EXPECT_CALL(*mockPlanBuilder2, isApplicable(::testing::_, ::testing::_))
|
|
.Times(2)
|
|
.WillRepeatedly(::testing::Return(false));
|
|
EXPECT_CALL(*mockPlanBuilder2,
|
|
buildPlan(::testing::_, ::testing::_, ::testing::_, ::testing::_))
|
|
.Times(0);
|
|
|
|
MiopenEngine engine(1);
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder1));
|
|
engine.addPlanBuilder(std::move(mockPlanBuilder2));
|
|
|
|
const MockGraph mockGraph;
|
|
const HipdnnMiopenHandle dummyHandle;
|
|
MockHipdnnMiopenContext ctx;
|
|
const MockEngineConfig mockConfig;
|
|
EXPECT_CALL(mockConfig, isValid()).WillRepeatedly(::testing::Return(false));
|
|
|
|
engine.initializeExecutionContext(dummyHandle, mockGraph, mockConfig, ctx);
|
|
}
|