【发布时间】:2017-12-01 07:15:34
【问题描述】:
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 可能更快吗?
【问题讨论】:
-
如果
H是float*,请记住 C 地址数学按操作数大小缩放,但 asm 没有。因此,您可能希望H + 1、H + 2获得从[reg + #4]、[reg + #8]等加载的 asm。检查编译器输出以确保它看起来像您期望的那样通常很有帮助(可以捕获正确性和性能错误)。 -
@PeterCordes H + 4, 8, 12 由编译器正确处理。与众不同的是
vld4指令本身。在AVX中缺少这样令人愉快的说明真的让我感到震惊。 -
@Jake'Alquimista'LEE:哎呀,我没有意识到 vld4q 正在加载 4x4 = 16 个浮点数,而 vld1q 正在加载 4 个浮点数。我猜它正在加载 1(将广播加载或标量加载到零扩展向量 reg 中,例如 x86 的
movss xmm0, [mem])。当我一直在查看/思考我希望 asm 如何出现时,我有时肯定会混淆并用字节数偏移我的 C 指针,所以我的第一个猜测是这就是问题所在:P
标签: c++ intrinsics neon