Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM霓虹灯没有给出准确的结果_Arm_Inline_Neon_Beagleboard - Fatal编程技术网

ARM霓虹灯没有给出准确的结果

ARM霓虹灯没有给出准确的结果,arm,inline,neon,beagleboard,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

我试图优化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"
    );

}

有趣的是,当我在一个单独的程序中调用这段代码来测试它是否有效时,结果是完美的。然而,当它在我的主程序中被多次调用时,结果是不正确的。如果有任何帮助,我将不胜感激,因为我目前毫无头绪。

我不知道内联程序集是如何处理寄存器保留的,但根据ATPC的规定,d8~d15必须在使用前保留,因此从一开始就使用它们(如果不是绝对必要的话)不是非常明智的

它将导致性能损失(如果内联程序集执行正确的工作),或者它将执行“不合理”的操作(如果内联程序集失败)


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

您可能会遇到一些内部管理问题-我建议至少暂时使用内部函数对其重新编码,并让编译器负责内部管理。您应该在两个版本之间比较生成的代码。但最有可能发生这种情况的原因是你没有在你的打击列表中列出“记忆”。因此,编译器不允许从内存中加载计算值。我尝试将“内存”放入已删除列表中。它不起作用,你将不得不发布一些生成的代码(包括此函数的周围代码)。它们是否不准确或完全偏离轨道?您还应该将相同函数的C代码传递给IMHO,以便人们能够理解您真正想要做的事情。