令我惊讶的是,我无法在网上跟踪任何基于cilkplus'的BLAS实施情况。数组表示法。这很奇怪,因为cilkplus应该确保在当今的多核工作站CPU上具有(超过)良好的性能,并且与BLAS算法的非常富有表现力和紧凑的表示相结合。更奇怪的是,考虑到BLAS / LAPACK是密集矩阵计算的事实标准(至少,作为规范)。
据我所知,还有其他更新的和软化的库试图改进/扩展blas / lapack,例如我看过eigen和flens,但是仍然很高兴有一个cilkplus版本的"标准" blas实施。
这取决于cilkplus非常有限的传播吗?
答案 0 :(得分:0)
http://parallelbook.com/downloads在Cholesky分解示例中有一些BLAS操作的Cilk Plus代码(请参阅“BOOK代码示例”):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。
答案 1 :(得分: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);
}
}