如何使用BLAS函数将指针传递给子数组?

时间:2015-03-07 03:16:59

标签: pointers julia

我使用的是Julia v0.3.5,它附带了WinPython 3.4.2.5 build 4.我是Julia的新手。我正在测试Julia与使用SciPy的BLAS包装器与ddot()相比有多快,它有以下参数:x,y,n,offx,incx,offy,incy。 Julia的OpenBLAS库没有偏移量参数,因此我试图弄清楚如何在最大化速度的同时模拟它们。我多次传递1MB阵列(向量)的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)

从方法显示中,我看到我可以将指针传递给x和y子数组,从而避免复制。例如:

x = [1., 2., 3.]
y = [4., 5., 6.]
Base.LinAlg.BLAS.dot(2, pointer(x), 1, pointer(y), 1)

但是,当我向指针添加整数偏移量(访问子数组)时,REPL崩溃。

如何在没有该子阵列副本减速的情况下将指针传递给子阵列或子阵列到Base.LinAlg.BLAS.dot? 我错过了什么?

1 个答案:

答案 0 :(得分:4)

它是段错误,因为指针算术不像你想象的那样工作(即C方式)。 pointer(x)+1pointer(x)之后的一个字节,但您可能需要pointer(x)+8,例如

Base.LinAlg.BLAS.dot(2, pointer(x)+1*sizeof(Float64), 1, pointer(y)+1*sizeof(Float64), 1)

或者,更加用户友好和推荐:

Base.LinAlg.dot(x,2:3,y,2:3)

defined here

我会说在朱莉娅中使用像这样的指针真的不推荐,但我想如果你这样做,那么这是一个特殊情况。