diff options
| author | hachem <im@hachem.wtf> | 2026-09-20 18:37:48 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-20 18:37:48 +0200 |
| commit | a136c80d978841d317a6ad3930b9e608fdba1586 (patch) | |
| tree | 7dde0e0372f60125bd7cb5f851f22efb01be703b /tester | |
| parent | e1f5c41c35fe26fddf5163ec06f78efd61ad35f4 (diff) | |
Diffstat (limited to 'tester')
| -rw-r--r-- | tester/main.c | 4 | ||||
| -rw-r--r-- | tester/tests.h | 1 | ||||
| -rw-r--r-- | tester/threading.c | 53 |
3 files changed, 57 insertions, 1 deletions
diff --git a/tester/main.c b/tester/main.c index a17e8f5..85f572d 100644 --- a/tester/main.c +++ b/tester/main.c @@ -16,7 +16,7 @@ int main(int argc, char** argv) { if (has_arg(argc, argv, "help") || has_arg(argc, argv, "--help") || has_arg(argc, argv, "-h")) { - printf("Usage: tester [clifford|non-clifford|custom|kernels|simd|noise|all]\n"); + printf("Usage: tester [clifford|non-clifford|custom|kernels|simd|noise|threading|all]\n"); return 0; } @@ -36,6 +36,8 @@ int main(int argc, char** argv) run_simd_tests(); if (all || has_arg(argc, argv, "noise")) run_noise_tests(); + if (all || has_arg(argc, argv, "threading")) + run_threading_tests(); return psi_test_summary(); } diff --git a/tester/tests.h b/tester/tests.h index d5262aa..abd5de0 100644 --- a/tester/tests.h +++ b/tester/tests.h @@ -20,3 +20,4 @@ void run_kernel_tests(void); void run_simd_tests(void); void run_noise_tests(void); void run_custom_tests(void); +void run_threading_tests(void); diff --git a/tester/threading.c b/tester/threading.c new file mode 100644 index 0000000..78f788a --- /dev/null +++ b/tester/threading.c @@ -0,0 +1,53 @@ +#include <stdio.h> + +#include "tests.h" + +static void build_wide(struct PsiQuantumCircuit* c) +{ + for (size_t i = 0; i < 8; i++) + psi_apply_h(c, i); + for (size_t i = 0; i + 1 < 8; i++) + psi_apply_cnot(c, i, i + 1); + psi_apply_rx(c, 3, 0.7); + psi_apply_t(c, 5); + psi_apply_cz(c, 2, 6); +} + +void run_threading_tests(void) +{ + psi_test_section("Threading (parallel runtimes)"); + + printf(" threads: %zu\n", psi_thread_count()); + + struct PsiQuantumCircuit base = psi_new_quantum_circuit(8); + build_wide(&base); + struct PsiVector reference = + psi_clone_vector(*psi_compute_circuit_with(&base, PSI_RUNTIME_BASIC)); + + enum PsiRuntime runtimes[] = { + PSI_RUNTIME_BASIC_MT, + PSI_RUNTIME_BATCHED_MT, + PSI_RUNTIME_SIMD_MT, + PSI_RUNTIME_STRUCTURE_AWARE_MT, + }; + const char* names[] = { + "BASIC_MT matches BASIC (8 qubits)", + "BATCHED_MT matches BASIC (8 qubits)", + "SIMD_MT matches BASIC (8 qubits)", + "STRUCTURE_AWARE_MT matches BASIC (8 qubits)", + }; + + for (size_t i = 0; i < sizeof runtimes / sizeof runtimes[0]; i++) + { + struct PsiQuantumCircuit c = psi_new_quantum_circuit(8); + build_wide(&c); + const struct PsiVector* state = psi_compute_circuit_with(&c, runtimes[i]); + bool ok = state->size == reference.size && + psi_amps_match(state->data, reference.data, reference.size); + psi_test_check(ok, names[i]); + psi_free_quantum_circuit(&c); + } + + psi_free_vector(&reference); + psi_free_quantum_circuit(&base); +} |
