2013-05-28 28 views
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" 
    ); 

} 

有趣的是,当我在一个单独的程序调用该代码来测试它是否正常工作,其结果是完美的。但是,当它在我的主程序中被多次调用时,结果是不正确的。任何帮助将不胜感激,因为我现在完全无能为力。

+0

你可能有一些看家的问题 - 我建议重新编码本,至少暂时,使用内联函数,让编译器把看家的照顾。 –

+2

您应该比较两个版本之间生成的代码。但最有可能发生这种情况的原因是您没有在您的clobber列表中列出“记忆”。所以编译器可以不从内存加载你的计算值。 –

+0

我试图把“内存”放在clobbered列表中。它不起作用 – fussy

回答

2

我不知道内联汇编究竟如何处理寄存器保存,但根据ATPCS,D8〜D15已经被之前使用保存下来,所以它不是很明智使用它们(如果不是绝对必要的)开始用。

这将导致性能损失(如果内联汇编做了合适的工作),或(如内联汇编失败),它会做一些“不合理”

尝试使用Q8〜Q13来代替。这将是一个安全的赌注。