我对英特尔如何收集内在作品感到有些困惑。
我有以下简单的代码。其中一个是设置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);
}