我有一個內存訪問模式在我的程序像...如果地址B訪問往往後跟地址C訪問,緩存可以識別它嗎?
b1->c1 (b and c are address.)
//.... do something else ....
b2->c2
//.... do something else ....
b3->c3
....
是編譯器/緩存/ CPU足夠聰明地認識到:
當我加載b
,應該(準備)相應的負載c
?
更具體地說:它能以某種方式預測我的訪問模式並在某些方面對其進行優化嗎?
大致的好處是多少?
我創建了a test case。結果表明在運行時不能學習。
(在現實情況下,B
有很多領域,但往往->
僅c
)
class C{
public: int data=0;
};
class B{
public: C* c; int accu=0;
public: B(){
c=new C();
}
public: void doSomething(){
accu+=c->data; //do something about c
}
};
int main() {
using namespace std;
const int NUM=1000000;
B* bs[NUM];
for(int n=0;n<NUM;n++){
bs[n]=new B();
}
for(int loop=0;loop<20;loop++){
double accumulator=0;
for(int n=0;n<NUM;n++){
int iSecret = rand() % NUM;
clock_t begin = clock();
bs[iSecret]->doSomething();
clock_t end = clock();
accumulator+=double(end - begin);
}
double elapsed_secs = accumulator;
std::cout<<elapsed_secs<<std::endl;
}
}
打印(每循環一次)
如果能學習,後來的循環應使用比以前少的時間。
298749
306951
332946
...
337232
我不認爲它可以利用Spatial locality,因爲c
的地址很遠。
不,我不這麼認爲。 – immibis
@immibis謝謝,這是一個有價值的評論。 – javaLover
你期望*它可以學習*?在最近的CPU管道AFAICT中總是用b加載c並不會更高效。 –