就效率而言,缓存是一个核心问题。
我知道缓存通常会自动发生。
但是,我想自己控制缓存的使用,因为我认为我可以比一些不知道确切程序的启发式方法做得更好。
因此,我需要汇编指令来直接移入或移出高速缓存单元。
like:
movL1 address content
我知道有一些指令给出了“缓存系统”提示,但我不确定这是否足够,因为这些提示可能会被忽略,或者它们可能不足以表达通过这种移入/移出缓存可以表达的任何内容命令。
是否有允许完全缓存控制的汇编器?
旁注:为什么我想改进缓存:
假设一个 CPU 有 1 个寄存器和一个包含 2 个单元的高速缓存。
考虑以下两个程序:
(其中 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"
在第一种情况下,您将使用 x、y、z 的寄存器和缓存(a 仅写入一次)
在第二种情况下,您将使用 a、x、y 的寄存器和缓存(z 只写入一次)
如果CPU进行缓存,它根本无法提前决定它面临的是上述两种情况中的哪一种。
在知道程序是否执行之前,它必须决定每个存储单元 x、y、z 是否应该缓存其内容。 1 或没有。 2,因为两个程序的开始是相同的。
另一方面,程序员提前知道哪些存储单元被重用以及何时被重用。
彼得·科德斯写道:
在大多数 ISA 的大多数微架构上,不,您无法将一行固定在高速缓存中以阻止其被逐出。使用缓存的唯一方法是作为加载/存储的透明缓存。
这是正确的,但例外情况很有趣......
DSP(“数字信号处理”)芯片通常提供在“高速缓存”和“暂存存储器”功能之间划分 SRAM 的有限能力。关于这个主题有很多白皮书和参考指南——一个例子是http://www.ti.com/lit/ug/sprug82a/sprug82a.pdf http://www.ti.com/lit/ug/sprug82a/sprug82a.pdf。在该芯片中,有三个 SRAM 块:一个小的“Level-1 指令”SRAM、一个小的“Level-1 数据”SRAM 和一个较大的“Level-2”SRAM。这三者中的每一个都可以在高速缓存和直接寻址存储器之间进行分区,具体细节取决于具体的芯片。例如,芯片可能不允许缓存、1/4 SRAM 作为缓存、1/2 SRAM 作为缓存、或者全部 SRAM 作为缓存。 (比率受到限制,因此可以有效地对允许的缓存大小进行索引。)
IBM“Cell”处理器(用于2006年发布的索尼PlayStation 3)是一种多核芯片,具有一个普通通用核心和八个协处理器核心。协处理器核心的指令集有限,加载和存储指令只能访问其私有 128KiB“暂存器”内存。为了访问主存储器,协处理器必须对 DMA 引擎进行编程,以执行主存储器到本地暂存存储器的块复制(反之亦然)。这种方法提供(并且需要)对数据移动的完美控制,从而产生(极少量)非常高性能的软件。
一些 GPU 还具有小型片上 SRAM,可以配置为 L1 缓存或显式控制的本地内存。
所有这些都被认为“非常难”(或更糟)使用,但如果产品需要非常低的成本、完全可预测的性能或非常低的功耗,这可能是正确的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)