data structures for multithreading tabling

This commit is contained in:
Ricardo Rocha 2011-11-22 17:09:29 +00:00
parent 42211448c5
commit 65b73a8a09
5 changed files with 414 additions and 211 deletions

View File

@ -13,107 +13,45 @@
/************************************************************************ /****************************************************************
** General Configuration Parameters ** ** Configuration Parameters **
************************************************************************/ ****************************************************************/
/******************************************************************************************
** use shared pages memory alloc scheme for OPTYap data structures? (optional) **
******************************************************************************************/
/* #define USE_PAGES_MALLOC 1 */
/************************************************************************
** Tabling Configuration Parameters **
************************************************************************/
/****************************
** default sizes **
****************************/
#define MAX_TABLE_VARS 1000
/**********************************************************
** trail freeze scheme (mandatory, define one) **
**********************************************************/
#define BFZ_TRAIL_SCHEME 1
/* #define BBREG_TRAIL_SCHEME 1 */
/*********************************************************
** support mode directed tabling ? (optional) **
*********************************************************/
#define MODE_DIRECTED_TABLING 1
/****************************************************
** support early completion ? (optional) **
****************************************************/
#define TABLING_EARLY_COMPLETION 1
/******************************************************
** support trie compact pairs ? (optional) **
******************************************************/
#define TRIE_COMPACT_PAIRS 1
/************************************************************
** support global trie for subterms ? (optional) **
************************************************************/
/* #define GLOBAL_TRIE_FOR_SUBTERMS 1 */
/******************************************************
** support incomplete tabling ? (optional) **
******************************************************/
/* #define INCOMPLETE_TABLING 1 */
/******************************************************
** limit the table space size ? (optional) **
******************************************************/
/* #define LIMIT_TABLING 1 */
/*********************************************************
** support deterministic tabling ? (optional) **
*********************************************************/
/* #define DETERMINISTIC_TABLING 1 */
/*************************************************
** enable error checking ? (optional) **
*************************************************/
/* #define DEBUG_TABLING 1 */
/************************************************************************
** YapOr Configuration Parameters **
************************************************************************/
/**************************** /****************************
** default sizes ** ** default sizes **
****************************/ ****************************/
#define MAX_TABLE_VARS 1000
#define TRIE_LOCK_BUCKETS 512
#define THREADS_FIRST_LEVEL_BUCKETS 16
#define THREADS_SECOND_LEVEL_BUCKETS (MAX_THREADS / THREADS_FIRST_LEVEL_BUCKETS) /* 64 (1024/16) */
#define TG_ANSWER_SLOTS 20
#define MAX_LENGTH_ANSWER 1000 #define MAX_LENGTH_ANSWER 1000
#define MAX_BRANCH_DEPTH 1000 #define MAX_BRANCH_DEPTH 1000
#define MAX_BEST_TIMES 21
/************************************************************ /**********************************************************************
** memory mapping scheme (mandatory, define one) ** ** memory mapping scheme for YapOr (mandatory, define one) **
************************************************************/ **********************************************************************/
#define MMAP_MEMORY_MAPPING_SCHEME 1 #define MMAP_MEMORY_MAPPING_SCHEME 1
/* #define SHM_MEMORY_MAPPING_SCHEME 1 */ /* #define SHM_MEMORY_MAPPING_SCHEME 1 */
/************************************************* /****************************************************************
** enable error checking ? (optional) ** ** use shared pages memory alloc scheme ? (optional) **
*************************************************/ ****************************************************************/
/* #define DEBUG_YAPOR 1 */ /* #define USE_PAGES_MALLOC 1 */
/**********************************************************************
** trail freeze scheme for tabling (mandatory, define one) **
**********************************************************************/
#define BFZ_TRAIL_SCHEME 1
/* #define BBREG_TRAIL_SCHEME 1 */
/************************************************************************ /************************************************************************
** OPTYap Configuration Parameters ** ** multithreading design for tabling (mandatory, define one) **
************************************************************************/ ************************************************************************/
#define THREADS_NO_SHARING 1
/**************************** /* #define THREADS_SUBGOAL_SHARING 1 */
** default sizes ** /* #define THREADS_FULL_SHARING 1 */
****************************/ /* #define THREADS_CONSUMER_SHARING 1 */
#define TG_ANSWER_SLOTS 20
#define TRIE_LOCK_BUCKETS 512
/************************************************************************* /*************************************************************************
** tries locking scheme (mandatory, define one per trie type) ** ** tries locking scheme (mandatory, define one per trie type) **
@ -154,26 +92,86 @@
#define TRIE_LOCK_USING_NODE_FIELD 1 #define TRIE_LOCK_USING_NODE_FIELD 1
/* #define TRIE_LOCK_USING_GLOBAL_ARRAY 1 */ /* #define TRIE_LOCK_USING_GLOBAL_ARRAY 1 */
/*********************************************************
** support mode directed tabling ? (optional) **
*********************************************************/
#define MODE_DIRECTED_TABLING 1
/****************************************************************
** support early completion for tabling ? (optional) **
*****************************************************************/
#define TABLING_EARLY_COMPLETION 1
/****************************************************** /******************************************************
** support tabling inner cuts ? (optional) ** ** support trie compact pairs ? (optional) **
******************************************************/ ******************************************************/
#define TABLING_INNER_CUTS 1 #define TRIE_COMPACT_PAIRS 1
/************************************************************
** support global trie for subterms ? (optional) **
************************************************************/
/* #define GLOBAL_TRIE_FOR_SUBTERMS 1 */
/******************************************************
** support incomplete tabling ? (optional) **
******************************************************/
/* #define INCOMPLETE_TABLING 1 */
/******************************************************
** limit the table space size ? (optional) **
******************************************************/
/* #define LIMIT_TABLING 1 */
/********************************************************* /*********************************************************
** use timestamps for suspension ? (optional) ** ** support deterministic tabling ? (optional) **
*********************************************************/ *********************************************************/
/* #define DETERMINISTIC_TABLING 1 */
/******************************************************************
** support tabling inner cuts with OPTYap ? (optional) **
******************************************************************/
#define TABLING_INNER_CUTS 1
/*********************************************************************
** use timestamps for suspension with OPTYap ? (optional) **
*********************************************************************/
#define TIMESTAMP_CHECK 1 #define TIMESTAMP_CHECK 1
/*************************************************
** enable error checking ? (optional) **
*************************************************/
/* #define DEBUG_TABLING 1 */
/* #define DEBUG_YAPOR 1 */
/**************************************************
** enable output checking ? (optional) **
**************************************************/
/* #define OUTPUT_THREADS_TABLING 1 */
/************************************************************************ /************************************************************************
** Parameter Checks ** ** Parameter Checks **
************************************************************************/ ************************************************************************/
#ifndef USE_PAGES_MALLOC #ifdef YAPOR
#undef LIMIT_TABLING #ifdef i386 /* For i386 machines we use shared memory segments */
#endif /* ! USE_PAGES_MALLOC */ #undef MMAP_MEMORY_MAPPING_SCHEME
#define SHM_MEMORY_MAPPING_SCHEME
#endif
#if !defined(MMAP_MEMORY_MAPPING_SCHEME) && !defined(SHM_MEMORY_MAPPING_SCHEME)
#error Define a memory mapping scheme
#endif
#if defined(MMAP_MEMORY_MAPPING_SCHEME) && defined(SHM_MEMORY_MAPPING_SCHEME)
#error Do not define multiple memory mapping schemes
#endif
#else /* ! YAPOR */
#undef MMAP_MEMORY_MAPPING_SCHEME
#undef SHM_MEMORY_MAPPING_SCHEME
#undef DEBUG_YAPOR
#endif /* YAPOR */
#ifdef TABLING #ifdef TABLING
#if !defined(BFZ_TRAIL_SCHEME) && !defined(BBREG_TRAIL_SCHEME) #if !defined(BFZ_TRAIL_SCHEME) && !defined(BBREG_TRAIL_SCHEME)
@ -195,27 +193,7 @@
#undef DEBUG_TABLING #undef DEBUG_TABLING
#endif /* TABLING */ #endif /* TABLING */
#if defined(TABLING) && (defined(YAPOR) || defined(THREADS))
#ifdef YAPOR
#ifdef i386 /* For i386 machines we use shared memory segments */
#undef MMAP_MEMORY_MAPPING_SCHEME
#define SHM_MEMORY_MAPPING_SCHEME
#endif
#if !defined(MMAP_MEMORY_MAPPING_SCHEME) && !defined(SHM_MEMORY_MAPPING_SCHEME)
#error Define a memory mapping scheme
#endif
#if defined(MMAP_MEMORY_MAPPING_SCHEME) && defined(SHM_MEMORY_MAPPING_SCHEME)
#error Do not define multiple memory mapping schemes
#endif
#undef LIMIT_TABLING
#else /* ! YAPOR */
#undef MMAP_MEMORY_MAPPING_SCHEME
#undef SHM_MEMORY_MAPPING_SCHEME
#undef DEBUG_YAPOR
#endif /* YAPOR */
#if defined(YAPOR) && defined(TABLING)
/* SUBGOAL_TRIE_LOCK_LEVEL */ /* SUBGOAL_TRIE_LOCK_LEVEL */
#if !defined(SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL) && !defined(SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL) && !defined(SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL) #if !defined(SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL) && !defined(SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL) && !defined(SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL)
#error Define a subgoal trie lock scheme #error Define a subgoal trie lock scheme
@ -258,13 +236,70 @@
#ifndef GLOBAL_TRIE_LOCK_AT_WRITE_LEVEL #ifndef GLOBAL_TRIE_LOCK_AT_WRITE_LEVEL
#undef GLOBAL_TRIE_ALLOC_BEFORE_CHECK #undef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
#endif #endif
/* TRIE_LOCK_USING_NODE_FIELD / TRIE_LOCK_USING_GLOBAL_ARRAY */ /* TRIE_LOCK_USING */
#if !defined(TRIE_LOCK_USING_NODE_FIELD) && !defined(TRIE_LOCK_USING_GLOBAL_ARRAY) #if !defined(TRIE_LOCK_USING_NODE_FIELD) && !defined(TRIE_LOCK_USING_GLOBAL_ARRAY)
#error Define a trie lock data structure #error Define a trie lock data structure
#endif #endif
#if defined(TRIE_LOCK_USING_NODE_FIELD) && defined(TRIE_LOCK_USING_GLOBAL_ARRAY) #if defined(TRIE_LOCK_USING_NODE_FIELD) && defined(TRIE_LOCK_USING_GLOBAL_ARRAY)
#error Do not define multiple trie lock data structures #error Do not define multiple trie lock data structures
#endif #endif
#else /* ! TABLING || (! YAPOR && ! THREADS) */
#undef SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL
#undef SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL
#undef SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL
#undef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
#undef ANSWER_TRIE_LOCK_AT_ENTRY_LEVEL
#undef ANSWER_TRIE_LOCK_AT_NODE_LEVEL
#undef ANSWER_TRIE_LOCK_AT_WRITE_LEVEL
#undef ANSWER_TRIE_ALLOC_BEFORE_CHECK
#undef GLOBAL_TRIE_LOCK_AT_NODE_LEVEL
#undef GLOBAL_TRIE_LOCK_AT_WRITE_LEVEL
#undef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
#undef TRIE_LOCK_USING_NODE_FIELD
#undef TRIE_LOCK_USING_GLOBAL_ARRAY
#endif /* TABLING && (YAPOR || THREADS) */
#if defined(TABLING) && defined(THREADS)
#if !defined(THREADS_NO_SHARING) && !defined(THREADS_SUBGOAL_SHARING) && !defined(THREADS_FULL_SHARING) && !defined(THREADS_CONSUMER_SHARING)
#error Define a multithreading table design
#endif
#if defined(THREADS_NO_SHARING) && defined(THREADS_SUBGOAL_SHARING)
#error Do not define multiple multithreading table designs
#endif
#if defined(THREADS_NO_SHARING) && defined(THREADS_FULL_SHARING)
#error Do not define multiple multithreading table designs
#endif
#if defined(THREADS_NO_SHARING) && defined(THREADS_CONSUMER_SHARING)
#error Do not define multiple multithreading table designs
#endif
#if defined(THREADS_SUBGOAL_SHARING) && defined(THREADS_FULL_SHARING)
#error Do not define multiple multithreading table designs
#endif
#if defined(THREADS_SUBGOAL_SHARING) && defined(THREADS_CONSUMER_SHARING)
#error Do not define multiple multithreading table designs
#endif
#if defined(THREADS_FULL_SHARING) && defined(THREADS_CONSUMER_SHARING)
#error Do not define multiple multithreading table designs
#endif
#ifdef THREADS_NO_SHARING
#undef SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL
#undef SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL
#undef SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL
#undef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
#endif
#if defined(THREADS_NO_SHARING) || defined(THREADS_SUBGOAL_SHARING)
#undef ANSWER_TRIE_LOCK_AT_ENTRY_LEVEL
#undef ANSWER_TRIE_LOCK_AT_NODE_LEVEL
#undef ANSWER_TRIE_LOCK_AT_WRITE_LEVEL
#undef ANSWER_TRIE_ALLOC_BEFORE_CHECK
#endif
#else /* ! TABLING || ! THREADS */
#undef THREADS_NO_SHARING
#undef THREADS_SUBGOAL_SHARING
#undef THREADS_FULL_SHARING
#undef THREADS_CONSUMER_SHARING
#endif /* TABLING && THREADS */
#ifdef TRIE_LOCK_USING_NODE_FIELD #ifdef TRIE_LOCK_USING_NODE_FIELD
#if defined(SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL) || defined(SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL) #if defined(SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL) || defined(SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL)
#define SUBGOAL_TRIE_LOCK_USING_NODE_FIELD 1 #define SUBGOAL_TRIE_LOCK_USING_NODE_FIELD 1
@ -286,25 +321,34 @@
#define GLOBAL_TRIE_LOCK_USING_GLOBAL_ARRAY 1 #define GLOBAL_TRIE_LOCK_USING_GLOBAL_ARRAY 1
#endif #endif
#endif #endif
#else /* ! TABLING || ! YAPOR */
#undef SUBGOAL_TRIE_LOCK_AT_ENTRY_LEVEL #if !defined(TABLING) || !defined(YAPOR)
#undef SUBGOAL_TRIE_LOCK_AT_NODE_LEVEL
#undef SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL
#undef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
#undef ANSWER_TRIE_LOCK_AT_ENTRY_LEVEL
#undef ANSWER_TRIE_LOCK_AT_NODE_LEVEL
#undef ANSWER_TRIE_LOCK_AT_WRITE_LEVEL
#undef ANSWER_TRIE_ALLOC_BEFORE_CHECK
#undef GLOBAL_TRIE_LOCK_AT_NODE_LEVEL
#undef GLOBAL_TRIE_LOCK_AT_WRITE_LEVEL
#undef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
#undef TRIE_LOCK_USING_NODE_FIELD
#undef TRIE_LOCK_USING_GLOBAL_ARRAY
#undef TABLING_INNER_CUTS #undef TABLING_INNER_CUTS
#undef TIMESTAMP_CHECK #undef TIMESTAMP_CHECK
#endif /* YAPOR && TABLING */ #endif
#if defined(TABLING) && defined(THREADS)
#if THREADS_FIRST_LEVEL_BUCKETS > THREADS_SECOND_LEVEL_BUCKETS
#error THREADS_FIRST_LEVEL_BUCKETS cannot exceed THREADS_SECOND_LEVEL_BUCKETS
#endif
#else
#undef OUTPUT_THREADS_TABLING
#endif
#if defined(DEBUG_YAPOR) && defined(DEBUG_TABLING) #if defined(DEBUG_YAPOR) && defined(DEBUG_TABLING)
#define DEBUG_OPTYAP #define DEBUG_OPTYAP
#endif /* DEBUG_YAPOR && DEBUG_TABLING */ #endif
#if defined(LIMIT_TABLING) && !defined(USE_PAGES_MALLOC)
#error LIMIT_TABLING requires USE_PAGES_MALLOC
#endif
#if defined(YAPOR) || defined(THREADS)
#undef MODE_DIRECTED_TABLING
#undef TABLING_EARLY_COMPLETION
#undef INCOMPLETE_TABLING
#undef LIMIT_TABLING
#undef DETERMINISTIC_TABLING
#endif

View File

@ -219,7 +219,7 @@ void Yap_init_root_frames(void) {
#ifdef TABLING #ifdef TABLING
/* root dependency frame */ /* root dependency frame */
#ifdef YAPOR #ifdef YAPOR
DepFr_cons_cp(GLOBAL_root_dep_fr) = B; DepFr_cons_cp(GLOBAL_root_dep_fr) = B; /* with YAPOR, at that point, LOCAL_top_dep_fr shouldn't be the same as GLOBAL_root_dep_fr ? */
#else #else
DepFr_cons_cp(LOCAL_top_dep_fr) = B; DepFr_cons_cp(LOCAL_top_dep_fr) = B;
#endif /* YAPOR */ #endif /* YAPOR */

View File

@ -78,10 +78,10 @@ typedef struct page_header {
***************************/ ***************************/
struct pages { struct pages {
#ifdef USE_PAGES_MALLOC #if defined(YAPOR) || defined(THREADS)
#ifdef YAPOR
lockvar lock; lockvar lock;
#endif /* YAPOR */ #endif /* YAPOR || THREADS */
#ifdef USE_PAGES_MALLOC
int structs_per_page; int structs_per_page;
struct page_header *first_free_page; struct page_header *first_free_page;
volatile long pages_allocated; volatile long pages_allocated;
@ -127,6 +127,12 @@ struct global_pages {
struct pages answer_trie_hash_pages; struct pages answer_trie_hash_pages;
struct pages global_trie_hash_pages; struct pages global_trie_hash_pages;
#endif /* TABLING */ #endif /* TABLING */
#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
struct pages subgoal_entry_pages;
#endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
#ifdef THREADS_FULL_SHARING
struct pages answer_ref_node_pages;
#endif /* THREADS_FULL_SHARING */
#if defined(YAPOR) && defined(TABLING) #if defined(YAPOR) && defined(TABLING)
struct pages suspension_frame_pages; struct pages suspension_frame_pages;
#endif /* YAPOR && TABLING */ #endif /* YAPOR && TABLING */
@ -158,6 +164,30 @@ struct global_optyap_locks {
/***************************************
** threads_dependency_frame **
***************************************/
#ifdef THREADS_CONSUMER_SHARING
struct threads_dependency_frame {
lockvar lock;
enum {
working,
idle,
completing
} state;
int terminator;
int next;
};
#endif /* THREADS_CONSUMER_SHARING */
#define ThDepFr_lock(X) ((X).lock)
#define ThDepFr_state(X) ((X).state)
#define ThDepFr_terminator(X) ((X).terminator)
#define ThDepFr_next(X) ((X).next)
/********************************* /*********************************
* Struct global_optyap_data ** * Struct global_optyap_data **
*********************************/ *********************************/
@ -212,6 +242,9 @@ struct global_optyap_data {
#ifdef YAPOR #ifdef YAPOR
struct dependency_frame *root_dependency_frame; struct dependency_frame *root_dependency_frame;
#endif /* YAPOR */ #endif /* YAPOR */
#ifdef THREADS_CONSUMER_SHARING
struct threads_dependency_frame threads_dependency_frame[MAX_THREADS];
#endif /*THREADS_CONSUMER_SHARING*/
CELL table_var_enumerator[MAX_TABLE_VARS]; CELL table_var_enumerator[MAX_TABLE_VARS];
#ifdef TRIE_LOCK_USING_GLOBAL_ARRAY #ifdef TRIE_LOCK_USING_GLOBAL_ARRAY
lockvar trie_locks[TRIE_LOCK_BUCKETS]; lockvar trie_locks[TRIE_LOCK_BUCKETS];
@ -238,6 +271,8 @@ struct global_optyap_data {
#define GLOBAL_pages_sg_hash (GLOBAL_optyap_data.pages.subgoal_trie_hash_pages) #define GLOBAL_pages_sg_hash (GLOBAL_optyap_data.pages.subgoal_trie_hash_pages)
#define GLOBAL_pages_ans_hash (GLOBAL_optyap_data.pages.answer_trie_hash_pages) #define GLOBAL_pages_ans_hash (GLOBAL_optyap_data.pages.answer_trie_hash_pages)
#define GLOBAL_pages_gt_hash (GLOBAL_optyap_data.pages.global_trie_hash_pages) #define GLOBAL_pages_gt_hash (GLOBAL_optyap_data.pages.global_trie_hash_pages)
#define GLOBAL_pages_sg_ent (GLOBAL_optyap_data.pages.subgoal_entry_pages)
#define GLOBAL_pages_ans_ref (GLOBAL_optyap_data.pages.answer_ref_node_pages)
#define GLOBAL_pages_susp_fr (GLOBAL_optyap_data.pages.suspension_frame_pages) #define GLOBAL_pages_susp_fr (GLOBAL_optyap_data.pages.suspension_frame_pages)
#define GLOBAL_scheduler_loop (GLOBAL_optyap_data.scheduler_loop) #define GLOBAL_scheduler_loop (GLOBAL_optyap_data.scheduler_loop)
#define GLOBAL_delayed_release_load (GLOBAL_optyap_data.delayed_release_load) #define GLOBAL_delayed_release_load (GLOBAL_optyap_data.delayed_release_load)
@ -280,6 +315,7 @@ struct global_optyap_data {
#define GLOBAL_last_sg_fr (GLOBAL_optyap_data.last_subgoal_frame) #define GLOBAL_last_sg_fr (GLOBAL_optyap_data.last_subgoal_frame)
#define GLOBAL_check_sg_fr (GLOBAL_optyap_data.check_subgoal_frame) #define GLOBAL_check_sg_fr (GLOBAL_optyap_data.check_subgoal_frame)
#define GLOBAL_root_dep_fr (GLOBAL_optyap_data.root_dependency_frame) #define GLOBAL_root_dep_fr (GLOBAL_optyap_data.root_dependency_frame)
#define GLOBAL_th_dep_fr(wid) (GLOBAL_optyap_data.threads_dependency_frame[wid])
#define GLOBAL_table_var_enumerator(index) (GLOBAL_optyap_data.table_var_enumerator[index]) #define GLOBAL_table_var_enumerator(index) (GLOBAL_optyap_data.table_var_enumerator[index])
#define GLOBAL_table_var_enumerator_addr(index) (GLOBAL_optyap_data.table_var_enumerator + (index)) #define GLOBAL_table_var_enumerator_addr(index) (GLOBAL_optyap_data.table_var_enumerator + (index))
#define GLOBAL_trie_locks(index) (GLOBAL_optyap_data.trie_locks[index]) #define GLOBAL_trie_locks(index) (GLOBAL_optyap_data.trie_locks[index])

View File

@ -88,6 +88,7 @@ static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames(tg_sol_fr_ptr, int);
** Tabling defines ** ** Tabling defines **
******************************/ ******************************/
/* traverse macros */
#define SHOW_MODE_STRUCTURE 0 #define SHOW_MODE_STRUCTURE 0
#define SHOW_MODE_STATISTICS 1 #define SHOW_MODE_STATISTICS 1
#define TRAVERSE_MODE_NORMAL 0 #define TRAVERSE_MODE_NORMAL 0
@ -135,6 +136,24 @@ static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames(tg_sol_fr_ptr, int);
#define CompactPairEndList AbsPair((Term *) (2*(LowTagBits + 1))) #define CompactPairEndList AbsPair((Term *) (2*(LowTagBits + 1)))
#endif /* TRIE_COMPACT_PAIRS */ #endif /* TRIE_COMPACT_PAIRS */
/* threads */
#if (_trie_retry_gterm - _trie_do_var + 1) + 1 <= 64 /* 60 (trie instructions) + 1 (ANSWER_TRIE_HASH_MARK) <= 64 */
#define ANSWER_LEAF_NODE_INSTR_BITS 6 /* 2^6 = 64 */
#define ANSWER_LEAF_NODE_INSTR_MASK 0x3F
#endif
#if SIZEOF_INT_P == 4
#define ANSWER_LEAF_NODE_MAX_THREADS (32 - ANSWER_LEAF_NODE_INSTR_BITS)
#elif SIZEOF_INT_P == 8
#define ANSWER_LEAF_NODE_MAX_THREADS (64 - ANSWER_LEAF_NODE_INSTR_BITS)
#else
#define ANSWER_LEAF_NODE_MAX_THREADS OOOOPPS!!! Unknown Pointer Sizeof
#endif /* SIZEOF_INT_P */
#define ANSWER_LEAF_NODE_INSTR_RELATIVE(NODE) TrNode_instr(NODE) = TrNode_instr(NODE) - _trie_do_var + 1
#define ANSWER_LEAF_NODE_INSTR_ABSOLUTE(NODE) TrNode_instr(NODE) = (TrNode_instr(NODE) & ANSWER_LEAF_NODE_INSTR_MASK) + _trie_do_var - 1
#define ANSWER_LEAF_NODE_SET_WID(NODE,WID) BITMAP_insert(TrNode_instr(NODE), WID + ANSWER_LEAF_NODE_INSTR_BITS)
#define ANSWER_LEAF_NODE_DEL_WID(NODE,WID) BITMAP_delete(TrNode_instr(NODE), WID + ANSWER_LEAF_NODE_INSTR_BITS)
#define ANSWER_LEAF_NODE_CHECK_WID(NODE,WID) BITMAP_member(TrNode_instr(NODE), WID + ANSWER_LEAF_NODE_INSTR_BITS)
/* choice points */ /* choice points */
#define NORM_CP(CP) ((choiceptr)(CP)) #define NORM_CP(CP) ((choiceptr)(CP))
#define GEN_CP(CP) ((struct generator_choicept *)(CP)) #define GEN_CP(CP) ((struct generator_choicept *)(CP))

View File

@ -31,21 +31,30 @@ typedef struct table_entry {
#ifdef MODE_DIRECTED_TABLING #ifdef MODE_DIRECTED_TABLING
int* mode_directed_array; int* mode_directed_array;
#endif /*MODE_DIRECTED_TABLING*/ #endif /*MODE_DIRECTED_TABLING*/
#ifdef THREADS_NO_SHARING
struct subgoal_trie_node *subgoal_trie[THREADS_FIRST_LEVEL_BUCKETS];
#else
struct subgoal_trie_node *subgoal_trie; struct subgoal_trie_node *subgoal_trie;
#endif /*THREADS_NO_SHARING */
struct subgoal_trie_hash *hash_chain; struct subgoal_trie_hash *hash_chain;
struct table_entry *next; struct table_entry *next;
} *tab_ent_ptr; } *tab_ent_ptr;
#define TabEnt_lock(X) ((X)->lock) #define TabEnt_lock(X) ((X)->lock)
#define TabEnt_pe(X) ((X)->pred_entry) #define TabEnt_pe(X) ((X)->pred_entry)
#define TabEnt_atom(X) ((X)->pred_atom) #define TabEnt_atom(X) ((X)->pred_atom)
#define TabEnt_arity(X) ((X)->pred_arity) #define TabEnt_arity(X) ((X)->pred_arity)
#define TabEnt_flags(X) ((X)->pred_flags) #define TabEnt_flags(X) ((X)->pred_flags)
#define TabEnt_mode(X) ((X)->execution_mode) #define TabEnt_mode(X) ((X)->execution_mode)
#define TabEnt_mode_directed(X) ((X)->mode_directed_array) #define TabEnt_mode_directed(X) ((X)->mode_directed_array)
#define TabEnt_subgoal_trie(X) ((X)->subgoal_trie) #ifdef THREADS_NO_SHARING
#define TabEnt_hash_chain(X) ((X)->hash_chain) #define TabEnt_subgoal_trie(X) ((X)->subgoal_trie[worker_id])
#define TabEnt_next(X) ((X)->next) #define TabEnt_subgoal_trie(X,I) ((X)->subgoal_trie[I])
#else
#define TabEnt_subgoal_trie(X) ((X)->subgoal_trie)
#endif /*THREADS_NO_SHARING */
#define TabEnt_hash_chain(X) ((X)->hash_chain)
#define TabEnt_next(X) ((X)->next)
@ -148,6 +157,24 @@ typedef struct global_trie_hash {
/******************************
** answer_ref_node **
******************************/
#ifdef THREADS_FULL_SHARING
typedef struct answer_ref_node {
struct answer_trie_node *ans_node;
struct answer_ref_node *next;
struct answer_ref_node *previous;
} *ans_ref_ptr;
#endif /* THREADS_FULL_SHARING */
#define RefNode_answer(X) ((X)->ans_node)
#define RefNode_next(X) ((X)->next)
#define RefNode_previous(X) ((X)->previous)
/************************************************************************ /************************************************************************
** Execution Data Structures ** ** Execution Data Structures **
************************************************************************/ ************************************************************************/
@ -193,29 +220,32 @@ struct loader_choicept {
/*********************************
** subgoal_state_flag **
*********************************/
typedef enum { /* do not change order !!! */
incomplete = 0, /* INCOMPLETE_TABLING */
ready_external = 1, /* THREADS_CONSUMER_SHARING */
ready = 2,
evaluating = 3,
complete = 4,
complete_in_use = 5, /* LIMIT_TABLING */
compiled = 6,
compiled_in_use = 7 /* LIMIT_TABLING */
} subgoal_state_flag;
/**************************** /****************************
** subgoal_frame ** ** subgoal_entry **
****************************/ ****************************/
typedef struct subgoal_frame { typedef struct subgoal_entry {
#if defined(YAPOR) || defined(THREADS) #if defined(YAPOR) || defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
lockvar lock; lockvar lock;
#endif /* YAPOR || THREADS */ #endif /* YAPOR || THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
#ifdef YAPOR
int generator_worker;
struct or_frame *top_or_frame_on_generator_branch;
#endif /* YAPOR */
yamop *code_of_subgoal; yamop *code_of_subgoal;
enum { /* do not change order !!! */
incomplete = 0, /* INCOMPLETE_TABLING */
ready = 1,
evaluating = 2,
complete = 3,
complete_in_use = 4, /* LIMIT_TABLING */
compiled = 5,
compiled_in_use = 6 /* LIMIT_TABLING */
} state_flag;
choiceptr generator_choice_point;
struct answer_trie_hash *hash_chain; struct answer_trie_hash *hash_chain;
struct answer_trie_node *answer_trie; struct answer_trie_node *answer_trie;
struct answer_trie_node *first_answer; struct answer_trie_node *first_answer;
@ -223,61 +253,130 @@ typedef struct subgoal_frame {
#ifdef MODE_DIRECTED_TABLING #ifdef MODE_DIRECTED_TABLING
int* mode_directed_array; int* mode_directed_array;
struct answer_trie_node *invalid_chain; struct answer_trie_node *invalid_chain;
#endif /*MODE_DIRECTED_TABLING*/ #endif /* MODE_DIRECTED_TABLING */
#ifdef INCOMPLETE_TABLING #ifdef INCOMPLETE_TABLING
struct answer_trie_node *try_answer; struct answer_trie_node *try_answer;
#endif /* INCOMPLETE_TABLING */ #endif /* INCOMPLETE_TABLING */
#ifdef LIMIT_TABLING #ifdef LIMIT_TABLING
struct subgoal_frame *previous; struct subgoal_frame *previous;
#endif /* LIMIT_TABLING */ #endif /* LIMIT_TABLING */
#ifdef YAPOR
struct or_frame *top_or_frame_on_generator_branch;
#endif /* YAPOR */
#if defined(YAPOR) || defined(THREADS_CONSUMER_SHARING)
int generator_worker;
#endif /* YAPOR || THREADS_CONSUMER_SHARING */
#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
subgoal_state_flag state_flag;
int active_workers;
struct subgoal_frame *subgoal_frame[THREADS_FIRST_LEVEL_BUCKETS];
#endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
}* sg_ent_ptr;
#define SgEnt_lock(X) ((X)->lock)
#define SgEnt_code(X) ((X)->code_of_subgoal)
#define SgEnt_tab_ent(X) (((X)->code_of_subgoal)->u.Otapl.te)
#define SgEnt_arity(X) (((X)->code_of_subgoal)->u.Otapl.s)
#define SgEnt_hash_chain(X) ((X)->hash_chain)
#define SgEnt_answer_trie(X) ((X)->answer_trie)
#define SgEnt_first_answer(X) ((X)->first_answer)
#define SgEnt_last_answer(X) ((X)->last_answer)
#define SgEnt_mode_directed(X) ((X)->mode_directed_array)
#define SgEnt_invalid_chain(X) ((X)->invalid_chain)
#define SgEnt_try_answer(X) ((X)->try_answer)
#define SgEnt_previous(X) ((X)->previous)
#define SgEnt_gen_top_or_fr(X) ((X)->top_or_frame_on_generator_branch)
#define SgEnt_gen_worker(X) ((X)->generator_worker)
#define SgEnt_sg_ent_state(X) ((X)->state_flag)
#define SgEnt_active_workers(X) ((X)->active_workers)
#define SgEnt_sg_fr(X,I) ((X)->subgoal_frame[I])
/****************************
** subgoal_frame **
****************************/
typedef struct subgoal_frame {
#ifdef THREADS
#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
struct subgoal_entry *subgoal_entry;
#endif /* THREADS_FULL_SHARING || THREADS_CONSUMER_SHARING */
#ifdef THREADS_FULL_SHARING
struct answer_trie_node *batched_last_answer;
struct answer_ref_node *batched_cached_answers;
#endif /* THREADS_FULL_SHARING */
#else
struct subgoal_entry subgoal_entry;
#endif /* THREADS */
subgoal_state_flag state_flag;
choiceptr generator_choice_point;
struct subgoal_frame *next; struct subgoal_frame *next;
} *sg_fr_ptr; } *sg_fr_ptr;
#define SgFr_lock(X) ((X)->lock) /* subgoal_entry fields */
#define SgFr_gen_worker(X) ((X)->generator_worker) #ifdef THREADS
#define SgFr_gen_top_or_fr(X) ((X)->top_or_frame_on_generator_branch) #define SUBGOAL_ENTRY(X) SgFr_subgoal_entry(X)->
#define SgFr_code(X) ((X)->code_of_subgoal) #else
#define SgFr_tab_ent(X) (((X)->code_of_subgoal)->u.Otapl.te) #define SUBGOAL_ENTRY(X) (X)->subgoal_entry.
#define SgFr_arity(X) (((X)->code_of_subgoal)->u.Otapl.s) #endif /* THREADS */
#define SgFr_state(X) ((X)->state_flag) #define SgFr_lock(X) (SUBGOAL_ENTRY(X) lock)
#define SgFr_gen_cp(X) ((X)->generator_choice_point) #define SgFr_code(X) (SUBGOAL_ENTRY(X) code_of_subgoal)
#define SgFr_hash_chain(X) ((X)->hash_chain) #define SgFr_tab_ent(X) ((SUBGOAL_ENTRY(X) code_of_subgoal)->u.Otapl.te)
#define SgFr_answer_trie(X) ((X)->answer_trie) #define SgFr_arity(X) ((SUBGOAL_ENTRY(X) code_of_subgoal)->u.Otapl.s)
#define SgFr_first_answer(X) ((X)->first_answer) #define SgFr_hash_chain(X) (SUBGOAL_ENTRY(X) hash_chain)
#define SgFr_last_answer(X) ((X)->last_answer) #define SgFr_answer_trie(X) (SUBGOAL_ENTRY(X) answer_trie)
#define SgFr_mode_directed(X) ((X)->mode_directed_array) #define SgFr_first_answer(X) (SUBGOAL_ENTRY(X) first_answer)
#define SgFr_invalid_chain(X) ((X)->invalid_chain) #define SgFr_last_answer(X) (SUBGOAL_ENTRY(X) last_answer)
#define SgFr_try_answer(X) ((X)->try_answer) #define SgFr_mode_directed(X) (SUBGOAL_ENTRY(X) mode_directed_array)
#define SgFr_previous(X) ((X)->previous) #define SgFr_invalid_chain(X) (SUBGOAL_ENTRY(X) invalid_chain)
#define SgFr_next(X) ((X)->next) #define SgFr_try_answer(X) (SUBGOAL_ENTRY(X) try_answer)
#define SgFr_previous(X) (SUBGOAL_ENTRY(X) previous)
#define SgFr_gen_top_or_fr(X) (SUBGOAL_ENTRY(X) top_or_frame_on_generator_branch)
#define SgFr_gen_worker(X) (SUBGOAL_ENTRY(X) generator_worker)
#define SgFr_sg_ent_state(X) (SUBGOAL_ENTRY(X) state_flag)
#define SgFr_active_workers(X) (SUBGOAL_ENTRY(X) active_workers)
/* subgoal_frame fields */
#define SgFr_subgoal_entry(X) ((X)->subgoal_entry)
#define SgFr_batched_last_answer(X) ((X)->batched_last_answer)
#define SgFr_batched_cached_answers(X) ((X)->batched_cached_answers)
#define SgFr_state(X) ((X)->state_flag)
#define SgFr_gen_cp(X) ((X)->generator_choice_point)
#define SgFr_next(X) ((X)->next)
/************************************************************************************************** /**********************************************************************************************************
SgFr_lock: spin-lock to modify the frame fields. SgFr_lock: spin-lock to modify the frame fields.
SgFr_gen_worker: the id of the worker that had allocated the frame. SgFr_code initial instruction of the subgoal's compiled code.
SgFr_gen_top_or_fr: a pointer to the top or-frame in the generator choice point branch. SgFr_tab_ent a pointer to the corresponding table entry.
When the generator choice point is shared the pointer is updated SgFr_arity the arity of the subgoal.
to its or-frame. It is used to find the direct dependency node for SgFr_hash_chain: a pointer to the first answer_trie_hash struct.
consumer nodes in other workers branches. SgFr_answer_trie: a pointer to the top answer trie node.
SgFr_code initial instruction of the subgoal's compiled code. SgFr_first_answer: a pointer to the leaf answer trie node of the first answer.
SgFr_tab_ent a pointer to the correspondent table entry. SgFr_last_answer: a pointer to the leaf answer trie node of the last answer.
SgFr_arity the arity of the subgoal. SgFr_mode_directed: a pointer to the mode directed array.
SgFr_state: a flag that indicates the subgoal state. SgFr_invalid_chain: a pointer to the first invalid leaf node when using mode directed tabling.
SgFr_gen_cp: a pointer to the correspondent generator choice point. SgFr_try_answer: a pointer to the leaf answer trie node of the last tried answer.
SgFr_hash_chain: a pointer to the first answer_trie_hash struct for the subgoal in hand. It is used when a subgoal was not completed during the previous evaluation.
SgFr_answer_trie: a pointer to the top answer trie node. Not completed subgoals start by trying the answers already found.
It is used to check for/insert new answers. SgFr_previous: a pointer to the previous subgoal frame on the chain.
SgFr_first_answer: a pointer to the bottom answer trie node of the first available answer. SgFr_gen_top_or_fr: a pointer to the top or-frame in the generator choice point branch.
SgFr_last_answer: a pointer to the bottom answer trie node of the last available answer. When the generator choice point is shared the pointer is updated
SgFr_mode_directed: a pointer to the mode directed array. to its or-frame. It is used to find the direct dependency node for
SgFr_invalid_chain: a pointer to the first invalid leaf node when using mode directed tabling. consumer nodes in other workers branches.
SgFr_try_answer: a pointer to the bottom answer trie node of the last tried answer. SgFr_gen_worker: the id of the worker that had allocated the frame.
It is used when a subgoal was not completed during the previous evaluation. SgFr_sg_ent_state: a flag that indicates the subgoal entry state.
Not completed subgoals start by trying the answers already found. SgFr_active_workers: the number of workers evaluating the subgoal.
SgFr_previous: a pointer to the previous subgoal frame on the chain. SgFr_subgoal_entry: a pointer to the corresponding subgoal entry.
SgFr_next: a pointer to the next subgoal frame on the chain. SgFr_batched_last_answer: a pointer to the leaf answer trie node of the last checked answer
when using batched scheduling.
SgFr_batched_cached_answers: a pointer to the chain of answers already inserted in the trie, but not
yet found when using batched scheduling.
SgFr_state: a flag that indicates the subgoal frame state.
SgFr_gen_cp: a pointer to the correspondent generator choice point.
SgFr_next: a pointer to the next subgoal frame on the chain.
**************************************************************************************************/ **********************************************************************************************************/
@ -286,9 +385,9 @@ typedef struct subgoal_frame {
*******************************/ *******************************/
typedef struct dependency_frame { typedef struct dependency_frame {
#if defined(YAPOR) || defined(THREADS) #ifdef YAPOR
lockvar lock; lockvar lock;
#endif /* YAPOR || THREADS */ #endif /* YAPOR */
#ifdef YAPOR #ifdef YAPOR
int leader_dependency_is_on_stack; int leader_dependency_is_on_stack;
struct or_frame *top_or_frame; struct or_frame *top_or_frame;
@ -300,6 +399,9 @@ typedef struct dependency_frame {
choiceptr leader_choice_point; choiceptr leader_choice_point;
choiceptr consumer_choice_point; choiceptr consumer_choice_point;
struct answer_trie_node *last_consumed_answer; struct answer_trie_node *last_consumed_answer;
#ifdef THREADS_CONSUMER_SHARING
int generator_is_external;
#endif /* THREADS_CONSUMER_SHARING */
struct dependency_frame *next; struct dependency_frame *next;
} *dep_fr_ptr; } *dep_fr_ptr;
@ -311,9 +413,10 @@ typedef struct dependency_frame {
#define DepFr_leader_cp(X) ((X)->leader_choice_point) #define DepFr_leader_cp(X) ((X)->leader_choice_point)
#define DepFr_cons_cp(X) ((X)->consumer_choice_point) #define DepFr_cons_cp(X) ((X)->consumer_choice_point)
#define DepFr_last_answer(X) ((X)->last_consumed_answer) #define DepFr_last_answer(X) ((X)->last_consumed_answer)
#define DepFr_external(X) ((X)->generator_is_external)
#define DepFr_next(X) ((X)->next) #define DepFr_next(X) ((X)->next)
/******************************************************************************************************* /*********************************************************************************************************
DepFr_lock: lock variable to modify the frame fields. DepFr_lock: lock variable to modify the frame fields.
DepFr_leader_dep_is_on_stack: the generator choice point for the correspondent consumer choice point DepFr_leader_dep_is_on_stack: the generator choice point for the correspondent consumer choice point
@ -330,9 +433,10 @@ typedef struct dependency_frame {
DepFr_leader_cp: a pointer to the leader choice point. DepFr_leader_cp: a pointer to the leader choice point.
DepFr_cons_cp: a pointer to the correspondent consumer choice point. DepFr_cons_cp: a pointer to the correspondent consumer choice point.
DepFr_last_answer: a pointer to the last consumed answer. DepFr_last_answer: a pointer to the last consumed answer.
DepFr_external: the generator choice point is external to the current thread (FALSE/TRUE).
DepFr_next: a pointer to the next dependency frame on the chain. DepFr_next: a pointer to the next dependency frame on the chain.
*******************************************************************************************************/ *********************************************************************************************************/