从SBCL调用BLAS ddot例程

Dan*_*uko 5 sbcl common-lisp blas dot-product

我试图从SBCL调用BLAS ddot例程.

基于:

我想出了以下脚本:

(load-shared-object "libblas.so.3")

(declaim (inline ddot))

(define-alien-routine ("ddot_" ddot) void
  (n int :copy)
  (dx (* double))
  (incx int :copy)
  (dy (* double))
  (incy int :copy))

(defun pointer (array)
  (sap-alien (sb-sys:vector-sap (array-storage-vector array)) (* double)))

(defun dot (dx dy)
  (unless (= (length dx) (length dy))
    (error "Vectors length does not match"))
  (let ((n (length dx))
    (result 0.0d0))
    (sb-sys:with-pinned-objects (dx dy result)
      (ddot n (pointer dx) 1 (pointer dy) 1))))
Run Code Online (Sandbox Code Playgroud)

但是,以下脚本:

(defvar *a* (make-array 4 :initial-element 1.0d0 :element-type 'double-float))
(defvar *b* (make-array 4 :initial-element 2.0d0 :element-type 'double-float))
(dot *a* *b*)
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

arithmetic error FLOATING-POINT-INVALID-OPERATION signalled
   [Condition of type FLOATING-POINT-INVALID-OPERATION]
Run Code Online (Sandbox Code Playgroud)

任何提示?

Dan*_*uko 4

找到了。感谢布拉格查尔斯大学的 Miroslav Urbanek 提供的提示。

-(define-alien-routine ("ddot_" ddot) void
+(define-alien-routine ("ddot_" ddot) double

 (defun dot (dx dy)
   (unless (= (length dx) (length dy))
     (error "Vectors length does not match"))
-  (let ((n (length dx))
-        (result 0.0d0))
-    (sb-sys:with-pinned-objects (dx dy result)
+  (let ((n (length dx)))
+    (sb-sys:with-pinned-objects (dx dy)
Run Code Online (Sandbox Code Playgroud)

ddot 例程旨在返回双精度值,而不是 void。结果变量是无用的。你意识到它们之后,事情就变得如此明显了:-)