问题标签 [clflush]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - clflush 是否刷新 L1i?
这就是问题:clflush 是否刷新 L1i?英特尔 ISA 手册对此并不清楚:
从高速缓存一致性域中的每一级高速缓存层次结构中,使包含由内存操作数指定的线性地址的高速缓存行无效。如果该高速缓存行在高速缓存层次结构的任何级别包含修改的数据,则该数据将被写回内存
我会根据措辞推测
如果该高速缓存行在高速缓存层次结构的任何级别包含修改的数据,则该数据将被写回内存。
所以L1I保持不变。这是英特尔 CPU 的实际行为吗?
c - 不使用 clflush 逐出缓存行
我想基于 Yarom 和 Falkner 的FLUSH+RELOAD攻击实现 EVICT+RELOAD,但不使用clflush
指令从缓存中逐出数据。
我对缓存行和页面有一个粗略的了解,例如,这篇文章简洁地解释了它。我知道缓存行是缓存中的最小单位。在我的系统上,一个缓存行有 64 个字节。内存页是指固定长度的连续虚拟内存块。
但是,我真的不明白如何实现它。我很清楚我需要覆盖缓存中的现有数据。另外,我知道缓存是根据访问的地址填满的。但是,如果缓存透明地工作,我如何有选择地覆盖特定的缓存行?
// 附录
问题的帖子有没有办法刷新与程序相关的整个 CPU 缓存?还提到驱逐是一种从缓存中删除数据的策略:“或者当然为已知的 L1d 大小和关联性创建冲突驱逐,例如以 4kiB 的倍数写入多行,这些行都映射到 32k / 8-方式 L1d。” 但它没有提供有关如何完成它的任何细节。
c - 如何获取共享库中指令的地址?
我想在flush-reload
论文中重现一些实验。在这个实验中,有两个线程称为A和B。有一个共享库c。A线程通过flush指令从缓存中刷新共享库c中的指令d 。然后A等待一段时间。然后 A 重新加载指令 d。如果加载时间短,说明d指令在缓存中,说明线程A在等待时线程B使用了这条指令。如果加载指令d的时间较长,说明d指令在内存中,说明线程B在线程A的等待时间内没有使用这条指令。
我想知道如何获取共享库中指令的地址。
例如,我有一个带有函数的共享库print
。我想得到a=a+1
这个函数中指令的地址。经过
我可以得到打印函数的地址,但是我如何得到的地址a=a+1
呢?探针+n? (这应该n
是什么?)如何验证这个地址确实是指令?
c - 系统崩溃时 clflush 或 clflushopt 是原子的吗?
通常,高速缓存行是 64B,但非易失性存储器的原子性是 8B。
例如:
x
缓存行对齐,最初设置为0
.
系统崩溃clflush();
重启后可以吗?</
x[1]=0
p >x[2]=100
c++ - 为什么缓存命中比缓存未命中需要更多时间?
我想用 C 或 C++ 清除我的缓存行。我的代码如下,我的 gcc 版本是 9.3.0。
我的缓存线是 64 字节。至于我的cpu缓存大小,是这样的:
我多次运行这段代码,结果似乎很奇怪,
如果我将clear_cache
功能更改如下:
并将调用 clear_cache 的函数从clear_cache(mem_block, sizeof(char)*len)
改为clear_cache(mem_block, len)
,运行的程序似乎是有道理的。结果是这样的:
如上所示,为什么我之前写的代码不能产生正常的结果(缓存命中比缓存未命中需要更多时间),但两篇文章都表明缓存未命中比缓存命中花费更多的 tsc(时间戳计数),尽管它们的缓存未命中 tsc 也有很大不同。为什么代码会这样?或者如果我的编码有问题?非常感谢您的帮助。
c - 使用函数 _mm_clflush 刷新大型结构的正确方法
我开始使用_mm_clflush
、_mm_clflushopt
和等函数_mm_clwb
。
现在说,因为我已经定义了一个结构名称 mystruct,它的大小是 256 字节。我的缓存线大小是 64 字节。现在我想刷新包含 mystruct 变量的缓存行。以下哪种方法是正确的方法?
或者
assembly - x86 是否有非特权指令来刷新整个缓存而不是单行?
我想知道 x86 汇编中是否存在一条指令或指令序列来刷新执行该指令的 CPU 的整个 L1I 和 L1D 缓存。具体来说,我正在寻找相当于指令 MOV 到 CR0(将 CR0.PG 从 1 更改为 0)的非特权缓存,它刷新所有 TLB(包括全局 TLB)。我的目标是出于安全原因刷新这些缓存并将它们添加到其他汇编指令例程中。
x86 - 有没有办法将缓存行刷新到 L3 缓存?
我是建筑方向的博士生。我正在做一些关于缓存的研究工作。
有没有办法将缓存行刷新到 L3 缓存?比如L1和L2缓存中有一些缓存行,我想调整到L3缓存。因为我的实验是保证访问这些缓存行有类似的时间延迟。clflush 指令将所有高速缓存行刷新到内存。我只想刷新到 L3 缓存。
我的服务器配置为:
c - 关于 _mm_clflush 和 _mm_clflushout 的一些问题
- _mm_clflush 和 _mm_clflushout 之间的主要区别是什么?
- 鉴于每个线程刷新不同的内存区域(可能源自不同的 CPU 内核),刷新 CPU 缓存中的无效页面是否是线程安全的?
- 只是为了确定-这些命令是同步的吗?即,它们仅在缓存页面被刷新到内存后才返回(如果它是无效页面)?
cuda - 如果使用 cuda api 从 GPU 内存复制到持久内存,我是否需要外部调用刷新?
我正在使用 Cuda API:
cudaMemcpyAsync ( void* dst, const void* src, size_t count, cudaMemcpyKind kind, cudaStream_t stream = 0 )
从 CPU 内存中复制 GPU 内存中的数据。如果使用 memcpy() 将数据从 CPU 内存复制到持久内存,我们需要显式调用刷新操作(例如 clflush())以确保从 CPU 缓存中刷新数据。使用 cudaMemcpyAsync() 从 GPU 内存复制到持久内存时是否需要调用刷新操作?