0

令我惊讶的是,我无法在网络上跟踪任何基于 cilkplus 数组表示法的 BLAS 实现。这很奇怪,因为 cilkplus 应该确保在当今的多核工作站 CPU 上(超过)体面的性能,再加上 BLAS 算法的非常富有表现力和紧凑的表示。更奇怪的是,考虑到 BLAS/LAPACK 是密集矩阵计算的事实标准(至少,作为规范)。

我知道还有其他更新和复杂的库试图改进/扩展 blas/lapack,例如,我查看了 eigen 和 flens,但是拥有“标准”blas 的 cilkplus 版本仍然会很好执行。

这是否取决于 cilkplus 的非常有限的传播?

4

2 回答 2

0

http://parallelbook.com/downloads有 Cilk Plus 代码(参见“书中的代码示例”),用于 Cholesky 分解示例中的一些 BLAS 操作:gemm、portrf、syrk 和 trsm。例程是模板,因此它们适用于任何精度。

从好的方面来说,Cilk Plus 版本为您提供了良好的合成属性,即您可以在生成树的不同部分使用它们而无需担心。不利的一面是,如果您不需要干净的组合,那么很难与高度调整的并行 BLAS 库竞争,因为 Cilk Plus 算法往往是缓存无意识的,而高度调整的库可以利用缓存感知。例如,缓存感知算法可以仔细调度同一内核上的多个线程在同一块上工作,从而节省内存获取开销。为每台机器获得正确的缓存感知需要做很多工作,但 BLAS 作者愿意做这项工作。

正是缓存意识(“我拥有整台机器”编程)阻碍了干净的组合,所以你不能两者兼得。

对于某些 BLAS 操作,与结构较少的并行性相比,Cilk Plus 的 fork-join 结构似乎也限制了性能。有关一些示例,请参见http://www.netlib.org/utk/people/JackDongarra/WEB-PAGES/cscads-libtune-09/talk17-knobe.pdf的幻灯片 2 。

于 2016-11-01T02:55:40.413 回答
0

以gemm为例,最后并行例程只是调用blas(sgemm,dgemm等)例程。这可能是 netlib 参考、atlas、openblas 或 mkl,但这在建议的引用中是不透明的。我在询问是否存在参考例程的 cilkplus 实现,例如

void dgemm(MATRIX & A, MATRIX & B, MATRIX & C) {    
    #pragma cilk grainsize = 64
    cilk_for(int i = 1; i <= A.rows; i++) {
        double *x = &A(i, 1);
        for (int j = 1; j <= A.cols; j++, x += A.colstride)
            ROW(C, i) += (*x) * ROW(B, j);
    }
}
于 2016-11-02T05:03:33.693 回答