相关疑难解决方法(0)

x86 SIMD内在函数的头文件

哪些头文件为不同的x86 SIMD指令集扩展(MMX,SSE,AVX,...)提供内在函数?似乎不可能在网上找到这样的清单.如我错了请纠正我.

x86 sse simd header-files intrinsics

121
推荐指数
5
解决办法
5万
查看次数

为什么gcc不将_mm256_loadu_pd解析为单个vmovupd?

我正在编写一些AVX代码,我需要从可能未对齐的内存中加载.我目前正在加载4个双打,因此我将使用内部指令_mm256_loadu_pd ; 我写的代码是:

__m256d d1 = _mm256_loadu_pd(vInOut + i*4);
Run Code Online (Sandbox Code Playgroud)

然后,我使用选项进行编译,-O3 -mavx -g然后使用objdump获取汇编代码以及带注释的代码和line(objdump -S -M intel -l avx.obj).
当我查看底层汇编程序代码时,我发现以下内容:

vmovupd xmm0,XMMWORD PTR [rsi+rax*1]
vinsertf128 ymm0,ymm0,XMMWORD PTR [rsi+rax*1+0x10],0x1
Run Code Online (Sandbox Code Playgroud)

我期待看到这个:

vmovupd ymm0,XMMWORD PTR [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)

并充分利用256位寄存器(YMM0),而不是它看起来像海湾合作委员会已决定在128位部分(填写XMM0),然后再次加载另一半vinsertf128.

有人能够解释这个吗?在MSVC VS 2012中
使用单个vmovupd编译等效代码.

我运行gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0Ubuntu的18.04 X86-64.

assembly gcc simd vectorization avx

13
推荐指数
2
解决办法
464
查看次数

为什么我能够在Linux内核模块中执行浮点运算?

我正在使用x86 CentOS 6.3(内核v2.6.32)系统.

我将以下函数编译成一个简单的字符驱动程序模块作为实验,以了解Linux内核如何对浮点运算做出反应.

static unsigned floatstuff(void){
    float x = 3.14;
    x *= 2.5;
    return x;
}

...

printk(KERN_INFO "x: %u", x);
Run Code Online (Sandbox Code Playgroud)

编译的代码(这是没有预料到的)所以我插入了模块并检查了日志dmesg.日志显示:x: 7.

这看起来很奇怪; 我以为你不能在Linux内核中执行浮点运算 - 除了一些例外kernel_fpu_begin().模块是如何执行浮点运算的?

这是因为我在x86处理器上吗?

c linux x86 gcc linux-kernel

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

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

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

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

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

performance x86 assembly avx micro-optimization

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