首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BLAS.dgemm方法多线程计算错误

BLAS.dgemm方法多线程计算错误
EN

Stack Overflow用户
提问于 2017-11-28 15:31:41
回答 1查看 69关注 0票数 1

当我使用spark mllib多层感知器模型预测一个向量时,我发现在多线程中,相同的向量有时会产生不同的结果。我读了源代码,发现它是基于BLAS库的。我为多线程中的BLAS做了一些测试代码。

我使用BLAS dgemm utils来计算矩阵,当使用多线程时,相同的矩阵数据会产生不同的结果。

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

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

代码语言:javascript
运行
复制
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中的相同数据会产生不同的结果?

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

EN

回答 1

Stack Overflow用户

发布于 2017-11-29 01:51:55

它可能有并发问题,所有线程都在更改.array c(堆中的同一对象),synchronously.if a和b数组在dgemm function.then中是只读的,不需要克隆它们

代码语言:javascript
运行
复制
 @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();
    }


}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47526201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档