GCC 4.8.2向量化避免简单循环

时间:2014-09-10 16:32:52

标签: c gcc vectorization

以下是我的C代码的摘录。我希望我复制了所有相关部分。

#define SIN_LEN 22050
#define CALC_N 4100
#define CHUNK_LEN 22050

float __attribute__((aligned(16))) sin_array[SIN_LEN];
float __attribute__((aligned(16))) cos_array[SIN_LEN];
short __attribute__((aligned(16))) data[CHUNK_LEN];
size_t __attribute__((aligned(16))) a1[CHUNK_LEN];
float sinus_sum  __attribute__((aligned(16)));
float cosinus_sum __attribute__((aligned(16)));
float __attribute__((aligned(16))) temp1[CHUNK_LEN];
float __attribute__((aligned(16))) temp2[CHUNK_LEN];

void sin_summ(long n, float* restrict sin_s, float* restrict cos_s ) {
    sinus_sum = 0;
    cosinus_sum = 0;
    for (int i = 0; i < CHUNK_LEN; i++ ) 
        a1[i] = (n*i) % SIN_LEN;
    for (int i = 0; i < CHUNK_LEN; i++) {
        temp1[i] = sin_array[a1[i]];
        temp2[i] = cos_array[a1[i]];
    }
    for (int i = 0; i < CHUNK_LEN; i++) {
        sinus_sum += data[i] * temp1[i];
        cosinus_sum += data[i] * temp2[i];
    }
    *sin_s = sinus_sum;
    *cos_s = cosinus_sum;
    return;
}

函数sin_summ也在循环中调用。 GCC参数是-O3 -march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -ffast-math -mfpu=neon -ftree-vectorize -ftree-vectorizer-verbose=1 -funsafe-math-optimizations -fstrict-aliasing -Wstrict-aliasing架构是armv7-neon(BeagleBone Black)。

问题是循环#1和#3是矢量化的,但#2不是。我想这是因为[a[i]]部分。 有人请建议如何使其可矢量化。现在单个非矢量化循环的工作速度比此处写的速度快40%。

0 个答案:

没有答案