Common lisp 从SBCL调用BLAS ddot例程
我正试图从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 (*
- 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。结果变量是无用的。事情在你意识到之后是如此的明显:-)