如果地址-B访问倾向于访问地址-C访问,则缓存可以识别
If address-B access tends to be followed by address-C access, can the cache recognize it?
我的程序中有一个内存访问模式,例如...
b1->c1 (b and c are address.)
//.... do something else ....
b2->c2
//.... do something else ....
b3->c3
....
是编译器/CACH/CPU,足够聪明,可以识别:
当我加载b
时,应该(准备)加载相应的c
?
更具体地:它可以以某种方式预测我的访问模式并以某种方式进行优化吗?
大约有多少优势?
我创建了一个测试用例。结果表明它在运行时不能学习。
(在实际情况下,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;
}
}
print(每个循环时间)
如果它可以学习,以后的循环应该比以前的时间更少。
298749
306951
332946
...
337232
我认为它不能使用空间位置,因为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
条件在address X
等。
在此条件构造中,编译器可以生成代码,该代码可以最大程度地减少管道处理器上的失速周期的惩罚(由于分支)。
此外,管道的处理器可以在运行时使用branch_predictor学习您的分支。
相关文章:
- 通过按地址访问变量
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何访问头文件中类的组件并打印它们的地址?
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 访问和编辑内存中的多个地址
- 如果地址-B访问倾向于访问地址-C访问,则缓存可以识别
- C++ Firebase 分段错误,Linux,位于 std::string::assign 无法访问地址 0xf 处的
- 带有超载操作员 的无访问地址的指针返回
- 尝试块中禁止访问地址
- 在 Linux 环境程序中访问地址之前,如何检查地址的有效性?
- C++ <错误:无法访问地址 0x1> 处的内存
- 无法访问地址 0x 处的内存
- 读取变量时发生简单代码错误:无法访问地址处的内存
- 无法访问地址为c++的内存
- CUDA:全局内存访问地址
- 为什么运行得很好?(范围外变量的访问地址)
- 在添加断点并运行程序时,无法访问地址处的内存