gpt4 book ai didi

c++ - NEON 浮点乘法比预期慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:12 26 4
gpt4 key购买 nike

我有两个 float 标签。我需要将第一个选项卡中的元素乘以第二个选项卡中的相应元素,并将结果存储在第三个选项卡中。

我想使用 NEON 来并行化 float 乘法:同时进行四个 float 乘法而不是一个。

我预计会有显着的加速,但我只实现了大约 20% 的执行时间减少。这是我的代码:

#include <stdlib.h>
#include <iostream>
#include <arm_neon.h>

const int n = 100; // table size

/* fill a tab with random floats */
void rand_tab(float *t) {
for (int i = 0; i < n; i++)
t[i] = (float)rand()/(float)RAND_MAX;
}

/* Multiply elements of two tabs and store results in third tab
- STANDARD processing. */
void mul_tab_standard(float *t1, float *t2, float *tr) {
for (int i = 0; i < n; i++)
tr[i] = t1[i] * t2[i];
}

/* Multiply elements of two tabs and store results in third tab
- NEON processing. */
void mul_tab_neon(float *t1, float *t2, float *tr) {
for (int i = 0; i < n; i+=4)
vst1q_f32(tr+i, vmulq_f32(vld1q_f32(t1+i), vld1q_f32(t2+i)));
}

int main() {
float t1[n], t2[n], tr[n];

/* fill tables with random values */
srand(1); rand_tab(t1); rand_tab(t2);


// I repeat table multiplication function 1000000 times for measuring purposes:
for (int k=0; k < 1000000; k++)
mul_tab_standard(t1, t2, tr); // switch to next line for comparison:
//mul_tab_neon(t1, t2, tr);
return 1;
}

我运行以下命令进行编译: g++ -mfpu=neon -ffast-math neon_test.cpp

我的 CPU:ARMv7 处理器版本 0 (v7l)

您有什么想法可以实现更显着的加速吗?

最佳答案

Cortex-A8 和 Cortex-A9 每个周期只能执行两次 SP FP 乘法,因此您最多可以将这些(最流行的)CPU 的性能提高一倍。实际上,ARM CPU 的 IPC 非常低,因此最好尽可能多地展开循环。如果您想要终极性能,请使用汇编语言编写:gcc 的 ARM 代码生成器在任何地方都不如 x86。

我还建议使用特定于 CPU 的优化选项:“-O3 -mcpu=cortex-a9 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mthumb”用于 Cortex-A9;对于 Cortex-A15、Cortex-A8 和 Cortex-A5,相应地替换 -mcpu=-mtune=cortex-a15/a8/a5。 gcc 没有针对 Qualcomm CPU 的优化,因此对于 Qualcomm Scorpion 使用 Cortex-A8 参数(并且展开比平时更多),对于 Qualcomm Krait 尝试使用 Cortex-A15 参数(您需要最新版本的 gcc 支持它)。

关于c++ - NEON 浮点乘法比预期慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com