标签: intel

为什么英特尔公布的一些Haswell AVX延迟比Sandy Bridge慢3倍?

在英特尔内部网络应用程序中,从Sandy Bridge到Haswell的几项操作似乎已经恶化.例如,许多插入操作(如_mm256_insertf128_si256)显示如下的成本表:

   Performance
 Architecture   Latency   Throughput
 Haswell        3         -
 Ivy Bridge     1         - 
 Sandy Bridge   1         - 
Run Code Online (Sandbox Code Playgroud)

我发现这种差异令人费解.这有什么不同,因为有新的指令可以取代这些或补偿它的东西(哪些)?有谁知道Skylake是否进一步改变了这个模型?

x86-64 intel simd cpu-architecture avx2

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

为什么Skylake比Broadwell-E在单线程内存吞吐量方面要好得多?

我们有一个简单的内存吞吐量基准.对于大块内存,它所做的只是重复记忆.

在几台不同的机器上查看结果(针对64位编译),Skylake机器的性能明显优于Broadwell-E,保持OS(Win10-64),处理器速度和RAM速度(DDR4-2133)不变.我们不是说几个百分点,而是大约2个因素.Skylake配置为双通道,Broadwell-E的结果不会因双/三/四通道而异.

任何想法为什么会这样?随后的代码在VS2015的Release中编译,并报告完成每个memcpy的平均时间:

64位:Skylake为2.2ms,Broadwell-E为4.5ms

32位:Skylake为2.2ms,Broadwell-E为3.5ms.

通过利用多个线程,我们可以在四通道Broadwell-E构建上获得更大的内存吞吐量,这很不错,但是看到单线程内存访问的这种巨大差异令人沮丧.为什么差异如此显着的任何想法?

我们还使用了各种基准测试软件,他们验证了这个简单示例所展示的内容 - 单线程内存吞吐量在Skylake上更好.

#include <memory>
#include <Windows.h>
#include <iostream>

//Prevent the memcpy from being optimized out of the for loop
_declspec(noinline) void MemoryCopy(void *destinationMemoryBlock, void *sourceMemoryBlock, size_t size)
{
    memcpy(destinationMemoryBlock, sourceMemoryBlock, size);
}

int main()
{
    const int SIZE_OF_BLOCKS = 25000000;
    const int NUMBER_ITERATIONS = 100;
    void* sourceMemoryBlock = malloc(SIZE_OF_BLOCKS);
    void* destinationMemoryBlock = malloc(SIZE_OF_BLOCKS);
    LARGE_INTEGER Frequency;
    QueryPerformanceFrequency(&Frequency);
    while (true)
    {
        LONGLONG total = 0;
        LONGLONG max = 0;
        LARGE_INTEGER StartingTime, …
Run Code Online (Sandbox Code Playgroud)

performance benchmarking x86 intel cpu-architecture

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

由于勘误,Debian 固件错误 TSC_DEADLINE 被禁用

在 Debian 上,当机器启动时,它显示错误:

[Firmware Bug]: TSC_DEADLINE disabled due to Errata; 
please update microcode to version: 0xb2 (or later)
Run Code Online (Sandbox Code Playgroud)

我做了

sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
Run Code Online (Sandbox Code Playgroud)

它没有帮助

debian intel firmware

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

获取显卡型号?

我想知道如何从代码特别是DirectX 9.0c(从C++代码中)获取显卡型号/品牌.

c++ directx graphics model intel

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

是否有使用AT&T语法的完整x86汇编语言参考?

理想情况下会有一个用AT&T语法编写的英特尔软件开发人员手册版本,但我很乐意找到足够接近的版本.

x86 assembly intel

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

__m128i变量是零吗?

如何测试__m128i变量在SSE-2和更早版本的处理器上是否具有任何非零值?

c c++ sse intel simd

11
推荐指数
2
解决办法
3596
查看次数

什么是x86 cr0 WP位的目的?

在x86 CPU中,控制寄存器编号为0.该寄存器的第16位表示"写保护"设置.如果该位清零,CPU可以覆盖只读数据.(在页表条目中配置)在内存中.如果该位置1,CPU不能覆盖内存中的RO数据.

我很好奇的是"这个位的最初目的是什么?" "为什么x86 CPU需要这个?"

x86 intel

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

英特尔主流的更快但不太准确的fsin?

由于在x86下fsin计算sin(x)函数的函数可以追溯到Pentium时代,显然它甚至没有使用SSE寄存器,我想知道是否有更新更好的指令来计算三角函数.

我习惯用C++编写代码并做一些asm优化,所以任何适合从C++开始,到C语言到asm的管道都适合我.

谢谢.


我现在处于Linux 64位以下,gcc并且clang(甚至强硬的铿锵并没有提供任何与FPU相关的优化AFAIK).

编辑

  • 我已经实现了一个sin功能,它通常是2倍于std::sin甚至sse上.
  • 我的功能永远不会慢fsin,即使很难fsin通常更准确,但考虑到fsin从未超越我的sin实现,我将保留我sin的现在,也是我sin完全可移植的fsin只有x86.
  • 我需要这个用于实时计算,所以我将精确换算速度,我认为我会很好,精度为4-5位小数.
  • 没有基于表的方法,我没有使用它,它搞砸了缓存,使一切变慢,没有基于内存访问或查找表的算法请.

c c++ assembly trigonometry intel

11
推荐指数
2
解决办法
2498
查看次数

AVX2中的VPERMB在哪里?

AVX2有很多好东西.例如,它有很多指令,它们比它们的前体更加强大.Take VPERMD:它允许您从一个256位长的32位值向量中完全任意地广播/混洗/置换到另一个,并且在运行时1可以选择置换.在功能上,它废除了大量现有的旧解包,广播,置换,随机和移位指令3.

凉豆.

那么在哪里VPERMB?即,相同的指令,但在字节大小的元素上工作.或者,就此而言,VPERMW对于16位元素,在哪里?已经涉足x86程序集已经有一段时间了,很明显SSE PSHUFB指令几乎是有史以来最有用的指令之一.它可以进行任何可能的排列,广播或逐字节混洗.此外,它还可用于执行16个并行4位 - > 8位表查找2.

不幸的是,PSHUFB在AVX2中没有延伸到跨车道,所以它仅限于车道内行为.该VPERM指令能够做到跨洗牌(事实上,"烫发"和"SHUF"似乎是在指令助记符同义词?) -但被省略了8位和16位版本?

甚至似乎没有一种好的方法来模拟这个指令,而你可以轻松地模拟宽度较小的shuffles(通常,它甚至是免费的:你只需要一个不同的掩码).

我毫不怀疑英特尔已经意识到它的广泛使用PSHUFB,因此自然会出现为什么在AVX2中省略字节变体的问题.操作本质上难以在硬件中实现吗?是否有编码限制迫使其遗漏?


1通过在运行时选择,我的意思是定义混洗行为的掩码来自寄存器.这使得指令比采用立即随机掩码的早期变体更灵活,其方式与add更灵活的inc变换相比,或者变量比立即变换更灵活.

2或AVX2中的32个此类查找.

3较旧的指令偶尔会有用,如果它们的编码较短,或者避免从内存中加载掩码,但在功能上它们会被取代.

x86 assembly sse intel avx2

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

为什么XCHG reg,注册了关于现代英特尔架构的3微操作指令?

我正在对代码的性能关键部分进行微优化,并且遇到了指令序列(在AT&T语法中):

add %rax, %rbx
mov %rdx, %rax
mov %rbx, %rdx
Run Code Online (Sandbox Code Playgroud)

我以为我终于有一个用例xchg可以让我刮一个指令并写:

add  %rbx, %rax
xchg %rax, %rdx
Run Code Online (Sandbox Code Playgroud)

然而,根据Agner Fog的指令表,我发现这xchg是一个3微操作指令,在Sandy Bridge,Ivy Bridge,Broadwell,Haswell甚至Skylake上有2个周期延迟.3个完整的微操作和2个周期的延迟!3微操作抛出了我的4-1-1-1的节奏和2周期延迟使得它比在最好的情况下原来的,因为在原来的并行执行可能最后2条指令差.

现在......我得知CPU可能会将指令分解为相当于以下内容的微操作:

mov %rax, %tmp
mov %rdx, %rax
mov %tmp, %rdx 
Run Code Online (Sandbox Code Playgroud)

哪里tmp是匿名内部寄存器,我想最后两个微操作可以并行运行,因此延迟是2个周期.

鉴于寄存器重命名发生在这些微架构上,但对我来说这是以这种方式完成的.为什么寄存器重命名器不会交换标签?理论上,这将只有1个周期(可能是0?)的延迟,并且可以表示为单个微操作,因此它会便宜得多.

performance x86 assembly intel

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