为什么VLD4Q_F32与4X VLD1Q_F32不同

Why is vld4q_f32 not the same as 4x vld1q_f32?

本文关键字:F32 VLD1Q 不同 4X 为什么 VLD4Q      更新时间:2023-10-16
const float* H; //input data from elsewhere
const float32x4x4_t hCols = vld4q_f32(H);
const float32x4_t hCol0 = vld1q_f32(H + 0);
const float32x4_t hCol1 = vld1q_f32(H + 4);
const float32x4_t hCol2 = vld1q_f32(H + 8);
const float32x4_t hCol3 = vld1q_f32(H + 12);

使用HCOL0,HCOL1,HCOL2,HCOL3的代码替换为HCOLS.VAL [0],HCOLS.VAL [1],HCOLS.VAL [2],HCOLS.VAL [3],但是现在我变得非常了怪异的输出。

这两个负载与VLD4Q_F32的可能性不完全相同?

vld4vld1的指令截然不同。

虽然 vld1是一个直接的负载,而 vld4是一个分布负载,每个值都在四个寄存器之间分布,元素后元素,在注册后注册。

vld4q_f32(pSrc) will translate to:
vld4.32 {d0, d2, d4, d6}, [pSrc]!
vld4.32 {d1, d3, d5, d7}, [pSrc]
*pSrc:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E
================================================
And the values are loaded as following:
q0 (d0 + d1): 0, 4, 8, C
q1 (d2 + d3): 1, 5, 9, D
q2 (d4 + d5): 2, 6, A, E
q3 (d6 + d7): 3, 7, B, F

在汇编中,可以直接加载多个寄存器的单个指令,例如:

vld1.32 {q0, q1}, [pSrc]!
vld1.32 {q2, q3}, [pSrc]
And the values are loaded as following:
q0 (d0 + d1): 0, 1, 2, 3
q1 (d2 + d3): 4, 5, 6, 7
q2 (d4 + d5): 8, 9, A, B
q3 (d6 + d7): C, D, E, F

在内在内容中,您必须通过注册注册进行注册:float32x4x4_t hcols;

hCols.val[0] = vld1q_f32(H + 0);
hCols.val[1] = vld1q_f32(H + 4);
hCols.val[2] = vld1q_f32(H + 8);
hCols.val[3] = vld1q_f32(H + 12);

在Android Studio 3.01上,vld1q_f32_x4是为此目的定义的,但似乎仍然有故障。我至少无法成功建造。

顺便说一句,您是否想执行4x4矩阵乘法?恭喜,您刚刚找到了如何自动在vld4中自动转移矩阵;

不过,不要浪费时间的时间。汇编版本的运行范围几乎是的三倍,而我进行了1:1转换为Interins,由Clang编写的Android Studio 3.01。这真的很烦人。

使用内在的时间纯粹是浪费时间,至少在手臂上。

相关文章: