@@ -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