考虑在x86 CPU上进行单个内存访问(单个读取或单个写入,而不是读取或写入)SSE指令.该指令访问16字节(128位)的存储器,访问的存储器位置对齐为16字节.
文档"英特尔®64架构内存订购白皮书"指出,对于"读取或写入地址在8字节边界上对齐的四字(8字节)的指令",内存操作似乎作为单个内存访问执行,而不管记忆类型.
问题:是否存在Intel/AMD/etc x86 CPU,它们保证读取或写入与16字节边界对齐的16字节(128位)作为单个内存访问执行?是这样,它是哪种特定类型的CPU(Core2/Atom/K8/Phenom/...)?如果您对此问题提供答案(是/否),请同时指定用于确定答案的方法 - PDF文档查找,强力测试,数学证明或您用于确定答案的任何其他方法.
此问题涉及http://research.swtch.com/2010/02/off-to-races.html等问题
更新:
我在C中创建了一个可以在您的计算机上运行的简单测试程序.请在您的Phenom,Athlon,Bobcat,Core2,Atom,Sandy Bridge或您碰巧拥有的任何支持SSE2的CPU上编译并运行它.谢谢.
// Compile with:
// gcc -o a a.c -pthread -msse2 -std=c99 -Wall -O2
//
// Make sure you have at least two physical CPU cores or hyper-threading.
#include <pthread.h>
#include <emmintrin.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
typedef int v4si __attribute__ ((vector_size (16)));
volatile v4si x;
unsigned n1[16] __attribute__((aligned(64)));
unsigned n2[16] __attribute__((aligned(64)));
void* thread1(void *arg) {
for (int i=0; i<100*1000*1000; i++) { …Run Code Online (Sandbox Code Playgroud) 该MASKMOVDQU 1是86存储指令之间特殊的,因为在原则上,它可以让你各个字节存储在缓存行,而无需首先加载整个高速缓存行一路核心,以便写入的字节可以与不合并- 覆盖现有字节。
它似乎使用与 NT 存储相同的机制来工作:在不首先执行 RFO 的情况下将缓存行向下推。根据英特尔软件开发手册(重点是我的):
MASKMOVQ 指令可用于提高需要逐字节合并数据的算法的性能。它不应导致读取所有权;这样做会产生不必要的带宽,因为将使用字节掩码直接写入数据,而无需在存储之前分配旧数据。
然而,与其他 NT 存储不同,您可以使用掩码来指定实际写入的字节。
如果您想在不太可能适合任何级别的缓存的大区域中进行稀疏字节粒度写入,则此指令似乎是个主意。
与几乎所有其他有用的指令不同,英特尔没有将指令扩展到 AVX/AVX2 或 AVX-512 中的 256 或 512 位。这是否表示不再推荐使用此指令,可能无法在当前或未来的架构上有效实现?
1 ...及其在 MMX MASKMOVQ 中的64 位前身。
当使用像 Intel optane DCPMM 这样的持久内存时,如果在执行 movnt 指令时系统崩溃(断电),是否可以在重新启动后看到部分结果?
为了:
movntix86 保证原子用于其他目的?movntdq/movntps不保证原子性,但实际上可能在支持持久内存的 CPU 上。vmovntdq/vmovntpsvmovntdq/vmovntps全线商店MOVDIR64B在支持它和 DC-PM 的未来 CPU 上保证了 64 字节写入原子性。例如Sapphire Rapids Xeon / Tiger Lake / Tremont。movntpd假定与 相同movntps。
相关问题: