我已多次阅读有关cache-as-ram模式(无填充模式)的信息,并且想知道是否可以编写第一个可执行代码并跳转到可执行代码,如果是这样,可执行代码仅限于一级缓存的一半(从那以后)缓存真的只是sram).
我已经了解了不同的缓存映射技术,如直接映射,关联映射和集合关联映射技术,还学习了权衡.但我很好奇现在在intel core i7或AMD处理器中使用了什么.以及这些技术是如何演变的.还有哪些事情需要改进?
考虑x86中的以下循环:
; on entry, rdi has the number of iterations
.top:
; some magic happens here to calculate a result in rax
mov [array + rdi * 8], rax ; store result in output array
dec rdi
jnz .top
Run Code Online (Sandbox Code Playgroud)
它很简单:有些东西计算结果rax(未显示)然后我们将结果存储到数组中,与我们索引时的顺序相反rdi.
我想转换上面的循环而不是对内存进行任何写入(我们可以假设未显示的计算不会写入内存).
只要循环计数rdi有限,我就可以使用ymmregs 提供的充足空间(512字节)来保存值,但实际上这样做似乎很尴尬,因为你不能"索引"任意寄存器.
一种方法是始终将ymm一个元素的整个"数组" 寄存器混洗,然后将元素插入新释放的位置.
像这样的东西:
vpermq ymm3, ymm3, 10_01_00_11b ; left rotate ymm by qword
vpermq ymm2, ymm2, 10_01_00_11b ; left rotate ymm by qword
vpermq ymm1, ymm1, 10_01_00_11b …Run Code Online (Sandbox Code Playgroud) 假设我有一个非常大的源代码,并且打算rdx在执行期间完全不使用寄存器,即,在生成汇编代码时,我只想通知我的编译器(GCC)它根本不应该使用rdx。
注意:注册rdx只是一个例子。我可以使用任何可用的 Intel x86 寄存器。
我什至很高兴更新编译器的源代码并使用我的自定义 GCC。但是需要对源代码进行哪些更改?
我正在创建一个自定义操作系统,有没有什么方法可以在程序集中存储数据(几乎像文件系统),以便在计算机关闭并重新打开时数据仍然存在?
在x86-64平台上,CLFLUSH汇编指令允许刷新对应于给定地址的缓存行.相反,冲洗与特定地址的缓存,会有一种通过使其充满了虚拟的内容,以刷新整个高速缓存(或者相关程序的缓存中执行,或整个高速缓存),例如(或任何我不会意识到的其他方法):
以下函数的内容是什么:(无论编译器优化如何,该函数都应该工作)?
void flush_cache()
{
// Contents
}
Run Code Online (Sandbox Code Playgroud) assembly ×3
x86 ×3
cpu-cache ×2
amd ×1
architecture ×1
avx ×1
c++ ×1
file ×1
gcc ×1
intel ×1
linux ×1
memory ×1
non-volatile ×1
optimization ×1
persistence ×1
sse ×1
sys ×1