저는 템플릿 기반 행렬 클래스를 작성하고 있습니다. 더 큰 행렬에 대해서는 연산자로 값을 반환 할 때 스택 오버플로가 발생합니다. 나는 스택을 완화하기 위해 어떻게 든 참조로 반환하는 것을 선호하고 여분의 복사를 방지하기 위해, 그러나, 나는 새로운로 구성 객체를 반환해야하고 "모든 새로운에 대한을 삭제 를 사용하여"의 일반적인 규칙을 깰 . 오버 헤드 및 스택 제한 문제를 복사하여 값으로 반환 할 수 없으며 메모리 누수로 인해 참조로 되돌릴 수 없으므로 어떻게해야합니까?참조로 반환하는 C++ 행렬 클래스 오버로드 연산자
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);
}
내가 (MS 앰프와) GPU에 대한 몇 가지 행렬 연산을 강화하려는 때문에이 클래스를 쓰고 있어요 :
여기 내 제품 기능 (매트릭스 2 차원 배열 elems를 포함)이다. 기존 솔루션을 찾고 GPU 가속 선형 대수 라이브러리를 찾았지만 찾을 수없는 것은 +, -, * 연산자가있는 간단한 행렬 클래스였습니다. 누군가 나 한테 추천 할 수 있을까?
공유 포인터를 돌려 줄 수 있습니까? – andre
''pImpl' 패턴에 대해 들어 보셨습니까? – Yakk