항상 그렇듯이 여기서 분명히 분명한 내용이 없을 것입니다. 전체 소스 코드를 게시 할 수는 없지만 업무와 관련되어 있기 때문에 mulMM
(행렬에 의한 행렬 곱하기) 함수와 mulMT
함수 (행렬에 의한 행렬 곱하기)가있는 템플릿 화 된 Matrix
클래스가 있습니다. 이미 코드에 있습니다. 단 정밀도 부동 소수점 값을 전문으로하는 mulMT
함수를 추가하려고합니다. 비슷한 첫 번째 두 함수 매개 변수를 공유하는 mulMM
비슷한 전문화 된 있습니다.코드를 실행하기 전에 함수에 입력 할 때 예외가 발생합니다.
#ifdef TARGET_x86_SSE4
template <>
Matrix<Float>& Matrix<Float>::mulMM (const Matrix<Float>& mat1,
const Matrix<Float>& mat2);
template <>
Matrix<Float>& Matrix<Float>::mulMT (const Matrix<Float>& mat1,
const Matrix<Float>& mat2,
const bool softmax);
#endif // no SSE4: use template generic
template <class BT>
Matrix<BT>& Matrix<BT>::mulMM (const Matrix<BT>& mat1,
const Matrix<BT>& mat2) {
// Function code
}
template <class BT>
Matrix<BT>& Matrix<BT>::mulMT (const Matrix<BT>& mat1,
const Matrix<BT>& mat2,
const bool softmax) {
// Function code
}
별도의 파일에서 그런 : 몇 가지 예를 들어 코드는 I 코드를 호출하면
#ifdef TARGET_x86_SSE4
template <>
Matrix<Float>& Matrix<Float>::mulMM (const Matrix<Float>& mat1,
const Matrix<Float>& mat2) {
// Function code
}
template <>
Matrix<Float>& Matrix<Float>::mulMT (const Matrix<Float>& mat1,
const Matrix<Float>& mat2,
const bool softmax) {
// Function code
}
상기 mulMM 올바르게 입력 행렬의 값으로 끌어하지만 mulMT를 호출 할 때 , 행렬의 차원에 대해 임의의 숫자를 사용합니다. 디버거를 사용하면 들어올 때 행렬이 올바르게 정의되어 있지만 함수에 들어가 자마자 값이 모두 잘못되었음을 알 수 있습니다. 다음은 내가 사용하고있는 몇 가지 예제 코드입니다.
MatrixFloat mA(4, 5);
MatrixFloat mB(5, 4);
// Code to initialize mA and mB's values.
MatrixFloat mR = mR.mulMM(mA, mB)
// This works fine and correctly find the values for the product.
MatrixFloat mC(4, 4)
// Code to initialize mC
mR = mR.mulMT(mC, mC)
// This fails with a memory access error and stepping into the function reveals
// that this seems to be because mC has dimensions of 84376 x 1 or thereabouts
MT로 두 값을 다르게 만들려고했습니다. 나는 Floats에 대한 mulMT가 존재하지 않을 때, 일반적인 Floor에 대한 mulMT가 작동하는지 확인했습니다. 왜이 일을하고 있는지 나는 모른다.
편집 : Float 전문화 안의 코드가 문제가 아니라는 것을 증명하기 위해 나는 그것을 주석 처리했습니다. 모든 것이 효과가있었습니다. 나는 코드의 주석을 제거했다. 모든 것은 여전히 작동합니다. 아마도 Visual Studio가 혼란스러워하고 뭔가를 다시 컴파일하지 않았을 것이라고 생각합니다.
추가 편집 : 확인 ... 이것은 매우 이상합니다. 디버깅 할 때 mulMT에 처음 들어가면 const bool softmax) {
이라는 줄에 나를 떨어 뜨립니다. F10을 시도하면 예외가 발생합니다. 내가 F11을 치면 ChkStk.asm
에 나를 떨어 뜨린다. 내가 그 파일을 빠져 나가면, 함수 내부에 접근 할 수 있고 모든 것이 올바르게 할당됩니다. 사실, 테스트 프로그램을 다시 컴파일하지 않는 한, 아무런 오류없이 원하는대로 여러 번 실행하거나 실행할 수 있습니다. 그러나 테스트 프로그램을 변경하고 다시 컴파일하면 문제가 다시 발생합니다.
나는 처음보다 훨씬 혼란 스럽다.
편집 : 문제가없는 이틀 후 OK입니다. 다시 나타납니다. 나는 이전에 생각했던 것처럼 값이 변하는 것이 아니라고 생각합니다. 대신 매개 변수가 실제로 인스턴스화되기 전에 어떤 일이 발생합니다. 이유는, 내가 왜 F11
함수를 입력 한 후 내가 stkchk.asm
에 나를 떨어 뜨리는 유일한 기능이 다른 이유는 모르겠다.
UnitTest.exe의 0x00789adc에서 첫 번째 예외가 발생했습니다. 0xC0000005 : 0xabbabab 위치를 읽는 중 액세스 위반이 발생했습니다.은 예외입니다. 앞서 함수에서, 나는 거의 동일한 호출을하고, 어떤 변수가 연산자와 함께 사용되는지를 변경했다. 이상하게도, 호출을 둘러싼 try-catch 블록은 프로그램이 충돌하는 것을 막을 수있는 아무 것도하지 않습니다.
Matrix 유형의 로컬 객체를 반환합니까? 당신이 무언가에 대한 참조를 반환하기 때문에 나는 이것을 묻습니다. 이 포인터를 포인터 리턴으로 변경하는 것이 좋습니다. 다음과 같이 : template <> Matrix * Matrix ..... –
Amadeus
MatrixFloat이란 무엇인가? (MatrixFloat 란 무엇인가?) Matrix',하지만 누가 알 겠어 ...). –
'// function code' 주석으로 건너 뛴 코드를 보여줄 수 있습니까? 거기에 오류가있을 가능성이 있습니다 ... – JBL