ARM NEON没有给出准确的结果

时间:2013-05-28 17:07:24

标签: arm inline neon beagleboard

我正在尝试优化beagleboard上的光线跟踪器代码,为此我正在使用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"
    );

}

有趣的是,当我在一个单独的程序中调用此代码来测试它是否有效时,结果是完美的。但是,当它在我的主程序中多次调用时,结果是不正确的。任何帮助都将受到赞赏,因为我现在几乎无能为力。

1 个答案:

答案 0 :(得分:2)

我不确切知道内联汇编如何处理寄存器保留,但根据ATPCS,d8~d15必须在使用前保留,因此使用它们(如果不是绝对必要的话)开始时并不是很明智

它会导致性能下降(如果内联汇编执行正确的工作),或者它会执行“不合理”的操作(如果内联汇编失败)

尝试使用q8~q13代替。这将是一个安全的赌注。