我考虑过实现一个矩阵类,该矩阵类使用算法中的std::transform
进行计算,但是我发现在某些情况下编写循环会更快。
外观上添加operator+=
进行元素明智的添加。如果rhs矩阵具有1 col而行数与lhs矩阵相同,我可以执行以下操作:
for (auto c = 0; c < cols(); ++c) {
std::transform(std::execution::par, col_begin(c), col_end(c), rhs.begin(), col_begin(c), std::plus<>());
}
或使用简单的循环:
auto lhsval = begin();
auto rhsval= rhs.begin();
for (auto r = 0; r < rows(); ++r) {
for (auto c = 0; c < cols(); ++c) {
*lhsval += *rhsval;
++lhsval;
}
++rhsval;
}
为您提供信息,我编写了一个接受步骤的迭代器。因此,col_begin()
返回一个迭代器,该迭代器将跳过operator++
我使用Google基准测试对这两种实现之间的差异进行计时,得出的结论是,该循环比使用std :: transform快约5倍。好吧,也许应该有所不同,但没有那么大的差异。
您可以在my github repo
查看完整的代码。答案 0 :(得分:1)
传递std::execution::par
要求库并行化此操作。即使只是确定“您的问题太小而无法并行化”,这也会增加开销。在值得进行并行化之前,要转换的元素数量必须非常大(有时成千上万或数百万),并且要求您具有适当的硬件(在两核计算机上并行化的价值远小于在并行处理上的价值) 64核计算机)。
for
循环版本与无std::transform
参数的普通std::execution::par
更为相似。如果删除该参数,但性能差异仍然很大,请使用该信息以及编译器版本,平台,编译器开关以及有关数据集的信息(行/列数等)来更新您的问题。