我们使用公式的沉闷的矩阵乘法算法
通过字面上的 3 个循环,我们将得到一个非常慢的程序,因为我们没有利用处理器的矢量化能力。这种缓慢实现的一个例子是:
T comp;
for (int i = 0; i < lhs.rows(); i++)
{
for (int j = 0; j < rhs.columns(); j++)
{
comp = 0;
for (int k = 0; k < lhs.columns(); k++)
{
comp += lhs.at(i,k)*rhs.at(k,j);
}
result.at(i,j) = comp;
}
}
我的问题是:如果我们考虑矢量化,我们会击败像 OpenBLAS 这样的典型库吗?.
为什么?因为我非常想专门化我的矩阵乘法,以至于 BLAS 无法提供我需要的东西。
如果我们假设这些矩阵是边长为的方阵,并且以列优先顺序存储并且在内存中是连续的(例如,std::vector,具有元素)。考虑以下代码片段:
transpose(lhs); //apply in-place transpose
for (int i = 0; i < lhs.columns(); i++)
{
for (int j = 0; j < rhs.columns(); j++)
{
result.at(i,j) =
std::transform(
lhs.begin()+i*lhs.rows(),
lhs.begin()+(i+1)*lhs.rows(),
rhs.begin()+j*rhs.rows(),
std::multiplies<T>);
}
}
transpose(lhs);
现在这不仅考虑了矢量化,甚至还使用标准算法让编译器完全自由地进行它想要的所有优化。所以我的问题是:这会击败好的 BLAS 库吗?我还应该怎么做才能使这样的代码变得超级高效?