From: Terrance S. <ts...@us...> - 2002-05-20 17:50:30
|
Update of /cvsroot/xsb/XSB/emu In directory usw-pr-cvs1:/tmp/cvs-serv741 Modified Files: builtin.c builtin.h complete_local.h complete_xsb_i.h debug_xsb.c emudef.h inst_xsb.c io_builtins_xsb.c io_builtins_xsb.h remove_unf.c subinst.h subp.c Log Message: Changes for profiling routine: spitOutGraph(), some changes for remove_unf_set pre-implementation, and a little documentation here and there. Index: builtin.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/builtin.c,v retrieving revision 1.141 retrieving revision 1.142 diff -u -r1.141 -r1.142 --- builtin.c 13 Mar 2002 22:40:13 -0000 1.141 +++ builtin.c 20 May 2002 17:47:09 -0000 1.142 @@ -906,88 +906,6 @@ } #endif -/*----------------------- write_quotedname/2 ---------------------------*/ - -static xsbBool no_quotes_needed(char *string) -{ - int nextchar; - int ctr, flag; - - ctr = 0; - nextchar = (int) string[0]; - flag = 0; - if (nextchar >= 97 && nextchar <= 122) { /* 0'a=97, 0'z=122 */ - while (nextchar != '\0' && !flag) { - if (nextchar < 48 - || (nextchar > 57 && nextchar < 65) - || ((nextchar > 90 && nextchar < 97) && nextchar != 95) - || (nextchar > 122)) - flag = 1; - ctr++; - nextchar = (int) string[ctr]; - } - if (!flag) return FALSE; - } - - if (string[1] == '\0') { - if ((int) string[0] == 33 /*--- || (int) string[0] == 59 ---*/) - return FALSE; - if ((int) string[0] == 46) return TRUE; - } - - nextchar = (int) string[0]; - ctr = 0; - while (nextchar != '\0' && !flag) { - switch(nextchar) { - case 35: case 36: case 38: case 42: case 43: case 45: case 46: - case 47: case 58: case 60: case 61: case 62: case 63: case 64: - case 92: case 94: case 96: case 126: - nextchar++; - break; - default: - flag = 1; - } - ctr++; - nextchar = (int) string[ctr]; - } - return flag; -} - -static void double_quotes(char *string, char *new_string) -{ - int ctr = 0, nctr = 0; - - while (string[ctr] != '\0') { - if (string[ctr] == 39) { - new_string[nctr] = 39; - nctr++; - } - new_string[nctr] = string[ctr]; - nctr++; ctr++; - } - new_string[nctr] = '\0'; -} - -static void write_quotedname(FILE *file, char *string) -{ - char* new_string; - - new_string = (char *)malloc(2*(strlen(string))+1); - - if (*string == '\0') - fprintf(file,"''"); - else { - if (!no_quotes_needed(string)) { - fprintf(file,"%s",string); - } - else { - double_quotes(string,new_string); - fprintf(file,"\'%s\'",new_string); - } - } - - free(new_string); -} /*----------------------------------------------------------------------*/ Index: builtin.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/builtin.h,v retrieving revision 1.44 retrieving revision 1.45 diff -u -r1.44 -r1.45 --- builtin.h 13 Mar 2002 22:40:13 -0000 1.44 +++ builtin.h 20 May 2002 17:47:09 -0000 1.45 @@ -226,6 +226,7 @@ #define UNWIND_STACK 233 #define CLEAN_UP_BLOCK 234 +#define DUMMY 235 /* added by Bart Demoen & Kostis Sagonas for debugging and convenience */ #define PRINT_LS 240 #define PRINT_TR 241 @@ -245,3 +246,36 @@ /* This hook is for Interprolog */ #define INTERPROLOG_CALLBACK 255 + +#define PLUS_FUNCT 1 +#define MINUS_FUNCT 2 +#define TIMES_FUNCT 3 +#define DIV_FUNCT 4 +#define BITAND_FUNCT 5 +#define BITOR_FUNCT 6 + +#define BITNOT_FUNCT 7 +#define IDIV_FUNCT 8 + +#define SIN_FUNCT 9 +#define COS_FUNCT 10 +#define TAN_FUNCT 11 + +#define FLOAT_FUNCT 13 +#define FLOOR_FUNCT 14 +#define EXP_FUNCT 15 +#define LOG_FUNCT 16 +#define LOG10_FUNCT 17 +#define SQRT_FUNCT 18 +#define ASIN_FUNCT 19 +#define ACOS_FUNCT 20 +#define ATAN_FUNCT 21 +#define ABS_FUNCT 22 +#define TRUNC_FUNCT 23 +#define ROUND_FUNCT 24 +#define CEIL_FUNCT 25 + +#define BITSHIFTL_FUNCT 26 +#define BITSHIFTR_FUNCT 27 +#define UMINUS_FUNCT 28 + Index: complete_local.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/complete_local.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- complete_local.h 12 Mar 2002 17:31:21 -0000 1.5 +++ complete_local.h 20 May 2002 17:47:09 -0000 1.6 @@ -88,6 +88,86 @@ #define ProfileLeader #endif + + +/* The following function writes the SDG to stddbg. The SDG is +written every "std_sample_rate" times the computation determines that +it is checking completion for a leader. If so, the opentable stack is +traversed along with the various lists hanging off of the subgoal +frames. For each edge in the SDG a Prolog-readible fact is written + +edge(sdg_check_num,Type,Root_subgoal,Selected_tabled_subgoal) + +sdg_check_num is the number of the check. Using sdg_check_num one can +get a somewhat dynamic view of how the SDG changes over the +computation. + +Type = 1 if it is a positive link (consumer choice point) +Type = -1 if it is a negative link to a completion suspension choice point +Type = 2 if it is the first call (generator cp is used here). + +Right now, there isnt a good way of determining whether the first call +of a tabled predicate is positive or negative. So its best to table +tnot/1 in tables.P if you want to keep full track of signs */ + +#ifdef PROFILE +void print_sdg_edge(int check_num,int sign,VariantSF fromsf,VariantSF tosf) +{ + fprintf(stddbg,"edge(%d,%d,",check_num,sign); + print_subgoal(stddbg,fromsf); fprintf(stddbg,","); + print_subgoal(stddbg,tosf); fprintf(stddbg,").\n"); +} + +void SpitOutGraph(CPtr cs_ptr) +{ + CPtr tmp_openreg = cs_ptr; + CPtr nsf; + int num_subgoals = 0; + VariantSF prof_compl_subg; + + sdg_check_num++; + if (sdg_sample_rate > 0 && (sdg_check_num % sdg_sample_rate == 0)) { + printf(" /* now checking: %d */ \n",sdg_check_num); + while (tmp_openreg < COMPLSTACKBOTTOM) { + num_subgoals++; + prof_compl_subg = compl_subgoal_ptr(tmp_openreg); + + fprintf(stddbg," /* "); + print_subgoal(stddbg, prof_compl_subg); + fprintf(stddbg," */ \n"); + + if (tcp_ptcp(subg_cp_ptr(prof_compl_subg)) != NULL ) { + print_sdg_edge(sdg_check_num,2, + tcp_ptcp(subg_cp_ptr(prof_compl_subg)), + prof_compl_subg); + } else { + } + + nsf = subg_asf_list_ptr(prof_compl_subg); + while (nsf != NULL) { + + print_sdg_edge(sdg_check_num,1,nlcp_ptcp(nsf),prof_compl_subg); + + nsf = nlcp_prevlookup(nsf); + } + + nsf = subg_compl_susp_ptr(prof_compl_subg); + while (nsf != NULL) { + + print_sdg_edge(sdg_check_num,-1,csf_ptcp(nsf),prof_compl_subg); + + nsf = csf_prevcsf(nsf); + } + + tmp_openreg = prev_compl_frame(tmp_openreg); + } + /* printf("doing checking %d %d \n",sdg_check_num,num_subgoals); */ + } +} +#else +#define SpitOutGraph +#endif + #ifdef LOCAL_EVAL #define DisposeOfComplSusp(subgoal) \ subg_compl_susp_ptr(subgoal) = NULL @@ -188,6 +268,12 @@ ComplStkFrame = next_compl_frame(ComplStkFrame); } /* while */ + /* TLS: placemarker while I develop it. This function should happen + *after* simplification and *before* removal of answer lists, which + is useful for traversing dependency graphs. */ + + /* remove_unfounded_set(cs_ptr); */ + /* reclaim all answer lists, but the one for the leader */ ComplStkFrame = next_compl_frame(cs_ptr); while (ComplStkFrame >= openreg) { Index: complete_xsb_i.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/complete_xsb_i.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- complete_xsb_i.h 12 Mar 2002 17:31:21 -0000 1.18 +++ complete_xsb_i.h 20 May 2002 17:47:09 -0000 1.19 @@ -73,8 +73,8 @@ /* The following code is only done in profile mode; it keeps track * of characteristics of SCCs */ - ProfileLeader; - + /* ProfileLeader; */ + /* SpitOutGraph(cs_ptr); */ /* check if fixpoint has been reached, otherwise schedule any * unresolved answers */ FailIfAnswersFound(check_fixpoint(subgoal,breg)); @@ -91,8 +91,6 @@ CompleteSimplifyAndReclaim(cs_ptr); - remove_unfounded_set(cs_ptr); - /* leader has non-returned answers? */ if (has_answer_code(subgoal) && (subg_answers(subgoal) > COND_ANSWERS)) { reclaim_incomplete_table_structs(subgoal); Index: debug_xsb.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/debug_xsb.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- debug_xsb.c 12 Mar 2002 17:31:21 -0000 1.16 +++ debug_xsb.c 20 May 2002 17:47:09 -0000 1.17 @@ -28,6 +28,7 @@ #include "xsb_debug.h" #include <stdio.h> +#include <string.h> #include "auxlry.h" #include "cell_xsb.h" @@ -42,6 +43,12 @@ #include "choice.h" #include "macro_xsb.h" #include "inst_xsb.h" +#include "debug_xsb.h" +#include "token_xsb.h" +#include "varstring_xsb.h" +#include "cinterf.h" +#include "io_defs_xsb.h" +#include "io_builtins_xsb.h" #ifdef DEBUG #include "subp.h" @@ -67,21 +74,6 @@ /*----------------------------------------------------------------------*/ -#ifdef DEBUG -#define STRIDESIZE 30 - -#define EOS "--------------------BOTTOM_OF_STACK--------------------\n" -#define EOFR "--------------------------------------------\n" -#define EOSUBG "------------------------------------------------------------\n" - -#define print_subg_header(SUBG) { \ - fprintf(stddbg, "=== Frame for "); print_subgoal(stddbg, SUBG); \ - if (is_completed(SUBG)) fprintf(stddbg, " (completed) ===\n"); \ - else fprintf(stddbg, " (incomplete) ===\n"); } -#endif - -/*----------------------------------------------------------------------*/ - static int count_producer_subgoals(void) { int i; @@ -434,6 +426,7 @@ static Cell cell_array[500]; + static void print_term_of_subgoal(FILE *fp, int *i) { Cell term; @@ -446,7 +439,8 @@ break; case XSB_STRUCT: args = get_arity((Psc)cs_val(term)); - fprintf(fp, "%s", get_name((Psc)cs_val(term))); + write_quotedname(fp, get_name((Psc)cs_val(term))); + /* fprintf(fp, "%s", get_name((Psc)cs_val(term))); */ if (args > 0) fprintf(fp, "("); for (j = args; j > 0; j--) { (*i)--; @@ -473,7 +467,8 @@ fprintf(fp, "]"); break; case XSB_STRING: - fprintf(fp, "%s", string_val(term)); + write_quotedname(fp,string_val(term)); + /* fprintf(fp, "%s", string_val(term));*/ break; case XSB_INT: fprintf(fp, "%d", int_val(term)); @@ -499,7 +494,8 @@ for (leaf = subg_leaf_ptr(subg); leaf != NULL; leaf = Parent(leaf)) { cell_array[i++] = BTN_Symbol(leaf); } - fprintf(fp, "%s", get_name(psc)); + write_quotedname(fp, get_name(psc)); + /* fprintf(fp, "%s", get_name(psc)); */ if (get_arity(psc) > 0) { fprintf(fp, "("); for (i = i-2; i >= 0 ; i--) { @@ -1006,7 +1002,7 @@ /*----------------------------------------------------------------------*/ /* Needs to change when new xwam stacks are introduced. */ -static void print_heap(int overlap) /* Heap grows up */ + void terry_print_heap(int overlap) /* Heap grows up */ { int i, offset = 0; char ans = 'y'; @@ -1034,13 +1030,6 @@ } } -/*----- For table debugging --------------------------------------------*/ - -static char *compl_stk_frame_field[] = { - "subgoal_ptr", "level_num", - "del_ret_list", "visited", "DG_edges", "DGT_edges" -}; - /*----------------------------------------------------------------------*/ void print_completion_stack(void) @@ -1400,7 +1389,7 @@ case 'H': scanf("%d", &num); skip_to_nl(); - print_heap(num); + terry_print_heap(num); goto again; case 'k': scanf("%d", &num); Index: emudef.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/emudef.h,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- emudef.h 13 Mar 2002 22:40:13 -0000 1.32 +++ emudef.h 20 May 2002 17:47:09 -0000 1.33 @@ -54,7 +54,7 @@ CPtr openreg; CPtr root_address; -CPtr ptcpreg; +CPtr ptcpreg = NULL; CPtr delayreg; #ifdef DEMAND Index: inst_xsb.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/inst_xsb.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- inst_xsb.c 21 Sep 2001 15:01:15 -0000 1.13 +++ inst_xsb.c 20 May 2002 17:47:09 -0000 1.14 @@ -35,16 +35,20 @@ extern void init_builtin_table(void); #ifdef PROFILE + +/* Initialize this stuff for profiling. In profiling, the number of + occurrences of each instruction can be counted, as well as + operations that happen within instructions, such as switch_envs, + and others. Thus the instruction tables have an added field, to + keep the count. In addition, statistics on SCCs can be derived and + the SDGs themselves printed out, if you like. */ + Cell inst_table[BUILTIN_TBL_SZ][6]; + unsigned long num_switch_envs; unsigned long num_switch_envs_iter; Cell subinst_table[BUILTIN_TBL_SZ][2]; -int max_subgoals = 0; -int max_completed = 0; -int max_consumers_in_ascc = 0; -int max_compl_susps_in_ascc = 0; -int trapped_prolog_cps = 0; #define XSB_INST(inum, inst, label, op1type, op2type, op3type, op4type) \ inst_table[inst][0] = (Cell)( #inst ); \ @@ -60,6 +64,18 @@ #define set_subinst_table(inst,instr) \ subinst_table[inst][0] = (Cell)(instr); \ subinst_table[inst][1] = 0 + +/* ProfileLeader */ +int max_subgoals = 0; +int max_completed = 0; +int max_consumers_in_ascc = 0; +int max_compl_susps_in_ascc = 0; +int trapped_prolog_cps = 0; + +/* SpitOutGraph */ +int sdg_sample_rate = 2000; +int sdg_check_num = 0; + #else Cell inst_table[BUILTIN_TBL_SZ][5]; Index: io_builtins_xsb.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/io_builtins_xsb.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- io_builtins_xsb.c 23 Jan 2002 17:08:09 -0000 1.23 +++ io_builtins_xsb.c 20 May 2002 17:47:09 -0000 1.24 @@ -1309,3 +1309,87 @@ return i; } + +/*----------------------- write_quotedname/2 ---------------------------*/ + +xsbBool no_quotes_needed(char *string) +{ + int nextchar; + int ctr, flag; + + ctr = 0; + nextchar = (int) string[0]; + flag = 0; + if (nextchar >= 97 && nextchar <= 122) { /* 0'a=97, 0'z=122 */ + while (nextchar != '\0' && !flag) { + if (nextchar < 48 + || (nextchar > 57 && nextchar < 65) + || ((nextchar > 90 && nextchar < 97) && nextchar != 95) + || (nextchar > 122)) + flag = 1; + ctr++; + nextchar = (int) string[ctr]; + } + if (!flag) return FALSE; + } + + if (string[1] == '\0') { + if ((int) string[0] == 33 /*--- || (int) string[0] == 59 ---*/) + return FALSE; + if ((int) string[0] == 46) return TRUE; + } + + nextchar = (int) string[0]; + ctr = 0; + while (nextchar != '\0' && !flag) { + switch(nextchar) { + case 35: case 36: case 38: case 42: case 43: case 45: case 46: + case 47: case 58: case 60: case 61: case 62: case 63: case 64: + case 92: case 94: case 96: case 126: + nextchar++; + break; + default: + flag = 1; + } + ctr++; + nextchar = (int) string[ctr]; + } + return flag; +} + + +void double_quotes(char *string, char *new_string) +{ + int ctr = 0, nctr = 0; + + while (string[ctr] != '\0') { + if (string[ctr] == 39) { + new_string[nctr] = 39; + nctr++; + } + new_string[nctr] = string[ctr]; + nctr++; ctr++; + } + new_string[nctr] = '\0'; +} + +void write_quotedname(FILE *file, char *string) +{ + char* new_string; + + new_string = (char *)malloc(2*(strlen(string))+1); + + if (*string == '\0') + fprintf(file,"''"); + else { + if (!no_quotes_needed(string)) { + fprintf(file,"%s",string); + } + else { + double_quotes(string,new_string); + fprintf(file,"\'%s\'",new_string); + } + } + + free(new_string); +} Index: io_builtins_xsb.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/io_builtins_xsb.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- io_builtins_xsb.h 25 Oct 1999 05:58:36 -0000 1.1 +++ io_builtins_xsb.h 20 May 2002 17:47:10 -0000 1.2 @@ -32,3 +32,7 @@ extern FILE *open_files[]; /* Table of file pointers for open files */ extern int xsb_intern_file(FILE *f, char *c); + +extern void write_quotedname(FILE *file, char *string); +extern void double_quotes(char *string, char *new_string); +extern xsbBool no_quotes_needed(char *string); Index: remove_unf.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/remove_unf.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- remove_unf.c 5 Oct 2001 19:26:49 -0000 1.1 +++ remove_unf.c 20 May 2002 17:47:10 -0000 1.2 @@ -1,6 +1,52 @@ +#include <stdio.h> + #include "xsb_config.h" +#include "basictypes.h" #include "cell_xsb.h" +#include "error_xsb.h" +#include "psc_xsb.h" +#include "tries.h" +#include "macro_xsb.h" +#include "debug_xsb.h" +#include "register.h" + +#ifdef DEBUG +void my_print_completion_stack(CPtr leader_ptr) +{ + int i = 0; + EPtr eptr; + VariantSF subg; + CPtr temp = openreg; + + fprintf(stddbg,"openreg -> "); + while (temp < (leader_ptr + COMPLFRAMESIZE)) { + if ((i % COMPLFRAMESIZE) == 0) { + fprintf(stddbg,EOFR); + subg = compl_subgoal_ptr(temp); + print_subg_header(subg); + printf("ans_list_ptr %x ans_list_tail %x\n", + subg_ans_list_ptr(subg), + subg_ans_list_tail(subg)); + } + fprintf(stddbg,"Completion Stack %p: %lx\t(%s)", + temp, *temp, compl_stk_frame_field[(i % COMPLFRAMESIZE)]); + /* only for batched + if ((i % COMPLFRAMESIZE) >= COMPLFRAMESIZE-2) { + for (eptr = (EPtr)*temp; eptr != NULL; eptr = next_edge(eptr)) { + fprintf(stddbg," --> %p", edge_to_node(eptr)); + } + } */ + fprintf(stddbg,"\n"); + temp++; i++; + } + fprintf(stddbg, EOS); +} void remove_unfounded_set(CPtr leader_ptr) { + + my_print_completion_stack((CPtr) leader_ptr); + } + +#endif Index: subinst.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/subinst.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- subinst.h 21 Sep 2001 15:01:15 -0000 1.3 +++ subinst.h 20 May 2002 17:47:10 -0000 1.4 @@ -33,12 +33,21 @@ #define NEW_ANSWER_SIMPL_NEG_FAIL 13 #define NEW_ANSWER_SIMPL_NEG_SUC 14 +/* The following global variables are used for ProfileLeader, and + represent summary statistics on the size and confomation of SCCs. */ + extern int max_subgoals; extern int max_completed; extern int max_consumers_in_ascc; extern int max_compl_susps_in_ascc; extern int trapped_prolog_cps; + +/* The following global variables are used for SpitOutGraph, which + prints out the entire SDG */ + +extern int sdg_sample_rate; +extern int sdg_check_num; extern Cell subinst_table[256][2]; Index: subp.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/subp.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -r1.60 -r1.61 --- subp.c 12 Mar 2002 15:13:38 -0000 1.60 +++ subp.c 20 May 2002 17:47:10 -0000 1.61 @@ -311,6 +311,8 @@ /* set interrupt code in reg 2 and return ep of interrupt handler. */ /* the returned value is normally assigned to pcreg, so this is like */ /* raising a trap. */ +/* Note that the interrupt handlers referred to by flags array values */ +/* are set up on the Prolog side via set_inthandler/2 */ /*======================================================================*/ Psc synint_proc(Psc psc, int intcode, byte *cur_inst) |