- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 可能更快?
最佳答案
vld4
是一个与 vld1
截然不同的指令。
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 转换为内部函数,由 Android Studio 3.01 附带的 Clang 编译。这真的很烦人。
使用内部函数纯粹是浪费时间,至少在 ARM 上是这样。
关于c++ - 为什么 vld4q_f32 与 4x vld1q_f32 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47588370/
全部, 根据 MSVC,我正在编写一个显然存在内存泄漏的应用程序。此应用程序由二进制可执行文件和几个 DLL 组成。应用程序和 DLL 都使用“动态链接”。 我还有一个书面应用程序,它只包含一个静态链
下面两行代码到底会发生什么? vst1.64 {d8, d9, d10, d11}, [r4:128]! vst1.64 {d12, d13, d14, d15}, [r4:128] 更一般地说,我想
我正在使用可视检漏仪。它正确地显示了一些泄漏的调用堆栈,但我得到一些调用堆栈为空的输出,如下所示: ---------- Block 131148 at 0x69B3AF68: 144 bytes -
我正在尝试使用 Visual C++ (2010) 和 Visual Leak Detector 编译 SDL 库,以便在另一个调用 SDL 的程序中查找内存泄漏。 问题是vld.h是一个C++库,而
我有一个大小为 M x N 的图像,每个像素为 14 位(所有像素都存储在 16 位整数中,但未使用 2 个最低有效位)。由于映射函数只是一个包含 16384 个值的数组,所以我想将每个像素映射到一个
我用 CRTDBG 检测到一堆内存泄漏,但发现它们很难追踪,所以安装了 Visual Leak Detection。这显示了一致数量的泄漏,我将其追溯到没有虚拟析构函数的抽象类。我修复了这个问题,VL
我在 Visual Studio 2010 的 Win32 项目中包含 vld.h、vld.lib 和 vld_x86.dll。它可以正确构建,但是当我执行时,它会崩溃并显示以下消息: "The ap
所有,我尝试使用 Visual Leak Detector,并按照说明进行操作: Visual C++ 2010:转到“查看”->“属性管理器”,选择“Microsoft.Cpp.Win32.user
我是一名优秀的程序员,十分优秀!