查看AVX2内在函数文档,收集了加载指令,例如VPGATHERDD:
__m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale);
Run Code Online (Sandbox Code Playgroud)
从文档中我不清楚的是计算的加载地址是 元素地址还是字节地址,即元素的加载地址i:
load_addr = base + index[i] * scale; // (1) element addressing ?
Run Code Online (Sandbox Code Playgroud)
要么:
load_addr = (char *)base + index[i] * scale; // (2) byte addressing ?
Run Code Online (Sandbox Code Playgroud)
从英特尔文档看起来它可能是(2),但是这没有多大意义,因为聚集的负载的最小元素大小是32位 - 为什么要从未对齐的地址加载(即使用比例<4) )?