是否有 AVX 指令能够从常规的增量对齐向量中加载四个 double 值?因此,如果我想要像 _mm256_load_pd(a)
这样的调用,只需增量 4,这样值就不会是 a[0]
、a[1]
、a[2]
和 a[3]
已加载,但 a[0]
、a[4]
、a[8]
和 a[12]
?
最佳答案
如果您有 AVX2(Haswell 及更高版本),那么您可以使用聚集负载,例如_mm256_i32gather_pd
。来自 Intel Intrinsics Guide :
Synopsis
__m256d _mm256_i32gather_pd (double const* base_addr, __m128i vindex, const int scale)
#include "immintrin.h"
Instruction:
vgatherdpd ymm, vm64x, ymm
CPUID Flags:
AVX2
Description
Gather double-precision (64-bit) floating-point elements from memory using 32-bit indices. 64-bit elements are loaded from addresses starting at base_addr and offset by each 32-bit element in vindex (each index is scaled by the factor in scale). Gathered elements are merged into dst. scale should be 1, 2, 4 or 8.
正如评论中已经指出的那样,收集的负载在 Haswell 上速度很慢,但如果您需要这种访问模式来进行后续的 256 位 SIMD 操作,那么它们可能仍然是值得的。由于您使用的是 double ,因此任何好处可能都很小,因此您可能还想针对传统标量实现进行基准测试。
关于x86 - 带增量的 AVX 加载指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34200839/