aboutsummaryrefslogtreecommitdiff

Thinks that tripped me up

Underscores

Using _ for Lisp names.

typedef struct

typedef struct
{
  size_t size;
  size_t stride;
  double * data;
  gsl_block * block;
  int owner;
} gsl_vector;

prescheme generated this syntax for

(define-wrapper-type gsl-vector)
struct gsl_vector {
};

struct gsl_vector *vector_3X;

resulting in

expected 'gsl_vector *' but argument is of type 'struct gsl_vector *'
   82 | void gsl_vector_free (gsl_vector * v);

how to map one to the other? If you take out the struct it works. So, somehow, I need to create an opaque data structure.

(define (gsl-create-vector size) ; gsl_vector_alloc (3);
  ((external "gsl_vector_alloc" (=> (integer) (^ unit)))
   size))

(define (gsl-destroy-vector vector)
  ((external "gsl_vector_free" (=> (address) unit))
   vector))

as unit translate to void that works - but there is no type safety. Well, at least not at the prescheme level.

ps-compiler/prescheme/type.scm make-pointer-type

For now I solved it by having sed edit out the 'struct' from the C code.

Floating point

Initializing with 1.0 (leading zero) works. But 1.1 does not. The c-code becomes an empty space.

openblas.c:36:108: error: expected expression before ')' token
   36 |     else {gsl_vector_set(vector_2X, 0, 0.0);gsl_vector_set(vector_2X, 1, 1.0);gsl_vector_set(vector_2X, 2, );gsl_vector_set(vector_2X, 3, 4.0);gsl_vector_set(vector_2X, 4, 5.0);

This was fixed by Andrew Whatson for me!

Loading a module

Requires restarting prescheme? Note that file prescheme/memory.scm is loaded with ps-memory.

(define-structure openblas (export main)
  (open prescheme)
  ;; (open ps-receive)
  (open ps-memory)
  ;; (open prescheme interface)
  (open ps-utils)
  (open ps-string)
  (open ps-vector)
  ;; (open prescheme interfaces)
  (files openblas))

SIMDE

Let's try to multiply a vector with a scalar.

const __m128 scalar = _mm_set1_ps(s);
__m128 result = _mm_mul_ps(vector, scalar);