是否可以在堆栈上创建向量?

时间:2019-05-03 13:06:27

标签: c++ performance caching optimization

由于优化原因,我希望向量存在于缓存中,并将其放在堆栈中会大大增加这种可能性。是否可以在堆栈上创建向量?如果有必要,我完全愿意重新实现自己的std::vector变体。如果需要,我也很习惯使用内联汇编。

3 个答案:

答案 0 :(得分:4)

  

在堆栈上具有[vector]会大大增加[其内容在缓存中]的几率。”

这是猜测。缓存可以从堆栈和堆中加载数据。缓存并不关心原始物理内存的来源。这就是缓存的目的。所有人都称赞Cache。实际上,从软件角度看内存的位置(自动存储还是免费存储)与物理位置(缓存,RAM,磁盘等)之间甚至没有很强的关联性。

  

由于优化原因,我想要[...]

我想您想要一个更快的软件。为此,您需要确定到底是什么使它变得太慢而无法满足您的口味。有a profiler is one of them种工具。当您解决了所有瓶颈并留有仍然太慢的软件时,可以确定您会遇到data-oriented性能问题。这是当您问自己:我如何才能以一种可预测的方式处理记忆,以帮助我的CPU cacheCPU branch prediction

答案 1 :(得分:1)

CPU缓存不知道或不在乎您是使用堆栈还是堆内存,它可以处理原始内存地址,这些地址细分为缓存行(例如64字节)。此外,虚拟内存子系统在页面(例如4KB)上运行,这也可能是速度降低的原因。因此, 重要的是停留在相同的内存位置或附近,即通过重复使用内存。

是的,在进行缓存时,堆栈内存通常是一个安全的选择,因为堆栈的顶部通常是“热”的,这意味着已经被缓存了。但是堆栈并不意味着要存储大型或动态大小的对象,因为这样做会使顶部移出热点区域并破坏目的。

from scipy import rand, floor import matplotlib.pyplot as plt Lx=30; Ly=20 p=0.4 r=rand(Lx,Ly) # Generates random numbers across the 2D lattice of size Lx*Ly A = floor(r+p) # Using spy plt.xlabel('$L_x$'); plt.ylabel('$L_y$') plt.spy(A, origin='lower') plt.title("Figure 1") plt.savefig('fig1.png') # Using imshow plt.xlabel('$L_x$'); plt.ylabel('$L_y$') plt.imshow(r, cmap='rainbow', origin='lower', extent=[0,Lx,0,Ly]) plt.title("Figure 2") plt.colorbar(orientation='horizontal') plt.savefig('fig2.png') # Using matshow plt.xlabel('$L_x$'); plt.ylabel('$L_y$') plt.matshow(r, cmap='rainbow', origin='lower', extent=[0,Lx,0,Ly]) plt.colorbar(orientation='horizontal') plt.title("Figure 3") plt.savefig('fig3.png') plt.show() #Issues # 1) plt.show() doesn't show spy-plot (Figure 1). # 2) Axes labels don't pass to matshow-plot (Figure 3). # 3) spy-plot shows wrong-label ($L_x$ and $L_y$ are interchanged in Figure 2). # 4) None of the plots set origin at 'lower', i.e. at the bottom-left position. 可以缓存友好。只要确保事先reserve内存,就可以避免昂贵的重新分配和数据移动,并使用缓存友好的内存分配器,例如jemalloc(BSD内置)或ptmalloc(Linux内置)。当然还有个人资料,个人资料,个人资料。

答案 2 :(得分:0)

如果您希望向量驻留在堆栈中,则无需重新实现向量,而仅“提供”一个使用堆栈而不是堆的新分配器。

您可以查看this来获得想法。