相关疑难解决方法(0)

动态确定恶意AVX-512指令的执行位置

我有一个在支持AVX-512的Intel机器上运行的进程,但是这个进程不直接使用任何AVX-512指令(asm或内在函数)并且编译时-mno-avx512f使编译器不插入任何AVX-512指令.

然而,它在减少的AVX turbo频率下无限运行.毫无疑问,有一个AVX-512指令在某个地方偷偷摸摸,通过一个库,(非常不可能)系统调用或类似的东西.

而不是尝试"二进制搜索"AVX-512指令来自哪里,有没有什么方法可以立即找到它,例如,捕获这样的指令?

操作系统是Ubuntu 16.04.

linux performance x86 intel avx512

15
推荐指数
1
解决办法
648
查看次数

SIMD指令降低CPU频率

我读了这篇文章。它谈到了为什么AVX-512指令:

英特尔最新的处理器具有高级指令(AVX-512),这可能会导致内核或其他CPU的运行速度变慢,这是因为它们使用了多少电量。

我认为在Agner的博客上也提到了类似的内容(但我找不到确切的帖子)。

我想知道Skylake支持的其他哪些指令会产生类似的效果,即它们会降低功耗以在以后最大化吞吐量吗?所有前缀v指令(如vmovapdvmulpdvaddpdvsubpdvfmadd213pd)?

我正在尝试编译说明列表,以避免在为Xeon Skylake编译C ++应用程序时避免。

optimization x86 intel compiler-optimization avx512

12
推荐指数
2
解决办法
564
查看次数

如果您的程序+库不包含SSE指令,那么使用VZEROUPPER是否有用?

我理解VZEROUPPER在混合SSE和AVX代码时使用很重要,但如果我只使用AVX(和普通的x86-64代码)而不使用任何传统的SSE指令呢?

如果我从不在我的代码中使用单个SSE指令,是否有任何性能原因我需要使用VZEROUPPER

这假设我没有调用任何外部库(可能使用SSE).

performance x86 assembly avx micro-optimization

9
推荐指数
1
解决办法
413
查看次数

避免AVX-SSE(VEX)过渡处罚

我们的64位应用程序有很多代码(特别是在标准库中),它们在SSE模式下使用xmm0-xmm7寄存器.

我想使用ymm寄存器实现快速内存复制.我无法修改使用xmm寄存器添加VEX前缀的所有代码,我也认为这是不实际的,因为它会增加代码的大小,因为需要CPU解码更大的指令会使它运行得更慢.

我只是想使用两个ymm寄存器(可能是zmm - 支持zmm的经济型处理器可以在今年推出)用于快速内存复制.

问题是:如何使用ymm寄存器但避免过渡处罚?

当我使用ymm8-ymm15寄存器(不是ymm0-ymm7)时会发生惩罚吗?SSE最初有8个128位寄存器(xmm0-xmm7),但在64位模式下,(xmm8-xmm15)也可用于非VEX前缀指令.但是,我已经审查了我们的64位应用程序,它只使用xmm0-xmm7,因为它也有一个32位版本,几乎相同的代码.仅当CPU尝试使用之前使用过的xmm寄存器为ymm并且具有高128位非零值时才会发生惩罚吗?将快速内存复制后使用的ymm寄存器归零是不是更好?例如,我曾使用ymm寄存器复制32个字节的内存 - 将它归零的最快方法是什么?"vpxor ymm15,ymm15,ymm15"足够快吗?(AFAIK,vpxor可以在3个ALU执行端口中的任何一个上执行,p0/p1/p5,而vxorpd只能在p5上执行).是不是将它归零的时间超过使用它来复制32字节内存的收益?

x86 assembly sse avx micro-optimization

4
推荐指数
4
解决办法
908
查看次数

AVX512BW:使用 bsf / tzcnt 处理 32 位代码中的 64 位掩码?

这是我在 AVX512BW 中的“strlen”函数的代码

vxorps          zmm0, zmm0, zmm0   ; ZMM0 = 0
vpcmpeqb        k0, zmm0, [ebx]    ; ebx is string and it's aligned at 64-byte boundary
kortestq        k0, k0             ; 0x00 found ?
jnz             .chk_0x00
Run Code Online (Sandbox Code Playgroud)

现在对于'chk_0x00',在x86_64系统中,没有问题,我们可以这样处理:

chk_0x00:
kmovq   rbx, k0
tzcnt   rbx, rbx
add     rax, rbx
Run Code Online (Sandbox Code Playgroud)

这里我们有一个 64 位寄存器,因此我们可以将掩码存储到其中,但我的问题是关于 x86 系统,我们没有任何 64 位寄存器,因此我们必须使用“内存”保留(8 字节)并检查两者掩码的DWORD一一对应(其实这是我的方式,我想知道有没有更好的方式)

chk_0x00:
kmovd   ebx, k0       ; move the first dword of the mask to the ebx
test    ebx, ebx      ; 0x00 found in the first dword ?
jz …
Run Code Online (Sandbox Code Playgroud)

x86 assembly 32-bit micro-optimization avx512

2
推荐指数
1
解决办法
606
查看次数

Haswell AVX/FMA 延迟测试比英特尔指南说的慢 1 个周期

在英特尔内部函数指南,vmulpdvfmadd213pd已延迟5,vaddpd具有延迟3。

我写了一些测试代码,但所有的结果都慢了 1 个周期。

这是我的测试代码:

.CODE
test_latency PROC
    vxorpd  ymm0, ymm0, ymm0
    vxorpd  ymm1, ymm1, ymm1

loop_start:
    vmulpd  ymm0, ymm0, ymm1
    vmulpd  ymm0, ymm0, ymm1
    vmulpd  ymm0, ymm0, ymm1
    vmulpd  ymm0, ymm0, ymm1
    sub     rcx, 4
    jg      loop_start

    ret
test_latency ENDP
END
Run Code Online (Sandbox Code Playgroud)
.CODE
test_latency PROC
    vxorpd  ymm0, ymm0, ymm0
    vxorpd  ymm1, ymm1, ymm1

loop_start:
    vmulpd  ymm0, ymm0, ymm1
    vmulpd  ymm0, ymm0, ymm1
    vmulpd  ymm0, ymm0, ymm1
    vmulpd  ymm0, ymm0, ymm1
    sub     rcx, 4
    jg …
Run Code Online (Sandbox Code Playgroud)

performance x86-64 intel cpu-architecture avx

2
推荐指数
1
解决办法
132
查看次数

我需要在 2021 年使用 _mm256_zeroupper 吗?

摘自Agner Fog 的“用 C++ 优化软件”

在某些 Intel 处理器上混合使用和不使用 AVX 支持编译的代码时会出现问题。由于 YMM 寄存器状态的变化,从 AVX 代码到非 AVX 代码会导致性能下降。在从 AVX 代码到非 AVX 代码的任何转换之前,应该通过调用内部函数 _mm256_zeroupper() 来避免这种惩罚。在以下情况下,这可能是必要的:

• 如果程序的一部分是使用 AVX 支持编译的,而程序的另一部分是在没有 AVX 支持的情况下编译的,则在离开 AVX 部分之前调用 _mm256_zeroupper()。

• 如果使用 CPU 调度在使用和不使用 AVX 的多个版本中编译函数,则在离开 AVX 部分之前调用 _mm256_zeroupper()。

• 如果一段使用AVX 支持编译的代码调用了编译器自带的库以外的库中的函数,而该库没有AVX 支持,则在调用库函数之前先调用_mm256_zeroupper()。

我想知道什么是英特尔处理器。具体来说,是否有过去五年制造的处理器。这样我就知道修复丢失的_mm256_zeroupper()电话是否为时已晚。

c++ sse simd intrinsics avx

2
推荐指数
1
解决办法
137
查看次数