Re: [討論] 雙核心的CPU L2快取設定問題
看板Notebook (筆記型電腦)作者jk21234 ( 1569 11 /47)時間14年前 (2010/03/12 12:54)推噓9(9推 0噓 8→)留言17則, 10人參與討論串2/2 (看更多)
※ 引述《nhsmallcat (在一起不容易)》之銘言:
: http://support.microsoft.com/kb/183063/en-us/
: 微軟知識庫中關於SecondLevelDataCache的說明
: 節錄部份如下:
: SecondLevelDataCache records the size of the processor cache, also known as
: the secondary or L2 cache. If the value of this entry is 0, the system
: attempts to retrieve the L2 cache size from the Hardware Abstraction Layer
: (HAL) for the platform. If it fails, it uses a default L2 cache size of 256
: KB. If the value of this entry is not 0, it uses this value as the L2 cache
: size. This entry is designed as a secondary source of cache size information
: for computers on which the HAL cannot detect the L2 cache.
: 如果值為0,系統會先透過HAL來讀取L2值。就算透過HAL讀取失敗,預設至少也會是256KB
: 如果值不為0,系統就會以此值來作為L2的值。
: 問題來了,
: 如果只設為原本實體L2的一半,那L2使用到的容量僅為實體的一半,
: 效能應該反而比較慢才對,怎麼會變快呢?
因為它控制的不是使用L2 Cache的數量(從軟體層上控制不了)
它的效果是,在某些對應的code上要作出"閃避相隔xxx KB的持續存取
記憶體動作".
為甚麼?因為你要看後面那段
This is not related to the hardware; it is only useful for computers
with direct-mapped L2 caches
這兩者有甚麼關係?Direct Mapped cache的意思是,假定Cache 256KB好了,
那麼,記憶體位置上,0~32,256KB+32,512KB+32....這幾段記憶體,占用的就是同一個區塊
假設你真的持續讀取這些位置,就會持續使用到同一個cache block,互相把對方擠出去.
變成誰都沒有cache的效果可以用.如果我可以避免以這個順序存取L2 cache,就可以在
"古老的"(至少在x86上,它已經退場超過十年)direct-mapped cache系統上取回cache
的效果.不過因為現在cpu內建的L2 Cache以上,至少都會是4-way,8-way以上,所以
也不會有這個問題需要避開....
另外,實作上是怎樣避開的?它是刻意的打亂logical address和physical address的
對應關係,讓它不太連續.因此在現在的電腦上還這樣改的話,只會降低效能不會有
甚麼好處
當然關於這個,愛相信的就相信,愛改的就改,反正除了一些storage driver,
陳年老code外,除了變慢還不至於真的有問題.....
==============如果要眼見為憑L2 cache的話===============
最簡單的方法,就是自己作程式,連續作兩次"xx KB的讀取記憶體",
測量第二次讀取的時間,然後換算成每秒的速度.
只有L1 cache的系統
速度
|***
| |
| |
| |************
|
---------------------->讀取量
^這個點就是L1 Cache的大小
(超過L1 cache大小 會瞬降到外部記憶體的速度)
有L2 Cache產生作用的系統
速度
|***
| \
| \
| **********
|
---------------------->讀取量
^這個點就是L1 Cache的大小
^第二個斜率轉折點就是L2 cache的大小
(以上從Pentium II到Core 2應該都相同,至於有L3的系統,
以及K7以後的exclusive cache,就不會有很漂亮的斜率)
=========Sample Code, MS系的編譯器用============
#include <iostream.h>
#include <windows.h>
#define RDTSC(var) \
_asm _emit 0x0F \
_asm _emit 0x31 \
_asm mov DWORD PTR var,eax \
_asm mov DWORD PTR var+4,edx
#define LB(var,offset) \
_asm mov ebx,var \
_asm mov edi,offset \
_asm movzx eax,[ebx+edi]
#define LW(var,offset) \
_asm mov ebx,var \
_asm mov edi,offset \
_asm mov eax,[ebx+edi]
#define space 512
void main(){
long double time,time2;
long double overhead[13];
int temp;
int loop;
int i,j;
void* p;
p=VirtualAlloc(NULL,1048576*4,MEM_COMMIT,PAGE_READWRITE);
__int64 clock1,clock2;
RDTSC(clock1);
RDTSC(clock2);
time=clock2-clock1;
cout<<"RDTSC overhead averge using "<<time<<" clocks\n";
//case1 偵測cache之大小
for (j=0;j<=12;j++){
loop=(1024*(1<<j)-64);
RDTSC(clock1);
for (i=0;i<loop;i+=4){
};
RDTSC(clock2);
overhead[j]=clock2-clock1;
};
for (j=0;j<=12;j++){
loop=(1024*(1<<j)-64);
for (i=0;i<loop;i+=4){
__asm {
mov ebx,p
mov edi,i
mov eax,[ebx+edi]
}
};
RDTSC(clock1);
for (i=0;i<loop;i+=4){
__asm {
mov ebx,p
mov edi,i
mov eax,[ebx+edi]
}
};
RDTSC(clock2);
temp=(1<<j)-0;
time=(clock2-clock1-overhead[j])/temp;
cout<<"reading "<<(1<<j)<<"kbytes averge using "<<time<<" clocks\n";
cout<<"Averge Speed:"<<((2600/time)*(1<<j)*1024)<<"MB /s \n";
//2600為cpu的MHZ數..不同的需要修改
};
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.237.63
→
03/12 13:00, , 1F
03/12 13:00, 1F
推
03/12 13:00, , 2F
03/12 13:00, 2F
推
03/12 13:07, , 3F
03/12 13:07, 3F
→
03/12 13:07, , 4F
03/12 13:07, 4F
→
03/12 13:08, , 5F
03/12 13:08, 5F
推
03/12 13:12, , 6F
03/12 13:12, 6F
推
03/12 13:13, , 7F
03/12 13:13, 7F
→
03/12 13:14, , 8F
03/12 13:14, 8F
→
03/12 13:14, , 9F
03/12 13:14, 9F
→
03/12 13:21, , 10F
03/12 13:21, 10F
→
03/12 13:32, , 11F
03/12 13:32, 11F
→
03/12 13:34, , 12F
03/12 13:34, 12F
推
03/12 15:14, , 13F
03/12 15:14, 13F
推
03/12 19:21, , 14F
03/12 19:21, 14F
推
03/12 19:52, , 15F
03/12 19:52, 15F
推
03/13 00:35, , 16F
03/13 00:35, 16F
推
03/17 04:20, , 17F
03/17 04:20, 17F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
19
81
Notebook 近期熱門文章
PTT數位生活區 即時熱門文章