2

我对英特尔如何收集内在函数有点困惑。

我有以下简单的代码。其中一个是设置y[0]=y[1] = x[0], ... y[20002]=y[20003]=x[10002],另一个是设置y[i] = x[i], y[i+1] = x[i+2]。

我只是随机打印出一些值来检查正确性。我发现如果使用“zeros”,我可以让 y[10] 和 y[11] 都等于 2.46。但是,当我使用“步幅”时,我会得到一个 y[11] 的随机数,而 y[10] 仍然是 2.46。知道出了什么问题吗?

#include <stdio.h>
#include <xmmintrin.h>
#include <immintrin.h>

void dummy(double *x, double *y) {
    printf("%lf, %lf\n", y[10], y[11]);
    return;
}

int main() {

    double x[20004];
    double y[20004];
    __m128i zeros = _mm_set_epi64x(0, 0);
    __m128i stride = _mm_set_epi64x(2, 0);

    for (int i = 0; i <= 20004; ++i) {
       x[i] = i * 0.246;
    }

    for (int j = 0; j <= 10000; j+=2) {
    #ifdef ZERO

        __m128d gather = _mm_i64gather_pd(&x[j], zeros, 1);
    #else

        __m128d gather = _mm_i64gather_pd(&x[j], stride, 1);
    #endif

       _mm_store_pd(&y[j], gather);
   }

    dummy(x, y);
}
4

0 回答 0