#ifndef GEMMSTONE_INCLUDE_GEMMSTONE_MICROKERNEL_PACKAGE_HPP
#define GEMMSTONE_INCLUDE_GEMMSTONE_MICROKERNEL_PACKAGE_HPP
#include "gemmstone/microkernel/protocol.hpp"
GEMMSTONE_NAMESPACE_START
namespace microkernel {
struct Argument;
struct RegisterRange;
struct Setting;
struct Package {
struct Setting {
std::string name; int value; };
Protocol protocol; uint64_t luid; std::vector<uint8_t> providerID;
std::vector<uint8_t> binary;
std::vector<Argument> arguments; std::vector<RegisterRange> clobbers;
uint32_t gmdidCompat; int grfMin = 0; int barrierCount = 0; bool systolic = false;
std::vector<Setting> settings;
int getSetting(const char *name) const {
for (auto &setting : settings)
if (setting.name == name) return setting.value;
throw std::runtime_error(
std::string("Microkernel package does not provide requested setting: ")
+ name);
}
enum class Status {
Success,
UncertainClobbers,
UnsupportedHW,
};
Status finalize();
};
struct RegisterRange {
uint32_t boffset = 0; uint32_t blen = 0;
RegisterRange() = default;
RegisterRange(uint32_t boffset_, uint32_t blen_)
: boffset(boffset_), blen(blen_) {}
};
struct TensorConfig {
static constexpr int maxDims = 4;
std::array<int, maxDims> dims
= {1, 1, 1, 1}; std::array<int, maxDims> block = {1, 1, 1,
1};
int elements() const {
int result = 1;
for (auto d : dims)
result *= d;
return result;
}
int blockElements() const {
int result = 1;
for (auto d : block)
result *= d;
return result;
}
bool blocked() const {
for (int i = 0; i < maxDims; i++)
if (block[i] < dims[i]) return true;
return false;
}
int blocks() const {
int result = 1;
for (int i = 0; i < maxDims; i++)
result *= dims[i] / block[i];
return result;
}
};
struct Argument {
std::string name; std::vector<RegisterRange> location; StructuredType::Type actualType
= StructuredType::any; TensorConfig sizes; };
}
GEMMSTONE_NAMESPACE_END
#endif