【问题标题】:BLAS.dgemm method multithreading compute errorBLAS.dgemm 方法多线程计算错误
【发布时间】:2018-05-11 14:13:53
【问题描述】:

当我使用 spark mllib 多层感知器模型来预测向量时,我发现相同的向量在多线程中有时会给出不同的结果。我阅读了源代码,发现它基于 BLAS lib。我在多线程中为 BLAS 编写了一些测试代码。

我使用 BLAS dgemm utils 计算矩阵,相同的矩阵数据在使用多线程时会给出不同的结果。

我的测试代码可以在github 上找到。在测试代​​码中,我做了一些人工的测试数据。要使用 Windows 10 对其进行测试,请在 java 类路径中添加 blas dll 文件。

当我只使用一个线程运行时:

blas.dgemm(transa, transb, m, n, k,alpha, a, _a_offset, lda, b, _b_offset, ldb,beta, c, _c_offset, ldc)

重复运行的结果是一样的。但是使用 5 个或更多线程来运行相同的数据, blas.dgemm 给出不同的结果。这很令人困惑,为什么blas.dgemm中的相同数据会给出不同的结果?

使用 Windows 10,将 netlib-native_system-win-x86_64.dll 添加到 java 类路径。

【问题讨论】:

  • 我做了一些相当大的语法更改,如果有任何我误解的内容,请更改/还原。
  • 谢谢。以后会密切注意语法错误的。

标签: java multithreading apache-spark apache-spark-mllib openblas


【解决方案1】:

它可能存在并发问题。数组 c(堆中的同一对象)正在被所有线程同步更改。如果 a 和 b 数组在 dgemm 函数中是只读的。那么不需要克隆它们

 @Override
 public void run() {
       double[] aa=a.clone();
       double[] bb=b.clone();
       double[] cc=c.clone();
     try {

        BLAS  blas =  BLAS.getInstance();
        blas.dgemm(transa, transb, m, n, k,
                alpha, aa, _a_offset, lda, bb, _b_offset, ldb,
                beta, cc, _c_offset, ldc);

        System.out.println("c.rows:"+ m + "   c.cols:"+n
                + "   c.data:"+ Arrays.toString(cc)
                + "   c._c_offset:"+_c_offset
                + "   c.ldc:"+ldc);

    } catch (Exception e) {
        e.printStackTrace();
    }


}

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多