gpt4 book ai didi

common-lisp - 从 SBCL 调用 BLAS ddot 例程

转载 作者:行者123 更新时间:2023-12-02 01:14:19 26 4
gpt4 key购买 nike

我正在尝试从 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))))

但是,以下脚本:

(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]

有什么提示吗?

最佳答案

找到了。感谢布拉格查尔斯大学的 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。结果变量是无用的。 你意识到事情之后,事情就变得如此明显了:-)

关于common-lisp - 从 SBCL 调用 BLAS ddot 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31452042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com