makemake 我对 Boost Ublas Matrix 的逐个元素产品的默认函数进行了基准测试,发现 element_prod 比我用简单的 for 循环编写自己的实现要慢得多。所以,我决定编写自己的版本。
我正在尝试在如下语句的帮助下实现将逐元素矩阵乘法的代码:
matrix m1, m2, m3;
m3 = m1 * m2;
在这里,我想利用 C++11 移动语义来有效地返回乘法的输出。
这就是我到目前为止所拥有的。
#include "boost\numeric\ublas\matrix.hpp"
#include <Windows.h>
typedef boost::numeric::ublas::matrix<float> matrix;
void ElemProd();
const size_t X_SIZE = 400;
const size_t Y_SIZE = 400;
const size_t ITERATIONS = 500;
matrix operator*(const matrix &m1, const matrix &m2)
{
size_t rows = m1.size1();
size_t cols = m2.size2();
matrix temp(rows,cols);
for (size_t i = 0; i < rows; i++)
{
for (size_t j = 0; j < cols; j++)
{
temp(i, j) = m1(i, j) * m2(i, j);
}
}
//return std::move(temp);
return temp;
}
void ElemProd()
{
matrix m1(X_SIZE, Y_SIZE);
matrix m2(X_SIZE, Y_SIZE);
for (size_t i = 0; i < X_SIZE; i++)
{
for (size_t j = 0; j < Y_SIZE; j++)
{
m1(i, j) = 2;
m2(i, j) = 10;
}
}
matrix m3 = m1; // simply to allocate the right amount of memory for m3, to be overwritten.
m3 = m1 * m2;
}
在这里,在 operator* 重载中,我必须创建一个临时矩阵来存储计算结果。我认为这增加了很大的开销。有什么建议可以解决这个问题吗?
另一种选择是将重载的参数设置为非 const,并覆盖其中一个矩阵并返回它,但我认为从长远来看这是非常冒险的,我宁愿避免它。
考虑我想要这样的情况:
矩阵 m = m1 * m2 * m3 * m4 * m5 * m6;
在这里,您可以看到我在实现中为 temp 分配了 6 次内存。m 应该只需要分配一次。进一步的分配只是开销。