对于x86-64架构,是否有一条指令可以将给定内存地址的数据加载到缓存中?类似地,是否存在可以在给定与该高速缓存行对应的存储器地址(或类似高速缓存行标识符)的情况下逐出高速缓存行的指令?
将数据预取到缓存中(不将其加载到寄存器中):
PREFETCHT0 [address] PREFETCHT1 [address] PREFETCHT2 [address]
内在的: void _mm_prefetch (char const* p, int hint)
void _mm_prefetch (char const* p, int hint)
请参阅insn ref manual和其他指南,了解不同的近似提示的含义 . (x86标签维基上的其他链接) .
着名的What Every Programmer Should Know About Memory文章是在P4当前时编写的 . 当前的CPU具有更智能的硬件预取程序,超线程不仅仅是运行预取线程 . AFAIK,预取线程大多是一个死的想法 . 除此之外,关于缓存的优秀文章 . 搜索其他SO帖子和内容以决定何时实际预取 .
不要在Intel IvyBridge上使用软件预取过度 . 该特定的微体系结构存在性能缺陷,并且只能退出one prefetch per 43 clocks .
刷新包含给定地址的缓存行:
clflush [address] clflushopt [address] ; Newer CPUs only. Weakly ordered, with higher throughput.
内在的: void _mm_clflushopt (void const * p)
void _mm_clflushopt (void const * p)
有一个recent question about its performance .
1 回答
将数据预取到缓存中(不将其加载到寄存器中):
内在的:
void _mm_prefetch (char const* p, int hint)
请参阅insn ref manual和其他指南,了解不同的近似提示的含义 . (x86标签维基上的其他链接) .
着名的What Every Programmer Should Know About Memory文章是在P4当前时编写的 . 当前的CPU具有更智能的硬件预取程序,超线程不仅仅是运行预取线程 . AFAIK,预取线程大多是一个死的想法 . 除此之外,关于缓存的优秀文章 . 搜索其他SO帖子和内容以决定何时实际预取 .
不要在Intel IvyBridge上使用软件预取过度 . 该特定的微体系结构存在性能缺陷,并且只能退出one prefetch per 43 clocks .
刷新包含给定地址的缓存行:
内在的:
void _mm_clflushopt (void const * p)
有一个recent question about its performance .