问题标签 [avx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何有效地结合 SSE 中的比较?
我正在尝试将以下代码转换为 SSE/AVX:
这里 N 是一个很小的常数,比如说 8。 if(...) 语句在大多数情况下的计算结果为 false。
第一次尝试:
这有效,并且相当快。问题是,有没有更有效的方法来做到这一点?特别是,如果有一个寄存器包含 SSE 或 AVX 比较浮点数(放置0xffff
或0x0000
放入该插槽)的结果,那么所有比较的结果如何(例如)与 -ed 或 or-ed 在一起,一般来说? PMOVMSKB
(或相应的内在)是_mm_movemask
执行此操作的标准方法吗?
另外,如何在上面的代码中使用 AVX 256 位寄存器而不是 SSE?
编辑:
使用 VPTEST(来自 _mm_test* 内在)对版本进行测试和基准测试,如下所示。
这也有效,而且速度很快。对此(Intel i7-2630QM、Windows 7、cygwin 1.7、cygwin gcc 4.5.3 或 mingw x86_64 gcc 4.5.3、N=8)进行基准测试表明,这与 64 位上的上述代码速度相同(小于 0.1%) . 内部循环的任一版本平均运行大约 6.8 个时钟,这些数据都在缓存中,并且比较总是返回 false。
有趣的是,在 32 位上,_mm_test 版本的运行速度慢了大约 10%。事实证明,编译器在循环展开后会溢出掩码,并且必须重新读取它们;这可能是不必要的,并且可以在手动编码组装中避免。
选择哪种方法?似乎没有令人信服的理由更VPTEST
喜欢VMOVMSKPS
. 实际上,有一个更喜欢的理由VMOVMSKPS
,即它释放了一个 xmm 寄存器,否则该寄存器会被掩码占用。
intel - 英特尔 SSE 和 AVX 示例和教程
是否有任何好的 C/C++ 教程或示例来学习英特尔 SSE 和 AVX 指令?
我在 Microsoft MSDN 和 Intel 网站上发现很少,但从基础知识了解它会很棒..
c++ - m256_f32 的 GCC 等效项
我有这样的 AVX C++ 代码,在 Visual Studio 2010 下编译得很好:
然而,GCC 给出了以下错误:
我做了一些研究,这似乎ymm0.m256_f32
是 Microsoft 特定的指令,用于从长 AVX 寄存器中提取单个浮点数。但是我可以用什么来让 gcc/linux 做同样的事情呢?
c - AVX 中 SSE unpacklo_ps/unpackhi_ps 的等价物(双打)
在 SSE 中,如果我有一个包含 4 个浮点数的 128 位寄存器,即
和
那么如果我想要
我可以简单地做:
同样,如果我想要
我可以:
如果我有一个包含双精度的 AVX 寄存器,是否可以用一条指令来做同样的事情?
根据这些内在函数的工作方式,我知道我不能使用_mm256_unpacklo_pd()
,_mm256_shuffle_pd()
或. 除了这些我可以使用的任何指令还是我必须使用上述指令的组合?_mm256_permute2f128_pd()
_mm256_blend_pd()
c++ - SSE / AVX 对齐内存上的 valarray
有没有办法确保valarray
使用对齐的内存,以便可以使用 SSE 和 AVX 对其进行矢量化?据我所知,STL 不能保证对齐,并且您不能将分配器传递给 valarray。还有另一种方法可以实现这一目标吗?
提前谢谢!
gcc - gcc 选项同时使用 i87、AVX 但不使用 SSE
当为支持AVX
扩展的处理器编译时(比如说适用),同时使用键-m64 -march=corei7-avx -mtune=corei7-avx
是否有意义?-mfpmath=both -mavx
这不是导致编译器同时使用三组指令(i87
, SSE
, AVX
)吗?还是仅i87
针对标量(在某种意义上)和AVX
仅针对向量?
gcc - MinGW(甚至 gcc)的 mfpmath 选项
带有命令行选项(甚至带有)的MinGW-march=corei7-avx -mtune=corei7-avx
的or-march=corei7 -mtune=corei7 -mavx
命令行选项是否可以将AVX指令用于数学例程?请注意,从这里开始不起作用(对于MinGW上的最新版本,这是“无法识别的选项” )。-mfpmath=sse
-mfpmath=both
--with-fpmath=avx
sse - 如何将 __m256d 中的所有元素设置为另一个 __m256d 的第三个元素?
使用 4 个打包float
( __m128
),我可以使用 SSE 内在函数
将所有元素设置H
为第三个元素X
(这是最快的方法吗?)
现在,我想对 4 个打包double
( __m256d
) 做同样的事情。我天真地编码
但这不正确!相反,它设置 H={X[1],X[1],X[3],X[3]}。
那么,怎么做才对呢?
编辑
使用 Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
c - 使用 AVX 的有符号/无符号整数的最小值
我正在查看 AVX 指令指南,虽然有 32 位整数值的加载、存储和置换操作,但其他操作(例如确定最小值或最大值)或随机操作仅适用于浮点数和双精度数。
因此,如果我想将这些操作用于 32 位整数,我是否需要将其类型转换为浮点数,然后再将其类型转换回来,或者是否还有其他一些我遗漏的指令?
此外,如果我想在 32 位整数上使用它,洗牌掩码是否与浮点数一样?
x86 - 8 个压缩的 32 位浮点数的水平总和
如果我有 8 个压缩的 32 位浮点数 ( __m256
),那么提取所有 8 个元素的水平总和的最快方法是什么?同理,如何获得水平最大值和最小值?换句话说,以下 C++ 函数的最佳实现是什么?