テンプレート化された行列クラスを作成していますが、演算子から値を返すときにスタック オーバーフローが発生します: +、-、* より大きな行列の場合。スタックを解放し、余分なコピーを避けるために、何らかの方法で参照によって戻ることを好みますが、その場合、newで構築されたオブジェクトを返し、「すべてのnewに対して削除を使用する」という一般的なルールを破る必要があります。コピーのオーバーヘッドとスタック制限の問題で値渡しができず、メモリリークで参照渡しもできないのですが、どうすればよいでしょうか。
これが私の製品関数です(マトリックスには2D配列要素が含まれています):
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アンプを使用して)いくつかの行列演算を強化したいので、このクラスを書いています。既存のソリューションを検索したところ、GPU で高速化された線形代数ライブラリが見つかりましたが、+、-、* 演算子を使用した単純な行列クラスが見つかりませんでした。多分誰かが私を推薦してくれるでしょうか?