Skip to content

Commit 63cdc16

Browse files
committed
Implemented first version of systolic array time loop transform
1 parent 0226f23 commit 63cdc16

File tree

7 files changed

+93
-33
lines changed

7 files changed

+93
-33
lines changed

include/phism/mlir/Transforms/Passes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createLiftMemRefSubviewPass
2525
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createSCoPDecompositionPass();
2626
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createInlineSCoPAffinePass();
2727
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createEmitHLSPass();
28-
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createSystolicArraySPass();
28+
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createSystolicArrayTimeLoopPass();
2929

3030
/// Generate the code for registering passes.
3131
#define GEN_PASS_REGISTRATION

include/phism/mlir/Transforms/Passes.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,12 @@ def EmitHLSPass : Pass<"emit-hls", "::mlir::ModuleOp"> {
143143
];
144144
}
145145

146-
def SystolicArrayPass : Pass<"systolic-array", "::mlir::ModuleOp"> {
146+
def SystolicArrayTimeLoopPass : Pass<"systolic-array-time-loop", "::mlir::ModuleOp"> {
147147
let summary = "TODO";
148148
let description = [{
149149
TODO
150150
}];
151-
let constructor = "phism::createSystolicArraySPass()";
151+
let constructor = "phism::createSystolicArrayTimeLoopPass()";
152152
let options = [
153153
Option<"fileName", "file-name", "std::string", /*default=*/"", "The output code">
154154
];

include/phism/mlir/Transforms/PhismTransforms.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ void registerFoldIfPasses();
1515
void registerAllPhismPasses();
1616
// void registerDependenceAnalysisPasses();
1717
void registerEmitHLSPass();
18-
void registerSystolicArrayPass();
18+
void registerSystolicArrayTimeLoopPass();
1919
} // namespace phism
2020

2121
#endif

lib/mlir/Transforms/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ add_mlir_library(PhismTransforms
1414
SCoPDecomposition.cc
1515
LoadSwitch.cc
1616
EmitHLS.cc
17-
SystolicArray.cc
17+
SystolicArrayTimeLoop.cc
1818
Utils.cc
1919

2020
ADDITIONAL_HEADER_DIRS

lib/mlir/Transforms/PhismTransforms.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ void registerAllPhismPasses() {
3030
registerInlineSCoPAffinePass();
3131
registerLoadSwitchPass();
3232
registerEmitHLSPass();
33-
registerSystolicArrayPass();
33+
registerSystolicArrayTimeLoopPass();
3434
}
3535

3636
} // namespace phism

lib/mlir/Transforms/SystolicArray.cc renamed to lib/mlir/Transforms/SystolicArrayTimeLoop.cc

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===- SystolicArray.cc ----------------------------------------------------===//
1+
//===- SystolicArrayTimeLoop.cc ----------------------------------------------------===//
22
//
33
// This file implements passes that TODO
44
//
@@ -38,15 +38,15 @@ using namespace mlir;
3838
using namespace llvm;
3939
using namespace phism;
4040

41-
#define DEBUG_TYPE "systolic-array"
41+
#define DEBUG_TYPE "systolic-array-time-loop"
4242

4343
//----------------------------------------------------------------------------//
44-
// SystolicArrayPass:
44+
// SystolicArrayTimeLoopPass:
4545
// * TODO
4646
//----------------------------------------------------------------------------//
4747

4848
namespace {
49-
struct SystolicArrayPipelineOptions : public mlir::PassPipelineOptions<SystolicArrayPipelineOptions> {
49+
struct SystolicArrayTimeLoopPipelineOptions : public mlir::PassPipelineOptions<SystolicArrayTimeLoopPipelineOptions> {
5050
Option<std::string> fileName{
5151
*this, "file-name",
5252
llvm::cl::desc("The output HLS code")
@@ -90,35 +90,69 @@ static int countSubstring(std::string pat, std::string txt) {
9090
return res;
9191
}
9292

93+
static mlir::FuncOp createPE(AffineForOp affine_for_op) {
94+
LLVM_DEBUG(dbgs() << "op name to create PE from: " << affine_for_op << "\n");
95+
96+
// mlir::FuncOp PE_func_op = mlir::FuncOp
97+
98+
// return PE_func_op
99+
}
100+
101+
template <typename OpType>
102+
static bool contains(Block &block) {
103+
for (auto &op : block) {
104+
if (dyn_cast<OpType>(op)) {
105+
return true;
106+
}
107+
}
108+
return false;
109+
}
110+
93111

94112
namespace {
95-
class SystolicArrayPass : public phism::SystolicArrayPassBase<SystolicArrayPass> {
113+
class SystolicArrayTimeLoopPass : public phism::SystolicArrayTimeLoopPassBase<SystolicArrayTimeLoopPass> {
96114
public:
97115

98116
std::string fileName = "";
99117

100-
SystolicArrayPass() = default;
101-
SystolicArrayPass(const SystolicArrayPipelineOptions & options)
118+
SystolicArrayTimeLoopPass() = default;
119+
SystolicArrayTimeLoopPass(const SystolicArrayTimeLoopPipelineOptions & options)
102120
: fileName(!options.fileName.hasValue() ? "" : options.fileName.getValue()){
103121
}
104122

105123
void runOnOperation() override {
106124
ModuleOp m = getOperation();
107-
//TODO
125+
126+
SmallVector<mlir::AffineForOp> to_create_PE;
127+
m.walk([&](mlir::AffineForOp op) {
128+
LLVM_DEBUG(dbgs() << "op name: " << op << "\n");
129+
// TODO find a proper way of determining time loops from polyhedral analysis
130+
bool contains_affine_for = contains<AffineForOp>(*op.getBody());
131+
LLVM_DEBUG(dbgs() << "Op contains more AffineForOp inside?: " << contains_affine_for << "\n");
132+
if (!contains_affine_for) {
133+
to_create_PE.push_back(op);
134+
}
135+
});
136+
137+
for (mlir::AffineForOp op : to_create_PE) {
138+
createPE(op);
139+
}
140+
141+
108142
}
109143
};
110144
} // namespace
111145

112146
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
113-
phism::createSystolicArraySPass() {
114-
return std::make_unique<SystolicArrayPass>();
147+
phism::createSystolicArrayTimeLoopPass() {
148+
return std::make_unique<SystolicArrayTimeLoopPass>();
115149
}
116150

117-
void phism::registerSystolicArrayPass() {
118-
PassPipelineRegistration<SystolicArrayPipelineOptions>(
119-
"systolic-array", "Systolic array TODO.",
120-
[](OpPassManager &pm, const SystolicArrayPipelineOptions &options) {
121-
pm.addPass(std::make_unique<SystolicArrayPass>(options));
151+
void phism::registerSystolicArrayTimeLoopPass() {
152+
PassPipelineRegistration<SystolicArrayTimeLoopPipelineOptions>(
153+
"systolic-array-time-loop", "Systolic array time loop TODO.",
154+
[](OpPassManager &pm, const SystolicArrayTimeLoopPipelineOptions &options) {
155+
pm.addPass(std::make_unique<SystolicArrayTimeLoopPass>(options));
122156
}
123157
);
124158
}

pyphism/polybench/pb_flow.py

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ def emit_HLS(self):
930930
src_file, self.cur_file = self.cur_file, self.cur_file.replace(
931931
".mlir", ".cpp"
932932
)
933-
log_file = self.cur_file.replace(".cpp", ".log")
933+
log_file = self.cur_file.replace(".cpp", ".cpp.log")
934934

935935
args = [
936936
self.get_program_abspath("phism-opt"),
@@ -985,12 +985,17 @@ def check_if_systolic_array_possible(self):
985985
def post_poly(self):
986986
return (
987987
# Systolic array possible so use corresponding transforms
988-
self.sanity_check() #
989-
.systolic_array_transform()
990-
# .systolic_array_transform2()
991-
# .systolic_array_transform3()
992-
# .systolic_array_transform4()
988+
self.sanity_check()
989+
.constant_args()
990+
.sanity_check()
991+
.loop_transforms()
992+
.sanity_check()
993+
.array_partition()
994+
.sanity_check(no_diff=True)
995+
.scop_stmt_inline()
993996
.sanity_check(no_diff=True)
997+
.systolic_array_time_loop_transform()
998+
.sanity_check() #TODO diff or no diff?
994999

9951000
) if self.check_if_systolic_array_possible() else (
9961001
# Systolic array not possible so use default transforms
@@ -1005,19 +1010,17 @@ def post_poly(self):
10051010
.sanity_check(no_diff=True)
10061011
)
10071012

1008-
def systolic_array_transform(self):
1013+
def systolic_array_time_loop_transform(self):
10091014
src_file, self.cur_file = self.cur_file, self.cur_file.replace(
1010-
".mlir", ".sa.mlir"
1015+
".mlir", ".sat.mlir"
10111016
)
10121017
log_file = self.cur_file.replace(".mlir", ".log")
10131018

1014-
# 3 TODO implement a dummy pass in SystolicArray.cc
1015-
# 4 TODO understand the differences in AutoSA generated C code and Polsca to implement a proper transform
10161019
args = [
10171020
self.get_program_abspath("phism-opt"),
10181021
src_file,
1019-
f'-systolic-array',
1020-
"-debug-only=systolic-array",
1022+
f'-systolic-array-time-loop',
1023+
"-debug-only=systolic-array-time-loop",
10211024
]
10221025

10231026
self.run_command(
@@ -1029,6 +1032,29 @@ def systolic_array_transform(self):
10291032
)
10301033

10311034
return self
1035+
1036+
def systolic_array_space_loop_transform(self):
1037+
src_file, self.cur_file = self.cur_file, self.cur_file.replace(
1038+
".mlir", ".sas.mlir"
1039+
)
1040+
log_file = self.cur_file.replace(".mlir", ".log")
1041+
1042+
# args = [
1043+
# self.get_program_abspath("phism-opt"),
1044+
# src_file,
1045+
# f'-systolic-array',
1046+
# "-debug-only=systolic-array",
1047+
# ]
1048+
1049+
# self.run_command(
1050+
# cmd=" ".join(args),
1051+
# shell=True,
1052+
# stderr=open(log_file, "w"),
1053+
# stdout=open(self.cur_file, "w"),
1054+
# env=self.env,
1055+
# )
1056+
1057+
return self
10321058

10331059

10341060
def run_command(

0 commit comments

Comments
 (0)