由于优化原因,我希望向量存在于缓存中,并将其放在堆栈中会大大增加这种可能性。是否可以在堆栈上创建向量?如果有必要,我完全愿意重新实现自己的std::vector
变体。如果需要,我也很习惯使用内联汇编。
答案 0 :(得分:4)
在堆栈上具有[vector]会大大增加[其内容在缓存中]的几率。”
这是猜测。缓存可以从堆栈和堆中加载数据。缓存并不关心原始物理内存的来源。这就是缓存的目的。所有人都称赞Cache。实际上,从软件角度看内存的位置(自动存储还是免费存储)与物理位置(缓存,RAM,磁盘等)之间甚至没有很强的关联性。
由于优化原因,我想要[...]
我想您想要一个更快的软件。为此,您需要确定到底是什么使它变得太慢而无法满足您的口味。有a profiler is one of them种工具。当您解决了所有瓶颈并留有仍然太慢的软件时,可以确定您会遇到data-oriented性能问题。这是当您问自己:我如何才能以一种可预测的方式处理记忆,以帮助我的CPU cache和CPU 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来获得想法。