On Fri, Sep 28, 2007 at 04:01:00PM +0000, Martin Kersten wrote:
> Update of /cvsroot/monetdb/MonetDB5/src/mal
> In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv5547
>
> Modified Files:
> mal_interpreter.mx
> Log Message:
> Split the interpreter in two versions. A FAST and SLOW version.
> If there is no request for debugging or performance measurement
> outstanding, we can go the fast path. However, given the fact
> that at any time we may enter the debugger, a jump to the slow
> line is always possible.
> The code relies on compiler optimization to get rid of blocks
> with constant arguments. Unclear if all compilers are that smart.
All C-compilers (respetively their C preprocessors) are expected to respect
C preprocessor directives (e.g., #if ... #endif), "even" with optimization
disabled.
Hence, why not use those compile-time conditionals instead "pseudo"-runtime
conditionals with constant conditions?
(Would also speed-up the compilation process...)
Stefan
>
>
> Index: mal_interpreter.mx
> ===================================================================
> RCS file: /cvsroot/monetdb/MonetDB5/src/mal/mal_interpreter.mx,v
> retrieving revision 1.197
> retrieving revision 1.198
> diff -u -d -r1.197 -r1.198
> --- mal_interpreter.mx 24 Sep 2007 08:24:22 -0000 1.197
> +++ mal_interpreter.mx 28 Sep 2007 16:00:57 -0000 1.198
> @@ -70,6 +70,9 @@
> #include "mal_debugger.h" /* for mdbStep() */
> #include "mal_type.h"
>
> +#define SLOW 1
> +#define FAST 0
> +
> static str runMALsequence( Client cntxt, MalBlkPtr mb, int startpc,
> int stoppc, MalStkPtr stk, MalStkPtr env, InstrPtr pcicaller);
> static str setDynamicType(MalBlkPtr mb, VarPtr v, int tpe, int pc);
> @@ -421,8 +424,27 @@
> stkpc = startpc;
> exceptionVar = exceptionPC = -1;
> (void)exceptionPC; /* TODO maybe we should use this variable somewhere*/
> [EMAIL PROTECTED]
> +From this point onwards we should differentiate fast processing
> +against monitored processing. Fast processing is possible if there is
> +no call to the debugger statically/dynamically set. Same holds for
> +performance control statements.
> +The code currently does not statically checks the mode change.
> +Preferrably we should introduce a itrace flag PROFILE
> +We rely on optimizing compilers to remove the redundant code.
> [EMAIL PROTECTED]
> + if( malProfileMode == 0 && cntxt->itrace==0){
> + while(stkpc < mb->stop && stkpc != stoppc ){
> + pci = getInstrPtr(mb,stkpc);
> + if( malProfileMode + cntxt->itrace)
> + goto workslow;
> + @:MALinterpret(FAST)@
> + @:MALflowofcontrol(FAST)@
> + }
> + } else
> while(stkpc < mb->stop && stkpc != stoppc ){
> pci = getInstrPtr(mb,stkpc);
> +workslow:
> if( cntxt->itrace ) {
> lng t=0;
> if( stk->cmd== 0) stk->cmd= cntxt->itrace;
> @@ -445,8 +467,8 @@
> }
>
> @:beginProfile@
> - @:MALinterpret@
> - @:MALflowofcontrol@
> + @:MALinterpret(SLOW)@
> + @:MALflowofcontrol(SLOW)@
> @:endProfile@
> }
> @:MALwrapup@
> @@ -639,11 +661,11 @@
> limited.
> @c
> switch( pci->token){
> - case ASSIGNsymbol: @:assignStmt@ break;
> - case PATcall: @:patterncall@ break;
> - case CMDcall: @:commandcall@ break;
> - case FACcall: @:factorycall@ break;
> - case FCNcall: @:functioncall@ break;
> + case ASSIGNsymbol: @:assignStmt(SLOW)@ break;
> + case PATcall: @:patterncall(SLOW)@ break;
> + case CMDcall: @:commandcall(SLOW)@ break;
> + case FACcall: @:factorycall(SLOW)@ break;
> + case FCNcall: @:functioncall(SLOW)@ break;
> }
> /* we don't allow sequential flow control here */
> dropMALflowStep(flow,stkpc,n,pending,mb,stk);
> @@ -710,22 +732,24 @@
> @= MALinterpret
> ret = 0;
> switch( pci->token){
> - case ASSIGNsymbol: @:assignStmt@ break;
> - case PATcall: @:patterncall@ break;
> - case CMDcall: @:commandcall@ break;
> - case FACcall: @:factorycall@ break;
> - case FCNcall: @:functioncall@ break;
> + case ASSIGNsymbol: @:assignStmt(@1)@ break;
> + case PATcall: @:patterncall(@1)@ break;
> + case CMDcall: @:commandcall(@1)@ break;
> + case FACcall: @:factorycall(@1)@ break;
> + case FCNcall: @:functioncall(@1)@ break;
> case NOOPsymbol:
> case REMsymbol:
> break;
> case ENDsymbol:
> if( getInstrPtr(mb,0)->token == FACTORYsymbol)
> ret= shutdownFactory(mb);
> - if( oldtimer)
> + if( @1 && oldtimer)
> cntxt->timer= oldtimer;
> if( pcicaller && garbageControl(getInstrPtr(mb,0)) )
> garbageCollector(mb, stk, TRUE);
> - @:endProfile@
> + if(@1){
> + @:endProfile@
> + }
> stkpc= mb->stop;
> continue;
> default:
> @@ -735,7 +759,9 @@
> }
> ret = createScriptException(mb, stkpc,MAL,
> NULL, "unkown operation");
> - @:endProfile@
> + if( @1){
> + @:endProfile@
> + }
> stkpc= mb->stop;
> continue;
> }
> @@ -886,9 +912,10 @@
> if( lhs->vtype == TYPE_bat)
> BBPincref(lhs->val.br.id, TRUE);
> }
> - @:restoreTarget@
> + @:restoreTarget(@1)@
> ret = 0;
> - @:exceptionHndlr@
> + @:exceptionHndlr(@1)@
> + @:timingHndlr(@1)@
> }
> @}
> @-
> @@ -1000,7 +1027,7 @@
> }
> }
> /* Provide debugging support */
> - if( GDKdebug & 10 ){
> + if( @1 && (GDKdebug & 10) ){
> BAT *b;
> str oldmsg =0;
>
> @@ -1146,8 +1173,9 @@
> ret = createScriptException(mb, stkpc, MAL, NULL,
> "too many arguments for command call");
> }
> - @:restoreTarget@
> - @:exceptionHndlr@
> + @:restoreTarget(@1)@
> + @:exceptionHndlr(@1)@
> + @:timingHndlr(@1)@
> }
> @-
> @= patterncall
> @@ -1157,8 +1185,9 @@
> else {
> @:safeTarget@
> ret = (str) (*pci->fcn)(mb,stk,pci);
> - @:restoreTarget@
> - @:exceptionHndlr@
> + @:restoreTarget(@1)@
> + @:exceptionHndlr(@1)@
> + @:timingHndlr(@1)@
> }
> @-
> MAL function calls are relatively expensive, because they have to assemble
> @@ -1171,8 +1200,9 @@
> stk->pcup = stkpc;
> @:safeTarget@
> ret= runMAL(cntxt,pci->blk,1,mb,stk,pci);
> - @:restoreTarget@
> - @:exceptionHndlr@
> + @:restoreTarget(@1)@
> + @:exceptionHndlr(@1)@
> + @:timingHndlr(@1)@
> }
> @-
> Factory calls are more involved. At this stage it is a synchrononous
> @@ -1184,7 +1214,8 @@
> "reference to MAL function missing");
> else
> ret= runFactory(cntxt,pci->blk,mb,stk,pci);
> - @:exceptionHndlr@
> + @:exceptionHndlr(@1)@
> + @:timingHndlr(SLOW)@
> @-
> The type dispatching table in getArgValue can be removed if we
> determine at compile time the address offset within a ValRecord.
> @@ -1323,7 +1354,6 @@
> @{
>
> @= exceptionHndlr
> - @:timingHndlr@
> if( ret != MAL_SUCCEED ) {
> str msg = 0, nxt;
> if( stk->cmd ) {
> @@ -1569,7 +1599,7 @@
> #endif
>
> @= timingHndlr
> -if( cntxt->flags && stk->cmd != 't' && stk->cmd != 'C'){
> +if( @1 && cntxt->flags && stk->cmd != 't' && stk->cmd != 'C'){
> if( cntxt->flags & timerFlag)
> stream_printf(cntxt->fdout,"[%6d usec ",GDKusec()-cntxt->timer);
> #ifdef HAVE_SYS_RESOURCE_H
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2005.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Monetdb-checkins mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/monetdb-checkins
>
>
--
| Dr. Stefan Manegold | mailto:[EMAIL PROTECTED] |
| CWI, P.O.Box 94079 | http://www.cwi.nl/~manegold/ |
| 1090 GB Amsterdam | Tel.: +31 (20) 592-4212 |
| The Netherlands | Fax : +31 (20) 592-4312 |
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-developers