相关疑难解决方法(0)

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或?

以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 assembly micro-optimization

109
推荐指数
1
解决办法
4万
查看次数

在执行uop计数不是处理器宽度倍数的循环时性能是否会降低?

我想知道各种大小的循环如何在最近的x86处理器上执行,作为uop数的函数.

以下是彼得·科德斯(Peter Cordes)的一句话,他在另一个问题中提出了非多数的问题:

我还发现,如果循环不是4 uop的倍数,则循环缓冲区中的uop带宽不是每个循环的常数4.(即它是abc,abc,......;不是abca,bcab,......).遗憾的是,Agner Fog的microarch doc对循环缓冲区的这种限制并不清楚.

问题是关于循环是否需要是N uop的倍数才能以最大uop吞吐量执行,其中N是处理器的宽度.(即最近的英特尔处理器为4).在谈论"宽度"和计算微动时,有很多复杂因素,但我大多想忽略这些因素.特别是,假设没有微观或宏观融合.

Peter给出了以下一个循环,其中包含7个uop的循环:

一个7-uop循环将发出4 | 3 | 4 | 3 | ...的组我没有测试更大的循环(不适合循环缓冲区),看看是否有可能从下一个指令开始迭代发布在与其分支相同的组中,但我不假设.

更一般地说,声称是x在其体内具有uops 的循环的每次迭代将至少进行ceil(x / 4)迭代,而不是简单地迭代x / 4.

对于部分或全部最新的x86兼容处理器,这是真的吗?

performance x86 assembly cpu-architecture micro-optimization

20
推荐指数
2
解决办法
2048
查看次数

如何在256位AVX(YMM)寄存器中交换低128位和高128位

我正在移植SSE SIMD代码以使用256位AVX扩展,并且似乎找不到任何将混合/混洗/移动高128位和低128位的指令.

支持故事:

我真正想要的是VHADDPS/ _mm256_hadd_ps表现得像HADDPS/ _mm_hadd_ps,只有256个字.不幸的是,它就像是HADDPS对低字和高字独立行动的两次调用.

x86 simd avx

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

AVX中的水平XOR

有没有办法水平异步AVX寄存器 - 具体来说,对256位寄存器的四个64位组件进行异或?

目标是获得AVX寄存器的所有4个64位组件的XOR.它基本上与水平add(_mm256_hadd_epi32())做同样的事情,除了我想要XOR而不是ADD.

标量代码是:

inline uint64_t HorizontalXor(__m256i t) {
  return t.m256i_u64[0] ^ t.m256i_u64[1] ^ t.m256i_u64[2] ^ t.m256i_u64[3];
}
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly simd avx

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