aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/simde.scm
diff options
context:
space:
mode:
authorPjotr Prins2025-02-11 02:24:30 -0600
committerPjotr Prins2025-02-11 02:24:30 -0600
commitfd714598394a36d94846a5c2cfa1dc6a7e4bcced (patch)
tree9b89ad45f6e357de32bb0219e7b534053484675d /prescheme-nim-local/simde.scm
parent83d5d1535754016500af6854aab26c1fbdde73d0 (diff)
downloadpresentations-fd714598394a36d94846a5c2cfa1dc6a7e4bcced.tar.gz
Add FOSDEM 2025 talk
Diffstat (limited to 'prescheme-nim-local/simde.scm')
-rw-r--r--prescheme-nim-local/simde.scm97
1 files changed, 97 insertions, 0 deletions
diff --git a/prescheme-nim-local/simde.scm b/prescheme-nim-local/simde.scm
new file mode 100644
index 0000000..06e6fb6
--- /dev/null
+++ b/prescheme-nim-local/simde.scm
@@ -0,0 +1,97 @@
+;; simde example (WIP)
+
+(define %vec-a (vector-unfold (lambda (i)
+ (* i i))
+ 5))
+
+;; take vec-a's length at compile-time
+(define %len-a (vector-length %vec-a))
+
+
+(define foox
+ (external "computefoox" (=> (integer integer) integer)
+ (lambda (x y)
+ (display (+ x y)))))
+
+(define (handle-error message)
+ (define out (current-error-port))
+ (error message))
+
+;;(define-c-generator make-string #t
+;; (lambda (call port indent)
+;; ; calloc is used as a hack to get a zero at the end
+;; (format port "(char *)calloc( 1, 1 + ")
+;; (c-value (call-arg call 0) port)
+;; (format port ")")))
+
+;; gcvt (float value, int ndigits, char * buf);
+(define (gcvt v ndigits buf)
+ ((external "gcvt" (=> (float integer (^ char)) unit ) )
+ v ndigits buf))
+
+(define-wrapper-type m256d)
+
+;; (define (fmaddf a b c)
+;; ((external "simde_mm256_fmadd_pd" (=> ((^ float) (^ float) (^ float)) (^ float) ) )
+;; a b c))
+
+;; simde__m256d evens4 = simde_mm256_loadu_pd(l1);
+(define (simde-loadu ds)
+ ((external "simde_mm256_loadu_pd" (=> ((^ float)) m256d))
+ ds ))
+
+(define (simde-storeu ds avx)
+ ((external "simde_mm256_storeu_pd" (=> ((^ float) m256d) (^ float)))
+ ds avx)
+ ds )
+
+(define (simde-sub-pd ds1 ds2)
+ ((external "simde_mm256_sub_pd" (=> (m256d m256d) m256d))
+ ds1 ds2))
+
+(define (main)
+ (define out (current-output-port))
+
+ (write-string "SIMDE: Print vec-a with vector-for-each:\n" out)
+
+ (vector-for-each (lambda (i val)
+ (write-string " vec-a[" out)
+ (write-integer i out)
+ (write-string "] = " out)
+ (write-integer val out)
+ (write-string ", " out)
+ )
+ %vec-a %len-a)
+ (newline out)
+ (let ((target (make-string 20))
+ (f 1.2)
+ (a (make-vector 10 1.1))
+ (b (make-vector 10 1.1))
+ (c (make-vector 10 1.1))
+ )
+ (gcvt f 4 target)
+ (write-string target out)
+ (newline out)
+ (vector-set! a 0 2.2)
+ (vector-set! a 1 2.2)
+ (vector-set! a 2 4.2)
+ (vector-set! a 3 5.2)
+ (vector-set! b 0 1.1)
+ (vector-set! b 1 2.1)
+ (vector-set! b 2 3.1)
+ (vector-set! b 3 4.1)
+ (let* ((evens (simde-loadu a))
+ (odds (simde-loadu b))
+ (result (simde-storeu a (simde-sub-pd evens odds))))
+ (vector-for-each (lambda (i val)
+ ;; (flonum-set! val i)
+ (gcvt val 4 target)
+ (write-string target out)
+ (newline out)
+ )
+ result 4)
+ )
+ )
+ (newline out)
+ 0
+)