加速C ++中的堆内存访问

时间:2014-09-18 11:18:03

标签: c++ stack heap

由于仿真建议,我需要建模一个由单元,块和页面组成的小型存储系统。这样,我实现了这个内存如下:

typedef struct block {
    double lifetime[320];
    block * next;
} block;

我向每个页面发送了数十亿的写信:

vector<vector<block>>  MainMem(max_page, vector<block>(num_blocks_per_page));
for(double  cWrite = 0 ;  MainMem.size()  ; ++cWrite)
    for(int page_index = 0 ; page_index < MainMem.size() ; page_index ++)
          for(int block_index = 0 ; block_index < max_blocks; block_index++)
                for(int cell = 0 ; cell < max_cell; cell++){
                    MainMem[page_index][cnt_block].lifetime[cell] --;

不幸的是,这是一个非常耗时的过程。我尝试过基于堆栈而不是基于堆,但由于堆栈容量小而不满足我。

1 个答案:

答案 0 :(得分:0)

如果不进行测量,就不可能量化任何可能的加速,但这里有一些可以帮助理论的东西。您必须实施并测试它。

当您使用vector<vector<block>>时,您需要为外部vector分配一个分配,为每个内部vector分配一个分配。除此之外,您还有一个额外的间接级别,可能导致(更多)缓存未命中。特别是第二部分可能非常重要。

要避免这种情况,请使用简单的vector<block>。您必须将索引从MainMem[i][j]更改为MainMem[i*num_blocks_per_page + j],或将其包装在具有为您执行该逻辑的operator[]的类中。内联其实施可能很重要。

(我猜你的循环在你的真实代码中没有被破坏。)