我正在编写模板化的矩阵类,当从运算符按值返回时出现堆栈溢出:+、-、* 对于较大的矩阵。我宁愿以某种方式通过引用返回以减轻堆栈并避免额外的复制,但是,我将不得不返回一个用new构造的对象,并打破“对每个new使用delete ”的一般规则。由于复制开销和堆栈限制问题,我无法按值返回,并且由于内存泄漏,我也无法按引用返回,那我该怎么办?
这是我的产品功能(矩阵包含二维数组元素):
template<typename T, unsigned int n, unsigned int m> template<unsigned int m2>
Matrix<T,n,m2> Matrix<T,n,m>::operator*(Matrix<T,m,m2>& M) {
T prod[n][m2];
if(n*m < GPUAccelerationThreshold)
for(int i = 0; i < n; i++)
for(int j = 0; j < m2; j++) {
prod[i][j] = elems[i][0] * M(0, j);
for(int p = 1; p < m; p++)
prod[i][j] += elems[i][p] * M(p, j);
}
else {
array_view<T, 2> product(n, m2, *prod);
array_view<T, 2> a(n, m, *elems);
array_view<T, 2> b(m, m2, M.elems[0]);
parallel_for_each(
product.extent,
[=](index<2> idx) restrict(amp) {
int row = idx[0];
int col = idx[1];
for (int inner = 0; inner < m; inner++) {
product[idx] += a(row, inner) * b(inner, col);
}
}
);
product.synchronize();
}
return Matrix<T,n,m2>(prod);
}
我正在写这门课,因为我想在 GPU(使用 MS amp)上增强一些矩阵运算。我搜索了一个现有的解决方案,找到了 GPU 加速的线性代数库,但我在其中找不到一个带有 +、-、* 运算符的简单矩阵类。也许有人可以推荐我吗?