相关疑难解决方法(0)

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

SIMD指令降低CPU频率

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

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

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

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

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

optimization x86 intel compiler-optimization avx512

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

硬件 SIMD 向量指针和相应类型之间的“reinterpret_cast”是否是未定义的行为?

reinterpret_castafloat*到 a__m256*float通过不同的指针类型访问对象是否合法?

constexpr size_t _m256_float_step_sz = sizeof(__m256) / sizeof(float);
alignas(__m256) float stack_store[100 * _m256_float_step_sz ]{};
__m256& hwvec1 = *reinterpret_cast<__m256*>(&stack_store[0 * _m256_float_step_sz]);

using arr_t = float[_m256_float_step_sz];
arr_t& arr1 = *reinterpret_cast<float(*)[_m256_float_step_sz]>(&hwvec1);
Run Code Online (Sandbox Code Playgroud)

hwvec1arr1依赖undefined behaviors 吗?

它们是否违反了严格的别名规则?[基本.lval]/11

或者只有一种定义的内在方式:

__m256 hwvec2 = _mm256_load_ps(&stack_store[0 * _m256_float_step_sz]);
_mm256_store_ps(&stack_store[1 * _m256_float_step_sz], hwvec2);
Run Code Online (Sandbox Code Playgroud)

神箭

c++ x86 intrinsics undefined-behavior language-lawyer

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