@@ -133,17 +133,24 @@ function demo() {
133133 } ,
134134 resetSchedule : function ( ) {
135135 model . schedule = [ ] ;
136+
137+ model . cancelReq ( ) ;
138+ model . setOutput ( "" , "" , "" , "" ) ;
136139 model . updateScheduleView ( ) ;
137140 } ,
138141 addScheduleRow : function ( ) {
139142 model . schedule . push ( { command : "" , parameters : [ ] } ) ;
143+
140144 model . updateScheduleView ( ) ;
141145 } ,
142146 deleteScheduleRow : function ( row ) {
147+ var isNop = ( model . schedule [ row ] . command === "" ) ;
143148 model . schedule . splice ( row , 1 ) ;
144149
145- model . cancelReq ( ) ;
146- model . setOutput ( "" , "" , "" , "" ) ;
150+ if ( ! isNop ) {
151+ model . cancelReq ( ) ;
152+ model . setOutput ( "" , "" , "" , "" ) ;
153+ }
147154 model . updateScheduleView ( ) ;
148155 } ,
149156 swapScheduleRows : function ( row1 , row2 ) {
@@ -161,12 +168,23 @@ function demo() {
161168 var parameterInfo = scheduleCommands [ command ] [ i ] ;
162169 var defaultValue = "" ;
163170
164- if ( parameterInfo [ 0 ] === "default" || parameterInfo [ 0 ] === "predefined dropdown" ) {
171+ if ( parameterInfo [ 0 ] === "default" ||
172+ parameterInfo [ 0 ] === "predefined dropdown" ) {
165173 defaultValue = parameterInfo [ 1 ] ;
174+ } else if ( parameterInfo [ 0 ] === "result dropdown" ) {
175+ for ( var access in model . input . tensorOrders ) {
176+ if ( model . input . tensorOrders [ access ] > 0
177+ && model . input . expression . indexOf ( access ) <= model . input . expression . indexOf ( "=" ) ) {
178+ defaultValue += access ;
179+ break ;
180+ }
181+ }
166182 }
167183 model . schedule [ row ] . parameters . push ( defaultValue ) ;
168184 }
169185
186+ model . cancelReq ( ) ;
187+ model . setOutput ( "" , "" , "" , "" ) ;
170188 model . updateScheduleView ( ) ;
171189 } ,
172190 addScheduleParameter : function ( row , index , value ) {
@@ -616,13 +634,13 @@ function demo() {
616634 2 : [ "default" , "" ] ,
617635 3 : [ "text" ]
618636 } ,
619- // divide: {
620- // parameters: ["Divided IndexVar", "Outer IndexVar", "Inner IndexVar", "Divide Factor"],
621- // 0: ["index dropdown", [1, "0"], [2, "1"]],
622- // 1: ["default", ""],
623- // 2: ["default", ""],
624- // 3: ["text"]
625- // },
637+ divide : {
638+ parameters : [ "Divided IndexVar" , "Outer IndexVar" , "Inner IndexVar" , "Divide Factor" ] ,
639+ 0 : [ "index dropdown" , [ 1 , "0" ] , [ 2 , "1" ] ] ,
640+ 1 : [ "default" , "" ] ,
641+ 2 : [ "default" , "" ] ,
642+ 3 : [ "text" ]
643+ } ,
626644 precompute : {
627645 parameters : [ "Precomputed Expr" , "Original IndexVar" , "Workspace IndexVar" ] ,
628646 0 : [ "long text" ] ,
@@ -653,6 +671,12 @@ function demo() {
653671 "GPU Thread" , "GPU Block" , "GPU Warp" ] ,
654672 2 : [ "predefined dropdown" , "No Races" ,
655673 "Ignore Races" , "No Races" , "Atomics" , "Temporary" , "Parallel Reduction" ]
674+ } ,
675+ assemble : {
676+ parameters : [ "Result Tensor" , "Assembly Strategy" ] ,
677+ 0 : [ "result dropdown" ] ,
678+ 1 : [ "predefined dropdown" , "Insert" ,
679+ "Insert" , "Append" ]
656680 }
657681 } ;
658682
@@ -734,6 +758,26 @@ function demo() {
734758 return parameter ;
735759 }
736760
761+ // a dropdown where user can choose from result tensors
762+ function resultDropdown ( parameterName , inputId , input ) {
763+ var parameter = "" ;
764+ var defaultParam = "" ;
765+ for ( var access in model . input . tensorOrders ) {
766+ if ( model . input . tensorOrders [ access ] > 0
767+ && model . input . expression . indexOf ( access ) <= model . input . expression . indexOf ( "=" ) ) {
768+ parameter += "<li><a>" ;
769+ parameter += access ;
770+ parameter += "</a></li>" ;
771+ if ( defaultParam === "" ) {
772+ defaultParam += access ;
773+ }
774+ }
775+ }
776+ parameter = dropdown ( parameterName , inputId , input , defaultParam )
777+ + parameter + "</ul></div></li>" ;
778+ return parameter ;
779+ }
780+
737781 // a dropdown where user can choose from a set of predefined options
738782 function predefinedDropdown ( parameterName , inputId , input , options ) {
739783 var parameter = dropdown ( parameterName , inputId , input , options [ 0 ] , false , "160px" ) ;
@@ -763,6 +807,9 @@ function demo() {
763807 case "access dropdown" :
764808 parameters += accessDropdown ( parameterName , inputId , input ) ;
765809 break ;
810+ case "result dropdown" :
811+ parameters += resultDropdown ( parameterName , inputId , input ) ;
812+ break ;
766813 case "predefined dropdown" :
767814 parameters += predefinedDropdown ( parameterName , inputId , input , parameterInfo . slice ( 1 ) ) ;
768815 break ;
@@ -858,7 +905,7 @@ function demo() {
858905 var row = rowId . substring ( ( "schedule" ) . length ) ;
859906
860907 $ ( "#" + rowId ) . val ( command ) ;
861- model . addScheduleCommand ( row , command , ) ;
908+ model . addScheduleCommand ( row , command ) ;
862909 } ) ;
863910
864911 $ ( ".schedule-input input" ) . on ( "change" , function ( e ) {
@@ -989,7 +1036,7 @@ function demo() {
9891036 var getKernel = function ( ) {
9901037 model . setOutput ( "" , "" , "" , "" ) ;
9911038
992- var command = model . input . expression . replace ( / / g, "" ) ;
1039+ var command = "\"" + model . input . expression . replace ( / / g, "" ) + "\"" ;
9931040
9941041 var formats = "" ;
9951042 for ( t in model . input . tensorOrders ) {
@@ -1022,7 +1069,7 @@ function demo() {
10221069 var scheduleCommand = model . schedule [ i ] [ "command" ] ;
10231070 if ( ! scheduleCommand ) { continue ; }
10241071
1025- command += " -s=" + scheduleCommand + "(" ;
1072+ command += " -s=\" " + scheduleCommand + "(" ;
10261073 schedule += ( ( schedule === "" ) ? "" : ";" ) + scheduleCommand + ":" ;
10271074
10281075 for ( var param of model . schedule [ i ] [ "parameters" ] ) {
@@ -1038,7 +1085,7 @@ function demo() {
10381085 }
10391086
10401087 command = command . substring ( 0 , command . length - 1 ) ;
1041- command += ")" ;
1088+ command += ")\" " ;
10421089 schedule = schedule . substring ( 0 , schedule . length - 1 ) ;
10431090 }
10441091
@@ -1086,7 +1133,15 @@ function demo() {
10861133 x : { name : "Dense array" , levels : { formats : [ "d" ] , ordering : [ 0 ] } }
10871134 }
10881135 } ,
1089- add : { name : "Sparse matrix addition" ,
1136+ spgemm : { name : "SpGEMM" ,
1137+ code : "A(i,j) = B(i,k) * C(k,j)" ,
1138+ formats : {
1139+ A : { name : "CSR" , levels : { formats : [ "d" , "s" ] , ordering : [ 0 , 1 ] } } ,
1140+ B : { name : "CSR" , levels : { formats : [ "d" , "s" ] , ordering : [ 0 , 1 ] } } ,
1141+ C : { name : "CSR" , levels : { formats : [ "d" , "s" ] , ordering : [ 0 , 1 ] } } ,
1142+ }
1143+ } ,
1144+ spadd : { name : "Sparse matrix addition" ,
10901145 code : "A(i,j) = B(i,j) + C(i,j)" ,
10911146 formats : {
10921147 A : { name : "CSR" , levels : { formats : [ "d" , "s" ] , ordering : [ 0 , 1 ] } } ,
@@ -1186,9 +1241,10 @@ function demo() {
11861241 }
11871242 model . setInput ( code ) ;
11881243
1189- var schedule = default_CPU_schedules [ e ] ;
1190- model . setExampleSchedule ( ( schedule . length > 0 ) ? e : "" ) ;
1191- model . setSchedule ( schedule ) ;
1244+ var cpuSchedule = default_CPU_schedules [ e ] ;
1245+ var gpuSchedule = default_GPU_schedules [ e ] ;
1246+ model . setExampleSchedule ( ( gpuSchedule . length > 0 ) ? e : "" ) ;
1247+ model . setSchedule ( cpuSchedule ) ;
11921248 } ;
11931249 $ ( "#example_" + e ) . click ( setExample ) ;
11941250
0 commit comments