为什么在 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 .因此,在此视图中只能访问该集合的一半。

enter image description here

这只是手册上写的一个声明,告诉我真相。但我的问题是,这种设计的原因是什么?为什么在 VFP 的 S0-31 寄存器组视图中只能访问一半的寄存器组?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)