in src/args.cc [455:491]
int64_t Args::getAutotuneModelSize() const {
std::string modelSize = autotuneModelSize;
if (modelSize.empty()) {
return Args::kUnlimitedModelSize;
}
std::unordered_map<char, int> units = {
{'k', 1000},
{'K', 1000},
{'m', 1000000},
{'M', 1000000},
{'g', 1000000000},
{'G', 1000000000},
};
uint64_t multiplier = 1;
char lastCharacter = modelSize.back();
if (units.count(lastCharacter)) {
multiplier = units[lastCharacter];
modelSize = modelSize.substr(0, modelSize.size() - 1);
}
uint64_t size = 0;
size_t nonNumericCharacter = 0;
bool parseError = false;
try {
size = std::stol(modelSize, &nonNumericCharacter);
} catch (std::invalid_argument&) {
parseError = true;
}
if (!parseError && nonNumericCharacter != modelSize.size()) {
parseError = true;
}
if (parseError) {
throw std::invalid_argument(
"Unable to parse model size " + autotuneModelSize);
}
return size * multiplier;
}