From ee14ad272e68d9363202d7f668e0b20302827209 Mon Sep 17 00:00:00 2001 From: hachem Date: Mon, 14 Sep 2026 12:20:52 +0200 Subject: feat: simd + testing + formatting --- include/maths/format.h | 4 ++-- include/maths/matrix.h | 10 +++++----- include/maths/simd.h | 22 ++++++++++++++++++++++ include/maths/vector.h | 25 +++++++++++++------------ 4 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 include/maths/simd.h (limited to 'include/maths') diff --git a/include/maths/format.h b/include/maths/format.h index 65c1680..a11e3be 100644 --- a/include/maths/format.h +++ b/include/maths/format.h @@ -4,5 +4,5 @@ #include "maths/complex.h" -char *psi_format_amplitude(struct PsiComplex c, char *out, size_t cap); -char *psi_format_probability(double p, char *out, size_t cap); +char* psi_format_amplitude(struct PsiComplex c, char* out, size_t cap); +char* psi_format_probability(double p, char* out, size_t cap); diff --git a/include/maths/matrix.h b/include/maths/matrix.h index c4e5530..ff996d6 100644 --- a/include/maths/matrix.h +++ b/include/maths/matrix.h @@ -7,22 +7,22 @@ struct PsiMatrix { - struct PsiComplex *data; + struct PsiComplex* data; size_t rows; size_t cols; }; struct PsiMatrix psi_new_matrix(size_t rows, size_t cols); -struct PsiMatrix psi_new_matrix_from(const struct PsiComplex *data, size_t rows, size_t cols); +struct PsiMatrix psi_new_matrix_from(const struct PsiComplex* data, size_t rows, size_t cols); struct PsiMatrix psi_identity_matrix(size_t size); struct PsiMatrix psi_clone_matrix(struct PsiMatrix m); -void psi_free_matrix(struct PsiMatrix *m); +void psi_free_matrix(struct PsiMatrix* m); -#define psi_matrix(rows, cols, ...) \ +#define psi_matrix(rows, cols, ...) \ psi_new_matrix_from((struct PsiComplex[]){ __VA_ARGS__ }, rows, cols) struct PsiComplex psi_get_matrix(struct PsiMatrix m, size_t row, size_t col); -void psi_set_matrix(struct PsiMatrix *m, size_t row, size_t col, struct PsiComplex value); +void psi_set_matrix(struct PsiMatrix* m, size_t row, size_t col, struct PsiComplex value); struct PsiMatrix psi_dot_matrix(struct PsiMatrix a, struct PsiMatrix b); struct PsiMatrix psi_kronecker_matrix(struct PsiMatrix a, struct PsiMatrix b); diff --git a/include/maths/simd.h b/include/maths/simd.h new file mode 100644 index 0000000..38d0171 --- /dev/null +++ b/include/maths/simd.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "maths/complex.h" + +enum PsiSimdCapability +{ + PSI_SIMD_NONE, + PSI_SIMD_AVX2, + PSI_SIMD_AVX512, + PSI_SIMD_NEON, +}; + +enum PsiSimdCapability psi_detect_simd(void); +const char* psi_simd_name(enum PsiSimdCapability cap); + +void psi_apply_single_qubit_gate_simd(struct PsiComplex* state, const struct PsiComplex gate[2][2], + size_t target, size_t num_qubits); +void psi_apply_single_qubit_gate_simd_parallel(struct PsiComplex* state, + const struct PsiComplex gate[2][2], size_t target, + size_t num_qubits); diff --git a/include/maths/vector.h b/include/maths/vector.h index d452ef1..0136715 100644 --- a/include/maths/vector.h +++ b/include/maths/vector.h @@ -12,27 +12,28 @@ enum PsiVectorKind struct PsiVector { - struct PsiComplex *data; + struct PsiComplex* data; size_t size; enum PsiVectorKind kind; }; struct PsiVector psi_new_vector(size_t size, enum PsiVectorKind kind); -struct PsiVector psi_new_vector_from(const struct PsiComplex *data, size_t size, enum PsiVectorKind kind); +struct PsiVector psi_new_vector_from(const struct PsiComplex* data, size_t size, + enum PsiVectorKind kind); struct PsiVector psi_clone_vector(struct PsiVector v); -void psi_free_vector(struct PsiVector *v); +void psi_free_vector(struct PsiVector* v); -#define psi_row_vector(...) \ - psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \ - sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \ - PSI_ROW_VECTOR) -#define psi_column_vector(...) \ - psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \ - sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \ - PSI_COLUMN_VECTOR) +#define psi_row_vector(...) \ + psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \ + sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \ + PSI_ROW_VECTOR) +#define psi_column_vector(...) \ + psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \ + sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \ + PSI_COLUMN_VECTOR) struct PsiComplex psi_get_vector(struct PsiVector v, size_t index); -void psi_set_vector(struct PsiVector *v, size_t index, struct PsiComplex value); +void psi_set_vector(struct PsiVector* v, size_t index, struct PsiComplex value); struct PsiComplex psi_dot_vector(struct PsiVector a, struct PsiVector b); struct PsiComplex psi_norm_vector(struct PsiVector v); -- cgit v1.3