From b4535e55b51d24f0e019836605287aacd3d9105d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 11 Sep 2026 13:59:48 +0800 Subject: [PATCH] =?UTF-8?q?benchmark:=20matmul/quicksort=20=E6=94=B9?= =?UTF-8?q?=E7=94=A8=20compact=20=E5=BD=A2=E5=BC=8F=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20=5Fcompact=20=E5=86=97=E4=BD=99=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit matmul/quicksort 的 kv 实现从散 key map([int64]·float64)改为单个 compact XValue([N,N]float64 / [N]int64,storetype=ARRAYND,元素连续),用 A[i,j] 索引 取代 A·*idx;删除重复的 matmul_compact / quicksort_compact 目录。 Co-Authored-By: Claude Opus 4.8 --- benchmark/cases/matmul/matmul.kv | 27 +++----- .../cases/matmul_compact/matmul_compact.c | 32 --------- .../cases/matmul_compact/matmul_compact.kv | 60 ---------------- .../cases/matmul_compact/matmul_compact.py | 23 ------- .../cases/matmul_compact/matmul_compact.rs | 29 -------- benchmark/cases/quicksort/quicksort.kv | 55 ++++++++------- .../quicksort_compact/quicksort_compact.c | 44 ------------ .../quicksort_compact/quicksort_compact.kv | 69 ------------------- .../quicksort_compact/quicksort_compact.py | 32 --------- .../quicksort_compact/quicksort_compact.rs | 35 ---------- 10 files changed, 40 insertions(+), 366 deletions(-) delete mode 100644 benchmark/cases/matmul_compact/matmul_compact.c delete mode 100644 benchmark/cases/matmul_compact/matmul_compact.kv delete mode 100644 benchmark/cases/matmul_compact/matmul_compact.py delete mode 100644 benchmark/cases/matmul_compact/matmul_compact.rs delete mode 100644 benchmark/cases/quicksort_compact/quicksort_compact.c delete mode 100644 benchmark/cases/quicksort_compact/quicksort_compact.kv delete mode 100644 benchmark/cases/quicksort_compact/quicksort_compact.py delete mode 100644 benchmark/cases/quicksort_compact/quicksort_compact.rs diff --git a/benchmark/cases/matmul/matmul.kv b/benchmark/cases/matmul/matmul.kv index 25af78d4..b53785a8 100644 --- a/benchmark/cases/matmul/matmul.kv +++ b/benchmark/cases/matmul/matmul.kv @@ -1,31 +1,30 @@ -// matrix multiplication benchmark — 稠密方阵乘(浮点运算 + 三重循环) -// A/B 元素取 0.25 倍数(二进制精确),C 校验和 × 1e6 恒为精确整数、跨语言逐字节一致 +// matrix multiplication benchmark(compact 形式)— 同 matmul 算法,矩阵落**单个 compact XValue** +// (`[N,N]float64`,storetype=ARRAYND,元素连续打包),而非散 key 的 `[int64]·float64` map。 +// 对比点:同一算法的两种 kv 物理形态——map 每次元素访问一次 KV 往返,compact 一次 xv·at/set。 // 方阵阶 N 由 __SCALE__ 占位(O(N^3),勿改逻辑) // 期望输出(N=6 时): -// matmul: check = 82750000 +// matmul_compact: check = 82750000 rwfunc test() -> () { __SCALE__ -> n - A:[int64]·float64 = {} - B:[int64]·float64 = {} + A:[__SCALE__,__SCALE__]float64 = [] + B:[__SCALE__,__SCALE__]float64 = [] 0 -> i while (i < n) { 0 -> j while (j < n) { - i × n -> base - base + j -> idx i + j -> ta ta % 4 -> qa float64(qa) -> qaf qaf × 0.25 -> pa pa + 0.25 -> av - av -> A·*idx + av -> A[i, j] i × 2 -> i2 i2 + j -> tb tb % 4 -> qb float64(qb) -> qbf qbf × 0.25 -> pb pb + 0.25 -> bv - bv -> B·*idx + bv -> B[i, j] j + 1 -> j } i + 1 -> i @@ -39,12 +38,8 @@ rwfunc test() -> () { 0.0 -> acc 0 -> k while (k < n) { - i × n -> ba - ba + k -> ia - kv·get(A, ia) -> av - k × n -> bb - bb + j -> ib - kv·get(B, ib) -> bv + A[i, k] -> av + B[k, j] -> bv av × bv -> pr acc + pr -> acc k + 1 -> k @@ -57,7 +52,7 @@ rwfunc test() -> () { t1 = time·now() checksum × 1000000.0 -> scaled int64(scaled) -> out - println("matmul: check =", out) + println("matmul_compact: check =", out) delta = time·sub(t1, t0) ns = time/duration·as_nanos(delta) println("__bench_ns:", ns) diff --git a/benchmark/cases/matmul_compact/matmul_compact.c b/benchmark/cases/matmul_compact/matmul_compact.c deleted file mode 100644 index fbb65411..00000000 --- a/benchmark/cases/matmul_compact/matmul_compact.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include - -int main(void) { - int n = atoi(getenv("BENCH_SCALE")); - double A[n * n], B[n * n]; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - int idx = i * n + j; - A[idx] = (double)((i + j) % 4) * 0.25 + 0.25; - B[idx] = (double)((i * 2 + j) % 4) * 0.25 + 0.25; - } - } - struct timespec t0, t1; - clock_gettime(CLOCK_MONOTONIC, &t0); - double checksum = 0.0; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - double acc = 0.0; - for (int k = 0; k < n; k++) - acc += A[i * n + k] * B[k * n + j]; - checksum += acc; - } - } - clock_gettime(CLOCK_MONOTONIC, &t1); - long ns = (t1.tv_sec - t0.tv_sec) * 1000000000L + (t1.tv_nsec - t0.tv_nsec); - long out = (long)(checksum * 1000000.0); - printf("matmul_compact: check = %ld\n", out); - printf("__bench_ns: %ld\n", ns); - return 0; -} diff --git a/benchmark/cases/matmul_compact/matmul_compact.kv b/benchmark/cases/matmul_compact/matmul_compact.kv deleted file mode 100644 index b53785a8..00000000 --- a/benchmark/cases/matmul_compact/matmul_compact.kv +++ /dev/null @@ -1,60 +0,0 @@ -// matrix multiplication benchmark(compact 形式)— 同 matmul 算法,矩阵落**单个 compact XValue** -// (`[N,N]float64`,storetype=ARRAYND,元素连续打包),而非散 key 的 `[int64]·float64` map。 -// 对比点:同一算法的两种 kv 物理形态——map 每次元素访问一次 KV 往返,compact 一次 xv·at/set。 -// 方阵阶 N 由 __SCALE__ 占位(O(N^3),勿改逻辑) -// 期望输出(N=6 时): -// matmul_compact: check = 82750000 -rwfunc test() -> () { - __SCALE__ -> n - A:[__SCALE__,__SCALE__]float64 = [] - B:[__SCALE__,__SCALE__]float64 = [] - 0 -> i - while (i < n) { - 0 -> j - while (j < n) { - i + j -> ta - ta % 4 -> qa - float64(qa) -> qaf - qaf × 0.25 -> pa - pa + 0.25 -> av - av -> A[i, j] - i × 2 -> i2 - i2 + j -> tb - tb % 4 -> qb - float64(qb) -> qbf - qbf × 0.25 -> pb - pb + 0.25 -> bv - bv -> B[i, j] - j + 1 -> j - } - i + 1 -> i - } - t0 = time·now() - 0.0 -> checksum - 0 -> i - while (i < n) { - 0 -> j - while (j < n) { - 0.0 -> acc - 0 -> k - while (k < n) { - A[i, k] -> av - B[k, j] -> bv - av × bv -> pr - acc + pr -> acc - k + 1 -> k - } - checksum + acc -> checksum - j + 1 -> j - } - i + 1 -> i - } - t1 = time·now() - checksum × 1000000.0 -> scaled - int64(scaled) -> out - println("matmul_compact: check =", out) - delta = time·sub(t1, t0) - ns = time/duration·as_nanos(delta) - println("__bench_ns:", ns) - println("__bench_input: N=__SCALE__") -} diff --git a/benchmark/cases/matmul_compact/matmul_compact.py b/benchmark/cases/matmul_compact/matmul_compact.py deleted file mode 100644 index 67c9d1d9..00000000 --- a/benchmark/cases/matmul_compact/matmul_compact.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import time - -n = int(os.environ["BENCH_SCALE"]) -A = [0.0] * (n * n) -B = [0.0] * (n * n) -for i in range(n): - for j in range(n): - idx = i * n + j - A[idx] = float((i + j) % 4) * 0.25 + 0.25 - B[idx] = float((i * 2 + j) % 4) * 0.25 + 0.25 -t0 = time.perf_counter_ns() -checksum = 0.0 -for i in range(n): - for j in range(n): - acc = 0.0 - for k in range(n): - acc += A[i * n + k] * B[k * n + j] - checksum += acc -t1 = time.perf_counter_ns() -out = int(checksum * 1000000.0) -print("matmul_compact: check =", out) -print("__bench_ns:", t1 - t0) diff --git a/benchmark/cases/matmul_compact/matmul_compact.rs b/benchmark/cases/matmul_compact/matmul_compact.rs deleted file mode 100644 index c4c45d1a..00000000 --- a/benchmark/cases/matmul_compact/matmul_compact.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::time::Instant; - -fn main() { - let n: usize = std::env::var("BENCH_SCALE").unwrap().parse().unwrap(); - let mut a = vec![0.0f64; n * n]; - let mut b = vec![0.0f64; n * n]; - for i in 0..n { - for j in 0..n { - let idx = i * n + j; - a[idx] = ((i + j) % 4) as f64 * 0.25 + 0.25; - b[idx] = ((i * 2 + j) % 4) as f64 * 0.25 + 0.25; - } - } - let t0 = Instant::now(); - let mut checksum = 0.0f64; - for i in 0..n { - for j in 0..n { - let mut acc = 0.0f64; - for k in 0..n { - acc += a[i * n + k] * b[k * n + j]; - } - checksum += acc; - } - } - let ns = t0.elapsed().as_nanos(); - let out = (checksum * 1000000.0) as i64; - println!("matmul_compact: check = {}", out); - println!("__bench_ns: {}", ns); -} diff --git a/benchmark/cases/quicksort/quicksort.kv b/benchmark/cases/quicksort/quicksort.kv index 971ba537..2b7649d7 100644 --- a/benchmark/cases/quicksort/quicksort.kv +++ b/benchmark/cases/quicksort/quicksort.kv @@ -1,10 +1,12 @@ -// quicksort benchmark — 迭代 Lomuto 分区就地排序(数组访问 + 显式栈递归) +// quicksort benchmark(compact 形式)— 同 quicksort 算法,待排数组与显式栈都落**单个 compact +// XValue**(`[N]int64`,storetype=ARRAYND),而非散 key 的 `[int64]·int64` map。 +// 对比点:同一算法的两种 kv 物理形态。 // 数据由 LCG 确定生成,规模 N 由 __SCALE__ 占位,run.py 按扫描点替换(勿改逻辑) // 期望输出(N=64 时): -// qsort: a0 = 1 amid = 52 alast = 99 +// qsort_compact: a0 = 1 amid = 52 alast = 99 rwfunc test() -> () { __SCALE__ -> n - arr:[int64]·int64 = {} + arr:[__SCALE__]int64 = [] 1 -> seed 0 -> i while (i < n) { @@ -12,53 +14,54 @@ rwfunc test() -> () { s1 + 12345 -> s2 s2 % 2147483648 -> seed seed % 100 -> v - v -> arr·*i + v -> arr[i] i + 1 -> i } t0 = time·now() - st_lo:[int64]·int64 = {} - st_hi:[int64]·int64 = {} + // 显式栈也用 compact:与待排数组一样落单个 ARRAYND XValue,全程只在 compact 数组里直接交换。 + st_lo:[__SCALE__]int64 = [] + st_hi:[__SCALE__]int64 = [] 0 -> top - 0 -> st_lo·*top - n - 1 -> st_hi·*top + 0 -> st_lo[top] + n - 1 -> st_hi[top] top + 1 -> top while (top > 0) { top - 1 -> top - kv·get(st_lo, top) -> lo - kv·get(st_hi, top) -> hi + st_lo[top] -> lo + st_hi[top] -> hi if (lo < hi) { - kv·get(arr, hi) -> pivot + arr[hi] -> pivot lo - 1 -> ii lo -> jj while (jj < hi) { - kv·get(arr, jj) -> aj + arr[jj] -> aj if (aj <= pivot) { ii + 1 -> ii - kv·get(arr, ii) -> ai - aj -> arr·*ii - ai -> arr·*jj + arr[ii] -> ai + aj -> arr[ii] + ai -> arr[jj] } jj + 1 -> jj } ii + 1 -> pp - kv·get(arr, pp) -> app - pivot -> arr·*pp - app -> arr·*hi - lo -> st_lo·*top - pp - 1 -> st_hi·*top + arr[pp] -> app + pivot -> arr[pp] + app -> arr[hi] + lo -> st_lo[top] + pp - 1 -> st_hi[top] top + 1 -> top - pp + 1 -> st_lo·*top - hi -> st_hi·*top + pp + 1 -> st_lo[top] + hi -> st_hi[top] top + 1 -> top } } t1 = time·now() n ÷ 2 -> mid n - 1 -> last - kv·get(arr, 0) -> a0 - kv·get(arr, mid) -> am - kv·get(arr, last) -> al - println("qsort: a0 =", a0, "amid =", am, "alast =", al) + arr[0] -> a0 + arr[mid] -> am + arr[last] -> al + println("qsort_compact: a0 =", a0, "amid =", am, "alast =", al) delta = time·sub(t1, t0) ns = time/duration·as_nanos(delta) println("__bench_ns:", ns) diff --git a/benchmark/cases/quicksort_compact/quicksort_compact.c b/benchmark/cases/quicksort_compact/quicksort_compact.c deleted file mode 100644 index e0e8ea18..00000000 --- a/benchmark/cases/quicksort_compact/quicksort_compact.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include - -static void swap(long *a, long i, long j) { - long t = a[i]; - a[i] = a[j]; - a[j] = t; -} - -static void qsort_r(long *a, long lo, long hi) { - if (lo < hi) { - long pivot = a[hi]; - long i = lo - 1; - for (long j = lo; j < hi; j++) { - if (a[j] <= pivot) { - i++; - swap(a, i, j); - } - } - swap(a, i + 1, hi); - long p = i + 1; - qsort_r(a, lo, p - 1); - qsort_r(a, p + 1, hi); - } -} - -int main(void) { - long n = atol(getenv("BENCH_SCALE")); - long arr[n]; - long seed = 1; - for (long i = 0; i < n; i++) { - seed = (seed * 1103515245 + 12345) % 2147483648; - arr[i] = seed % 100; - } - struct timespec t0, t1; - clock_gettime(CLOCK_MONOTONIC, &t0); - qsort_r(arr, 0, n - 1); - clock_gettime(CLOCK_MONOTONIC, &t1); - long ns = (t1.tv_sec - t0.tv_sec) * 1000000000L + (t1.tv_nsec - t0.tv_nsec); - printf("qsort_compact: a0 = %ld amid = %ld alast = %ld\n", arr[0], arr[n / 2], arr[n - 1]); - printf("__bench_ns: %ld\n", ns); - return 0; -} diff --git a/benchmark/cases/quicksort_compact/quicksort_compact.kv b/benchmark/cases/quicksort_compact/quicksort_compact.kv deleted file mode 100644 index 2b7649d7..00000000 --- a/benchmark/cases/quicksort_compact/quicksort_compact.kv +++ /dev/null @@ -1,69 +0,0 @@ -// quicksort benchmark(compact 形式)— 同 quicksort 算法,待排数组与显式栈都落**单个 compact -// XValue**(`[N]int64`,storetype=ARRAYND),而非散 key 的 `[int64]·int64` map。 -// 对比点:同一算法的两种 kv 物理形态。 -// 数据由 LCG 确定生成,规模 N 由 __SCALE__ 占位,run.py 按扫描点替换(勿改逻辑) -// 期望输出(N=64 时): -// qsort_compact: a0 = 1 amid = 52 alast = 99 -rwfunc test() -> () { - __SCALE__ -> n - arr:[__SCALE__]int64 = [] - 1 -> seed - 0 -> i - while (i < n) { - seed × 1103515245 -> s1 - s1 + 12345 -> s2 - s2 % 2147483648 -> seed - seed % 100 -> v - v -> arr[i] - i + 1 -> i - } - t0 = time·now() - // 显式栈也用 compact:与待排数组一样落单个 ARRAYND XValue,全程只在 compact 数组里直接交换。 - st_lo:[__SCALE__]int64 = [] - st_hi:[__SCALE__]int64 = [] - 0 -> top - 0 -> st_lo[top] - n - 1 -> st_hi[top] - top + 1 -> top - while (top > 0) { - top - 1 -> top - st_lo[top] -> lo - st_hi[top] -> hi - if (lo < hi) { - arr[hi] -> pivot - lo - 1 -> ii - lo -> jj - while (jj < hi) { - arr[jj] -> aj - if (aj <= pivot) { - ii + 1 -> ii - arr[ii] -> ai - aj -> arr[ii] - ai -> arr[jj] - } - jj + 1 -> jj - } - ii + 1 -> pp - arr[pp] -> app - pivot -> arr[pp] - app -> arr[hi] - lo -> st_lo[top] - pp - 1 -> st_hi[top] - top + 1 -> top - pp + 1 -> st_lo[top] - hi -> st_hi[top] - top + 1 -> top - } - } - t1 = time·now() - n ÷ 2 -> mid - n - 1 -> last - arr[0] -> a0 - arr[mid] -> am - arr[last] -> al - println("qsort_compact: a0 =", a0, "amid =", am, "alast =", al) - delta = time·sub(t1, t0) - ns = time/duration·as_nanos(delta) - println("__bench_ns:", ns) - println("__bench_input: N=__SCALE__,seed=1") -} diff --git a/benchmark/cases/quicksort_compact/quicksort_compact.py b/benchmark/cases/quicksort_compact/quicksort_compact.py deleted file mode 100644 index 401dc266..00000000 --- a/benchmark/cases/quicksort_compact/quicksort_compact.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import time -import sys - -sys.setrecursionlimit(10000) - - -def qsort(a, lo, hi): - if lo < hi: - pivot = a[hi] - i = lo - 1 - for j in range(lo, hi): - if a[j] <= pivot: - i += 1 - a[i], a[j] = a[j], a[i] - a[i + 1], a[hi] = a[hi], a[i + 1] - p = i + 1 - qsort(a, lo, p - 1) - qsort(a, p + 1, hi) - - -n = int(os.environ["BENCH_SCALE"]) -arr = [] -seed = 1 -for i in range(n): - seed = (seed * 1103515245 + 12345) % 2147483648 - arr.append(seed % 100) -t0 = time.perf_counter_ns() -qsort(arr, 0, n - 1) -t1 = time.perf_counter_ns() -print("qsort_compact: a0 =", arr[0], "amid =", arr[n // 2], "alast =", arr[n - 1]) -print("__bench_ns:", t1 - t0) diff --git a/benchmark/cases/quicksort_compact/quicksort_compact.rs b/benchmark/cases/quicksort_compact/quicksort_compact.rs deleted file mode 100644 index 917293a9..00000000 --- a/benchmark/cases/quicksort_compact/quicksort_compact.rs +++ /dev/null @@ -1,35 +0,0 @@ -use std::time::Instant; - -fn qsort(a: &mut [i64], lo: i64, hi: i64) { - if lo < hi { - let pivot = a[hi as usize]; - let mut i = lo - 1; - let mut j = lo; - while j < hi { - if a[j as usize] <= pivot { - i += 1; - a.swap(i as usize, j as usize); - } - j += 1; - } - a.swap((i + 1) as usize, hi as usize); - let p = i + 1; - qsort(a, lo, p - 1); - qsort(a, p + 1, hi); - } -} - -fn main() { - let n: i64 = std::env::var("BENCH_SCALE").unwrap().parse().unwrap(); - let mut arr: Vec = Vec::new(); - let mut seed: i64 = 1; - for _ in 0..n { - seed = (seed * 1103515245 + 12345) % 2147483648; - arr.push(seed % 100); - } - let t0 = Instant::now(); - qsort(&mut arr, 0, n - 1); - let ns = t0.elapsed().as_nanos(); - println!("qsort_compact: a0 = {} amid = {} alast = {}", arr[0], arr[(n / 2) as usize], arr[(n - 1) as usize]); - println!("__bench_ns: {}", ns); -}