[Gsll-devel] small modification to blas2.lisp
Mirko Vukovic
mirko.vukovic at gmail.com
Thu May 15 02:01:49 UTC 2008
On Wed, May 14, 2008 at 5:02 PM, Liam Healy <lhealy at common-lisp.net> wrote:
> On Wed, May 14, 2008 at 2:23 PM, Mirko Vukovic <mirko.vukovic at gmail.com> wrote:
>> Hi,
>>
>> I was playing with gsll and blas. I modified the cblas-transpose
>> definition in blas2.lisp (see top of file) to capture a few more
>> values:
>>
>> Here is the new version:
>>
>> (cffi:defcenum cblas-transpose
>> "CBLAS_TRANSPOSE from /usr/include/gsl/gsl_cblas.h."
>> (:notrans 111) (:trans 112) (:conjtrans 113))
>
> I fail to see the difference with what is in there now:
> (cffi:defcenum cblas-transpose
> "CBLAS_TRANSPOSE from /usr/include/gsl/gsl_cblas.h."
> (:notrans 111) :trans :conjtrans)
> See http://common-lisp.net/project/cffi/manual/html_node/defcenum.html#defcenum
> "If value is omitted its value will either be 0, if it's the first
> entry, or it it will continue the progression from the last specified
> value."
> so :trans gets 112, :conjtrans 113 by default.
I was wondering why the other values were omitted.
>
>>
>> I am posting it here because I was not able to download with svn so I
>> don't have versioning for gsll.
>>
>> Also, here is a code snippet that I used to test for tridiagonal
>> matrix solving that also uses gsll-s blas2 routine gemv to double
>> check that things work.
>>
>> (in-package :gsll)
>> ;; solve a tridiagonal system and then verify result by matrix multiplication
>> ;; uses solve-tridiagonal and gemv
>> (let* ((dim 6)
>> (dim- (- dim 1)))
>> (let ((d (make-array dim :element-type 'double-float :initial-element -2.d0))
>> (e (make-array dim- :element-type 'double-float :initial-element 0.2d0))
>> (f (make-array dim- :element-type 'double-float :initial-element 1.d0))
>> (x (make-array dim :element-type 'double-float :initial-element 0.d0))
>> (b (make-array dim :element-type 'double-float :initial-element 0.5d0))
>> (mat (make-array (list dim dim)
>> :element-type 'double-float
>> :initial-element 0.d0)))
>>
>> ;; load matrix
>> (loop for i from 0 below dim-
>> do (progn
>> (setf (aref mat i i) (aref d i))
>> (setf (aref mat (+ i 1) i) (aref f i))
>> (setf (aref mat i (+ i 1)) (aref e i))))
>> (setf (aref mat dim- dim-) (aref d dim-))
>>
>> ;; gsl operations
>> (letm ((d* (vector-double-float d))
>> (e* (vector-double-float e))
>> (f* (vector-double-float f))
>> (x* (vector-double-float x))
>> (b* (vector-double-float b))
>> (v2* (vector-double-float
>> (make-array dim :element-type 'double-float
>> :initial-element 0.d0)))
>> (mat* (matrix-double-float mat)))
>> (solve-tridiagonal d* e* f* b* x*)
>> ;; gemv returns the result in the last argument
>> (gemv :notrans 1.d0 mat* x* 0.d0 v2*)
>> (data v2*))))
>>
>> I am sure this code betrays my lack of lisp experience. So feel free
>> to clean it up if you want it included in the verification part.
>>
>> Mirko
>
> I might make a few simplifications; #'1- to do decrementing and
> I don't think there's a need to make arrays in CL and then remake
> them on the foreign side. It is possibly a candidate for
> example/ regression tests.
>
> Liam
>
I agree for regression that there is no need to duplicate the arrays. But,
1) I will be using the arrays outside of (letm ...) to plot them etc
2) I am still feeling my way around. Even the above point may be
un-necessary, with, for example the (data ... function)
Mirko
More information about the gsll-devel
mailing list