我想我找到了问题的答案。 VFP有一条“fmacs”指令可以执行在NEON / VFP寄存器上进行标量计算的技巧。
我对NEON或ARM编程很新......
我想将上三角矩阵加载到NEON寄存器中,并使用单精度积分(累积)矢量的外积。基本思想是A + = x'* x,其中A是上三角矩阵。一些操作可以通过在四重或双重寄存器上使用NEON指令“vmla.f32”来矢量化操作来完成。但是,有时我只需要一次操作一个精度寄存器1,即不需要在2或4个单精度寄存器上操作。在下面的例子中(不起作用),我对行
感兴趣// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
我想使用NEON寄存器执行一次单精度操作。
代码段:
__asm__ volatile (
//load x into registers
"vldmia %0, {d0-d3}\n\t"
// load A into registers
"vldmia %1, {d4-d12}\n\t"
"vldmia %1, {d13-d21}\n\t"
// A[0-7] += x[0]*x[0-7]
"vmla.f32 q2, q2, d0[0]\n\t"
"vmla.f32 q3, q3, d0[0]\n\t"
// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
// output
:
// input
: "r"(A), "r"(x)
// registers
: "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
);
答案 0 :(得分:1)
所以我认为你问的是将一个向量与一个标量相乘?
我会使用“vdup”将标量加载到NEON寄存器的所有通道中,然后相乘。
如果您可以发布您尝试做的简单C版本,我可以尝试帮助更多......