与往常一样,我可能会在此丢失一些明显的东西。我不能发布整个源代码,因为它是工作相关的,但我有一个模板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块并没有阻止程序崩溃。
它是否返回类型为Matrix的本地对象?我问这是因为你正在返回一个参考的东西。我建议你将它改为指针返回。像这样的东西:template <>矩阵 *矩阵 ..... –
Amadeus
2013-05-07 17:23:30
还有一些代码丢失了一眼就可能会发生什么(例如:什么是'MatrixFloat'?我猜'Matrix的typedef'',但谁知道......)。 –
2013-05-07 17:23:36
您可以显示您使用注释'//功能代码'跳过的代码吗?有错误存在的机会... – JBL 2013-05-07 17:27:10