13得票3回答
在打包的SSE浮点数上翻转符号

我正在寻找在SSE寄存器中翻转所有四个浮点数符号的最有效方法。 在英特尔架构软件开发手册中,我没有找到完成该操作的内置函数。以下是我已经尝试过的方法。 对于每种情况,我循环执行代码100亿次,并获得所示的墙时。我试图至少与我的非SIMD方法匹配4秒钟的时间, 该方法仅使用一元负运算符。 ...

7得票4回答
在寄存器中快速排序字节?

给定一个4字节的寄存器(或16个字节的SIMD寄存器),必须有一种有效的方法使用少量指令在寄存器中对字节进行排序。 提前感谢。

14得票5回答
AVX加速下最快的指数函数实现

我正在寻找一个在AVX元素(单精度浮点数)上快速处理指数函数的高效近似方法,即__m256 _mm256_exp_ps(__m256 x),不使用SVML。 相对精度应该达到大约1e-6或约20个尾数位(2的20次方中的1个部分)。 如果它是用英特尔内在函数以C风格编写的,我会很高兴。 代...

9得票2回答
使用AVX对64位结构体进行排序?

我有一个包含多个数据的64位结构体,其中之一是浮点数值: struct MyStruct{ uint16_t a; uint16_t b; float f; }; 假设我有四个这样的结构体,放在一个 std::array<MyStruct, 4> 中...

12得票1回答
字节数组置换 SSE 优化

我想使用SSE内嵌函数翻译这段代码。我找到了pshufb SSSE3指令和类似的__builtin_ia32_pshufb128(v128i, v128i) GCC内部函数,可能可以与此代码一起使用。该代码通过以特定方式交换数组中的字节,按索引k排列字节向量s。void permutation...

10得票3回答
C++如何编写代码,以便编译器可以轻松优化为SIMD?

我在使用Visual Studio 2008,项目设置中有一个“启用扩展指令集”的选项,可以将其设置为None、SSE或SSE2。 因此,编译器会尝试将指令批量处理,以利用SIMD指令吗? 有没有规则可以遵循来优化代码,使得编译器能够使用这些扩展生成有效的汇编语言呢? 例如,我目前正在编...

59得票2回答
如何选择AVX比较谓词变体

在高级矢量扩展(AVX)中,比较指令(例如_m256_cmp_ps)的最后一个参数是比较谓词。我对谓词的选择感到不知所措。它们似乎是类型、排序、信号的三元组。例如,_CMP_LE_OS表示“小于等于、有序、信号”。 首先,选择信号或非信号是否有性能原因?同样,有序还是无序比另一个更快? 那...

8得票2回答
SIMD/SSE新手:简单图像滤波

我对SIMD/SSE非常陌生,现在正尝试做一些简单的图像滤波(模糊)。 下面的代码使用水平方向上的简单[1 2 1]加权对8位灰度位图的每个像素进行过滤。我每次同时处理16个像素的总和。 在这段代码中,最让我感到不好的是它有很多的插入/提取操作,这并不十分优雅,也可能会拖慢速度。当移位时,...

22得票5回答
如何将两个__m128值合并为__m256?

我想将两个__m128值合并为一个__m256。 例如:__m128 a = _mm_set_ps(1, 2, 3, 4); __m128 b = _mm_set_ps(5, 6, 7, 8); 变成类似于这样的内容:__m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 };...

18得票3回答
我应该使用SIMD或矢量扩展还是其他什么?

我目前正在使用c++(带有c++11)开发一个开源的3D应用程序框架。我的数学库的设计类似于XNA数学库,也考虑了SIMD。但目前它并不是真正的快速,并且存在内存对齐问题,但这些问题会在另一个问题中讨论。 几天前我问自己为什么要编写自己的SSE代码。当优化开启时,编译器也能生成高度优化的代码...