// SPDX-License-Identifier: MIT // Copyright (c) 2018-2022, Advanced Micro Devices, Inc. All rights reserved. #include #include #include #include "profiler/data_type_enum.hpp" #include "profiler/profile_pool2d_fwd_impl.hpp" #include "profiler_operation_registry.hpp" using ck::index_t; struct avgPoolFwdArgParser { std::unordered_map> long_opts = { {"length", {}}, {"wsize", {}}, {"wstride", {}}, {"pad1", {}}, {"pad2", {}}}; bool parse_opt(int argc, char* argv[], const std::string& key, int i) { if(std::string("--") + key == argv[i]) { int pos = i; while(++i < argc && argv[i][0] != '-') {} int end = i; for(int j = pos + 1; j < end; j++) { long_opts[key].push_back(std::stoi(argv[j])); } return true; } return false; } void operator()(int argc, char* argv[]) { for(auto& kv : long_opts) { for(int i = 1; i < argc; i++) { if(parse_opt(argc, argv, kv.first, i)) break; } } } }; void print_help_avg_pool2d_fwd() { std::cout << "arg1: data type (0: fp16; 1: fp32)\n" << "arg2: verification (0: no; 1: yes)\n" << "arg3: initialization (0: no init; 1: integer value; 2: decimal value)\n" << "arg4: print tensor value (0: no; 1: yes)\n" << "arg5: time kernel (0=no, 1=yes)\n" << "--length: input tensor length for NDHW(e.g, --length 2 32 30 30) \n" << "--wsize: window size for YX (e.g, --wsize 2 2) \n" << "--wstride: window stride for HW (e.g, --wstride 2 2) \n" << "--pad1: left side of padding in HW (e.g, --pad1 1 1) \n" << "--pad2: right side of padding in HW (e.g, --pad2 1 1) \n" << "eg: ckProfiler avg_pool2d_fwd 0 1 2 0 1 0 --length 2 32 30 30 --wsize 2 2 " "--wstride 2 2 --pad1 1 1 --pad2 1 1" << std::endl; } int profile_avg_pool2d_fwd(int argc, char* argv[]) { ck::DataTypeEnum data_type = ck::DataTypeEnum::Half; bool do_verification = true; int init_method = 0; bool do_log = false; bool time_kernel = true; std::vector in_length = {2, 32, 30, 30}; std::vector wsize = {2, 2}; std::vector wstride = {2, 2}; std::vector pad1 = {1, 1}; std::vector pad2 = {1, 1}; if(argc != 2 && argc != 25) { print_help_avg_pool2d_fwd(); return 0; } else if(argc == 25) { data_type = static_cast(std::stoi(argv[2])); do_verification = std::stoi(argv[3]); init_method = std::stoi(argv[4]); do_log = std::stoi(argv[5]); time_kernel = std::stoi(argv[6]); // parse the long options avgPoolFwdArgParser arg_parser; arg_parser(argc, argv); in_length = arg_parser.long_opts["length"]; wsize = arg_parser.long_opts["wsize"]; wstride = arg_parser.long_opts["wstride"]; pad1 = arg_parser.long_opts["pad1"]; pad2 = arg_parser.long_opts["pad2"]; } using F16 = ck::half_t; using F32 = float; using I32 = int32_t; constexpr auto ReduceOpId = ck::ReduceTensorOp::AVG; if(data_type == ck::DataTypeEnum::Half) { ck::profiler::profile_pool2d_fwd_impl( do_verification, init_method, do_log, time_kernel, in_length, wsize, wstride, pad1, pad2); } else if(data_type == ck::DataTypeEnum::Float) { ck::profiler::profile_pool2d_fwd_impl( do_verification, init_method, do_log, time_kernel, in_length, wsize, wstride, pad1, pad2); } else { throw std::runtime_error("not implemented yet"); } return 0; } REGISTER_PROFILER_OPERATION("avg_pool2d_fwd", "avg_pool2d fwd", profile_avg_pool2d_fwd);