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

问题描述 投票:9回答:2

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

在几台不同的机器上查看结果(针对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, EndingTime, ElapsedMicroseconds;
        for (int i = 0; i < NUMBER_ITERATIONS; ++i)
        {
            QueryPerformanceCounter(&StartingTime);
            MemoryCopy(destinationMemoryBlock, sourceMemoryBlock, SIZE_OF_BLOCKS);
            QueryPerformanceCounter(&EndingTime);
            ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
            ElapsedMicroseconds.QuadPart *= 1000000;
            ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
            total += ElapsedMicroseconds.QuadPart;
            max = max(ElapsedMicroseconds.QuadPart, max);
        }
        std::cout << "Average is " << total*1.0 / NUMBER_ITERATIONS / 1000.0 << "ms" << std::endl;
        std::cout << "Max is " << max / 1000.0 << "ms" << std::endl;
    }
    getchar();
}
performance x86 benchmarking intel cpu-architecture
2个回答
7
投票

现代CPU上的单线程内存带宽受到从L1D到系统其余部分的传输的max_concurrency / latency限制,而不受DRAM控制器瓶颈的限制。每个内核都有10个线路填充缓冲器(LFB),用于跟踪发往/来自L1D的未完成请求。 (以及跟踪到/来自L2的线路的16个“超级”条目)。

与四核或双核台式机/笔记本电脑芯片相比,英特尔的多核芯片具有更高的L3 /内存延迟,因此在大型Xeon上单线程内存带宽实际上要差得多,即使具有多个线程的最大聚合带宽是好多了。它们在环形总线上有更多跳,它们连接内核,内存控制器和系统代理(PCIe等)。

SKX(Skylake-server / AVX512,包括i9“高端桌面”芯片)非常糟糕:L3 /内存延迟明显高于Broadwell-E / Broadwell-EP,因此单线程带宽更差比具有相似核心数的Broadwell。 (SKX使用网格而不是环形总线,因为它可以更好地扩展,see this for details on both。但显然新设计中的常数因素是不好的;未来几代可能会有更好的L3带宽/延迟,用于中小核心数量。虽然核心L2上升到1MiB,但L3可能会故意减速以节省电力。)


四核或双核芯片只需要几个线程(特别是如果内核+非核心(L3)时钟高)以使其内存带宽饱和,而具有快速DDR4双通道的Skylake具有相当大的带宽。

有关这方面的更多信息,请参阅this answer关于x86内存带宽的Latency-bound Platforms部分。 (并阅读memcpy / memset的其他部分,包括SIMD循环与rep movs/rep stos,以及NT存储与常规RFO存储等等。)

还有关联:What Every Programmer Should Know About Memory?(2017年更新仍然是真实的,以及2007年那篇优秀文章的变化)。


2
投票

我终于得到了VTune(evalutation)并且正在运行。它在Broadwell-E上提供了0.602(0到1之间)的DRAM限制分数,在Skylake上提供了.324,其中Broadwell-E延迟的很大一部分来自内存延迟。鉴于记忆棒的速度是相同的(除了Skylake配置的双通道和Broadwell-E的四通道),我最好的猜测是Skylake中的内存控制器的效果要好得多。

这使得购买Broadwell-E架构变得更加强硬,并且要求您真正需要额外的内核才能考虑它。

我也有L3 / TLB未命中数。在Broadwell-E上,TLB未命中率大约高出20%,而L3未命中率则高出约36%。

我认为这不是“为什么”的答案,所以我不会这样做,但是我认为我会暂时接近一个。感谢所有有用的评论。

© www.soinside.com 2019 - 2024. All rights reserved.