核心矩阵 Clojure 点积性能

Core Matrix Clojure Dot Product Performance

我想问一下core.matrix点积性能,有没有优化点积函数的技巧?

因为我发现在Java、C,甚至在HipHipArray 库中,点积性能比核心矩阵点积快得多。我通过将点积函数循环到 800000 步来进行一点基准测试,我发现 Java = 12 ms,C = 22 ms 和 core.matrix = 1300 ms(如果使用 core.matrix .dot ),如果在 clojure 中使用 hiphip 数组,我发现它在 800000 次迭代点积中产生了 300 毫秒。

其实我想在执行core.matrix.dot-product时使用hiphip array和core matrix,但是函数dot-product对输入要求双数组格式,这也是[的瓶颈过程=18=] 因为矩阵的行在 运行 点积之前应该被转换成双数组形式。

有什么解决办法吗?

core.marix 性能 严重 取决于您使用的矩阵实现。默认是基于持久向量的纯 Clojure 实现。自述文件 (vectorz-clj and Clatrix) 中列出了另外两个实现,并且在运行时提供了完整的列表(clojure.core.matrix.implementations/KNOWN_IMPLEMENTATIONS;这是 set-current-implementation 查找传递给它的关键字的地方,见下文)。

为了证明切换到不同的实现会产生多么巨大的性能差异,请考虑以下 Criterium 基准测试集合:

;; default implementation
(let [v (mat/matrix (mapv double (range 10000)))]
  (c/quick-bench (mat/dot v v)))
WARNING: Final GC required 49.98723291004293 % of runtime
Evaluation count : 282 in 6 samples of 47 calls.
             Execution time mean : 2.219186 ms
    Execution time std-deviation : 72.665087 µs
   Execution time lower quantile : 2.155165 ms ( 2.5%)
   Execution time upper quantile : 2.336716 ms (97.5%)
                   Overhead used : 15.800986 ns

Found 1 outliers in 6 samples (16.6667 %)
    low-severe   1 (16.6667 %)
 Variance from outliers : 13.8889 % Variance is moderately inflated by outliers

(mat/set-current-implementation :vectorz)

(let [v (mat/matrix (mapv double (range 10000)))]
  (c/quick-bench (mat/dot v v)))
WARNING: Final GC required 55.499903895118344 % of runtime
Evaluation count : 61518 in 6 samples of 10253 calls.
             Execution time mean : 9.964186 µs
    Execution time std-deviation : 171.566491 ns
   Execution time lower quantile : 9.751079 µs ( 2.5%)
   Execution time upper quantile : 10.161758 µs (97.5%)
                   Overhead used : 15.800986 ns

(mat/set-current-implementation :clatrix)

(let [v (mat/matrix (mapv double (range 10000)))]
  (c/quick-bench (mat/dot v v)))
WARNING: Final GC required 56.489827272630386 % of runtime
Evaluation count : 61992 in 6 samples of 10332 calls.
             Execution time mean : 9.898032 µs
    Execution time std-deviation : 266.379479 ns
   Execution time lower quantile : 9.594174 µs ( 2.5%)
   Execution time upper quantile : 10.236125 µs (97.5%)
                   Overhead used : 15.800986 ns

默认实现的时间 > 2 毫秒,而使用 vectorz-clj 或 Clatrix 的时间不到 10 微秒;换句话说,vectorz-clj 比此基准测试中的默认实现快约 222 倍。