gpt4 book ai didi

c++ - 如果地址-B 访问之后往往是地址-C 访问,缓存可以识别吗?

转载 作者:行者123 更新时间:2023-11-28 05:17:06 24 4
gpt4 key购买 nike

我的程序中有一个内存访问模式,例如...

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 的地址很远。

最佳答案

在您的情况下,bs[iSecret] 是一个地址,它试图通过 doSomething()

访问其他地址 c

这是用户级逻辑,用户只能通过适当放置 b 和 c 指向的数据来优化,以利用空间局部性。

举个简单的例子,你希望编译器优化这段代码吗?

int a[100][100];
for(int i = 0; i < 100; ++i)
for(int j = 0; j < 100; ++j)
cout << a[j][i] << endl;

但是,它会不会是像

这样的条件构造的情况?
address X:  if(condition)
{
address Y: //dosomething_A
}
else
{
address Z: //dosomething_B
}

这里,if条件是在地址X等..

在这种条件构造中,编译器可以生成代码,从而最大限度地减少流水线处理器上的停顿周期(由于分支)的惩罚。

此外,流水线处理器可以使用 Branch_predictor 了解您的分支在运行时。

关于c++ - 如果地址-B 访问之后往往是地址-C 访问,缓存可以识别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42406283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com