13得票2回答
在amd64上使用SIMD时,何时更好地使用更多指令而不是从内存中加载?

我有一些高性能代码。使用SSEn和AVX的SIMD实现需要约30条指令,而使用4096字节查找表的版本只需要约8条指令。在微基准测试中,查找表快了40%。如果我进行缓存无效化测试,每100次迭代,它们看起来差不多。在我的实际程序中,似乎非加载版本更快,但很难得到可靠的测量结果,而我的测量结果两...

7得票1回答
当使用未格式化的数据时,loadu_ps和set_ps有什么区别?

我有一些数据,它没有以数组结构存储。在寄存器中加载数据的最佳实践是什么? 使用_mm_loadu_ps时,我会将数据复制到临时堆栈数组中,而不是直接将数据复制为值。这样做有什么区别吗? __m128 _mm_set_ps (float e3, float e2, float e1, fl...

15得票2回答
浮点数相等比较的SIMD指令(包括NaN == NaN)

用于比较由4 * 32位浮点值组成的两个128位向量的指令是什么? 是否有一种指令将两侧都为NaN值视为相等?如果没有,提供反射性(即NaN等于NaN)的解决方法会对性能产生多大影响? 我听说确保反射性与IEEE语义相比会对性能产生显着影响,其中NaN不等于自身,我想知道这种影响有多大。 ...

20得票3回答
快速、无分支的无符号整数绝对差

我有一个程序,它大部分时间都在计算RGB值之间的欧几里得距离(三元组无符号8位Word8)。我需要一种快速、无分支的无符号整数绝对差函数,使得unsigned_difference :: Word8 -> Word8 -> Word8 unsigned_difference a b...

11得票5回答
在x86_64上是否可以对“myNum += a[b[i]] * c[i]”进行矢量化?

如果可能的话,在x86_64上使用哪些内在函数可以将以下代码向量化?double myNum = 0; for(int i=0;i<n;i++){ myNum += a[b[i]] * c[i]; //b[i] = int, a[b[i]] = double, c[i] = do...

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

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

20得票2回答
AVX2:计算512个浮点数组的点积

我先说明一下,我对SIMD指令是一个完全的新手。 基本上,我的CPU支持AVX2指令(Intel(R) Core(TM) i5-7500T CPU @ 2.70GHz)。我想知道计算大小为512的两个std::vector<float>的点积的最快方法。 我在网上找到了这个和这...

9得票2回答
使用SSE/AVX指令集进行快速的点积运算

我希望您能够快速计算具有3或4个分量的向量的点积。我尝试了几种方法,但大多数在线示例使用浮点数组,而我们的数据结构不同。 我们使用16字节对齐的结构体。代码摘录(简化): struct float3 { float x, y, z, w; // 4th component unus...

7得票1回答
没有AVX(2),最快的进行SIMD gather的方式是什么?

假设我拥有 SSE 到 SSE4.1,但没有 AVX(2),那么加载这样一个打包的内存布局的最快方法是什么(所有的 32 位整数): a0 b0 c0 d0 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3 将四个向量分别命名为a,b,c,d? a: {a0, a...

7得票1回答
AVX2技术可以加速查找表操作

我正在尝试加速一种执行一系列查找表的算法。我想使用SSE2或AVX2。我已经尝试使用_mm256_i32gather_epi32命令,但速度慢了31%。有人有任何改进建议或不同的方法吗? 时间: C代码= 234 聚合= 340 static const int32_t g_tables[...