為什么Skylake比Broadwell-E在單線程內(nèi)存吞吐量方面要好得多?我們有一個(gè)簡(jiǎn)單的內(nèi)存吞吐量基準(zhǔn)。對(duì)于大塊內(nèi)存,它所做的只是重復(fù)記憶。在幾臺(tái)不同的機(jī)器上查看結(jié)果(針對(duì)64位編譯),Skylake機(jī)器的性能明顯優(yōu)于Broadwell-E,保持OS(Win10-64),處理器速度和RAM速度(DDR4-2133)相同。我們不是說(shuō)幾個(gè)百分點(diǎn),而是大約2個(gè)因素。Skylake配置為雙通道,Broadwell-E的結(jié)果不會(huì)因雙/三/四通道而異。任何想法為什么會(huì)這樣?隨后的代碼在VS2015的Release中編譯,并報(bào)告完成每個(gè)memcpy的平均時(shí)間:64位:Skylake為2.2ms,Broadwell-E為4.5ms32位:Skylake為2.2ms,Broadwell-E為3.5ms。通過(guò)利用多個(gè)線程,我們可以在四通道Broadwell-E構(gòu)建上獲得更大的內(nèi)存吞吐量,這很不錯(cuò),但是看到單線程內(nèi)存訪問(wèn)的這種巨大差異令人沮喪。為什么差異如此顯著的任何想法?我們還使用了各種基準(zhǔn)測(cè)試軟件,他們驗(yàn)證了這個(gè)簡(jiǎn)單示例所展示的內(nèi)容 - 單線程內(nèi)存吞吐量在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();}
2 回答

ibeautiful
TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
我終于得到了VTune(evalutation)并且正在運(yùn)行。它在Broadwell-E上提供了0.602(0到1之間)的DRAM限制分?jǐn)?shù),在Skylake上提供了.324,其中Broadwell-E延遲的很大一部分來(lái)自內(nèi)存延遲。鑒于記憶棒的速度是相同的(除了Skylake配置的雙通道和Broadwell-E的四通道),我最好的猜測(cè)是Skylake中的內(nèi)存控制器的效果要好得多。
這使得購(gòu)買Broadwell-E架構(gòu)變得更加強(qiáng)硬,并且要求您真正需要額外的內(nèi)核才能考慮它。
我也有L3 / TLB未命中數(shù)。在Broadwell-E上,TLB未命中率大約高出20%,而L3未命中率則高出約36%。
我認(rèn)為這不是“為什么”的答案,所以我不會(huì)這樣做,但是我認(rèn)為我會(huì)暫時(shí)接近一個(gè)。感謝所有有用的評(píng)論。
添加回答
舉報(bào)
0/150
提交
取消