【问题标题】:AVX load instruction with increment带增量的 AVX 加载指令
【发布时间】:2016-03-16 00:38:07
【问题描述】:

是否有 AVX 指令能够从带有增量的常规对齐向量中加载四个双精度值?因此,如果我想要像 _mm256_load_pd(a) 这样的调用,增量为 4,因此不会加载值 a[0]a[1]a[2]a[3],而是加载 a[0]a[4]、@ 987654328@和a[12]?

【问题讨论】:

  • 您正在寻找一个收集负载。它们存在于 Haswell 中,但它们太慢了,使用标量加载 + 洗牌要快得多。
  • 你能给我这种类型的负载的内在函数吗?我没有 Haswell,它的 IvyBrdige(不是 AVX2?)。
  • 见保罗的回答。 Ivy Bridge 只有 AVX。它没有收集指令。但让我重申一下,你真的不想想要使用它们。至少对于当前这一代处理器来说不是。
  • 是的,我明白这一点。我的意思是标量负载。因为我只找到读取 4 个值的负载,例如 load_pd 和在负载中的标量,它同时存储在所有四个寄存器中,而不仅仅是第一个。
  • 您能否描述更多您正在尝试做的事情?我的意思是,例如,如果您阅读 0,4,8,12,然后阅读 1,5,9,13,...您可以这样做,例如转置。

标签: x86 vectorization simd avx


【解决方案1】:

如果您有 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。

如 cmets 中所述,Haswell 上的收集负载很慢,但如果您需要此访问模式用于后续 256 位 SIMD 操作,它们可能仍然值得。由于您使用的是doubles,因此任何好处都可能很小,因此您可能还想针对传统的标量实现进行基准测试。

【讨论】:

  • 我需要加载和存储的模式。对于计算,我可以在没有随机播放和掩码的情况下进行简单的算术运算。
猜你喜欢
  • 2019-07-29
  • 2016-06-19
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2017-04-26
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多