0
我想优化beagleboard上的raytracer代码,并且我正在使用NEON协处理器。有一个矩阵乘法函数被称为多次,我已经写在内联汇编。但是,由于某些原因结果不准确。这里是我的代码:ARM NEON没有给出准确的结果
void VecMatMult(float Vt[4], float M[4][4], float V[4])
{
__asm__ volatile(
"vldmia %1, {q1-q4} \n\t" // Load the Matrix in the quad registers
"vldmia %2, {q5} \n\t" //Load the Vector
"vmul.f32 q0, q1, d10[0] \n\t" //Calculate the matrix product
"vmla.f32 q0, q2, d10[1] \n\t"
"vmla.f32 q0, q3, d11[0] \n\t"
"vmla.f32 q0, q4, d11[1] \n\t"
"vstmia %0, {q0} \n\t" //Store the output
:
:"r" (Vt), "r" (M), "r" (V)
:"q0", "q1", "q2", "q3", "q4", "q5"
);
}
有趣的是,当我在一个单独的程序调用该代码来测试它是否正常工作,其结果是完美的。但是,当它在我的主程序中被多次调用时,结果是不正确的。任何帮助将不胜感激,因为我现在完全无能为力。
你可能有一些看家的问题 - 我建议重新编码本,至少暂时,使用内联函数,让编译器把看家的照顾。 –
您应该比较两个版本之间生成的代码。但最有可能发生这种情况的原因是您没有在您的clobber列表中列出“记忆”。所以编译器可以不从内存加载你的计算值。 –
我试图把“内存”放在clobbered列表中。它不起作用 – fussy