Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ default_enable_gperftools=no
default_enable_minmax=no
default_enable_cunit=no
default_enable_firstclass_rule=no
default_enable_normal_para=no
default_minimal_state=no
default_cunit_home="/usr/local"

Expand Down Expand Up @@ -145,6 +146,11 @@ AC_ARG_ENABLE([firstclass_rule],
[],
[enable_firstclass_rule="$default_enable_firstclass_rule"])

AC_ARG_ENABLE([normal_para],
[AS_HELP_STRING([--enable-normal-para]
[turn on parallel for normal mode (default no)])],
[],
[enable_normal_para="$default_enable_normal_para"])
# devel
if test "$enable_devel" = "yes"; then
AC_MSG_RESULT([enable devel: yes])
Expand Down Expand Up @@ -248,6 +254,13 @@ else
AC_MSG_RESULT([enable first-class rule: no])
fi

if test "$enable_normal_para" = "yes"; then
AC_MSG_RESULT([enable normal para: yes])
AC_DEFINE([NORMAL_PARA], 1, [enable normal para])
else
AC_MSG_RESULT([enable normal para: no])
fi

AM_CONDITIONAL(ENABLE_JNI, test "$enable_jni" = "yes")
AM_CONDITIONAL(ENABLE_TCMALLOC, test "$enable_tcmalloc" = "yes")
AM_CONDITIONAL(ENABLE_GPERFTOOLS, test "$enable_gperftools" = "yes")
Expand Down
5 changes: 5 additions & 0 deletions lib/state_space.lmn
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
*/
Ret = state_space.react_nd_set(Rule, Graph, RetRule) :- '$callback'('cb_react_ruleset_nd', Rule, Graph, RetRule, Ret).

Ret = state_space.react_nd_set_para(Rule, GraphList, Num, RetRule) :- '$callback'('cb_react_ruleset_nd_para', Rule, GraphList, Num, RetRule, Ret).

Ret = state_space.state_map_init :- '$callback'('cb_state_map_init', Ret).

state_space.state_map_free(Map) :- class(Map, "state_map") |
Expand All @@ -58,6 +60,9 @@
Ret = state_space.state_map_find(Map, {$key[]}, Res) :- class(Map, "state_map") |
'$callback'('cb_state_map_id_find', Map, {$key[]}, Res, Ret).

Ret = state_space.state_map_find_para(Map, MList, Len, RetId) :- class(Map, "state_map") |
'$callback'('cb_state_map_id_find_para', Map, MList, Len, RetId, Ret).

Ret = state_space.state_map_find(Map, $key, Res) :- class(Map, "state_map"), int($key) |
'$callback'('cb_state_map_state_find', Map, $key, Res, Ret).
}.
61 changes: 56 additions & 5 deletions src/env.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,15 @@

#include <climits>

struct Vector *lmn_id_pool;
struct LmnEnv lmn_env;
struct LmnProfiler lmn_prof;
LMN_TLS_TYPE(LmnTLS) lmn_tls;
#ifdef NORMAL_PARA
std::atomic<ProcessID> proc_next_id;
std::vector<std::stack<ProcessID>> lmn_id_pool;
#else
struct Vector *lmn_id_pool;
#endif

//static void env_init(void);

Expand All @@ -59,30 +64,67 @@ LMN_TLS_TYPE(LmnTLS) lmn_tls;
/* LMN_TLS部にpthread_key_tを埋め込む場合は, free関数をdestructorに渡しておく.
*/

#ifdef NORMAL_PARA
static inline void lmn_TLS_init(unsigned int thread_id) {
lmn_tls.thread_num = lmn_env.core_num;
lmn_tls.thread_id = thread_id;
lmn_tls.state_id = 0UL;
}

ProcessID env_gen_next_id() {
if(!(lmn_id_pool[lmn_tls.thread_id].empty())) {
auto ret = lmn_id_pool[lmn_tls.thread_id].top();
lmn_id_pool[lmn_tls.thread_id].pop();
return ret;
} else {
return proc_next_id++;
}
}

void env_return_id(ProcessID n) {

lmn_id_pool[lmn_tls.thread_id].push(n);
}
#else
static inline void lmn_TLS_init(LmnTLS *p, unsigned int thread_id) {
p->thread_num = lmn_env.core_num;
p->thread_id = thread_id;
p->state_id = 0UL;
p->proc_next_id = 1UL;
}
#endif

static inline void lmn_TLS_destroy(LmnTLS *p) { /* nothing now */ }

#ifdef NORMAL_PARA
static inline void lmn_TLS_make(unsigned int thread_id) {
lmn_TLS_init(thread_id);
}

#else

static inline LmnTLS *lmn_TLS_make(unsigned int thread_id) LMN_UNUSED;
static inline LmnTLS *lmn_TLS_make(unsigned int thread_id) {
struct LmnTLS *p = LMN_MALLOC(struct LmnTLS);
lmn_TLS_init(p, thread_id);
return p;
}

#endif
static inline void lmn_TLS_free(LmnTLS *p) LMN_UNUSED;
static inline void lmn_TLS_free(LmnTLS *p) {
lmn_TLS_destroy(p);
LMN_FREE(p);
}

void env_my_TLS_init(unsigned int th_id) {
#if !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD)
#ifdef NORMAL_PARA
if (th_id == LMN_PRIMARY_ID) {
env_set_my_thread_id(th_id);
} else {
lmn_TLS_init(th_id);
}
#elif !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD)
if (th_id == LMN_PRIMARY_ID) {
env_set_my_thread_id(th_id);
} else {
Expand All @@ -93,11 +135,13 @@ void env_my_TLS_init(unsigned int th_id) {
lmn_TLS_set_value(lmn_tls, lmn_TLS_make(th_id));
}
#endif
#ifndef NORMAL_PARA
env_reset_proc_ids();
#endif
}

void env_my_TLS_finalize() {
#if !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD)
#if !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD) || defined(NORMAL_PARA)
env_set_my_thread_id(LMN_PRIMARY_ID); /* resetする */
#elif defined(USE_TLS_PTHREAD_KEY)
if (env_my_thread_id() != LMN_PRIMARY_ID) {
Expand All @@ -109,8 +153,13 @@ void env_my_TLS_finalize() {
void lmn_stream_init() {
// lmn_env.init();

#ifndef NORMAL_PARA
lmn_id_pool = NULL;
#if !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD)
#endif

#ifdef NORMAL_PARA
lmn_TLS_init(LMN_PRIMARY_ID);
#elif !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD)
/* 並列処理無効の場合か, 並列処理有効かつthread local
* storageキーワードが利用可能な場合 */
lmn_TLS_init(&lmn_tls, LMN_PRIMARY_ID);
Expand All @@ -125,7 +174,7 @@ void lmn_stream_init() {
}

void lmn_stream_destroy() {
#if !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD)
#if !defined(ENABLE_PARALLEL) || defined(USE_TLS_KEYWORD) || defined(NORMAL_PARA)
lmn_TLS_destroy(&lmn_tls);
#elif defined(USE_TLS_PTHREAD_KEY)
lmn_TLS_free(lmn_TLS_get_value(lmn_tls));
Expand Down Expand Up @@ -224,4 +273,6 @@ LmnEnv::LmnEnv() {
this->findatom_parallel_mode = FALSE;
this->find_atom_parallel = FALSE;
this->findatom_parallel_inde = FALSE;

this->normal_para = FALSE;
}
Loading