1

与往常一样,我可能会在此丢失一些明显的东西。我不能发布整个源代码,因为它是工作相关的,但我有一个模板Matrix类与mulMM(矩阵乘以矩阵)功能和mulMT函数(乘以矩阵转置矩阵)。这已经存在于代码中。我正在尝试添加专门用于单精度浮点值的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 
} 

然后,在一个单独的文件:

#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不同。我已经证实,当我的MULMT for Floats不存在时,通用的工作。我不知道为什么这是在做它正在做的事情。

编辑:为了证明Float专业化中的代码不是问题,我评论了它。一切正常。我取消了代码注释。一切仍然有效。我在想,也许Visual Studio只是感到困惑,并没有重新编译一些东西。

更多编辑:好的...这很奇怪。在调试时,当我第一次进入mulMT时,它会将我放到const bool softmax) {的行上。如果我尝试F10,我会得到例外。如果我打F11,它会让我进入ChkStk.asm。如果我退出该文件,我可以访问该函数的内部,并且所有内容都正确分配。事实上,只要我不重新编译我的测试程序,我就可以按照我喜欢的方式无误地执行或运行多次。但是,如果我对测试程序进行更改并重新编译,则行为会回来。

我比我一开始就更困惑。

编辑:好吧,两天后没有问题,它再次出现。我认为它不像我以前所想的那样涉及价值观的变化。相反,这是在参数实际实例化之前发生的事情。事情是,我不知道为什么,除了这是我唯一的功能,如果我在输入函数后点击F11,我会将它放入stkchk.asm

UnitTest.exe中0x00789adc的第一次机会异常:0xC0000005:访问冲突读取位置0xabababab。是我得到的例外。在函数的前面,我做了一个几乎相同的调用,只是改变了运算符使用的变量。奇怪的是,围绕调用的try-catch块并没有阻止程序崩溃。

+0

它是否返回类型为Matrix 的本地对象?我问这是因为你正在返回一个参考的东西。我建议你将它改为指针返回。像这样的东西:template <>矩阵 *矩阵 ..... – Amadeus 2013-05-07 17:23:30

+0

还有一些代码丢失了一眼就可能会发生什么(例如:什么是'MatrixFloat'?我猜'Matrix的typedef' ',但谁知道......)。 – 2013-05-07 17:23:36

+0

您可以显示您使用注释'//功能代码'跳过的代码吗?有错误存在的机会... – JBL 2013-05-07 17:27:10

回答

0

我想通了哪里出了问题。这个例外确实发生在函数内部。 Visual Studio正在优化功能,所以除非我在它内部有一个中断点,否则它只会逐步完成所有功能。如果该功能运行正常,它运行正常。如果里面有任何异常,它就会失败。仍然不知道为什么trycatch块没有抓住它,但我并没有出汗。

谢谢大家的帮助。并且谢谢你,@JBL最终是正确的。