Changeset: 0c31de1be82a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0c31de1be82a
Modified Files:
monetdb5/scheduler/mut_pack.c
Branch: mutation
Log Message:
Better handle pack followed by partitioning
diffs (121 lines):
diff --git a/monetdb5/scheduler/mut_pack.c b/monetdb5/scheduler/mut_pack.c
--- a/monetdb5/scheduler/mut_pack.c
+++ b/monetdb5/scheduler/mut_pack.c
@@ -61,10 +61,14 @@ validswitch(InstrPtr p, InstrPtr q)
void
mutationPack(Client cntxt, Mutant m){
MalBlkPtr mb = m->src;
- int pc = m->target, i, j, mvar, svar, dvar, limit, packpc=0;
+ int pc = m->target, i, j, mvar, limit, packpc=0;
InstrPtr p=0, *old= mb->stmt, q, newpack = 0, newpack1=0, newpack2 = 0;
int profiler=0;
+ DEBUG_MULTICORE {
+ mnstr_printf(cntxt->fdout,"#MUTATIONPACK\n");
+ printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL);
+ }
(void) cntxt;
limit= mb->stop;
if ( newMalBlkStmt(mb, mb->ssize) < 0)
@@ -72,7 +76,7 @@ mutationPack(Client cntxt, Mutant m){
pushInstruction(mb,old[0]);//needed for debugging
// first phase, see if we need to undo a bat.partition
- svar = -1; mvar = -1; dvar = -1;
+ mvar = -1;
for (i = 1; i < limit; i++) {
p= old[i];
if ( i == pc){
@@ -80,41 +84,59 @@ mutationPack(Client cntxt, Mutant m){
continue;
mvar = getArg(p,0);
+ DEBUG_MULTICORE
mnstr_printf(cntxt->fdout,"#MUTATIONPACK move %d ",pc);
// move ahead to first candidate for consolidation
for(i++ ; i < limit && validswitch(old[pc],old[i]);
i++){
old[pc] = old[i];
old[i] = p;
pc = i;
}
+ packpc = pc;
+ newpack = p;
+ old[pc]= 0;
+
+ DEBUG_MULTICORE mnstr_printf(cntxt->fdout," to
%d\n",i-1);
q = old[i];
-
- // we found a partition to be removed
- if (getModuleId(q) == batRef && getFunctionId(q) ==
partitionRef && getArgPos(p,mvar) >=0){
- svar = getArg(q,0);
+ if (getModuleId(q) == batRef && getFunctionId(q) ==
partitionRef && getArgPos(q,mvar) >=0){
+ // we bounced upon a partition over a packed variable
+ // this means we replace the partitions by the matpack
components
+
+ int partitions =
getVarConstant(mb,getArg(q,2)).val.ival;
+ for(j =i; j< limit; j++)
+ if (getModuleId(q= old[j]) == batRef &&
getFunctionId(q) == partitionRef && getArgPos(q,mvar) >=0){
+ partitions --;
+ if ( partitions == 0 && p->argc >
p->retc){
+ getArg(p,0)= getArg(q,0);
+ old[j] = p;
+ freeInstruction(q);
+ } else
+ if ( partitions > 0 && p->argc >
p->retc){
+ clrFunction(q);
+ q->argc= q->retc;
+ q = pushArgument(mb, q,
getArg(p,1));
+ delArgument(p,1);
+ } else{
+ // inject an empty partition
+ clrFunction(q);
+ q =
pushArgument(mb,q,newTmpVariable(mb,getArgType(mb,q,0)));
+ }
+ }
+ packpc = 0;
+ newpack = 0;
}
- packpc = i-1;
- newpack = p;
- old[i-1]= 0;
m->comment = GDKstrdup("mutationPack");
- } else
- // rollback all but one partitioned instruction
- if (svar >= 0 && getArgPos(p,mvar) >= 0){
- if (dvar == -1){
- getArg(p, getArgPos(p,svar)) = mvar;
- dvar = getArg(p,0);
- }
}
}
- DEBUG_MULTICORE
- mnstr_printf(cntxt->fdout,"#mutationPack mvar %d svar %d dvar
%d leftover %d\n", mvar,svar,dvar,limit);
+ DEBUG_MULTICORE mnstr_printf(cntxt->fdout,"#mutationPack mvar %d packpc
%d\n", mvar,packpc);
// second phase, replace matpack with its successor
for (i = 1; i < limit; i++)
if ( (p= old[i])){
profiler = mb->profiler[i].trace;
- if ( packpc == i && getArgPos(old[i+1],mvar) < 0){
+ if ( packpc == i && getArgPos(p,mvar) < 0){
+ pushInstruction(mb,newpack);
pushInstruction(mb,p);
continue;
}
@@ -156,10 +178,10 @@ mutationPack(Client cntxt, Mutant m){
} else
// handle non-partitioned operators
pushInstruction(mb,p);
- }
- DEBUG_MULTICORE {
- mnstr_printf(cntxt->fdout,"#mutationPack mvar %d svar %d dvar
%d leftover %d\n", mvar,svar,dvar,limit);
- //printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL);
- }
+ } else
+ if ( packpc == i )
+ pushInstruction(mb,newpack);
+ DEBUG_MULTICORE
+ printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL);
GDKfree(old);
}
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list