gpt4 book ai didi

java - BLAS.dgemm方法多线程计算误差

转载 作者:太空宇宙 更新时间:2023-11-04 10:53:41 28 4
gpt4 key购买 nike

当我使用spark mllib多层感知器模型来预测 vector 时,我发现同一 vector 在多线程中有时会给出不同的结果。我阅读了源代码,发现它是基于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 类路径。

最佳答案

可能存在并发问题。数组 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();
}


}

关于java - BLAS.dgemm方法多线程计算误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47526201/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com