是否有AVX指令能够从常规的对齐矢量中加载四个双精度值?因此,如果我想要_mm256_load_pd(a)
这样的调用只增加4,那么就不会加载值a[0]
,a[1]
,a[2]
和a[3]
,但是a[0]
,a[4]
,a[8]
和a[12]
?
答案 0 :(得分:3)
如果你有AVX2(Haswell及更高版本),那么你可以使用聚集的负载,例如_mm256_i32gather_pd
。来自Intel Intrinsics Guide:
概要
__m256d _mm256_i32gather_pd (double const* base_addr, __m128i vindex, const int scale)
#include "immintrin.h"
说明:
vgatherdpd ymm, vm64x, ymm
CPUID标志:
AVX2
描述
使用32位索引从内存中收集双精度(64位)浮点元素。 64位元素从base_addr开始的地址加载,并由vindex中的每个32位元素偏移(每个索引按比例缩放)。收集的元素合并到dst。比例应为1,2,4或8。
正如评论中已经指出的那样,Haswell收集的负载很慢,但如果您需要这种访问模式用于后续的256位SIMD操作,它们仍然是值得的。由于您使用的是double
,因此任何好处都可能很小,因此您可能还希望对传统的标量实现进行基准测试。