mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	gh-138050: [WIP] JIT - Streamline MAKE_WARM - move coldness check to executor creation (GH-138240)
This commit is contained in:
		
							parent
							
								
									e03d8e4f50
								
							
						
					
					
						commit
						1753ccb432
					
				
					 7 changed files with 15 additions and 13 deletions
				
			
		|  | @ -939,7 +939,7 @@ struct _is { | |||
|     struct _PyExecutorObject *executor_deletion_list_head; | ||||
|     struct _PyExecutorObject *cold_executor; | ||||
|     int executor_deletion_list_remaining_capacity; | ||||
|     size_t trace_run_counter; | ||||
|     size_t executor_creation_counter; | ||||
|     _rare_events rare_events; | ||||
|     PyDict_WatchCallback builtins_dict_watcher; | ||||
| 
 | ||||
|  |  | |||
|  | @ -90,8 +90,9 @@ PyAPI_FUNC(void) _Py_Executors_InvalidateCold(PyInterpreterState *interp); | |||
| #endif | ||||
| 
 | ||||
| // Used as the threshold to trigger executor invalidation when
 | ||||
| // trace_run_counter is greater than this value.
 | ||||
| #define JIT_CLEANUP_THRESHOLD 100000 | ||||
| // executor_creation_counter is greater than this value.
 | ||||
| // This value is arbitrary and was not optimized.
 | ||||
| #define JIT_CLEANUP_THRESHOLD 1000 | ||||
| 
 | ||||
| #define TRACE_STACK_SIZE 5 | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,6 @@ | |||
| #include "pycore_audit.h"         // _PySys_Audit() | ||||
| #include "pycore_backoff.h" | ||||
| #include "pycore_cell.h"          // PyCell_GetRef() | ||||
| #include "pycore_ceval.h" | ||||
| #include "pycore_code.h" | ||||
| #include "pycore_emscripten_signal.h"  // _Py_CHECK_EMSCRIPTEN_SIGNALS | ||||
| #include "pycore_function.h" | ||||
|  | @ -5362,10 +5361,6 @@ dummy_func( | |||
| 
 | ||||
|         tier2 op(_MAKE_WARM, (--)) { | ||||
|             current_executor->vm_data.warm = true; | ||||
|             // It's okay if this ends up going negative.
 | ||||
|             if (--tstate->interp->trace_run_counter == 0) { | ||||
|                 _Py_set_eval_breaker_bit(tstate, _PY_EVAL_JIT_INVALIDATE_COLD_BIT); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         tier2 op(_FATAL_ERROR, (--)) { | ||||
|  |  | |||
|  | @ -1398,7 +1398,7 @@ _Py_HandlePending(PyThreadState *tstate) | |||
|     if ((breaker & _PY_EVAL_JIT_INVALIDATE_COLD_BIT) != 0) { | ||||
|         _Py_unset_eval_breaker_bit(tstate, _PY_EVAL_JIT_INVALIDATE_COLD_BIT); | ||||
|         _Py_Executors_InvalidateCold(tstate->interp); | ||||
|         tstate->interp->trace_run_counter = JIT_CLEANUP_THRESHOLD; | ||||
|         tstate->interp->executor_creation_counter = JIT_CLEANUP_THRESHOLD; | ||||
|     } | ||||
| 
 | ||||
|     /* GIL drop request */ | ||||
|  |  | |||
							
								
								
									
										3
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -7409,9 +7409,6 @@ | |||
| 
 | ||||
|         case _MAKE_WARM: { | ||||
|             current_executor->vm_data.warm = true; | ||||
|             if (--tstate->interp->trace_run_counter == 0) { | ||||
|                 _Py_set_eval_breaker_bit(tstate, _PY_EVAL_JIT_INVALIDATE_COLD_BIT); | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| #include "pycore_interp.h" | ||||
| #include "pycore_backoff.h" | ||||
| #include "pycore_bitutils.h"        // _Py_popcount32() | ||||
| #include "pycore_ceval.h"       // _Py_set_eval_breaker_bit | ||||
| #include "pycore_code.h"            // _Py_GetBaseCodeUnit | ||||
| #include "pycore_function.h"        // _PyFunction_LookupByVersion() | ||||
| #include "pycore_interpframe.h" | ||||
|  | @ -1343,6 +1344,14 @@ uop_optimize( | |||
|         return -1; | ||||
|     } | ||||
|     assert(length <= UOP_MAX_TRACE_LENGTH); | ||||
| 
 | ||||
|     // Check executor coldness
 | ||||
|     PyThreadState *tstate = PyThreadState_Get(); | ||||
|     // It's okay if this ends up going negative.
 | ||||
|     if (--tstate->interp->executor_creation_counter == 0) { | ||||
|         _Py_set_eval_breaker_bit(tstate, _PY_EVAL_JIT_INVALIDATE_COLD_BIT); | ||||
|     } | ||||
| 
 | ||||
|     *exec_ptr = executor; | ||||
|     return 1; | ||||
| } | ||||
|  |  | |||
|  | @ -571,7 +571,7 @@ init_interpreter(PyInterpreterState *interp, | |||
|     interp->executor_list_head = NULL; | ||||
|     interp->executor_deletion_list_head = NULL; | ||||
|     interp->executor_deletion_list_remaining_capacity = 0; | ||||
|     interp->trace_run_counter = JIT_CLEANUP_THRESHOLD; | ||||
|     interp->executor_creation_counter = JIT_CLEANUP_THRESHOLD; | ||||
|     if (interp != &runtime->_main_interpreter) { | ||||
|         /* Fix the self-referential, statically initialized fields. */ | ||||
|         interp->dtoa = (struct _dtoa_state)_dtoa_state_INIT(interp); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 alm
						alm