Files
hakmem/core/box/tiny_near_empty_box.h
Moe Charm (CI) 9b0d746407 Phase 3d-B: TLS Cache Merge - Unified g_tls_sll[] structure (+12-18% expected)
Merge separate g_tls_sll_head[] and g_tls_sll_count[] arrays into unified
TinyTLSSLL struct to improve L1D cache locality. Expected performance gain:
+12-18% from reducing cache line splits (2 loads → 1 load per operation).

Changes:
- core/hakmem_tiny.h: Add TinyTLSSLL type (16B aligned, head+count+pad)
- core/hakmem_tiny.c: Replace separate arrays with g_tls_sll[8]
- core/box/tls_sll_box.h: Update Box API (13 sites) for unified access
- Updated 32+ files: All g_tls_sll_head[i] → g_tls_sll[i].head
- Updated 32+ files: All g_tls_sll_count[i] → g_tls_sll[i].count
- core/hakmem_tiny_integrity.h: Unified canary guards
- core/box/integrity_box.c: Simplified canary validation
- Makefile: Added core/box/tiny_sizeclass_hist_box.o to link

Build:  PASS (10K ops sanity test)
Warnings: Only pre-existing LTO type mismatches (unrelated)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 07:32:30 +09:00

68 lines
2.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// tiny_near_empty_box.h - Box: Tiny Near-Empty Slab Advisor (C2/C3)
//
// 目的:
// - Tiny Superslab の free パスで「ほぼ空き slab」を検出する軽量な観測箱。
// - いまは C2/C3 限定で、used/cap から near-empty な slab を検知して
// カウンタを増やすだけSuperSlab/SharedPool の状態は一切変更しない)。
// - Learner から near-empty 統計を見て CAP/キャッシュ/しきい値を調整する足場として使う。
//
// ENV:
// - HAKMEM_TINY_SS_PACK_C23=1
// → C2/C3 の near-empty 検出を有効化既定0: 無効)。
// - HAKMEM_TINY_NEAREMPTY_DUMP=1
// → 終了時に [TINY_NEAR_EMPTY_STATS] を 1 回だけダンプ。
// - HAKMEM_TINY_NEAREMPTY_PCT=P (1-99, default 25)
// → near-empty 判定の使用率しきい値 (%).
#pragma once
#include <stdint.h>
#include "../hakmem_tiny_config.h" // TINY_NUM_CLASSES
#include "../superslab/superslab_types.h" // TinySlabMeta, SuperSlab
#ifdef __cplusplus
extern "C" {
#endif
// Per-class near-empty events観測用カウンタ
extern _Atomic uint64_t g_tiny_near_empty_events[TINY_NUM_CLASSES];
// 現在のしきい値(%を取得1-99
int tiny_near_empty_get_pct(void);
// しきい値(%を更新1-99 範囲外の値は無視)
void tiny_near_empty_set_pct(int pct);
// near-empty 検出free パスから呼ばれるメインエントリ)。
// - C2/C3 限定(現時点では 32B〜128B のホットクラスのみ)。
// - used>0 かつ used/cap <= THRESH_PCT% のとき near-empty とみなして 1 カウント。
// - SuperSlab/SharedPool の state には触らない(観測のみ)。
static inline void tiny_near_empty_on_free(int class_idx,
SuperSlab* ss,
int slab_idx,
TinySlabMeta* meta)
{
(void)ss;
(void)slab_idx;
if (!meta) {
return;
}
extern int tiny_near_empty_enabled(void);
extern void tiny_near_empty_on_free_impl(int class_idx, TinySlabMeta* meta);
if (!tiny_near_empty_enabled()) {
return;
}
tiny_near_empty_on_free_impl(class_idx, meta);
}
// near-empty 統計のスナップショットを取得。
// - events: 出力配列NULL の場合は無視)
// - reset!=0 のとき、読み取り後 0 にリセットする。
void tiny_near_empty_stats_snapshot(uint64_t events[TINY_NUM_CLASSES],
int reset);
#ifdef __cplusplus
}
#endif