JIT 훅

pypyjit 모듈에는 프로그램을 실행하는 동안 PyPy의 JIT가 무엇을 하는지 이해하는 데 도움이 될 만한 여러 훅(hook)이 있습니다:

dont_trace_here(next_instr, is_being_profiled, pycode)
get_jitcell_at_key(next_instr, is_being_profiled, pycode)
get_stats_asmmemmgr()

JIT 백엔드가 현재 사용 중인 원시 메모리(raw memory)를 (total_memory_allocated, memory_in_use) 쌍으로 반환합니다.

residual_call(callable, *args, **keywords)

테스트용입니다. callable(…)을 호출하지만, JIT가 그 호출을 따라가지 못하게 합니다.

set_compile_hook(callable, operations=True)

루프가 컴파일될 때마다 호출될 컴파일 훅을 설정합니다.

이 호출 가능 객체는 pypyjit.JitLoopInfo 객체를 인자로 받아 호출됩니다. 자세한 내용은 해당 객체의 문서를 참조하십시오.

JIT 훅은 재진입이 불가능하다는 점에 유의하십시오. 즉, JIT 훅 내부의 코드 자체가 JIT 컴파일되는 경우 그 코드는 컴파일되지만, 이에 대해서는 JIT 훅이 호출되지 않습니다.

operations=False이면 연산 목록을 사용할 수 없습니다. 훅이 매우 가벼워야 하는 경우에 유용합니다.

set_abort_hook(hook)

어떤 이유로든 트레이싱이 중단될 때마다 호출될 훅(callable)을 설정합니다.

훅은 다음 시그니처로 호출됩니다: hook(jitdriver_name, greenkey, reason, oplist)

reason은 문자열이며, 다른 인자들의 의미는 JitLoopInfo 객체의 속성과 같습니다

set_trace_too_long_hook(hook)

트레이스가 너무 길어서 트레이싱을 중단할 때마다 호출될 훅(호출 가능 객체)을 설정합니다.

이 훅은 다음 시그니처로 호출됩니다: hook(jitdriver_name, greenkey)

enable_debug()

get_stats_snapshot에서 사용할 디버깅 카운터의 기록을 시작합니다

현재 비활성화되어 있습니다.

disable_debug()

get_stats_snapshot용 디버깅 카운터 기록을 중단합니다

현재 비활성화되어 있습니다.

get_stats_snapshot()

특정 시점의 JIT 상태를 가져옵니다. 이 함수는 즉시(eager) 평가된다는 점에 유의하십시오. 속성 접근은 지연(lazy)되지 않으므로 새로운 통계가 필요하면 이 함수를 다시 호출해야 합니다. 더 많은 정보를 얻으려면 enable_debug를 호출하는 것이 좋습니다. JitInfoSnapshot의 인스턴스를 반환합니다.

class JitInfoSnapshot

현재 스냅숏을 나타내는 클래스입니다. 사용할 수 있는 속성은 다음과 같습니다:

  • counters - 내부 JIT 정수 카운터
  • counter_times - 내부 JIT float 카운터로, 특히 트레이싱과 JIT 백엔드에서 소요된 시간을 나타냅니다
  • loop_run_times - 루프가 실행된 횟수를 세는 카운터입니다. enable_debug가 호출된 경우에만 작동합니다.
class JitLoopInfo

컴파일된 루프에 대한 정보를 담고 있는 클래스입니다. 사용할 수 있는 속성은 다음과 같습니다:

  • operations - 요청한 경우 반환되는 연산 목록입니다
  • jitdriver_name - 이 루프와 연관된 jitdriver의 이름
  • greenkey - 루프가 컴파일된 지점을 나타내는 키(예: 코드 위치, is_being_profiled, python jitdriver의 경우 pycode 튜플)
  • loop_no - 루프 일련번호
  • bridge_no - fail descr의 id
  • type - “진입 브리지(entry bridge)”, “루프” 또는 “브리지(bridge)”
  • asmaddr - 어셈블러 코드가 위치한 원시(raw) 메모리상의 주소
  • asmlen - 어셈블러 코드가 연결된 원시 메모리의 길이

JIT 초기화

releaseall()

현재의 모든 기계어 코드 객체를 해제할 준비가 된 것으로 표시합니다. 이 객체들은 다음 GC 때 해제됩니다(단, 현재 어느 스레드의 스택에서 사용 중인 객체는 제외합니다). pypyjit.releaseall(); gc.collect()를 실행하는 것은 JIT를 새로 시작한 PyPy와 대략 비슷한 상태로 강제로 되돌리는 과감한 수단입니다.

set_param(*args, **keywords)

조정 가능한 JIT 매개변수를 설정합니다. 매개변수 이름은 Jit Help에 나열되어 있습니다:

  • set_param(name=value, ...)처럼 키워드 인자로 전달하는 방식
  • 사용자가 제공하는 문자열 형태의 set_param("name=value,name=value")
  • set_param("off"): JIT를 비활성화합니다
  • set_param("default")는 모든 설정을 기본값으로 되돌립니다