Initial project import

This commit is contained in:
Agila Forge Importer committed 2026-07-13 15:20:32 +00:00
commit 23f2d29e32
11957 files changed
+1754577

No files matched your search

+123
View File
@@ -0,0 +1,123 @@
### Environment
- CPU: AMD Ryzen 9 9950X3D (16C / 32T)
- RAM: 64 GiB
- OS: EndeavourOS (Linux, kernel 6.18.6-arch1-1)
- Compiler:
- amd64: v -prod -cc gcc -gc none
- i386: v -keepc -cc i686-linux-gnu-gcc -prod -m32 -arch i386 -cflags -mmmx -w -gc none
### How to run
```bash
# amd64
v -prod -cc gcc -gc none run benchmarks/atomic_benchmark.v
# i386
v -keepc -cc i686-linux-gnu-gcc -prod -m32 -arch i386 -cflags -mmmx -w -gc none run benchmarks/atomic_benchmark.v
```
### Results (ns/op, 100M iterations)
```
AMD64
=====
Command:
v -prod -cc gcc -gc none run atomic_benchmark.v
u64 store std: 3.788 ns/op (total: 378.783ms, iters: 100000000)
u64 store custom: 3.773 ns/op (total: 377.301ms, iters: 100000000)
u64 load std: 1.078 ns/op (total: 107.848ms, iters: 100000000)
u64 load custom: 1.084 ns/op (total: 108.381ms, iters: 100000000)
u64 add std: 3.601 ns/op (total: 360.067ms, iters: 100000000)
u64 add custom: 3.782 ns/op (total: 378.213ms, iters: 100000000)
u64 swap std (exchange): 3.805 ns/op (total: 380.520ms, iters: 100000000)
u64 swap custom: 3.835 ns/op (total: 383.493ms, iters: 100000000)
u64 cas std: 3.824 ns/op (total: 382.391ms, iters: 100000000)
u64 cas custom: 3.783 ns/op (total: 378.264ms, iters: 100000000)
u32 store std: 3.783 ns/op (total: 378.346ms, iters: 100000000)
u32 store custom: 3.822 ns/op (total: 382.245ms, iters: 100000000)
u32 load std: 1.084 ns/op (total: 108.427ms, iters: 100000000)
u32 load custom: 1.085 ns/op (total: 108.536ms, iters: 100000000)
u32 add std: 3.663 ns/op (total: 366.308ms, iters: 100000000)
u32 add custom: 3.857 ns/op (total: 385.722ms, iters: 100000000)
u32 swap std (exchange): 3.855 ns/op (total: 385.503ms, iters: 100000000)
u32 swap custom: 3.859 ns/op (total: 385.892ms, iters: 100000000)
u32 cas std: 3.87 ns/op (total: 387.025ms, iters: 100000000)
u32 cas custom: 3.837 ns/op (total: 383.680ms, iters: 100000000)
i64 store std (via u64): 3.784 ns/op (total: 378.377ms, iters: 100000000)
i64 store custom: 3.79 ns/op (total: 378.993ms, iters: 100000000)
i64 load std (via u64): 0.935 ns/op (total: 93.519ms, iters: 100000000)
i64 load custom: 0.864 ns/op (total: 86.350ms, iters: 100000000)
i64 add std (via u64): 3.608 ns/op (total: 360.752ms, iters: 100000000)
i64 add custom: 3.843 ns/op (total: 384.319ms, iters: 100000000)
i64 swap std (exchange u64): 3.826 ns/op (total: 382.621ms, iters: 100000000)
i64 swap custom: 3.835 ns/op (total: 383.513ms, iters: 100000000)
i64 cas std (via u64): 3.84 ns/op (total: 383.988ms, iters: 100000000)
i64 cas custom: 3.847 ns/op (total: 384.733ms, iters: 100000000)
i32 store std (via u32): 3.84 ns/op (total: 383.983ms, iters: 100000000)
i32 store custom: 3.841 ns/op (total: 384.068ms, iters: 100000000)
i32 load std (via u32): 1.1 ns/op (total: 109.956ms, iters: 100000000)
i32 load custom: 1.1 ns/op (total: 109.978ms, iters: 100000000)
i32 add std (via u32): 3.659 ns/op (total: 365.907ms, iters: 100000000)
i32 add custom: 3.846 ns/op (total: 384.574ms, iters: 100000000)
i32 swap std (exchange u32): 3.848 ns/op (total: 384.830ms, iters: 100000000)
i32 swap custom: 3.836 ns/op (total: 383.562ms, iters: 100000000)
i32 cas std (via u32): 3.837 ns/op (total: 383.690ms, iters: 100000000)
i32 cas custom: 3.815 ns/op (total: 381.453ms, iters: 100000000)
I386
====
Command:
v -keepc -cc i686-linux-gnu-gcc -prod -m32 -arch i386 -cflags -mmmx -w -gc none run benchmarks/atomic_benchmark.v
u64 store std: 9.575 ns/op (total: 957.485ms, iters: 100000000)
u64 store custom: 7.703 ns/op (total: 770.251ms, iters: 100000000)
u64 load std: 1.769 ns/op (total: 176.860ms, iters: 100000000)
u64 load custom: 1.892 ns/op (total: 189.238ms, iters: 100000000)
u64 add std: 5.544 ns/op (total: 554.431ms, iters: 100000000)
u64 add custom: 5.31 ns/op (total: 530.964ms, iters: 100000000)
u64 swap std: 5.32 ns/op (total: 531.988ms, iters: 100000000)
u64 swap custom: 5.242 ns/op (total: 524.175ms, iters: 100000000)
u64 cas std: 4.948 ns/op (total: 494.824ms, iters: 100000000)
u64 cas custom: 5.268 ns/op (total: 526.833ms, iters: 100000000)
u32 store std: 3.896 ns/op (total: 389.574ms, iters: 100000000)
u32 store custom: 4.067 ns/op (total: 406.712ms, iters: 100000000)
u32 load std: 1.132 ns/op (total: 113.242ms, iters: 100000000)
u32 load custom: 1.135 ns/op (total: 113.523ms, iters: 100000000)
u32 add std: 3.951 ns/op (total: 395.090ms, iters: 100000000)
u32 add custom: 4.141 ns/op (total: 414.139ms, iters: 100000000)
u32 swap std: 4.136 ns/op (total: 413.586ms, iters: 100000000)
u32 swap custom: 4.138 ns/op (total: 413.812ms, iters: 100000000)
u32 cas std: 4.136 ns/op (total: 413.644ms, iters: 100000000)
u32 cas custom: 4.705 ns/op (total: 470.505ms, iters: 100000000)
i64 store std: 9.643 ns/op (total: 964.327ms, iters: 100000000)
i64 store custom: 7.373 ns/op (total: 737.327ms, iters: 100000000)
i64 load std: 1.7 ns/op (total: 169.983ms, iters: 100000000)
i64 load custom: 1.824 ns/op (total: 182.396ms, iters: 100000000)
i64 add std: 5.27 ns/op (total: 526.950ms, iters: 100000000)
i64 add custom: 5.268 ns/op (total: 526.833ms, iters: 100000000)
i64 swap std: 4.917 ns/op (total: 491.690ms, iters: 100000000)
i64 swap custom: 5.095 ns/op (total: 509.546ms, iters: 100000000)
i64 cas std: 4.931 ns/op (total: 493.122ms, iters: 100000000)
i64 cas custom: 5.268 ns/op (total: 526.774ms, iters: 100000000)
i32 store std: 4.018 ns/op (total: 401.776ms, iters: 100000000)
i32 store custom: 4.138 ns/op (total: 413.820ms, iters: 100000000)
i32 load std: 1.132 ns/op (total: 113.185ms, iters: 100000000)
i32 load custom: 1.134 ns/op (total: 113.359ms, iters: 100000000)
i32 add std: 3.949 ns/op (total: 394.853ms, iters: 100000000)
i32 add custom: 4.139 ns/op (total: 413.947ms, iters: 100000000)
i32 swap std: 4.135 ns/op (total: 413.485ms, iters: 100000000)
i32 swap custom: 4.136 ns/op (total: 413.623ms, iters: 100000000)
i32 cas std: 4.137 ns/op (total: 413.702ms, iters: 100000000)
i32 cas custom: 4.704 ns/op (total: 470.402ms, iters: 100000000)
```
@@ -0,0 +1,376 @@
module main
import x.atomics
import time
$if windows {
#include "@VEXEROOT/thirdparty/stdatomic/win/atomic.h"
} $else {
#include "@VEXEROOT/thirdparty/stdatomic/nix/atomic.h"
}
fn C.atomic_store_u32(voidptr, u32)
fn C.atomic_load_u32(voidptr) u32
fn C.atomic_fetch_add_u32(voidptr, u32) u32
fn C.atomic_compare_exchange_strong_u32(voidptr, voidptr, u32) bool
fn C.atomic_exchange_u32(voidptr, u32) u32
fn C.atomic_store_u64(voidptr, u64)
fn C.atomic_load_u64(voidptr) u64
fn C.atomic_fetch_add_u64(voidptr, u64) u64
fn C.atomic_compare_exchange_strong_u64(voidptr, voidptr, u64) bool
fn C.atomic_exchange_u64(voidptr, u64) u64
const iterations = 100_000_000
fn keepalive_u64(x u64) {
asm volatile amd64 {
nop
; ; r (x)
}
}
fn keepalive_u32(x u32) {
asm volatile amd64 {
nop
; ; r (x)
}
}
fn keepalive_i64(x i64) {
asm volatile amd64 {
nop
; ; r (x)
}
}
fn keepalive_i32(x i32) {
asm volatile amd64 {
nop
; ; r (x)
}
}
fn bench_u64(name string, f fn (&u64, u64), iters int) {
mut v := u64(0)
for i in 0 .. 100_000 {
f(&v, u64(i))
}
mut sw := time.new_stopwatch()
for i in 0 .. iters {
f(&v, u64(i))
}
elapsed := sw.elapsed()
ns_per_op := f64(elapsed.nanoseconds()) / f64(iters)
keepalive_u64(v)
println('${name:-17s}: ${ns_per_op:6.3f} ns/op (total: ${elapsed:9}, iters: ${iters})')
}
fn bench_u32(name string, f fn (&u32, u32), iters int) {
mut v := u32(0)
for i in 0 .. 100_000 {
f(&v, u32(i))
}
mut sw := time.new_stopwatch()
for i in 0 .. iters {
f(&v, u32(i))
}
elapsed := sw.elapsed()
ns_per_op := f64(elapsed.nanoseconds()) / f64(iters)
keepalive_u32(v)
println('${name:-17s}: ${ns_per_op:6.3f} ns/op (total: ${elapsed:9}, iters: ${iters})')
}
fn bench_i64(name string, f fn (&i64, i64), iters int) {
mut v := i64(0)
for i in 0 .. 100_000 {
f(&v, i64(i))
}
mut sw := time.new_stopwatch()
for i in 0 .. iters {
f(&v, i64(i))
}
elapsed := sw.elapsed()
ns_per_op := f64(elapsed.nanoseconds()) / f64(iters)
keepalive_i64(v)
println('${name:-17s}: ${ns_per_op:6.3f} ns/op (total: ${elapsed:9}, iters: ${iters})')
}
fn bench_i32(name string, f fn (&i32, i32), iters int) {
mut v := i32(0)
for i in 0 .. 100_000 {
f(&v, i32(i))
}
mut sw := time.new_stopwatch()
for i in 0 .. iters {
f(&v, i32(i))
}
elapsed := sw.elapsed()
ns_per_op := f64(elapsed.nanoseconds()) / f64(iters)
keepalive_i32(v)
println('${name:-17s}: ${ns_per_op:6.3f} ns/op (total: ${elapsed:9}, iters: ${iters})')
}
fn std_store_u64(addr &u64, val u64) {
C.atomic_store_u64(voidptr(addr), val)
}
fn custom_store_u64(addr &u64, val u64) {
atomics.store_u64(addr, val)
}
fn std_load_u64(addr &u64, _ u64) {
_ = C.atomic_load_u64(voidptr(addr))
}
fn custom_load_u64(addr &u64, _ u64) {
_ = atomics.load_u64(addr)
}
fn std_add_u64(addr &u64, delta u64) {
_ = C.atomic_fetch_add_u64(voidptr(addr), delta)
}
fn custom_add_u64(addr &u64, delta u64) {
_ = atomics.add_u64(addr, delta)
}
fn std_swap_u64(addr &u64, val u64) {
_ = C.atomic_exchange_u64(voidptr(addr), val)
}
fn custom_swap_u64(addr &u64, val u64) {
_ = atomics.swap_u64(addr, val)
}
fn std_cas_u64(addr &u64, val u64) {
mut expected := u64(0)
_ = C.atomic_compare_exchange_strong_u64(voidptr(addr), voidptr(&expected), val)
}
fn custom_cas_u64(addr &u64, val u64) {
_ = atomics.cas_u64(addr, 0, val)
}
fn std_store_u32(addr &u32, val u32) {
C.atomic_store_u32(voidptr(addr), val)
}
fn custom_store_u32(addr &u32, val u32) {
atomics.store_u32(addr, val)
}
fn std_load_u32(addr &u32, _ u32) {
_ = C.atomic_load_u32(voidptr(addr))
}
fn custom_load_u32(addr &u32, _ u32) {
_ = atomics.load_u32(addr)
}
fn std_add_u32(addr &u32, delta u32) {
_ = C.atomic_fetch_add_u32(voidptr(addr), delta)
}
fn custom_add_u32(addr &u32, delta u32) {
_ = atomics.add_u32(addr, delta)
}
fn std_swap_u32(addr &u32, val u32) {
_ = C.atomic_exchange_u32(voidptr(addr), val)
}
fn custom_swap_u32(addr &u32, val u32) {
_ = atomics.swap_u32(addr, val)
}
fn std_cas_u32(addr &u32, val u32) {
mut expected := u32(0)
_ = C.atomic_compare_exchange_strong_u32(voidptr(addr), voidptr(&expected), val)
}
fn custom_cas_u32(addr &u32, val u32) {
_ = atomics.cas_u32(addr, 0, val)
}
fn std_store_i64(addr &i64, val i64) {
unsafe { C.atomic_store_u64(voidptr(addr), u64(val)) }
}
fn custom_store_i64(addr &i64, val i64) {
atomics.store_i64(addr, val)
}
fn std_load_i64(addr &i64, _ i64) {
unsafe {
_ = C.atomic_load_u64(voidptr(addr))
}
}
fn custom_load_i64(addr &i64, _ i64) {
_ = atomics.load_i64(addr)
}
fn std_add_i64(addr &i64, delta i64) {
unsafe {
_ = C.atomic_fetch_add_u64(voidptr(addr), u64(delta))
}
}
fn custom_add_i64(addr &i64, delta i64) {
_ = atomics.add_i64(addr, delta)
}
fn std_swap_i64(addr &i64, val i64) {
unsafe {
_ = C.atomic_exchange_u64(voidptr(addr), u64(val))
}
}
fn custom_swap_i64(addr &i64, val i64) {
_ = atomics.swap_i64(addr, val)
}
fn std_cas_i64(addr &i64, val i64) {
unsafe {
mut expected := u64(0)
_ = C.atomic_compare_exchange_strong_u64(voidptr(addr), voidptr(&expected), u64(val))
}
}
fn custom_cas_i64(addr &i64, val i64) {
_ = atomics.cas_i64(addr, 0, val)
}
fn std_store_i32(addr &i32, val i32) {
unsafe { C.atomic_store_u32(voidptr(addr), u32(val)) }
}
fn custom_store_i32(addr &i32, val i32) {
atomics.store_i32(addr, val)
}
fn std_load_i32(addr &i32, _ i32) {
unsafe {
_ = C.atomic_load_u32(voidptr(addr))
}
}
fn custom_load_i32(addr &i32, _ i32) {
_ = atomics.load_i32(addr)
}
fn std_add_i32(addr &i32, delta i32) {
unsafe {
_ = C.atomic_fetch_add_u32(voidptr(addr), u32(delta))
}
}
fn custom_add_i32(addr &i32, delta i32) {
_ = atomics.add_i32(addr, delta)
}
fn std_swap_i32(addr &i32, val i32) {
unsafe {
_ = C.atomic_exchange_u32(voidptr(addr), u32(val))
}
}
fn custom_swap_i32(addr &i32, val i32) {
_ = atomics.swap_i32(addr, val)
}
fn std_cas_i32(addr &i32, val i32) {
unsafe {
mut expected := u32(0)
_ = C.atomic_compare_exchange_strong_u32(voidptr(addr), voidptr(&expected), u32(val))
}
}
fn custom_cas_i32(addr &i32, val i32) {
_ = atomics.cas_i32(addr, 0, val)
}
fn main() {
bench_u64('u64 store std', std_store_u64, iterations)
bench_u64('u64 store custom', custom_store_u64, iterations)
bench_u64('u64 load std', std_load_u64, iterations)
bench_u64('u64 load custom', custom_load_u64, iterations)
bench_u64('u64 add std', std_add_u64, iterations)
bench_u64('u64 add custom', custom_add_u64, iterations)
bench_u64('u64 swap std', std_swap_u64, iterations)
bench_u64('u64 swap custom', custom_swap_u64, iterations)
bench_u64('u64 cas std', std_cas_u64, iterations)
bench_u64('u64 cas custom', custom_cas_u64, iterations)
println('')
bench_u32('u32 store std', std_store_u32, iterations)
bench_u32('u32 store custom', custom_store_u32, iterations)
bench_u32('u32 load std', std_load_u32, iterations)
bench_u32('u32 load custom', custom_load_u32, iterations)
bench_u32('u32 add std', std_add_u32, iterations)
bench_u32('u32 add custom', custom_add_u32, iterations)
bench_u32('u32 swap std', std_swap_u32, iterations)
bench_u32('u32 swap custom', custom_swap_u32, iterations)
bench_u32('u32 cas std', std_cas_u32, iterations)
bench_u32('u32 cas custom', custom_cas_u32, iterations)
println('')
bench_i64('i64 store std', std_store_i64, iterations)
bench_i64('i64 store custom', custom_store_i64, iterations)
bench_i64('i64 load std', std_load_i64, iterations)
bench_i64('i64 load custom', custom_load_i64, iterations)
bench_i64('i64 add std', std_add_i64, iterations)
bench_i64('i64 add custom', custom_add_i64, iterations)
bench_i64('i64 swap std', std_swap_i64, iterations)
bench_i64('i64 swap custom', custom_swap_i64, iterations)
bench_i64('i64 cas std', std_cas_i64, iterations)
bench_i64('i64 cas custom', custom_cas_i64, iterations)
println('')
bench_i32('i32 store std', std_store_i32, iterations)
bench_i32('i32 store custom', custom_store_i32, iterations)
bench_i32('i32 load std', std_load_i32, iterations)
bench_i32('i32 load custom', custom_load_i32, iterations)
bench_i32('i32 add std', std_add_i32, iterations)
bench_i32('i32 add custom', custom_add_i32, iterations)
bench_i32('i32 swap std', std_swap_i32, iterations)
bench_i32('i32 swap custom', custom_swap_i32, iterations)
bench_i32('i32 cas std', std_cas_i32, iterations)
bench_i32('i32 cas custom', custom_cas_i32, iterations)
}