为什么Skylake比Broadwell-E在单线程内存吞吐量方面要好得多?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么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, 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();
}
现代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年那篇优秀文章的变化)。
我终于得到了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%。
我认为这不是“为什么”的答案,所以我不会这样做,但是我认为我会暂时接近一个。感谢所有有用的评论。
以上是关于为什么Skylake比Broadwell-E在单线程内存吞吐量方面要好得多?的主要内容,如果未能解决你的问题,请参考以下文章
1.1万元值不值?Intel Broadwell-E性能实测:十核心霸气
为啥在 Skylake 上没有 VZEROUPPER 时,这个 SSE 代码会慢 6 倍?
为啥我的 Intel Skylake / Kaby Lake CPU 在简单的哈希表实现中会出现神秘的 3 倍减速?