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