我正在使用 Julia v0.3.5,它附带 WinPython 3.4.2.5 build 4。我是 Julia 的新手。我正在测试 Julia 与使用 SciPy 的 BLAS 包装器进行 ddot() 相比有多快,ddot() 具有以下参数:x,y,n,offx,incx,offy,incy。Julia 的 OpenBLAS 库没有偏移参数,因此我试图找出如何在最大化速度的同时模拟它们。我多次传递 1GB 数组(向量)的 100MB 子数组,因此我不希望 Julia 创建每个子数组的副本,这会降低速度。Python 的 SciPy 函数需要几个小时才能执行,因此希望优化 Julia 的速度。我一直在阅读有关 Julia 0.4 如何提供数组视图来避免不必要的复制的内容,但我不清楚 Julia 0.3.5 如何处理这个问题。
到目前为止,我使用 REPL 得知 BLAS dot() 函数与 linalg/matmul.jl 中的方法冲突。因此,我学会了这样访问它:
import Base.LinAlg.BLAS
methods(Base.LinAlg.BLAS.dot)
Run Code Online (Sandbox Code Playgroud)
从方法显示中,我看到我可以传递指向 x 和 y 子数组的指针,从而避免复制。例如:
x = [1., 2., 3.]
y = [4., 5., 6.]
Base.LinAlg.BLAS.dot(2, pointer(x), 1, pointer(y), 1)
Run Code Online (Sandbox Code Playgroud)
但是,当我向指针添加整数偏移量(以访问子数组)时,REPL 崩溃。
如何在Base.LinAlg.BLAS.dot不减慢该子数组副本速度的情况下传递指向子数组或子数组的指针?还有什么我错过的吗?
它会出现段错误,因为指针算术不像您想象的那样工作(即 C 方式)。pointer(x)+1是一个字节之后pointer(x),但你可能想要pointer(x)+8,例如
Base.LinAlg.BLAS.dot(2, pointer(x)+1*sizeof(Float64), 1, pointer(y)+1*sizeof(Float64), 1)
Run Code Online (Sandbox Code Playgroud)
或者,更加用户友好和推荐:
Base.LinAlg.dot(x,2:3,y,2:3)
Run Code Online (Sandbox Code Playgroud)
这是在这里定义的。
我想说,在 Julia 中使用这样的指针确实不推荐,但我想如果你这样做的话,那么这是一种特殊情况。