看着这个事实,我开始想知道寄存器在 GPU 中是如何工作的?在知道这一点之前,我认为在分层内存阶梯之上越来越高,大小不断减小(这是直观的(延迟减少,大小减小))。GPU 中寄存器的用途是什么,为什么它们的大小大于 L2/L1 缓存?谢谢。
谈到效率,缓存是核心。
我知道缓存通常会自动发生。
但是,我想自己控制缓存的使用,因为我认为我可以比一些不知道确切程序的启发式方法做得更好。
因此,我需要汇编指令来直接移入或移出高速缓存单元。
喜欢:
movL1 address content
Run Code Online (Sandbox Code Playgroud)
我知道有一些指令会给出“缓存系统”提示,但我不确定这是否足够,因为这些提示可能会被忽略,或者它们可能不足以表达任何可以通过这种移入/移出缓存来表达的内容命令。
是否有任何允许完全缓存控制的汇编程序?
旁注:为什么我想改进缓存:
考虑一个具有 1 个寄存器和一个包含 2 个单元的缓存的假设 CPU。
考虑以下两个程序:
(其中 x,y,z,a 是存储单元)
"START"
"move 1 to x"
"move 2 to y"
"move 3 to z"
"move 4 to a"
"move z to x"
"move y to x"
"END"
"START"
"move 1 to x"
"move 2 to y"
"move 3 to z"
"move 4 to a"
"move a to x"
"move y to x"
"END"
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,您将寄存器和缓存用于 x,y,z(a 只写入一次)在第二种情况下,您将寄存器和缓存用于 a,x,y (z只写入一次)
如果 CPU …
我想知道为什么需要内存屏障,我已经阅读了一些关于这个主题的文章。
有人说这是因为cpu乱序执行,而另一些人说这是因为缓存一致性问题,存储缓冲区和无效队列导致。
那么,需要内存屏障的真正原因是什么?cpu乱序执行或者缓存一致性问题?或两者?cpu乱序执行和缓存一致性有关系吗?x86和arm有什么区别?
CPU 已经通过一些协议(如 MESI)保证缓存一致性。为什么我们还需要volatile在某些语言(如java)中保持多线程之间的可见性。
可能的原因是这些协议在启动时未启用,并且必须由某些指令(例如LOCK.
如果确实如此,为什么CPU在启动时不启用该协议?
有没有办法在java中检查特定对象是否在CPU缓存中?有没有办法测试读/写其中一个字段是否会导致缓存未命中?
我以前编写过java程序,但不是复杂程序,现在我必须在java中做一些学术研究.
如果这是不可能的,有没有一种通用的方法来模拟这种事情?这在低级编程中是否可行,例如C?
for (int i = 0; i < foo + bar; ++i)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
假设这foo + bar是一个巨大的数字,并且它的值在循环迭代期间不会改变.(也就是说,循环的身体不会改变foo或bar)
foo + barget 的值是否缓存在某个地方?或者每次都会重新评估?
C/C++会不会处理它与Java等高级语言的不同?
我有一个特定的软件,它表现出的行为是未命中率如下所示:
L1-dcache-misses < L2-misses< L3-misses
Run Code Online (Sandbox Code Playgroud)
怎么会这样呢?
未命中率是通过perf查看重新填充计数器除以每个缓存的访问总数来计算的。
L2是非排除性的,这是一个有据可查的事实,这意味着 L2 不必包含 L1DCache 拥有的所有行。
\n\nL1d miss (Read, RFO) 是否也错过了 L2 填充 L1d 行而不填充相应的 L2 行?英特尔 mans 中有对此有任何解释吗?更新:有。Intel Vol.3,有关内存类型的部分。
\n\n或者用另一种方式重新表述这个问题:缺少 L2 的查找是否总是会导致其行被填充?
\n\n经过一番挖掘后,我自己发现了答案。它是回写内存类型的属性,而不是缓存级别
\n\n\n\n回写 (WB) \xe2\x80\x94 对系统内存的写入和读取均被缓存。读取来自缓存命中时的缓存行;读取未命中导致\n 缓存已满。
\n
我想知道 L1-Dcache 是不是数据来自的终极缓存。因为我知道 i-cache,所以有一个更接近 CPU 的 DSB,可以看作是 L0-icache。
另外,我对哪些硬件更改会影响 DSB 的性能感兴趣?我的意思是缓存,有诸如缓存大小、缓存关联性之类的东西。但是,DSB 是否也只是会受这些因素影响的缓存?
如果是,我可以使用 gem5.dll 模拟结果吗?我知道使用 gem5,我可以配置 L1 指令缓存并观察 L1 指令缓存性能。如何在 gem 上为 DSB 做同样的事情?
Cortex-A53 处理器有 1 到 4 个内核,每个内核都有一个 L1 内存系统和一个共享的 L2 缓存。