【问题标题】:Core Matrix Clojure Dot Product Performance核心矩阵 Clojure 点产品性能
【发布时间】:2015-03-14 11:14:57
【问题描述】:

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

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

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

有什么解决办法吗?

【问题讨论】:

  • 你尝试过输入提示吗?

标签: matrix clojure


【解决方案1】:

core.marix 的性能在很大程度上取决于您使用的矩阵实现。默认是基于持久向量的纯 Clojure 实现。自述文件中列出了另外两个实现(vectorz-cljClatrix),并且在运行时提供了完整列表(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 ms,使用 vectorz-clj 或 Clatrix 时不到 10 µs;换句话说,vectorz-clj 在这个基准测试中比默认 impl 快约 222 倍。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2016-06-17
    • 2019-05-11
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多