2011-05-16 60 views
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" 
    ); 
+0

你不是真的會想從NEON切換到這樣的VFP指令。在最近幾代iPhone中使用的Cortex-A8和Cortex-A9(您之前發佈的內容)都會在這些操作之間發生漫長的呃逆。對於計算的最後一部分,你也可以做一個向量操作。 – ohmantics 2011-05-17 14:24:14

回答

1

所以我覺得你問一個標量矢量相乘?

我會用「VDUP」標量加載到NEON寄存器的所有車道,然後乘以。

如果你可以發佈你正在試圖做的,我可以嘗試和幫助更多什麼是純C版本...