Add register reuse + peft scheduler cost model + Useless merger
This commit is contained in:
@@ -588,13 +588,37 @@ void PimCodeGen::emitInstruction(const pim_binary::InstructionRecord& instructio
|
||||
++emittedInstructionCount;
|
||||
if (coreJsonStream)
|
||||
*coreJsonStream << json::Value(pim_binary::makeInstructionJson(instruction)) << ',';
|
||||
updateScalarRegisterCache(instruction);
|
||||
}
|
||||
|
||||
void PimCodeGen::updateScalarRegisterCache(const pim_binary::InstructionRecord& instruction) const {
|
||||
switch (instruction.opcode) {
|
||||
case pim_binary::Opcode::sldi:
|
||||
scalarRegisterValues[instruction.rd] = instruction.r2OrImm;
|
||||
break;
|
||||
case pim_binary::Opcode::sld:
|
||||
case pim_binary::Opcode::sadd:
|
||||
case pim_binary::Opcode::ssub:
|
||||
case pim_binary::Opcode::smul:
|
||||
case pim_binary::Opcode::saddi:
|
||||
case pim_binary::Opcode::smuli:
|
||||
scalarRegisterValues[instruction.rd].reset();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PimCodeGen::genSetRegisterImmediateUnsigned(size_t registerNumber, size_t immediate) const {
|
||||
auto registerIndex = pim::checkedU8OrCrash(registerNumber, "register number");
|
||||
auto immediateValue = pim::checkedI32OrCrash(immediate, "register immediate");
|
||||
if (scalarRegisterValues[registerIndex] == immediateValue)
|
||||
return;
|
||||
|
||||
pim_binary::InstructionRecord instruction;
|
||||
instruction.opcode = pim_binary::Opcode::sldi;
|
||||
instruction.rd = static_cast<uint8_t>(registerNumber);
|
||||
instruction.r2OrImm = pim::checkedI32OrCrash(immediate, "register immediate");
|
||||
instruction.rd = registerIndex;
|
||||
instruction.r2OrImm = immediateValue;
|
||||
emitInstruction(instruction);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "llvm/Support/JSON.h"
|
||||
#include "llvm/Support/raw_os_ostream.h"
|
||||
|
||||
#include <array>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <optional>
|
||||
@@ -170,6 +171,7 @@ class PimCodeGen {
|
||||
const llvm::DenseMap<size_t, size_t>& emittedCoreIds;
|
||||
std::optional<unsigned> batchLane;
|
||||
mutable uint32_t emittedInstructionCount = 0;
|
||||
mutable std::array<std::optional<int32_t>, 256> scalarRegisterValues = {};
|
||||
|
||||
size_t addressOf(mlir::Value value, const StaticValueKnowledge& knowledge) const {
|
||||
return memory.getValueAddress(value, knowledge, batchLane);
|
||||
@@ -177,6 +179,7 @@ class PimCodeGen {
|
||||
size_t remapCoreId(size_t coreId) const;
|
||||
|
||||
void emitInstruction(const pim_binary::InstructionRecord& instruction) const;
|
||||
void updateScalarRegisterCache(const pim_binary::InstructionRecord& instruction) const;
|
||||
|
||||
void genSetRegisterImmediateUnsigned(size_t registerNumber, size_t immediate) const;
|
||||
void setupRd(size_t rdAddress, size_t rdOffset) const;
|
||||
|
||||
@@ -32,6 +32,31 @@ llvm::cl::opt<PimMemoryReportLevel> pimMemoryReport(
|
||||
llvm::cl::init(PimMemoryReportNone),
|
||||
llvm::cl::cat(OnnxMlirOptions));
|
||||
|
||||
llvm::cl::opt<PimConvLoweringType> pimConvLowering(
|
||||
"pim-conv-lowering",
|
||||
llvm::cl::desc("Convolution lowering strategy for PIM"),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringAuto, "auto", "Select the Conv lowering strategy automatically")),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringLegacy, "legacy", "Use the legacy explicit-im2col Conv lowering")),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringDepthwise, "depthwise", "Force the depthwise-specialized Conv lowering")),
|
||||
llvm::cl::values(
|
||||
clEnumValN(PimConvLoweringPackedIm2Col, "packed-im2col", "Use explicit im2col with packed multi-position GEMM")),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringStreamedPatch,
|
||||
"streamed-patch",
|
||||
"Use streamed/chunked im2col rows without multi-position packing")),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringStreamedPacked,
|
||||
"streamed-packed",
|
||||
"Use streamed/chunked im2col rows with packed multi-position GEMM")),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringOutputChannelTiled,
|
||||
"output-channel-tiled",
|
||||
"Force Conv lowering that relies on Gemm output-channel tiling")),
|
||||
llvm::cl::values(
|
||||
clEnumValN(PimConvLoweringInputKTiled, "input-k-tiled", "Force Conv lowering that relies on Gemm K tiling")),
|
||||
llvm::cl::values(clEnumValN(PimConvLoweringTiled2D,
|
||||
"tiled-2d",
|
||||
"Force Conv lowering that relies on Gemm 2D K/C tiling")),
|
||||
llvm::cl::init(PimConvLoweringAuto),
|
||||
llvm::cl::cat(OnnxMlirOptions));
|
||||
|
||||
llvm::cl::opt<bool>
|
||||
pimOnlyCodegen("pim-only-codegen",
|
||||
llvm::cl::desc("Only generate code for PIM (assume input is already in bufferized PIM IR)"),
|
||||
@@ -49,6 +74,23 @@ llvm::cl::opt<bool> useExperimentalConvImpl("use-experimental-conv-impl",
|
||||
llvm::cl::init(false),
|
||||
llvm::cl::cat(OnnxMlirOptions));
|
||||
|
||||
llvm::cl::opt<uint64_t> pimConvIm2colMaxElements(
|
||||
"pim-conv-im2col-max-elements",
|
||||
llvm::cl::desc("Maximum number of im2col elements to materialize globally for one Conv before streaming/chunking"),
|
||||
llvm::cl::init(1ull << 20),
|
||||
llvm::cl::cat(OnnxMlirOptions));
|
||||
|
||||
llvm::cl::opt<uint64_t> pimConvStreamChunkPositions(
|
||||
"pim-conv-stream-chunk-positions",
|
||||
llvm::cl::desc("Maximum number of Conv output positions to materialize in one streamed chunk"),
|
||||
llvm::cl::init(1024),
|
||||
llvm::cl::cat(OnnxMlirOptions));
|
||||
|
||||
llvm::cl::opt<bool> pimReportConvLowering("pim-report-conv-lowering",
|
||||
llvm::cl::desc("Emit a bounded Conv lowering report"),
|
||||
llvm::cl::init(true),
|
||||
llvm::cl::cat(OnnxMlirOptions));
|
||||
|
||||
llvm::cl::opt<bool> pimEmitJson("pim-emit-json",
|
||||
llvm::cl::desc("Also emit per-core JSON instruction files alongside binary .pim files"),
|
||||
llvm::cl::init(false),
|
||||
|
||||
@@ -30,19 +30,35 @@ typedef enum {
|
||||
PimMemoryReportFull = 2,
|
||||
} PimMemoryReportLevel;
|
||||
|
||||
typedef enum {
|
||||
PimConvLoweringAuto = 0,
|
||||
PimConvLoweringLegacy = 1,
|
||||
PimConvLoweringDepthwise = 2,
|
||||
PimConvLoweringPackedIm2Col = 3,
|
||||
PimConvLoweringStreamedPatch = 4,
|
||||
PimConvLoweringStreamedPacked = 5,
|
||||
PimConvLoweringOutputChannelTiled = 6,
|
||||
PimConvLoweringInputKTiled = 7,
|
||||
PimConvLoweringTiled2D = 8,
|
||||
} PimConvLoweringType;
|
||||
|
||||
extern llvm::cl::OptionCategory OnnxMlirOptions;
|
||||
extern llvm::cl::opt<PimEmissionTargetType> pimEmissionTarget;
|
||||
extern llvm::cl::opt<PimMergeSchedulerType> pimMergeScheduler;
|
||||
extern llvm::cl::opt<PimMemoryReportLevel> pimMemoryReport;
|
||||
extern llvm::cl::opt<PimConvLoweringType> pimConvLowering;
|
||||
|
||||
extern llvm::cl::opt<bool> pimOnlyCodegen;
|
||||
extern llvm::cl::opt<bool> pimDisableMemoryCoalescing;
|
||||
extern llvm::cl::opt<bool> useExperimentalConvImpl;
|
||||
extern llvm::cl::opt<bool> pimEmitJson;
|
||||
extern llvm::cl::opt<bool> pimReportConvLowering;
|
||||
|
||||
extern llvm::cl::opt<size_t> crossbarSize;
|
||||
extern llvm::cl::opt<size_t> crossbarCountInCore;
|
||||
extern llvm::cl::opt<long> coresCount;
|
||||
extern llvm::cl::opt<uint64_t> pimConvIm2colMaxElements;
|
||||
extern llvm::cl::opt<uint64_t> pimConvStreamChunkPositions;
|
||||
|
||||
bool hasExplicitPimCoreCount();
|
||||
void verifyExplicitPimCoreCount();
|
||||
|
||||
Reference in New Issue
Block a user