// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include "TestContext.hpp" #include #include #include #include #include #include #include #include namespace { using namespace rocRoller; namespace KG = KernelGraph; std::vector argumentNames(std::vector const& args) { std::vector names; names.reserve(args.size()); for(auto const& a : args) names.push_back(a.getName()); return names; } } // namespace TEST_CASE("SortArguments transform works as expected", "[kernel-graph][SortArguments]") { auto context = TestContext::ForDefaultTarget(); auto example = rocRollerTest::Graphs::GEMM(DataType::Float); auto command = example.getCommand(); auto commandParameters = example.getCommandParameters(); auto argumentName = [](auto const& arg) { return arg.name; }; KG::KernelGraph kgraph; auto one = Expression::literal(1); context->kernel()->setWorkgroupSize({64, 1, 1}); context->kernel()->setWorkitemCount({one, one, one}); context->kernel()->addCommandArguments(command->getArguments()); kgraph = KG::translate(command); kgraph = transform(kgraph, false); kgraph = transform(kgraph, commandParameters); kgraph = transform(kgraph, commandParameters, context.get()); kgraph = transform(kgraph, context.get()); kgraph = transform(kgraph, commandParameters, context.get()); kgraph = transform(kgraph, commandParameters, context.get()); kgraph = transform(kgraph); kgraph = transform(kgraph); kgraph = transform(kgraph, context.get()); kgraph = transform( kgraph, context.get(), commandParameters->workgroupRemapXCC); kgraph = transform(kgraph, commandParameters, context.get()); kgraph = transform(kgraph); kgraph = transform(kgraph); kgraph = transform(kgraph); kgraph = transform(kgraph); kgraph = transform(kgraph, commandParameters, context.get()); kgraph = transform(kgraph, commandParameters); kgraph = transform(kgraph, context.get(), command); kgraph = transform(kgraph, context.get(), command); kgraph = transform(kgraph, context.get()); std::vector argNamesByUse = {"user_Float_Value_8", "user_Float_Value_6", "Tensor_0_stride_1", "Tensor_0_pointer", "Tensor_0_size_1", "Tensor_2_stride_0", "Tensor_2_pointer", "Tensor_2_size_0", "Tensor_4_stride_1", "Tensor_4_pointer", "Tensor_4_size_1", "Tensor_15_stride_1", "Tensor_15_pointer", "Tensor_15_size_1"}; std::vector argNamesByUseAndSize = {"Tensor_0_stride_1", "Tensor_0_pointer", "Tensor_0_size_1", "Tensor_2_stride_0", "Tensor_2_pointer", "Tensor_2_size_0", "user_Float_Value_8", "user_Float_Value_6", "Tensor_4_stride_1", "Tensor_4_pointer", "Tensor_4_size_1", "Tensor_15_stride_1", "Tensor_15_pointer", "Tensor_15_size_1"}; SECTION("sortArgumentsByFirstUse function reorders kernel arguments by first use") { auto args = context->kernel()->arguments(); KG::SortArguments_detail::sortArgumentsByFirstUse(kgraph, context->kernel(), args); CHECK(argumentNames(args) == argNamesByUse); SECTION("decidePreloadedKernargs function sorts partitions by size and decides preloaded " "kernargs") { context->argLoader()->decidePreloadedKernargs(args); CHECK(argumentNames(args) == argNamesByUseAndSize); int totalSize = 0; for(auto const& arg : args) { totalSize += arg.getSize(); CAPTURE(arg, totalSize); if(totalSize <= 56) { CHECK(arg.getPreloaded()); } else { CHECK_FALSE(arg.getPreloaded()); } } } } SECTION("Applying sortArguments transform reorders kernel arguments by first use and by size") { kgraph = transform(kgraph, context.get()); auto args = context->kernel()->arguments(); CHECK(argumentNames(args) == argNamesByUseAndSize); } }