16得票1回答
当编译器在Sandy上重新排序AVX指令时,是否会影响性能?

请不要说这是过早的微观优化。我想尽可能地了解所描述的Sandy Bridge功能和汇编语言工作原理,并确保我的代码利用了这个架构特性。谢谢您的理解。 几天前我开始学习Intrinsics,所以答案对于一些人来说可能很明显,但我没有可靠的信息来源来解决这个问题。 我需要为Sandy Brid...

16得票5回答
如何从AVX寄存器中获取数据?

我使用MSVC 2013和AVX 1,在一个寄存器中有8个浮点数:__m256 foo = mm256_fmadd_ps(a,b,c); 现在我想对8个浮点数调用 inline void print(float) {...}。看起来使用 Intel AVX指令集会使这变得非常复杂:print(...

16得票1回答
能否在Rust中使用SIMD指令?

在C/C++中,您可以使用SIMD指令(如AVX和AVX2)的Intrinsics。是否有一种方法在Rust中使用SIMD?

16得票1回答
未对齐加载与未对齐存储

简短的问题是,如果我有一个函数需要接收两个向量作为参数。其中一个是输入向量,另一个是输出向量(没有别名)。我只能对其中一个进行内存对齐,应该选择哪一个? 更详细的版本是,考虑一个函数,void func(size_t n, void *in, void *out) { __m256i...

16得票1回答
_mm256_lddqu_si256和_mm256_loadu_si256有什么区别?

我之前使用_mm256_lddqu_si256,是在网上找到的一个例子。后来,我发现了_mm256_loadu_si256。英特尔指令集手册中只说明了当跨越缓存行边界时,lddqu版本可能会表现得更好。那么loadu有什么优势呢?一般来说,这些函数有何不同之处?

16得票2回答
为什么SSE指令保留YMM寄存器的上128位?

这似乎是一个经常出现的问题,许多Intel处理器(直到Skylake为止,除非我错了)在混合AVX-256指令和SSE指令时表现不佳。 根据Intel的文档,这是由于SSE指令被定义为保留YMM寄存器的上128位,因此为了能够通过不使用AVX数据路径的上128位来节省功率,CPU在执行SSE...

16得票1回答
根据精度,使用SSE/AVX快速矢量化的rsqrt和倒数。

假设需要计算打包的浮点数据的倒数或倒数平方根。两者都可以通过以下方式轻松完成: __m128 recip_float4_ieee(__m128 x) { return _mm_div_ps(_mm_set1_ps(1.0f), x); } __m128 rsqrt_float4_ieee(_...

15得票2回答
使用未对齐缓冲区进行向量化:使用VMASKMOVPS:从不对齐计数生成掩码?或者根本不使用该指令。

使用-O3 -mavx -mtune=haswell编译器选项的gcc 5.3版本用于x86-64架构,对于像下面这样需要处理可能未对齐的数据输入的代码来说,会生成令人惊讶的臃肿代码:// convenient simple example of compiler input // I'm n...

15得票2回答
使用AVX/AVX2指令集的对齐和非对齐内存访问

根据英特尔的软件开发手册(第14.9节),AVX放宽了内存访问的对齐要求。如果数据直接在处理指令中加载,例如:vaddps ymm0,ymm0,YMMWORD PTR [rax] 负载地址不必对齐。但是,如果使用专用的对齐负载指令,例如vmovaps ymm0,YMMWORD PTR [rax...

15得票3回答
高效地在大型数组中查找最低有效位(least significant set bit)?

我有一个巨大的内存块(位向量),大小为N比特,位于一页内存中,平均而言N大约是5000,即5k比特来存储一些标志信息。 在某个时间点(超频繁 - 关键时刻),我需要在整个大位向量中找到第一个设置的位。现在我是按64字处理的,即利用__builtin_ctzll的帮助来完成这项工作。但是当N变大...