我正在尝试加快Julia中的点积运算。但是我找不到点积的BLAS功能。
我当前的解决方案是:
X = rand(5,1);
Y = rand(5,1);
res = BLAS.gemm('T','N', X, Y);
res[1]
我想知道我们是否对Julia的BLAS中的点乘积具有更简单的功能。像BLAS.dot(X,Y)
。
答案 0 :(得分:6)
LinearAlgebra.BLAS.dotu
是BLAS1点产品,但不会比内置的Julia更快。 BLAS1和BLAS2例程的Julia通用函数在性能上几乎与OpenBLAS相当。在OpenBLAS中,BLAS3例程(矩阵乘法)更加深入,并且速度更快。
答案 1 :(得分:2)
有 dot功能:
对于任何可迭代容器
x
和y
(包括任何可重复使用的数组 维(数字)(或定义了点的任何元素类型), 计算点积(或内积或标量积),即dot(x[i],y[i])
的总和,就好像它们是矢量一样。
x ⋅ y
(其中可以在REPL中通过制表符填充⋅
来键入\cdot
)是dot(x, y)
的同义词。
它似乎比gemm BLAS调用快:
using LinearAlgebra
using BenchmarkTools
n = 10000
x = rand(n, 1);
y = rand(n, 1);
@btime(BLAS.gemm('T','N', x, y))
19.212 μs (1 allocation: 96 bytes)
@btime(x ⋅ y)
1.536 μs (1 allocation: 16 bytes)
versioninfo()
Julia Version 1.0.3
Commit 099e826241* (2018-12-18 01:34 UTC)
Platform Info:
OS: Linux (x86_64-suse-linux)
CPU: Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-6.0.0 (ORCJIT, haswell)