c - 使用没有内在函数的 gcc/clang 向量化残差平方和

标签 c performance sse avx

我试图说服 gcc (4.8.1) 或 clang (3.4) 对以下内容进行矢量化 ivy 桥处理器上的代码:

#include "stdlib.h"
#include "math.h"

float sumsqr(float *v, float mean, size_t n) {
    float ret = 0;
    for(size_t i = 0; i < n; i++) {
        ret += pow((v[i] - mean), 2);
    }
    return ret;
}

编译失败

$ gcc -std=c99 -O3 -march=native -mtune=native -ffast-math -S foo.c

有没有办法在不使用内部函数或修改 gcc 调用的情况下修改代码以获得矢量化代码?

最佳答案

pow 函数非常通用,编译器可能看不到它的作用(记住它可以计算类似 pow(1.8, -3.19) 的东西. 因此,仅使用内置操作而不进行函数调用可能会有所帮助:

for(size_t i = 0; i < n; i++)
{
    float const x = v[i] - mean;
    ret += x * x;
}

关于c - 使用没有内在函数的 gcc/clang 向量化残差平方和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22037044/

相关文章:

ios - 在 CABasicAnimation 中改变 CALayer 的速度,同时旋转一个轮子会导致 jerk 效果

C++ 中 SSE/AVX 的 x86 CPU 调度

c - WTS_CLIENT_ADDRESS 地址无法正确打印

C:返回行中的 OR 运算符?

c# - "readonly"(C#) 会减少内存使用吗?

java - Java 中 Bouncy CaSTLe 的性能

c - "if"条件不工作

c - C 中的字符串减速长度

c - 为什么 gcc 只用 _mm_set_ss 添加这个 movss 指令?

具有多种功能的 C++ SSE 优化