sse

Ubuntu - 如何判断 CPU 应用程序当前正在使用 AVX 还是 SSE?

我目前在许多具有 GPU 的服务器上运行 BOINC。 服务器运行 GPU 和 CPU BOINC 应用程序。 由于 AVX 和 SSE 在 CPU 应用程序中使用时会降低 CPU 频率,因此我必须选择一起运行哪个 CPU/GPU,因为某些 GPU 应用程序会遇到瓶颈(运行时间完成速度较慢),而其他应用程序则这样做不是。 目前,一些 CPU 应用程序已命名,因此可以清楚地看到它们是否使用 A... »

在我的 c++ builder 应用程序中包含 xmmintrin.h 的问题

我正在尝试编写一些 SIMD 代码(在 C++Builder 10.1 Berlin 中),但在 mmintrin.h 中出现 E2257 错误(包含在 xmmintrin.h 中,应该包含在SIMD 的东西)。有一堆相同的错误,所以 bcc32 似乎无法处理这些标头中的语法。 例如,所有包含__atribute__ 的行似乎都会导致此错误: typedef long long __m64 __a... »

c++

检查 __m128i 是否为零?

我发现了这个问题: Is an __m128i variable zero? 我用来创建以下示例: int main(){ __m128i intrinreg; intrinreg.m128i_i64[0] = 0; intrinreg.m128i_i64[1] = 6; __m128i zero = _mm_setzero_si128(); i... »

c++

AVX2 中的 VPERMB 在哪里?

AVX2 有很多好东西。例如,它有很多指令,这些指令比它们的前身要强大得多。以VPERMD 为例:它允许您完全任意地从一个 256 位长的 32 位值向量广播/洗牌/置换到另一个,并在运行时选择置换1。从功能上讲,这淘汰了一大堆现有的旧解包、广播、置换、随机播放和移位指令3。 酷豆。 那么VPERMB 在哪里?即,相同的指令,但在字节大小的元素上工作。或者,就此而言,对于 16 位元素,VPE... »

CRC32C SSE 与 BOOST

我正在尝试优化我的一段运行 CRC32 检查的代码。 对于测试缓冲区,我做了以下操作: char *buff = new char[1024]; for (int i = 0; i < 1024; ++i) buff[i] = i; 目前,我使用boost的crc实现如下: boost::crc_optimal<32, 0x1EDC6F41, 0, 0> cr... »

为什么添加 xorps 指令会使此函数使用 cvtsi2ss 并增加约 5 倍的速度?

我在使用 Google Benchmark 优化函数时搞砸了,遇到了我的代码在某些情况下意外变慢的情况。我开始尝试它,查看已编译的程序集,并最终提出了一个显示该问题的最小测试用例。这是我想出的展示这种减速的程序集: .text test: #xorps %xmm0, %xmm0 cvtsi2ss %edi, %xmm0 addss %xmm0, %xm... »

使用 SIMD 查找表

我有一个大像素处理函数,我目前正在尝试使用内部函数进行优化。 作为 SSE 新手,我不知道如何处理涉及查找表的代码部分。 基本上,我正在尝试对以下 vanilla C++ 代码进行矢量化: //outside loop const float LUT_RATIO = 1000.0F; //in loop float v = ... //input value v = myLookupTa... »

c++

float4::set_wxy(和其他 set-swizzle 操作)的更好的 SSE2 实现?

我正在使用 SSE2/AVX 内在函数在 C++ 中编写符合 HLSL float4 的类型,目前我正在实现 HLSL 中可用于 float4 的所有 set-swizzle 操作。我试图找出一个最佳的 SSE2 实现来处理涉及(swizzle)设置 2 或 3 个组件的 set-swizzle 操作(因为使用一个 SSE shuffle 操作来实现 4-component set-swizzle... »

c++

静态/静态本地 SSE/AVX 变量是否阻塞了 xmm/ymm 寄存器?

使用 SSE 内在函数时,通常需要零向量。避免在函数被调用时(每次有效地调用一些异或向量指令)在函数内部创建零变量的一种方法是使用静态局部变量,如 static inline __m128i negate(__m128i a) { static __m128i zero = __mm_setzero_si128(); return _mm_sub_epi16(zero, a); } ... »

c++

如何检查 AVX 内在 __m256 的 inf

检查 AVX 内在 __m256(8 个向量 float)是否包含任何 inf 的最佳方法是什么?我试过了 __m256 X=_mm256_set1_ps(1.0f/0.0f); _mm256_cmp_ps(X,X,_CMP_EQ_OQ); 但这与true 相比。请注意,此方法将找到 nan(与 false 相比)。所以一种方法是检查X!=nan && 0*X==nan: ... »

c++

在 64 位处理器上安装 SSE 4.2 是否合理?

SSE 4.2 对一次 16 字节的两个操作数进行比较。但是也可以用普通的处理器指令比较两个8字节的操作数。 差别不大,才有这种比较的特殊硬件实现。 SSE 4.2 是否如此无关紧要,还是我错过了什么? ... »

矩阵乘法的 sse 精度误差

我的程序执行 NxN 矩阵乘法,其中两个矩阵的元素都使用 for 循环初始化为值 (0, 1, 2, ... N)。两个矩阵元素都是浮点类型。不存在内存分配问题。矩阵大小输入为 4 的倍数,例如:4x4 或 8x8 等。通过顺序计算验证答案。在 64x64 的矩阵大小下一切正常。仅当矩阵大小超过 64(例如:68 x 68)时,才会观察到顺序版本和 SSE 版本之间的差异。 SSE sn-p如... »

c

尝试初始化 __m128 类成员变量时的 EXC_BAD_ACCESS 信号

我正在使用 Apple GCC 4.2.1,我偶然发现了以下代码的一个奇怪问题...我在尝试初始化 __m128 类成员变量。不幸的是,下面的简化代码在测试应用程序中工作,但也许你仍然可以帮助我找到这个问题的根源? 我不明白 EXC_BAD_ACCESS 异常背后的原因 - __m128 类型不是指针,所有其他 MyClass 成员都在没有的情况下初始化和访问任何问题,没有堆栈/堆损坏的迹象,如... »

c++

估计每条指令的周期

我已经反汇编了一个使用 MSVC v140 编译的小型 C++ 程序,并试图估计每条指令的周期,以便更好地了解代码设计如何影响性能。我一直在关注 Mike Acton 在 "Data-Oriented Design and C++" 上的 CppCon 2014 演讲,特别是我链接到的部分。 在其中,他指出了以下几行: movss 8(%rbx), %xmm1 movss 12(%rb... »

在 x86 中向 xmm 寄存器添加一个常量值

如何将1 或2 添加到寄存器xmm0(双精度)? 我可以这样做,但肯定有更简单的方法: movsd xmm0, [ecx] xor eax, eax 公司 cvtsi2sd xmm1, eax 添加 xmm0, xmm1 movsd [ecx], xmm0 也可以用浮点 x87 指令来做到这一点吗? 这对我不起作用: fld dword ptr [ecx] fld1 faddp... »