mirror of
https://github.com/ROCm/composable_kernel.git
synced 2026-04-19 14:29:05 +00:00
* enable gfx940
* switch between intrinsic mfma routines on mi100/200 and mi300
* fix mfma_int8 on MI300
* disable 2 int8 examples on MI300
* Update cmake-ck-dev.sh
* restore gitignore file
* modify Jenkinsfile to the internal repo
* Bump rocm-docs-core from 0.24.0 to 0.29.0 in /docs/sphinx
Bumps [rocm-docs-core](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.24.0 to 0.29.0.
- [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases)
- [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.24.0...v0.29.0)
---
updated-dependencies:
- dependency-name: rocm-docs-core
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* initial enablement of gfx950
* fix clang format
* disable examples 31 and 41 int8 on gfx950
* add code
* fix build wip
* fix xx
* now can build
* naming
* minor fix
* wip fix
* fix macro for exp2; fix warpgemm a/b in transposedC
* unify as tuple_array
* Update the required Python version to 3.9
* Update executable name in test scripts
* re-structure tuple/array to avoid spill
* Merge function templates
* Fix format
* Add constraint to array<> ctor
* Re-use function
* Some minor changes
* remove wrong code in store_raw()
* fix compile issue in transpose
* Rename enum
Rename 'cood_transform_enum' to 'coord_transform_enum'
* let more integral_constant->constant, and formating
* make sure thread_buffer can be tuple/array
* temp fix buffer_store spill
* not using custom data type by default, now we can have ISA-level same code as opt_padding
* fix compile error, fp8 not ready now
* fix fp8 duplicated move/shift/and/or problem
* Default use CK_TILE_FLOAT_TO_FP8_STOCHASTIC rounding mode
* fix scratch in fp8 kernel
* update some readme
* fix merge from upstream
* sync with upstream
* sync upstream again
* sync 22
* remove unused
* fix clang-format
* update README of ck_tile example
* fix several issue
* let python version to be 3.8 as minimal
* remove ck_tile example from default cmake target like all/install/check
* remove mistake
* 1).support receipe in generate.py 2).use simplified mask type 3).change left/right to pass into karg
* fix some bug in group-mode masking and codegen. update README
* F8 quantization for FMHA forward (#1224)
* Add SAccElementFunction, PComputeElementFunction, OAccElementFunction in pipeline
* Add element function to fmha api
* Adjust P elementwise function
* Fix bug of elementwise op, our elementwise op is not inout
* Add some elementwise op, prepare to quantization
* Let generate.py can generate different elementwise function
* To prevent compiler issue, remove the elementwise function we have not used.
* Remove f8 pipeline, we should share the same pipeline even in f8
* Remove remove_cvref_t
* Avoid warning
* Fix wrong fp8 QK/KV block gemm setting
* Check fp8 rounding error in check_err()
* Set fp8 rounding error for check_err()
* Use CK_TILE_FLOAT_TO_FP8_STANDARD as default fp8 rounding mode
* 1. codgen the f8 api and kernel
2. f8 host code
* prevent warning in filter mode
* Remove not-in-use elementwise function kargs
* Remove more not-in-use elementwise function kargs
* Small refinements in C++ source files
* Use conditional_t<> to simplify code
* Support heterogeneous argument for binary function types
* Re-use already-existing scales<> functor template
* Fix wrong value produced by saturating
* Generalize the composes<> template
* Unify saturates<> implementation
* Fix type errors in composes<>
* Extend less_equal<>
* Reuse the existing template less_equal<> in check_err()
* Add equal<float> & equal<double>
* Rename check_err() parameter
* Rename check_err() parameter
* Add FIXME comment for adding new macro in future
* Remove unnecessary cast to void
* Eliminate duplicated code
* Avoid dividing api pool into more than 2 groups
* Use more clear variable names
* Use affirmative condition in if stmt
* Remove blank lines
* Donot perfect forwarding in composes<>
* To fix compile error, revert generate.py back to 4439cc107d
* Fix bug of p element function
* Add compute element op to host softmax
* Remove element function in api interface
* Extract user parameter
* Rename pscale and oscale variable
* rename f8 to fp8
* rename more f8 to fp8
* Add pipeline::operator() without element_functor
* 1. Remove deprecated pipeline enum
2. Refine host code parameter
* Use quantization range as input
* 1. Rename max_dtype to dtype_max.
2. Rename scale to scale_s
3.Add init description
* Refine description
* prevent early return
* unify _squant kernel name in cpp, update README
* Adjust the default range.
* Refine error message and bias range
* Add fp8 benchmark and smoke test
* fix fp8 swizzle_factor=4 case
---------
Co-authored-by: Po Yen Chen <PoYen.Chen@amd.com>
Co-authored-by: carlushuang <carlus.huang@amd.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: illsilin <Illia.Silin@amd.com>
Co-authored-by: Illia Silin <98187287+illsilin@users.noreply.github.com>
Co-authored-by: Jing Zhang <jizha@amd.com>
Co-authored-by: zjing14 <zhangjing14@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Po-Yen, Chen <PoYen.Chen@amd.com>
Co-authored-by: rocking <ChunYu.Lai@amd.com>
185 lines
5.2 KiB
C++
185 lines
5.2 KiB
C++
// SPDX-License-Identifier: MIT
|
|
// Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
|
|
#include <iomanip>
|
|
#include <iostream>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
namespace ck_tile {
|
|
/*
|
|
* a host side utility, arg parser for
|
|
* -[key0]=[value0] -[key1]=[value1] ...
|
|
*/
|
|
class ArgParser
|
|
{
|
|
public:
|
|
class Arg
|
|
{
|
|
public:
|
|
std::string name;
|
|
std::string value;
|
|
std::string help_text;
|
|
};
|
|
|
|
ArgParser() {}
|
|
ArgParser& insert(const std::string& _name,
|
|
const std::string& _default_value,
|
|
const std::string& _help_text)
|
|
{
|
|
Arg in;
|
|
in.name = _name;
|
|
in.value = _default_value;
|
|
in.help_text = _help_text;
|
|
|
|
if(input_map.count(_name) != 0)
|
|
{
|
|
printf("arg:%s already exist\n", _name.c_str());
|
|
}
|
|
else
|
|
{
|
|
input_map[_name] = in;
|
|
keys.push_back(_name);
|
|
}
|
|
return *this;
|
|
}
|
|
void print()
|
|
{
|
|
printf("args:\n");
|
|
for(auto& key : keys)
|
|
{
|
|
auto value = input_map[key];
|
|
std::vector<std::string> help_text_lines;
|
|
size_t pos = 0;
|
|
for(size_t next_pos = value.help_text.find('\n', pos); next_pos != std::string::npos;)
|
|
{
|
|
help_text_lines.push_back(std::string(value.help_text.begin() + pos,
|
|
value.help_text.begin() + next_pos++));
|
|
pos = next_pos;
|
|
next_pos = value.help_text.find('\n', pos);
|
|
}
|
|
help_text_lines.push_back(
|
|
std::string(value.help_text.begin() + pos, value.help_text.end()));
|
|
|
|
std::string default_value = std::string("(default:") + value.value + std::string(")");
|
|
|
|
std::cout << std::setw(2) << std::setw(12 - value.name.length()) << "-" << key
|
|
<< std::setw(4) << " " << help_text_lines[0] << " " << default_value
|
|
<< std::endl;
|
|
|
|
for(auto help_next_line = std::next(help_text_lines.begin());
|
|
help_next_line != help_text_lines.end();
|
|
++help_next_line)
|
|
{
|
|
std::cout << std::setw(17) << " " << *help_next_line << std::endl;
|
|
}
|
|
}
|
|
}
|
|
bool parse(int argc, char* argv[], int start_index = 1)
|
|
{
|
|
if(argc < start_index)
|
|
{
|
|
printf("not enough args\n");
|
|
return false;
|
|
}
|
|
for(int i = start_index; i < argc; i++)
|
|
{
|
|
char* cur_arg = argv[i];
|
|
if(cur_arg[0] != '-')
|
|
{
|
|
printf("illegal input\n");
|
|
print();
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
std::string text(cur_arg + 1);
|
|
if(text == "?")
|
|
{
|
|
print();
|
|
return false;
|
|
}
|
|
auto pos = text.find('=');
|
|
if(pos == std::string::npos)
|
|
{
|
|
printf("arg should be [key]=[value] pair, here:%s\n", text.c_str());
|
|
return false;
|
|
}
|
|
if(pos >= (text.size() - 1))
|
|
{
|
|
printf("cant find value after \"=\", here:%s\n", text.c_str());
|
|
return false;
|
|
}
|
|
auto key = text.substr(0, pos);
|
|
auto value = text.substr(pos + 1);
|
|
if(input_map.count(key) == 0)
|
|
{
|
|
printf("no such arg:%s\n", key.c_str());
|
|
return false;
|
|
}
|
|
input_map[key].value = value;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::string get_str(const std::string& name) const
|
|
{
|
|
std::string value = input_map.at(name).value;
|
|
return value;
|
|
}
|
|
|
|
int get_int(const std::string& name) const
|
|
{
|
|
int value = atoi(input_map.at(name).value.c_str());
|
|
return value;
|
|
}
|
|
|
|
uint32_t get_uint32(const std::string& name) const
|
|
{
|
|
uint32_t value = strtoul(input_map.at(name).value.c_str(), nullptr, 10);
|
|
return value;
|
|
}
|
|
|
|
uint64_t get_uint64(const std::string& name) const
|
|
{
|
|
uint64_t value = strtoull(input_map.at(name).value.c_str(), nullptr, 10);
|
|
return value;
|
|
}
|
|
|
|
bool get_bool(const std::string& name) const
|
|
{
|
|
auto v = input_map.at(name).value;
|
|
if(v.compare("t") == 0 || v.compare("true") == 0)
|
|
return true;
|
|
if(v.compare("f") == 0 || v.compare("false") == 0)
|
|
return false;
|
|
int value = atoi(v.c_str());
|
|
return value == 0 ? false : true;
|
|
}
|
|
|
|
float get_float(const std::string& name) const
|
|
{
|
|
double value = atof(input_map.at(name).value.c_str());
|
|
return static_cast<float>(value);
|
|
}
|
|
|
|
double get_double(const std::string& name) const
|
|
{
|
|
double value = atof(input_map.at(name).value.c_str());
|
|
return value;
|
|
}
|
|
|
|
private:
|
|
std::unordered_map<std::string, Arg> input_map;
|
|
std::vector<std::string> keys;
|
|
};
|
|
} // namespace ck_tile
|