英特尔收集指令

时间:2016-02-13 01:49:19

标签: intrinsics avx2

我对英特尔如何收集内在作品感到有些困惑。

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

我只是随机打印出一些值来检查正确性。我发现如果"零"我可以得到y [10]和y [11]等于2.46。用来。但是,当我使用" stride"时,我会得到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);
}

0 个答案:

没有答案