相关疑难解决方法(0)

ASM x86_64 AVX:xmm和ymm记录差异

xmmymm寄存器有什么区别?我以为xmm是SSE,ymm是AVX,但是我写了一些代码:

vmovups     ymm1, [r9]      
vcvtss2si   rcx, ymm1
Run Code Online (Sandbox Code Playgroud)

它给了我:

error: invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)

关于这条线:

vcvtss2si   rcx, ymm1
Run Code Online (Sandbox Code Playgroud)

所以我写道:

vcvtss2si   rcx, xmm1
Run Code Online (Sandbox Code Playgroud)

它按预期工作。ymm1向量的第一个值转换为整数,现在位于中rcx

这是什么一回事呢?ymm1xmm1相同的寄存器?

assembly x86-64 nasm avx

3
推荐指数
2
解决办法
3219
查看次数

通过 avx 指令向量化间接访问

我最近被介绍了向量指令(理论上)并且对如何使用它们来加速我的应用程序感到兴奋。

我想改进的一个方面是一个非常热的循环:

__declspec(noinline) void pleaseVectorize(int* arr, int* someGlobalArray, int* output)
{
    for (int i = 0; i < 16; ++i)
    {
        auto someIndex = arr[i];
        output[i] = someGlobalArray[someIndex];
    }

    for (int i = 0; i < 16; ++i)
    {
         if (output[i] == 1)
         {
             return i;
         }
    }

    return -1;
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,所有 3 个主要编译器(msvc、gcc、clang)都拒绝对此进行矢量化。我可以理解为什么,但我想得到确认。

如果我必须手动矢量化它,它将是:

(1) VectorLoad "arr", 这带来了 16 个 4 字节整数,让我们说到 zmm0

(2) 16个内存从zmm0[0..3]指向的地址加载到zmm1[0..3],从zmm0[4..7]指向的地址加载到zmm1[4..7]所以等等

(3)比较zmm0和zmm1

(4) 向量 popcnt 到输出中找出最高有效位并基本上除以 8 得到匹配的索引

首先,向量指令可以做这些事情吗?就像他们可以执行这种“收集”操作,即从指向 zmm0 的地址加载?

以下是 clang 生成的内容:

0000000000400530 …
Run Code Online (Sandbox Code Playgroud)

c++ simd vectorization compiler-optimization avx512

3
推荐指数
1
解决办法
697
查看次数

如何使用 AVX-512 实现 16 位和 32 位整数插入和提取操作?

AVX 具有将 16 位和 32 位整数插入和提取到__m256i向量中的指令:_mm256_insert_epi16, _mm256_insert_epi32, _mm256_extract_epi16, _mm256_extract_epi32

但是,AVX-512 似乎没有等效的说明。为__m512i向量实现这些方法的适当方法是什么?IE

  • __m512i _mm512_insert_epi16(__m512i a, __int16 i, int index)
  • __m512i _mm512_insert_epi32(__m512i a, __int32 i, int index)
  • int _mm512_extract_epi16(__m512i a, int index)
  • int _mm512_extract_epi32(__m512i a, int index)

intrinsics avx avx512

3
推荐指数
1
解决办法
720
查看次数

在glibc的ld.so中禁用xsave

我想使用gdb的记录,但是因为glibc的ld.so使用xsave指令,所以出现错误“进程记录不支持地址0x7ffff7fe883c的指令0xfae64”。

多亏了stackoverflow的回答,我才能用二进制补丁修复类似的错误。运行半小时后,使用调试符号编译glibc失败,因此,如果有更快的解决方案,我将感到高兴。我从这里获得了一个编译版本,但似乎没有提供任何早期版本(即,我现在使用的是glibc 2.28.r502.g065957a3704-1和gdb 8.2.1)。如何使gdb录制工作?

assembly linker gdb glibc x86-64

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

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
查看次数

从 Intel Xeon Phi 上的 AVX512 迁移到 Intel i5-8259U 上的 AVX2 会损失什么?

在尝试学习Coursera 上的课程时,我尝试为我的 CPU 优化示例 C++ 代码Intel i5-8259U,我相信它支持AVX2SIMD 指令集。现在,AVX2每个内核提供 16 个寄存器(称为YMM0, YMM1, ..., YMM15),宽度为 256 位,这意味着每个内核最多可以同时处理 4 个双精度浮点数。利用AVX2SIMD 指令应该可以优化我的代码,使其运行速度比标量指令快 4 倍。

在链接的课程中,您可以尝试在Intel Xeon Phi 7210 (Knights Landing)支持AVX512使用 512 位宽寄存器的处理器上运行相同的数值积分代码。这意味着我们应该期望双精度运算的速度提高 8 倍。实际上,讲师使用的代码获得了高达 14 倍的优化,几乎是 8 的 173%。额外的优化归功于 OpenMP。

为了在我的 CPU 上运行相同的代码,我唯一改变的是传递给英特尔编译器的优化标志:-xMIC-AVX512我使用了 ,而不是-xCORE-AVX2。我获得的加速仅为 2 倍,仅是由于 256 位寄存器上的 SIMD 矢量化而产生的预期加速的 50%。将此 50% 与英特尔至强融核处理器上获得的 173% 进行比较。

为什么我仅仅从 转到 就看到性能的巨大AVX512损失AVX2?当然,除了 …

icc compiler-optimization avx2 xeon-phi avx512

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

如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量

我使用内联汇编,我的代码是这样的:

__m128i inl = _mm256_castsi256_si128(in);
__m128i inh = _mm256_extractf128_si256(in, 1); 
__m128i outl, outh;
__asm__(
    "vmovq %2, %%rax                        \n\t"
    "movzwl %%ax, %%ecx                     \n\t"
    "shr $16, %%rax                         \n\t"
    "movzwl %%ax, %%edx                     \n\t"
    "movzwl s16(%%ecx, %%ecx), %%ecx        \n\t"
    "movzwl s16(%%edx, %%edx), %%edx        \n\t"
    "xorw %4, %%cx                          \n\t"
    "xorw %4, %%dx                          \n\t"
    "rolw $7, %%cx                          \n\t"
    "rolw $7, %%dx                          \n\t"
    "movzwl s16(%%ecx, %%ecx), %%ecx        \n\t"
    "movzwl s16(%%edx, %%edx), %%edx        \n\t"
    "pxor %0, %0                            \n\t"
    "vpinsrw $0, %%ecx, %0, %0              \n\t"
    "vpinsrw $1, %%edx, %0, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly sse avx

0
推荐指数
1
解决办法
1081
查看次数