增量为

时间:2015-12-10 11:34:06

标签: x86 vectorization simd avx

是否有AVX指令能够从常规的对齐矢量中加载四个双精度值?因此,如果我想要_mm256_load_pd(a)这样的调用只增加4,那么就不会加载值a[0]a[1]a[2]a[3],但是a[0]a[4]a[8]a[12]

1 个答案:

答案 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,因此任何好处都可能很小,因此您可能还希望对传统的标量实现进行基准测试。