Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推进uBLAS矩阵积极慢_C++_Performance_Boost_Ublas_Boost Ublas - Fatal编程技术网

C++ 推进uBLAS矩阵积极慢

C++ 推进uBLAS矩阵积极慢,c++,performance,boost,ublas,boost-ublas,C++,Performance,Boost,Ublas,Boost Ublas,有没有办法提高boost ublas产品性能 我有两个矩阵A,B,我想对它们进行叠加 < Matlab与C++中,对于2000×2000矩阵运算,得到以下次数[s] OPERATION | MATLAB | C++ (MSVC10) A + B | 0.04 | 0.04 A - B | 0.04 | 0.04 AB | 1.0 | 62.66 A'B' | 1.0 | 54.35 为什么这里会有如此巨大的性能损失 这些矩阵只是实

有没有办法提高boost ublas产品性能

我有两个矩阵A,B,我想对它们进行叠加

< Matlab与C++中,对于2000×2000矩阵运算

,得到以下次数[s]
OPERATION | MATLAB | C++ (MSVC10)
A + B     |  0.04  |  0.04
A - B     |  0.04  |  0.04
AB        |  1.0   | 62.66
A'B'      |  1.0   | 54.35
为什么这里会有如此巨大的性能损失

这些矩阵只是实数的双精度矩阵。 但我也需要正定,对称,矩形积

编辑: 代码很简单

matrix<double> A( 2000 , 2000 );
// Fill Matrix A
matrix<double> B = A;

C = A + B;
D = A - B;
E = prod(A,B);
F = prod(trans(A),trans(B));
矩阵A(20002000);
//填充矩阵A
矩阵B=A;
C=A+B;
D=A-B;
E=产品(A,B);
F=产品(反式(A)、反式(B));
编辑2: 结果是10次试验的平均值。stddev小于0.005

我希望因子2-3可能是,但不是50(!)

编辑3: 一切都是在发布(NDEBUG/MOVE_SEMANTICS/)模式下进行的

编辑4:
为产品结果预先分配的矩阵不会影响运行时。

发布您的C+代码,以获取关于任何可能优化的建议

但是,您应该知道,Matlab对于其设计任务来说是高度专业化的,并且您不可能使用Boost来匹配它。另一方面,Boost是免费的,而Matlab显然不是


我相信,通过将uBlas代码绑定到底层LAPACK实现,可以获得最佳的性能提升。

您不知道内存管理在这里扮演什么角色
prod
必须分配一个32mb的矩阵,
trans
也必须分配两次,然后你要分配10次。拿一些看看它到底在做什么。我愚蠢的猜测是,如果你预先分配矩阵,你会得到更好的结果

其他加速矩阵乘法的方法有

  • 预转置左侧矩阵,以便于缓存,以及

  • 跳过零。只有当A(i,k)和B(k,j)都是非零时,才有任何贡献值


这是否是在uBlas中完成的是任何人的猜测。

有许多高效的BLAS实现,如ATLAS、gotoBLAS、MKL,请改用它们

我不挑代码,但猜测ublas::prod(A,B)使用了三个循环,没有块,也不支持缓存。如果这是真的,prod(A,B.trans())将比其他产品快得多


如果cblas可用,则使用cblas_dgemm进行计算。如果没有,您可以简单地重新排列数据、平均值、prod(A、B.trans())。

您应该在矩阵乘法的左侧使用
noalias
,以消除不必要的副本

而不是
E=prod(A,B)使用
noalias(E)=产品(A,b)

从文件:

如果你肯定知道左手的表情和右手的表情 表达式没有公共存储,则赋值没有别名。A. 在这种情况下可以指定更有效的赋值:noalias(C)= prod(A,B)这避免了创建临时矩阵,即 在正常任务中是必需的。”noalias的任务要求 左右两侧的尺寸应一致


一定要做一个干净的Matlab重新运行,它往往缓存。。。嗯,一切都好。完全不相关,但您应该能够从中获得良好的性能和简单的语法。(我对它与您的小基准测试的关系很感兴趣,提示:-)我希望乘法和加法的时间是2000倍。您记得为uBlas打开释放模式吗。请参阅本章末尾的常见问题解答[link=这表示您需要使用“-DNDEBUG”或其他一些标志来编译ublas以供发布。您不知道内存管理在这里扮演什么角色。
prod
必须分配一个32mb的矩阵,trans
也必须分配两次,然后您要执行所有这些操作10次。花点时间看看它真正在做什么。我愚蠢的猜测是,如果你预先分配矩阵,你会得到更好的结果。@Mike-
ublas
使用表达式模板,因此预先分配不太可能使事情更快,除非编码器故意浪费矩阵副本(这里不是这种情况)。+1“我相信,通过将uBlas代码绑定到底层LAPACK实现,可以获得最佳的Boost性能。”这是真正的答案。我非常确定Boost uBlas使用表达式模板来避免这种情况(或者至少应该这样)。