aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/nim/simd.nim
diff options
context:
space:
mode:
Diffstat (limited to 'prescheme-nim-local/nim/simd.nim')
-rw-r--r--prescheme-nim-local/nim/simd.nim29
1 files changed, 29 insertions, 0 deletions
diff --git a/prescheme-nim-local/nim/simd.nim b/prescheme-nim-local/nim/simd.nim
new file mode 100644
index 0000000..4c1e93b
--- /dev/null
+++ b/prescheme-nim-local/nim/simd.nim
@@ -0,0 +1,29 @@
+# Trying simd stuff. Compile with:
+#
+# nim --path:contrib/nimsimd/src c simd && ./simd
+# nim --path:contrib/nimsimd/src -c -d:release c simd && ./simd
+
+when defined(gcc) or defined(clang):
+ {.localPassc: "-mavx".}
+
+
+import nimsimd/avx2
+
+echo "TESTING AVX"
+
+# SIMD floating point multiplication
+let
+ a = mm_set1_ps(1.0) # Vector of 4 float32 each with value 1.0
+ b = mm_set1_ps(2.0) # Vector of 4 float32 each with value 2.0
+ c = mm_mul_ps(a, b) # SIMD vector multiplication operator
+
+# Cast the vector to echo as separate float32 values
+echo cast[array[4, float32]](c)
+
+var l1 = [1.0, 2.1, 3.2, 4.3]
+var l2 = [0.0, 1.1, 2.1, 3.3]
+
+var regs1 = mm256_loadu_pd(l1[0].addr)
+var regs2 = mm256_loadu_pd(l2[0].addr)
+var result = mm256_sub_pd(regs1,regs2)
+echo cast[array[4, float64]](result)