Skip to content

Commit 5c61ea1

Browse files
committed
Added ability to specify expression and schedule in URL + fixed some view synchronization bugs
1 parent b1aff8f commit 5c61ea1

File tree

1 file changed

+109
-36
lines changed

1 file changed

+109
-36
lines changed

javascripts/demo.js

+109-36
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ function demo() {
88
prefix: ""
99
},
1010
schedule: [],
11+
exampleSchedule: "",
1112
output: {
1213
computeLoops: "",
1314
assemblyLoops: "",
@@ -18,6 +19,7 @@ function demo() {
1819

1920
inputViews: [],
2021
scheduleView: null,
22+
exampleScheduleViews: [],
2123
outputViews: [],
2224
reqViews: [],
2325

@@ -35,6 +37,15 @@ function demo() {
3537
model.removeInvalidAccesses();
3638
model.scheduleView(0);
3739
},
40+
addExampleScheduleView: function(newView) {
41+
model.exampleScheduleViews.push(newView);
42+
newView(0);
43+
},
44+
updateExampleScheduleViews: function() {
45+
for (v in model.exampleScheduleViews) {
46+
model.exampleScheduleViews[v](0);
47+
}
48+
},
3849
addOutputView: function(newView) {
3950
model.outputViews.push(newView);
4051
newView(0);
@@ -109,18 +120,9 @@ function demo() {
109120
return (model.output.error !== "") ? model.output.error : model.input.error;
110121
},
111122

112-
setExampleSchedule: function(e, schedule) {
113-
if (schedule.length === 0) {
114-
$("#btnDefaults").hide();
115-
} else {
116-
$("#btnDefaults").show();
117-
$("#btnCPU").attr('data-val', e);
118-
$("#btnCPU").text(e + " CPU");
119-
120-
$("#btnGPU").attr('data-val', e);
121-
$("#btnGPU").text(e + " GPU");
122-
}
123-
model.setSchedule(schedule);
123+
setExampleSchedule: function(e) {
124+
model.exampleSchedule = e;
125+
model.updateExampleScheduleViews();
124126
},
125127
setSchedule: function(schedule) {
126128
model.schedule = JSON.parse(JSON.stringify(schedule)); // deep
@@ -903,6 +905,23 @@ function demo() {
903905

904906
model.scheduleView = tblScheduleView.updateView;
905907

908+
var btnExampleScheduleView = {
909+
updateView: function(timeout) {
910+
if (model.exampleSchedule.length === 0) {
911+
$("#btnDefaults").hide();
912+
} else {
913+
$("#btnDefaults").show();
914+
$("#btnCPU").attr('data-val', model.exampleSchedule);
915+
$("#btnCPU").text(model.exampleSchedule + " CPU");
916+
917+
$("#btnGPU").attr('data-val', model.exampleSchedule);
918+
$("#btnGPU").text(model.exampleSchedule + " GPU");
919+
}
920+
}
921+
};
922+
923+
model.addExampleScheduleView(btnExampleScheduleView.updateView);
924+
906925
var btnGetKernelView = {
907926
updateView: function(timeout) {
908927
$("#btnGetKernel").prop('disabled', model.input.error !== "" || model.req);
@@ -916,7 +935,8 @@ function demo() {
916935

917936
$("#txtExpr").keyup(function() {
918937
model.setInput($("#txtExpr").val());
919-
model.updateScheduleView();
938+
model.resetSchedule();
939+
model.setExampleSchedule("");
920940
});
921941

922942
var panelKernelsView = {
@@ -970,47 +990,56 @@ function demo() {
970990
model.setOutput("", "", "", "");
971991

972992
var command = model.input.expression.replace(/ /g, "");
993+
994+
var formats = "";
973995
for (t in model.input.tensorOrders) {
974996
var order = model.input.tensorOrders[t];
975997
if (order === 0) {
976998
continue;
977999
}
9781000

9791001
command += (" -f=" + t + ":");
1002+
formats += ((formats === "") ? "" : ";") + t + ":";
9801003

9811004
var dims = $("#dims" + t).sortable("toArray");
9821005
for (var i = 1; i <= order; ++i) {
983-
command += $("#" + dims[i] + "_select").attr("data-val");
1006+
var levelFormat = $("#" + dims[i] + "_select").attr("data-val");
1007+
command += levelFormat;
1008+
formats += levelFormat;
9841009
}
9851010

9861011
command += ":";
1012+
formats += ":";
9871013
for (var i = 1; i <= order; ++i) {
988-
command += dims[i].split("_")[1];
989-
command += (i === order) ? "" : ",";
1014+
var position = dims[i].split("_")[1] + ((i === order) ? "" : ",");
1015+
command += position;
1016+
formats += position;
9901017
}
9911018
}
9921019

1020+
var schedule = "";
9931021
for (var i = 0; i < model.schedule.length; ++i) {
994-
command += " -s=";
995-
9961022
var scheduleCommand = model.schedule[i]["command"];
9971023
if (!scheduleCommand) { continue; }
9981024

999-
command += scheduleCommand + "(";
1025+
command += " -s=" + scheduleCommand + "(";
1026+
schedule += ((schedule === "") ? "" : ";") + scheduleCommand + ":";
10001027

10011028
for (var param of model.schedule[i]["parameters"]) {
1002-
param = param.toString().replace(/ /g, "");
1003-
if (!param) {
1029+
var paramShortened = param.toString().replace(/ /g, "");
1030+
if (!paramShortened) {
10041031
errorMsg = "Schedule is missing arguments";
10051032
model.cancelReq();
10061033
model.setOutput("", "", "", errorMsg);
10071034
return;
10081035
}
1009-
command += param + ",";
1036+
command += paramShortened + ",";
1037+
schedule += param + ":";
10101038
}
10111039

10121040
command = command.substring(0, command.length - 1);
10131041
command += ")";
1042+
schedule = schedule.substring(0, schedule.length - 1);
10141043
}
10151044

10161045
var prefix = model.input.prefix.replaceAll(" ", "");
@@ -1030,6 +1059,13 @@ function demo() {
10301059
response['full-kernel'],
10311060
response['error']);
10321061
model.setReq(null);
1062+
1063+
var url = window.location.pathname + "?expr="
1064+
+ model.input.expression + "&format=" + formats;
1065+
if (schedule !== "") {
1066+
url += "&sched=" + schedule;
1067+
}
1068+
history.replaceState(null, "", url);
10331069
},
10341070
error: function(XMLHttpRequest, textStatus, errorThrown) {
10351071
var errorMsg = "Unable to connect to the taco online server";
@@ -1088,18 +1124,52 @@ function demo() {
10881124
}
10891125
$("#listExamples").html(listExamplesBody);
10901126

1091-
var getURLParam = function(key) {
1127+
var getURLParam = function(k) {
10921128
var url = window.location.search.substring(1);
10931129
var params = url.split('&');
10941130
for (var i = 0; i < params.length; ++i) {
10951131
var param = params[i].split('=');
1096-
if (param[0] === key) {
1097-
return param[1];
1132+
var key = param[0];
1133+
var val = param.slice(1).join('=');
1134+
if (key === k) {
1135+
return val;
10981136
}
10991137
}
11001138
return "";
11011139
};
11021140

1141+
var inited = false;
1142+
var expr = getURLParam("expr");
1143+
if (expr !== "") {
1144+
var formats = getURLParam("format").split(";");
1145+
for (var f in formats) {
1146+
var [tensor, levelFormats, ordering] = formats[f].split(":");
1147+
levelFormats = levelFormats.split("");
1148+
ordering = ordering.split(",").map(Number);
1149+
format = { formats: levelFormats, ordering: ordering };
1150+
tblFormatsView.insertLevelsCacheEntry(tensor, format);
1151+
var name = tblFormatsView.getFormatName(format, levelFormats.length);
1152+
tblFormatsView.insertNamesCacheEntry(tensor, name);
1153+
}
1154+
1155+
expr = expr.replaceAll("%20", " ");
1156+
model.setInput(expr);
1157+
$("#txtExpr").val(expr);
1158+
inited = (model.error == null);
1159+
1160+
var schedule = [];
1161+
var scheduleString = getURLParam("sched");
1162+
if (scheduleString !== "") {
1163+
var commands = scheduleString.split(";");
1164+
for (var c in commands) {
1165+
var [transform, ...args] = commands[c].split(":").map(function(x) { return x.replaceAll("%20", " "); });
1166+
command = { command: transform, parameters: args };
1167+
schedule.push(command);
1168+
}
1169+
}
1170+
model.setSchedule(schedule);
1171+
}
1172+
11031173
var demo = getURLParam("demo");
11041174
if (!(demo in examples)) {
11051175
demo = "spmv";
@@ -1116,26 +1186,29 @@ function demo() {
11161186
model.setInput(code);
11171187

11181188
var schedule = default_CPU_schedules[e];
1119-
model.setExampleSchedule(e, schedule);
1189+
model.setExampleSchedule((schedule.length > 0) ? e : "");
1190+
model.setSchedule(schedule);
11201191
};
11211192
$("#example_" + e).click(setExample);
11221193

11231194
// Initialize demo
1124-
if (e === demo) {
1195+
if (!inited && e === demo) {
11251196
setExample();
11261197
}
11271198
})(e, examples[e].code, examples[e].formats);
11281199
}
11291200

1130-
var urlPrefix = "http://tensor-compiler.org/examples/" + demo;
1131-
var computeGet = $.get(urlPrefix + "_compute.c");
1132-
var assemblyGet = $.get(urlPrefix + "_assembly.c");
1133-
var fullGet = $.get(urlPrefix + "_full.c");
1134-
$.when(computeGet, assemblyGet, fullGet).done(function() {
1135-
model.setOutput(computeGet.responseText,
1136-
assemblyGet.responseText,
1137-
fullGet.responseText, "");
1138-
});
1201+
if (!inited) {
1202+
var urlPrefix = "http://tensor-compiler.org/examples/" + demo;
1203+
var computeGet = $.get(urlPrefix + "_compute.c");
1204+
var assemblyGet = $.get(urlPrefix + "_assembly.c");
1205+
var fullGet = $.get(urlPrefix + "_full.c");
1206+
$.when(computeGet, assemblyGet, fullGet).done(function() {
1207+
model.setOutput(computeGet.responseText,
1208+
assemblyGet.responseText,
1209+
fullGet.responseText, "");
1210+
});
1211+
}
11391212

11401213
$("#btnSchedule").click(function() {
11411214
model.addScheduleRow();

0 commit comments

Comments
 (0)