【问题标题】:ARM NEON not giving accurate resulsARM NEON 没有给出准确的结果
【发布时间】:2013-05-28 17:07:24
【问题描述】:

我正在尝试优化 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"
    );

}

有趣的是,当我在单独的程序中调用这段代码来测试它是否有效时,结果是完美的。但是,当它在我的主程序中多次调用时,结果不正确。任何帮助将不胜感激,因为我现在真的一无所知。

【问题讨论】:

  • 您可能有一些内务处理问题 - 我建议至少暂时使用内部函数重新编码,并让编译器负责内务处理。
  • 您应该比较两个版本之间生成的代码。但最有可能发生这种情况是因为您没有在您的clobber 列表中列出“内存”。因此允许编译器不从内存中加载您的计算值。
  • 我尝试将“内存”放入被破坏的列表中。它没有工作
  • 您必须发布一些生成的代码(包括此函数的周围代码)。
  • 它们不准确还是完全偏离了轨道?恕我直言,您还应该传递相同函数的 C 代码,以便人们了解您真正想要做什么。

标签: arm inline neon beagleboard


【解决方案1】:

我不知道内联程序集是如何处理寄存器保存的,但是根据 ATPCS,d8~d15 必须在使用前被保存,所以使用它们(如果不是绝对必要的话)开始并不是很明智.

它会导致性能损失(如果内联汇编做得正确),或者它会做一些“不合理”的事情(如果内联汇编失败)

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

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多