6
我想我找到了我的問題的答案。 VFP有一個「fmacs」指令,它可以做NEON/VFP寄存器標量計算的技巧。混合NEON組件與非矢量功能
我很新的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"
);
你不是真的會想從NEON切換到這樣的VFP指令。在最近幾代iPhone中使用的Cortex-A8和Cortex-A9(您之前發佈的內容)都會在這些操作之間發生漫長的呃逆。對於計算的最後一部分,你也可以做一個向量操作。 – ohmantics 2011-05-17 14:24:14