@@ -8,6 +8,7 @@ function demo() {
8
8
prefix : ""
9
9
} ,
10
10
schedule : [ ] ,
11
+ exampleSchedule : "" ,
11
12
output : {
12
13
computeLoops : "" ,
13
14
assemblyLoops : "" ,
@@ -18,6 +19,7 @@ function demo() {
18
19
19
20
inputViews : [ ] ,
20
21
scheduleView : null ,
22
+ exampleScheduleViews : [ ] ,
21
23
outputViews : [ ] ,
22
24
reqViews : [ ] ,
23
25
@@ -35,6 +37,15 @@ function demo() {
35
37
model . removeInvalidAccesses ( ) ;
36
38
model . scheduleView ( 0 ) ;
37
39
} ,
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
+ } ,
38
49
addOutputView : function ( newView ) {
39
50
model . outputViews . push ( newView ) ;
40
51
newView ( 0 ) ;
@@ -109,18 +120,9 @@ function demo() {
109
120
return ( model . output . error !== "" ) ? model . output . error : model . input . error ;
110
121
} ,
111
122
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 ( ) ;
124
126
} ,
125
127
setSchedule : function ( schedule ) {
126
128
model . schedule = JSON . parse ( JSON . stringify ( schedule ) ) ; // deep
@@ -903,6 +905,23 @@ function demo() {
903
905
904
906
model . scheduleView = tblScheduleView . updateView ;
905
907
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
+
906
925
var btnGetKernelView = {
907
926
updateView : function ( timeout ) {
908
927
$ ( "#btnGetKernel" ) . prop ( 'disabled' , model . input . error !== "" || model . req ) ;
@@ -916,7 +935,8 @@ function demo() {
916
935
917
936
$ ( "#txtExpr" ) . keyup ( function ( ) {
918
937
model . setInput ( $ ( "#txtExpr" ) . val ( ) ) ;
919
- model . updateScheduleView ( ) ;
938
+ model . resetSchedule ( ) ;
939
+ model . setExampleSchedule ( "" ) ;
920
940
} ) ;
921
941
922
942
var panelKernelsView = {
@@ -970,47 +990,56 @@ function demo() {
970
990
model . setOutput ( "" , "" , "" , "" ) ;
971
991
972
992
var command = model . input . expression . replace ( / / g, "" ) ;
993
+
994
+ var formats = "" ;
973
995
for ( t in model . input . tensorOrders ) {
974
996
var order = model . input . tensorOrders [ t ] ;
975
997
if ( order === 0 ) {
976
998
continue ;
977
999
}
978
1000
979
1001
command += ( " -f=" + t + ":" ) ;
1002
+ formats += ( ( formats === "" ) ? "" : ";" ) + t + ":" ;
980
1003
981
1004
var dims = $ ( "#dims" + t ) . sortable ( "toArray" ) ;
982
1005
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 ;
984
1009
}
985
1010
986
1011
command += ":" ;
1012
+ formats += ":" ;
987
1013
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 ;
990
1017
}
991
1018
}
992
1019
1020
+ var schedule = "" ;
993
1021
for ( var i = 0 ; i < model . schedule . length ; ++ i ) {
994
- command += " -s=" ;
995
-
996
1022
var scheduleCommand = model . schedule [ i ] [ "command" ] ;
997
1023
if ( ! scheduleCommand ) { continue ; }
998
1024
999
- command += scheduleCommand + "(" ;
1025
+ command += " -s=" + scheduleCommand + "(" ;
1026
+ schedule += ( ( schedule === "" ) ? "" : ";" ) + scheduleCommand + ":" ;
1000
1027
1001
1028
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 ) {
1004
1031
errorMsg = "Schedule is missing arguments" ;
1005
1032
model . cancelReq ( ) ;
1006
1033
model . setOutput ( "" , "" , "" , errorMsg ) ;
1007
1034
return ;
1008
1035
}
1009
- command += param + "," ;
1036
+ command += paramShortened + "," ;
1037
+ schedule += param + ":" ;
1010
1038
}
1011
1039
1012
1040
command = command . substring ( 0 , command . length - 1 ) ;
1013
1041
command += ")" ;
1042
+ schedule = schedule . substring ( 0 , schedule . length - 1 ) ;
1014
1043
}
1015
1044
1016
1045
var prefix = model . input . prefix . replaceAll ( " " , "" ) ;
@@ -1030,6 +1059,13 @@ function demo() {
1030
1059
response [ 'full-kernel' ] ,
1031
1060
response [ 'error' ] ) ;
1032
1061
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 ) ;
1033
1069
} ,
1034
1070
error : function ( XMLHttpRequest , textStatus , errorThrown ) {
1035
1071
var errorMsg = "Unable to connect to the taco online server" ;
@@ -1088,18 +1124,52 @@ function demo() {
1088
1124
}
1089
1125
$ ( "#listExamples" ) . html ( listExamplesBody ) ;
1090
1126
1091
- var getURLParam = function ( key ) {
1127
+ var getURLParam = function ( k ) {
1092
1128
var url = window . location . search . substring ( 1 ) ;
1093
1129
var params = url . split ( '&' ) ;
1094
1130
for ( var i = 0 ; i < params . length ; ++ i ) {
1095
1131
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 ;
1098
1136
}
1099
1137
}
1100
1138
return "" ;
1101
1139
} ;
1102
1140
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
+
1103
1173
var demo = getURLParam ( "demo" ) ;
1104
1174
if ( ! ( demo in examples ) ) {
1105
1175
demo = "spmv" ;
@@ -1116,26 +1186,29 @@ function demo() {
1116
1186
model . setInput ( code ) ;
1117
1187
1118
1188
var schedule = default_CPU_schedules [ e ] ;
1119
- model . setExampleSchedule ( e , schedule ) ;
1189
+ model . setExampleSchedule ( ( schedule . length > 0 ) ? e : "" ) ;
1190
+ model . setSchedule ( schedule ) ;
1120
1191
} ;
1121
1192
$ ( "#example_" + e ) . click ( setExample ) ;
1122
1193
1123
1194
// Initialize demo
1124
- if ( e === demo ) {
1195
+ if ( ! inited && e === demo ) {
1125
1196
setExample ( ) ;
1126
1197
}
1127
1198
} ) ( e , examples [ e ] . code , examples [ e ] . formats ) ;
1128
1199
}
1129
1200
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
+ }
1139
1212
1140
1213
$ ( "#btnSchedule" ) . click ( function ( ) {
1141
1214
model . addScheduleRow ( ) ;
0 commit comments