/************************************************************************* * * * Extension for YAP Prolog * * * * Copyright G.S.Oliveira, A.F.Silva and Universidade Estadual de Maringá * * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: jit_configpreds.c * * comments: JIT Compiler Configuration predicates * * * * Last rev: 2013-10-18 * *************************************************************************/ #include "jit_predicates.hh" #include // Enable any (passed by argument) execution mode static Int p_execution_mode( USES_REGS1 ); // Enable 'just interpreted' mode. static Int p_interpreted_mode( USES_REGS1 ); // Enable 'smart jit' mode. static Int p_smartjit_mode( USES_REGS1 ); // Enable 'continuous compilation' mode. static Int p_continuouscompilation_mode( USES_REGS1 ); // Enable 'just compiled' mode. static Int p_justcompiled_mode( USES_REGS1 ); // Enable one (passed by argument) of all available frequency types: counter or time. Frequency bound is default. // Just for 'smart jit' or 'continuous compilation' mode static Int p_frequencyty1( USES_REGS1 ); // Enable one (1st argument) of all available frequency types: counter and time. Frequency bound is 2nd argument // Just for 'smart jit' or 'continuous compilation' mode static Int p_frequencyty2( USES_REGS1 ); // Enable frequency bound // Just for 'smart jit' or 'continuous compilation' mode static Int p_frequency_bound( USES_REGS1 ); // Enable value for starting profiling // Just for 'smart jit' or 'continuous compilation' mode static Int p_profiling_start_point( USES_REGS1 ); // Choose type of clause that can be main on traces // Just for 'smart jit' or 'continuous compilation' mode static Int p_main_clause_ty( USES_REGS1 ); // Choose amount of compilation threads // Just for 'smart jit' or 'continuous compilation' mode static Int p_compilation_threads( USES_REGS1 ); // Enable recompilation // Just for 'smart jit' or 'continuous compilation' mode static Int p_enable_recompilation( USES_REGS1 ); // Disable recompilation // Just for 'smart jit' or 'continuous compilation' mode static Int p_disable_recompilation( USES_REGS1 ); // Just code interpretation. Don't compile // Just for 'smart jit' or 'continuous compilation' mode static Int p_only_profiled_interpreter( USES_REGS1 ); // Disable 'p_only_profiled_interpreter' // Just for 'smart jit' or 'continuous compilation' mode static Int p_noonly_profiled_interpreter( USES_REGS1 ); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-function-declaration" static Int p_execution_mode( USES_REGS1 ) { enumExecModes mode; // valid values for ARG1 are 'integer' and 'atom' Term t = Deref(ARG1); if (IsIntTerm(t)) { // ARG1 is integer Int v = IntOfTerm(t); if (v < 0 || v > 3) { // value passed by argument is out of known range (valid values are: 0 -- interpreted; 1 -- smart jit; 2 -- continuous compilation; 3 -- just compiled) Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } // storing mode mode = (enumExecModes)v; } else if (IsAtomTerm(t)) { // ARG1 is atom int i = 0, j = 0; char *tmp; // gets string from atom and stores it on 'str' char *str = (char*)malloc(YAP_AtomNameLength(AtomOfTerm(t))*sizeof(char)); strcpy(str, AtomName(AtomOfTerm(t))); // Makes upper characters of 'str' (for comparison) UPPER_ENTRY(str); // Detecting mode according to 'str' if (strcmp(str, "INTERPRETED") == 0) mode = JUST_INTERPRETED; else if (strcmp(str, "SMARTJIT") == 0) mode = SMART_JIT; else if (strcmp(str, "CONTINUOUSCOMPILATION") == 0) mode = CONTINUOUS_COMPILATION; else if (strcmp(str, "JUSTCOMPILED") == 0) mode = JUST_COMPILED; else { // value passed by argument is out of known range Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } } else { // ARG1 is not an integer or atom Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"Execution mode"); return FALSE; } // setting execution mode ExpEnv.config_struc.execution_mode = mode; /* setting execution mode parameters */ switch (mode) { case JUST_INTERPRETED: { if (Yap_ExecutionMode == INTERPRETED) { // execution mode only can be 'JUST_INTERPRETED' if 'Yap_ExecutionMode == INTERPRETED' (passing -J0 on command line) // 'JUST_INTERPRETED' does not use these parameters ExpEnv.config_struc.frequency_type = NO_FREQ; ExpEnv.config_struc.frequency_bound = 0.0; ExpEnv.config_struc.profiling_startp = 0.0; ExpEnv.config_struc.mainclause_ty = UNUSED; ExpEnv.config_struc.compilation_threads = 0; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to INTERPRETED!!\n"); #endif } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"INTERPRETED"); return FALSE; } } break; case SMART_JIT: { if (Yap_ExecutionMode == MIXED_MODE) { // execution mode only can be 'SMART_JIT' if 'Yap_ExecutionMode == MIXED_MODE' (passing -J1 on command line) ExpEnv.config_struc.frequency_type = COUNTER; ExpEnv.config_struc.frequency_bound = 1024.0; ExpEnv.config_struc.profiling_startp = 0.72; ExpEnv.config_struc.mainclause_ty = HOT_AND_CALLEE; ExpEnv.config_struc.compilation_threads = 0; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to SMART JIT!!\n"); #endif } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"SMART JIT"); return FALSE; } } break; case CONTINUOUS_COMPILATION: { if (Yap_ExecutionMode == MIXED_MODE) { // execution mode only can be 'CONTINUOUS_COMPILATION' if 'Yap_ExecutionMode == MIXED_MODE' (passing -J1 on command line) ExpEnv.config_struc.frequency_type = COUNTER; ExpEnv.config_struc.frequency_bound = 1024.0; ExpEnv.config_struc.profiling_startp = 0.72; ExpEnv.config_struc.mainclause_ty = HOT_AND_CALLEE; ExpEnv.config_struc.compilation_threads = ExpEnv.config_struc.ncores-1; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to CONTINUOUS COMPILATION!!\n"); #endif } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"CONTINUOUS COMPILATION"); return FALSE; } } break; case JUST_COMPILED: { if (Yap_ExecutionMode == COMPILED) { // execution mode only can be 'JUST_COMPILED' if 'Yap_ExecutionMode == COMPILED' (passing -J2 on command line) // 'JUST_COMPILED' does not use these parameters ExpEnv.config_struc.frequency_type = NO_FREQ; ExpEnv.config_struc.frequency_bound = 0.0; ExpEnv.config_struc.profiling_startp = 0.0; ExpEnv.config_struc.mainclause_ty = UNUSED; ExpEnv.config_struc.compilation_threads = 0; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to JUST COMPILED!!\n"); #endif } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"JUST COMPILED"); return FALSE; } } break; } /***/ return TRUE; } static Int p_interpreted_mode( USES_REGS1 ) { // Same as 'execution_mode(0)' or 'execution_mode(interpreted)' if (Yap_ExecutionMode == INTERPRETED) { // execution mode only can be 'JUST_INTERPRETED' if 'Yap_ExecutionMode == INTERPRETED' (passing -J0 on command line) ExpEnv.config_struc.execution_mode = JUST_INTERPRETED; // setting mode ExpEnv.config_struc.frequency_type = NO_FREQ; // does not use frequency type ExpEnv.config_struc.frequency_bound = 0.0; // does not use frequency bound ExpEnv.config_struc.profiling_startp = 0.0; // does not use profiling startp ExpEnv.config_struc.mainclause_ty = UNUSED; // does not use mainclause ty ExpEnv.config_struc.compilation_threads = 0; // does not use compilation threads #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to INTERPRETED!!\n"); #endif return TRUE; } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"INTERPRETED"); return FALSE; } } static Int p_smartjit_mode( USES_REGS1 ) { // Same as 'execution_mode(1)' or 'execution_mode(smartjit)' if (Yap_ExecutionMode == MIXED_MODE) { // execution mode only can be 'SMART_JIT' if 'Yap_ExecutionMode == MIXED_MODE' (passing -J1 on command line) ExpEnv.config_struc.execution_mode = SMART_JIT; // setting mode ExpEnv.config_struc.frequency_type = COUNTER; // default value ExpEnv.config_struc.frequency_bound = 1024.0; // default value ExpEnv.config_struc.profiling_startp = 0.72; // default value ExpEnv.config_struc.mainclause_ty = HOT_AND_CALLEE; // default value /* does not use compilation threads */ ExpEnv.config_struc.compilation_threads = 0; ExpEnv.config_struc.threaded_compiler_threads = NULL; ExpEnv.config_struc.posthreads = NULL; /***/ #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to SMART JIT!!\n"); if (ExpEnv.debug_struc.pprint_intermediate.print_to_file) strcpy(((char*)ExpEnv.debug_struc.pprint_intermediate.file_name), "trace"); #endif return TRUE; } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"SMART JIT"); return FALSE; } } static Int p_continuouscompilation_mode( USES_REGS1 ) { // Same as 'execution_mode(2)' or 'execution_mode(continuouscompilation)' if (Yap_ExecutionMode == MIXED_MODE) { // execution mode only can be 'CONTINUOUS_COMPILATION' if 'Yap_ExecutionMode == MIXED_MODE' (passing -J1 on command line) ExpEnv.config_struc.execution_mode = CONTINUOUS_COMPILATION; // setting mode ExpEnv.config_struc.frequency_type = COUNTER; // default value ExpEnv.config_struc.frequency_bound = 1024.0; // default value ExpEnv.config_struc.profiling_startp = 0.72; // default value ExpEnv.config_struc.mainclause_ty = HOT_AND_CALLEE; // default value ExpEnv.config_struc.compilation_threads = ExpEnv.config_struc.ncores-1; // default value for this mode /* initializing structures which will handle compilation threads */ { if (ExpEnv.config_struc.threaded_compiler_threads) free(ExpEnv.config_struc.threaded_compiler_threads); if (ExpEnv.config_struc.posthreads) free(ExpEnv.config_struc.posthreads); ExpEnv.config_struc.threaded_compiler_threads = (pthread_t*)malloc(ExpEnv.config_struc.compilation_threads*sizeof(pthread_t)); ExpEnv.config_struc.posthreads = (CELL*)malloc(ExpEnv.config_struc.compilation_threads*sizeof(CELL)); int i; for (i = 0; i < ExpEnv.config_struc.compilation_threads; i++) ExpEnv.config_struc.posthreads[i] = 0; } /***/ #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to CONTINUOUS COMPILATION!!\n"); if (ExpEnv.debug_struc.pprint_intermediate.print_to_file) strcpy(((char*)ExpEnv.debug_struc.pprint_intermediate.file_name), "trace"); #endif return TRUE; } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"CONTINUOUS COMPILATION"); return FALSE; } } static Int p_justcompiled_mode( USES_REGS1 ) { // Same as 'execution_mode(3)' or 'execution_mode(justcompiled)' if (Yap_ExecutionMode == COMPILED) { // execution mode only can be 'JUST_COMPILED' if 'Yap_ExecutionMode == COMPILED' (passing -J2 on command line) ExpEnv.config_struc.execution_mode = JUST_COMPILED; // setting mode ExpEnv.config_struc.frequency_type = NO_FREQ; // does not use frequency type ExpEnv.config_struc.frequency_bound = 0.0; // does not use frequency bound ExpEnv.config_struc.profiling_startp = 0.0; // does not use profiling startp ExpEnv.config_struc.mainclause_ty = UNUSED; // does not use mainclause ty ExpEnv.config_struc.compilation_threads = 0; // does not use compilation threads #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," YAP Execution mode changed to JUST COMPILED!!\n"); if (ExpEnv.debug_struc.pprint_intermediate.print_to_file) strcpy(((char*)ExpEnv.debug_struc.pprint_intermediate.file_name), "clause"); #endif return TRUE; } else { // 'Yap_ExecutionMode' is not compatible Yap_NilError(INCOMPATIBLE_CODEMODE_WARNING,"JUST COMPILED"); return FALSE; } } static Int p_frequencyty1( USES_REGS1 ) { // this predicate works only 'SMART_JIT' and 'CONTINUOUS_COMPILATION' modes if (ExpEnv.config_struc.execution_mode == SMART_JIT || ExpEnv.config_struc.execution_mode == CONTINUOUS_COMPILATION) { Term t = Deref(ARG1); // valid value for ARG1 is just 'atom' if (IsAtomTerm(t)) { // ARG1 is atom int i = 0, j = 0; char *tmp; // gets string from atom and stores it on 'str' char *str = (char*)malloc(YAP_AtomNameLength(AtomOfTerm(t))*sizeof(char)); strcpy(str, AtomName(AtomOfTerm(t))); // Makes upper characters of 'str' (for comparison) UPPER_ENTRY(str); // Detectng frequency type according to 'str' if (strcmp(str, "COUNTER") == 0 || strcmp(str, "COUNT") == 0) { ExpEnv.config_struc.frequency_type = COUNTER; // setting frequency type to 'counter' ExpEnv.config_struc.frequency_bound = 1024.0; // if 'counter', frequency bound is '1024.0' return TRUE; } else if (strcmp(str, "TIME") == 0 || strcmp(str, "TIMING") == 0) { ExpEnv.config_struc.frequency_type = TIME; // setting frequency type to 'time' ExpEnv.config_struc.frequency_bound = 0.02; // if 'time', frequency bound is '0.02' return TRUE; } else { // value passed by argument is out of known range Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } } else { // ARG1 is not an atom Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"Frequency type"); return FALSE; } } else { // current execution mode differs of 'SMART_JIT' and 'CONTINUOUS_COMPILATION' Yap_NilError(INCOMPATIBLEMODE_WARNING,""); return FALSE; } } static Int p_frequencyty2( USES_REGS1 ) { // this predicate works only 'SMART_JIT' and 'CONTINUOUS_COMPILATION' modes if (ExpEnv.config_struc.execution_mode == SMART_JIT || ExpEnv.config_struc.execution_mode == CONTINUOUS_COMPILATION) { Term t = Deref(ARG1); // valid value for ARG1 is just 'atom' if (IsAtomTerm(t)) { Term u = Deref(ARG2); // valid values for ARG2 are 'integer' and 'float' if (IsIntTerm(u) || IsFloatTerm(u)) { // ARG1 is atom and ARG2 is integer or float int i = 0, j = 0; char *tmp; // getting string from atom and stores it on 'str' char *str = (char*)malloc(YAP_AtomNameLength(AtomOfTerm(t))*sizeof(char)); strcpy(str, AtomName(AtomOfTerm(t))); // Making upper characters of 'str' (for comparison) UPPER_ENTRY(str); // getting ARG2 value Float v; if (IsIntTerm(u)) v = (Float)IntOfTerm(u); if (IsFloatTerm(u)) v = FloatOfTerm(u); // setting 'frequency type' and 'frequency bound' if 'COUNTER' if (strcmp(str, "COUNTER") == 0 || strcmp(str, "COUNT") == 0) { if (v < 20.0) { // Very low frequency bound to apply on 'COUNTER' fprintf(stderr,"%.2f is a very low value for the active frequency type. Reconsider its value...\n", v); return FALSE; } ExpEnv.config_struc.frequency_type = COUNTER; ExpEnv.config_struc.frequency_bound = roundf(v); return TRUE; } // setting 'frequency type' and 'frequency bound' if 'TIME' else if (strcmp(str, "TIME") == 0 || strcmp(str, "TIMING") == 0) { if (v <= 0.0 || v > 0.49) { // Very low frequency bound to apply on 'COUNTER' fprintf(stderr,"%.2f is an invalid or a very high value for the active frequency type. Reconsider its value...\n", v); return FALSE; } ExpEnv.config_struc.frequency_type = TIME; ExpEnv.config_struc.frequency_bound = v; return TRUE; } else { // value passed by argument (ARG1) is out of known range Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } } else { // ARG2 is not an 'integer' or 'float' Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"frequencyty/2 (2nd arg)"); return FALSE; } } else { // ARG1 is not an atom Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"frequencyty/2 (1st arg)"); return FALSE; } } else { // current execution mode differs of 'SMART_JIT' and 'CONTINUOUS_COMPILATION' Yap_NilError(INCOMPATIBLEMODE_WARNING,""); return FALSE; } } static Int p_frequency_bound( USES_REGS1 ) { // this predicate works only 'SMART_JIT' and 'CONTINUOUS_COMPILATION' modes if (ExpEnv.config_struc.execution_mode == SMART_JIT || ExpEnv.config_struc.execution_mode == CONTINUOUS_COMPILATION) { Term t = Deref(ARG1); // valid values for ARG1 are 'integer' and 'float' if (IsIntTerm(t) || IsFloatTerm(t)) { // ARG1 is integer or float // getting ARG1 value Float v; if (IsIntTerm(t)) v = (Float)IntOfTerm(t); if (IsFloatTerm(t)) v = FloatOfTerm(t); // setting 'frequency bound' if 'frequency type' is 'COUNTER' if (ExpEnv.config_struc.frequency_type == COUNTER) { if (v < 20.0) { fprintf(stderr,"%.2f is a very low value for the active frequency type. Reconsider its value...\n", v); return FALSE; } ExpEnv.config_struc.frequency_bound = roundf(v); return TRUE; } // setting 'frequency bound' if 'frequency type' is 'TIME' else { if (v <= 0.0 || v > 0.49) { fprintf(stderr,"%.2f is an invalid or a very high value for the active frequency type. Reconsider its value...\n", v); return FALSE; } ExpEnv.config_struc.frequency_bound = v; return TRUE; } } else { // ARG1 is not an 'integer' or 'float' Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"frequency_bound/1 (1st arg)"); return FALSE; } } else { // current execution mode differs of 'SMART_JIT' and 'CONTINUOUS_COMPILATION' Yap_NilError(INCOMPATIBLEMODE_WARNING,""); return FALSE; } } static Int p_profiling_start_point( USES_REGS1 ) { // this predicate works only 'SMART_JIT' and 'CONTINUOUS_COMPILATION' modes if (ExpEnv.config_struc.execution_mode == SMART_JIT || ExpEnv.config_struc.execution_mode == CONTINUOUS_COMPILATION) { Term t = Deref(ARG1); Float v; // valid value for ARG1 is just 'float' if (IsFloatTerm(t)) { v = FloatOfTerm(t); if (v < 0.0 || v >= 1.0) { // value passed by argument is out of known range Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } ExpEnv.config_struc.profiling_startp = v; return TRUE; } else { // ARG1 is not float Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"profiling_start_point/1 (1st arg)"); return FALSE; } } else { // current execution mode differs of 'SMART_JIT' and 'CONTINUOUS_COMPILATION' Yap_NilError(INCOMPATIBLEMODE_WARNING,""); return FALSE; } } static Int p_main_clause_ty( USES_REGS1 ) { // this predicate works only 'SMART_JIT' and 'CONTINUOUS_COMPILATION' modes if (ExpEnv.config_struc.execution_mode == SMART_JIT || ExpEnv.config_struc.execution_mode == CONTINUOUS_COMPILATION) { Term t = Deref(ARG1); // valid values for ARG1 are 'integer' and 'atom' if (IsIntTerm(t)) { // ARG1 is integer Int v; v = IntOfTerm(t); if (v < 0 || v > 3) { // value passed by argument is out of known range Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) { switch(v) { case 0: fprintf(stderr," Type of main clause was changed to JUST HOT!!\n"); break; case 1: fprintf(stderr," Type of main clause was changed to HOT AND CALLEE!!\n"); break; case 2: fprintf(stderr," Type of main clause was changed to HOT AND GREATER!!\n"); break; case 3: fprintf(stderr," Type of main clause was changed to HOT AND FEWER!!\n"); break; } } #endif // setting 'mainclause_ty' -- I should de add '1' because the first enum of 'enumMainClauseType' is 'UNUSED', used just for control ExpEnv.config_struc.mainclause_ty = (enumMainClauseType)(v+1); return TRUE; } else if (IsAtomTerm(t)) { // ARG1 is atom enumMainClauseType v; int i = 0, j = 0; char *tmp; // gets string from atom and stores it on 'str' char *str = (char*)malloc(YAP_AtomNameLength(AtomOfTerm(t))*sizeof(char)); strcpy(str, AtomName(AtomOfTerm(t))); // Makes upper characters of 'str' (for comparison) UPPER_ENTRY(str); // Detecting mainclause type chosen by user according to 'str' if (strcmp(str, "JUSTHOT") == 0) { v = JUST_HOT; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," Type of main clause was changed to JUST HOT!!\n"); #endif } else if (strcmp(str, "HOTANDCALLEE") == 0) { v = HOT_AND_CALLEE; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," Type of main clause was changed to HOT AND CALLEE!!\n"); #endif } else if (strcmp(str, "HOTANDGREATER") == 0) { v = HOT_AND_GREATER; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," Type of main clause was changed to HOT AND GREATER!!\n"); #endif } else if (strcmp(str, "HOTANDFEWER") == 0) { v = HOT_AND_FEWER; #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," Type of main clause was changed to HOT AND FEWER!!\n"); #endif } else { // value passed by argument is out of known range Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } ExpEnv.config_struc.mainclause_ty = v; return TRUE; } else { // ARG1 is not an integer or atom Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"main_clause_ty/1 (1st arg)"); return FALSE; } } else { // current execution mode differs of 'SMART_JIT' and 'CONTINUOUS_COMPILATION' Yap_NilError(INCOMPATIBLEMODE_WARNING,""); return FALSE; } } static Int p_compilation_threads( USES_REGS1 ) { // this predicate works only 'CONTINUOUS_COMPILATION' mode if (ExpEnv.config_struc.execution_mode == SMART_JIT || ExpEnv.config_struc.execution_mode == CONTINUOUS_COMPILATION) { Term t = Deref(ARG1); Int v; // valid value for ARG1 is 'integer' (because it defines number of threads) if (IsIntTerm(t)) { // ARG1 is integer v = IntOfTerm(t); if (v < 1) { // ERROR: number of threads is negative!! Yap_Error(OUT_OF_KNOWNRANGE_ERROR,t,""); return FALSE; } if (v >= ExpEnv.config_struc.ncores) { // WARNING: number of threads is not ideal -- real parallelism won't occur!! fprintf(stderr, " It was detected %ld cores on this computer, therefore it is ideally to set just %ld compilation thread. Reconsider its value...\n", ExpEnv.config_struc.ncores, ExpEnv.config_struc.ncores-1); } // setting compilation threads ExpEnv.config_struc.compilation_threads = v; /* initializing structures which will handle compilation threads */ { if (ExpEnv.config_struc.threaded_compiler_threads) free(ExpEnv.config_struc.threaded_compiler_threads); if (ExpEnv.config_struc.posthreads) free(ExpEnv.config_struc.posthreads); ExpEnv.config_struc.threaded_compiler_threads = (pthread_t*)malloc(v*sizeof(pthread_t)); ExpEnv.config_struc.posthreads = (CELL*)malloc(v*sizeof(CELL)); int i; for (i = 0; i < v; i++) ExpEnv.config_struc.posthreads[i] = 0; } /***/ #if YAP_DBG_PREDS if (ExpEnv.debug_struc.act_predicate_msgs.success_msgs) fprintf(stderr," Type of main clause was changed to HOT AND FEWER!!\n"); #endif return TRUE; } else { // ARG1 is not an integer Yap_NilError(INVALID_PARAMETER_TYPE_ERROR,"compilation_threads/1 (1st arg)"); return FALSE; } } else { // current execution mode differs of 'CONTINUOUS_COMPILATION' Yap_NilError(INCOMPATIBLEMODE_WARNING,""); return FALSE; } } static Int p_enable_recompilation( USES_REGS1 ) { ExpEnv.config_struc.torecompile = 1; return TRUE; } static Int p_disable_recompilation( USES_REGS1 ) { ExpEnv.config_struc.torecompile = 0; return TRUE; } static Int p_only_profiled_interpreter( USES_REGS1 ) { ExpEnv.config_struc.useonlypi = 1; return TRUE; } static Int p_noonly_profiled_interpreter( USES_REGS1 ) { ExpEnv.config_struc.useonlypi = 0; return TRUE; } #pragma GCC diagnostic pop void Yap_InitJitConfigPreds(void) { Yap_InitCPred("execution_mode", 1, p_execution_mode, SafePredFlag); Yap_InitCPred("interpreted_mode", 0, p_interpreted_mode, SafePredFlag); Yap_InitCPred("smartjit_mode", 0, p_smartjit_mode, SafePredFlag); Yap_InitCPred("continuouscompilation_mode", 0, p_continuouscompilation_mode, SafePredFlag); Yap_InitCPred("justcompiled_mode", 0, p_justcompiled_mode, SafePredFlag); Yap_InitCPred("frequencyty1", 1, p_frequencyty1, SafePredFlag); Yap_InitCPred("frequencyty2", 2, p_frequencyty2, SafePredFlag); Yap_InitCPred("frequency_bound", 1, p_frequency_bound, SafePredFlag); Yap_InitCPred("profiling_start_point", 1, p_profiling_start_point, SafePredFlag); Yap_InitCPred("main_clause_ty", 1, p_main_clause_ty, SafePredFlag); Yap_InitCPred("compilation_threads", 1, p_compilation_threads, SafePredFlag); Yap_InitCPred("enable_recompilation", 0, p_enable_recompilation, SafePredFlag); Yap_InitCPred("disable_recompilation", 0, p_disable_recompilation, SafePredFlag); Yap_InitCPred("only_profiled_interpreter", 0, p_only_profiled_interpreter, SafePredFlag); Yap_InitCPred("noonly_profiled_interpreter", 0, p_noonly_profiled_interpreter, SafePredFlag); }