為什么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.5ms32位: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();}
2 回答

ibeautiful
TA貢獻1993條經驗 獲得超6個贊
我終于得到了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%。
我認為這不是“為什么”的答案,所以我不會這樣做,但是我認為我會暫時接近一個。感謝所有有用的評論。
添加回答
舉報
0/150
提交
取消