26得票2回答
AVX2中的gather指令是如何实现的?

假设我正在使用AVX2的VGATHERDPS,这应该使用8个DWORD索引来加载8个单精度浮点数。 当要加载的数据存在于不同的高速缓存行中时会发生什么?该指令是否作为硬件循环实现,逐个获取高速缓存行?还是它可以一次发出多个高速缓存行的加载? 我阅读了几篇论文,其中提到了前者(并且这是我更能...

26得票5回答
如何执行 _mm256_movemask_epi8 (VPMOVMSKB) 的反操作?

内在价值:int mask = _mm256_movemask_epi8(__m256i s1) 创建一个掩码,其32位对应于s1每个字节的最高有效位。使用位操作(例如BMI2)操作掩码后,我想执行_mm256_movemask_epi8的反操作,即创建一个__m256i向量,其中每个字节的最...

25得票3回答
SSE (SIMD): 向量乘以标量

我程序中常见的操作是对向量进行标量缩放(V*s,例如[1,2,3,4]*2 == [2,4,6,8])。除了首先在向量中每个位置加载标量(例如_mm_set_ps(2,2,2,2))然后再进行乘法外,是否有SSE(或AVX)指令可以执行此操作呢? 这是我现在所做的:__m128 _scala...

25得票2回答
System.Numerics.VectorX的包装很耗费资源 - 为什么?

TL;DR: 为什么包装System.Numerics.Vectors类型很耗费资源,有没有什么方法可以解决?考虑下面的代码片段:[MethodImpl(MethodImplOptions.NoInlining)] private static long GetIt(long a, long ...

25得票1回答
GCC不能像C数组一样优化对齐的std :: array。

这是一段使用std::array时,GCC 6和7无法进行优化的代码:#include <array> static constexpr size_t my_elements = 8; class Foo { public: #ifdef C_ARRAY typedef...

24得票2回答
所有64位英特尔架构都支持SSSE3/SSE4.1/SSE4.2指令吗?

我在网上搜索并阅读了英特尔软件手册。但是,我无法确定所有英特尔64体系结构是否支持最高到SSSE3,SSE4.1,SSE4.2或AVX等级别的指令。为了让我的程序能够使用最少的SIMD支持指令,请帮忙确认。

24得票4回答
如何将128位立即数移动到XMM寄存器

已经有一个问题与此相关,但由于“含糊不清”而关闭,因此我开了一个新的问题 - 我找到了答案,也许它会帮助其他人。 问题是:如何编写一系列汇编代码以使用128位立即值(常量)初始化XMM寄存器?

23得票3回答
使用AVX指令进行水平向量求和的最快方法

我有一个包含四个64位浮点数值的紧凑型向量。 我希望获取该向量元素的总和。 使用SSE(并使用32位浮点数),我可以执行以下操作:v_sum = _mm_hadd_ps(v_sum, v_sum); v_sum = _mm_hadd_ps(v_sum, v_sum); 很遗憾,即使AVX具有...

23得票2回答
浏览器JavaScript是否支持SIMD或向量化操作?

我希望使用JavaScript编写需要大量数值计算的应用程序。但是,我对客户端JavaScript中高效线性代数类计算的状态感到非常困惑。似乎有许多方法,但没有明确表明它们的就绪状态。它们中的大多数似乎限制了允许进行计算的向量和矩阵的大小。 WebGL 显然可以在GPU上进行向量和矩阵计算...

23得票1回答
使用SSE计算绝对值的最快方法

我知道3种方法,但据我所知,通常只使用前两种: 使用andps或andnotps屏蔽符号位。 优点:如果掩码已在寄存器中,则只需要一条快速指令,非常适合在循环中多次执行此操作。 缺点:掩码可能不在寄存器中,更糟的是,甚至不在缓存中,导致非常长的内存提取时间。 从零开始减去该值以进行否...