Common lisp 从SBCL调用BLAS ddot例程

Common lisp 从SBCL调用BLAS ddot例程,common-lisp,blas,sbcl,dot-product,Common Lisp,Blas,Sbcl,Dot Product,我正试图从SBCL调用BLAS ddot例程 基于: ddot文档() 它的源代码是() 一些额外的提示() 调用dgemm例程()的工作示例 我想出了以下脚本: (load-shared-object "libblas.so.3") (declaim (inline ddot)) (define-alien-routine ("ddot_" ddot) void (n int :copy) (dx (* double)) (incx int :copy) (dy (*

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

基于:

  • ddot文档()
  • 它的源代码是()
  • 一些额外的提示()
  • 调用dgemm例程()的工作示例
我想出了以下脚本:

(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))))
(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*)
但是,以下脚本:

(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))))
(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*)
产生以下错误:

arithmetic error FLOATING-POINT-INVALID-OPERATION signalled
   [Condition of type FLOATING-POINT-INVALID-OPERATION]

有什么提示吗?

我知道它不能直接回答您的问题,但您是否尝试过使用已编写的Blas绑定?例如,我已经提供了一个lispy接口来找到它。布拉格查尔斯大学的米罗斯拉夫·乌尔巴内克(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)
ddot例程旨在返回一个double,而不是void。结果变量是无用的。事情在你意识到之后是如此的明显:-)