【发布时间】:2012-12-29 14:47:25
【问题描述】:
我正在编写模板矩阵类,当从运算符按值返回时出现堆栈溢出:对于较大的矩阵,+、-、*。我宁愿以某种方式通过引用返回以减轻堆栈并避免额外的复制,但是,我将不得不返回一个用 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 加速的线性代数库,但我在其中找不到一个带有 +、-、* 运算符的简单矩阵类。也许有人可以推荐我吗?
【问题讨论】:
-
你能返回一个共享指针吗?
-
你听说过
pImpl模式吗?
标签: c++ matrix return binary-operators