aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/openblas.scm
diff options
context:
space:
mode:
Diffstat (limited to 'prescheme-nim-local/openblas.scm')
-rw-r--r--prescheme-nim-local/openblas.scm108
1 files changed, 108 insertions, 0 deletions
diff --git a/prescheme-nim-local/openblas.scm b/prescheme-nim-local/openblas.scm
new file mode 100644
index 0000000..c171906
--- /dev/null
+++ b/prescheme-nim-local/openblas.scm
@@ -0,0 +1,108 @@
+;; openblas+gsl 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-wrapper-type gsl-vector)
+
+(define (gsl-create-vector size) ; gsl_vector_alloc (3);
+ ((external "gsl_vector_alloc" (=> (integer) gsl-vector))
+ size))
+
+(define (gsl-destroy-vector vector)
+ ((external "gsl_vector_free" (=> (gsl-vector) unit ) )
+ vector))
+
+(define (with-vector vector proc)
+ (if (null-pointer? vector)
+ (handle-error "Could not create vector")
+ (let ((result (proc vector)))
+ (gsl-destroy-vector vector)
+ result)))
+
+;; void gsl_vector_set(gsl_vector *v, const size_t i, double x)
+(define (gsl-vector-set! v i x)
+ ((external "gsl_vector_set" (=> (gsl-vector integer float) unit ) )
+ v i x))
+
+;; double gsl_vector_get(const gsl_vector *v, const size_t i)
+(define (gsl-vector-get v i)
+ ((external "gsl_vector_get" (=> (gsl-vector integer) float ) )
+ v i))
+
+;; gcvt (float value, int ndigits, char * buf);
+(define (gcvt v ndigits buf)
+ ((external "gcvt" (=> (float integer (^ char)) unit ) )
+ v ndigits buf))
+
+
+;;(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 ")")))
+
+(define (main)
+ (define out (current-output-port))
+
+ (write-string "Prescheme vector: print vec-a with vector-for-each:\n" out)
+ ; (make-pointer gsl-vector)
+
+ (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)
+ (write-string "OpenBLAS: print vec-a with vector-for-each:\n" out)
+ (with-vector
+ (gsl-create-vector 5)
+ (lambda (one-vec)
+ ;; (gsl-vector-for-each (lambda (i val)
+ ;; gsl-set-vector(one-vec,i,val);
+ ;; )
+ ;; one-vec)
+ (let ((x 1.1))
+ (gsl-vector-set! one-vec 0 (fl* x 0.0))
+ (gsl-vector-set! one-vec 1 (fl* x x))
+ (gsl-vector-set! one-vec 2 (fl* x 2.1))
+ (gsl-vector-set! one-vec 3 4.0)
+ (gsl-vector-set! one-vec 4 5.0)
+ ;; (gsl-vector-set one-vec 5 6.0)
+ )
+ (vector-for-each (lambda (i val)
+ (write-string " vec-b[" out)
+ (write-integer i out)
+ (write-string "] = " out)
+ ;; (write-number (gsl-vector-get one-vec i) out)
+ (let ((target (make-string 20)))
+ ;; (write-integer (gsl-vector-get one-vec i) out)
+ ;; (gcvt (gsl-vector-get one-vec i) target)
+ (gcvt (gsl-vector-get one-vec i) 4 target)
+ (write-string target out)
+ )
+ (write-string ", " out)
+ )
+ %vec-a %len-a)
+ ))
+ (newline out)
+ 0
+)