如何解决为什么在 VFP 的寄存器组 S0-31 视图中只能访问一半的寄存器组?
我正在优化 Cortex-A7 上的一个简单的 l2 距离计算程序目标。最初,我选择像下面这样展开计算循环:
void l2_naive_f32(float *mat,uint32_t m,uint32_t n,float *vec,float *dst) {
for (size_t i = 0; i < m; i++) {
float res0 = 0;
float res1 = 0;
for (size_t j = 0; j < n; j+=2) {
float t0 = mat[i * n + j] - vec[j];
float t1 = mat[i * n + j + 1] - vec[j + 1];
t0 *= t0;
t1 *= t1;
res0 += t0;
res1 += t1;
}
dst[i] = res0 + res1;
}
}
我观察到在目标 Cortex-A7 CPU 中,展开 8 次将达到峰值性能。展开 16 次将导致大量寄存器溢出 https://godbolt.org/z/sdzovT73P。
在这个armv7-reference-manual中,我了解到即使VFP寄存器组包含三十二个64位双字寄存器,它也只能将其视为三十二个32位单字寄存器,S0-S31 .因此,在此视图中只能访问该集合的一半。
这只是手册上写的一个声明,告诉我真相。但我的问题是,这种设计的原因是什么?为什么在 VFP 的 S0-31 寄存器组视图中只能访问一半的寄存器组?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。