sse - SSE:屏蔽存储是否会影响被屏蔽的字节
问题描述
在英特尔内在函数指南中,有一些允许存储宽寄存器的一部分。我的意思是_mm_maskstore
,_mm_mask_store
和_mm_mask_compressstoreu
喜欢。
问题是,如果我的线程不拥有它们所在的缓存行的一部分或者它超过当前页面的末尾,是否可以使用它们?
例子:
struct S {
std::int16_t write_here[10];
std::atomic<std::int16_t> other_thread_can_use_this;
};
我可以用一个 simd 商店写到write_here
吗?或者它可以破坏数据other_thread_can_use_this
(例如通过加载它然后再次写回)?
解决方案
他们进行故障抑制并保持正确性;请参阅当使用带有 AVX-512 加载和存储的屏蔽寄存器时,是否会因对屏蔽元素的无效访问而引发错误?
它绝对不会做非原子 RMW。
这一切都适用于 SSE(慢 NT 存储)maskmovdqu
、AVX 相对高效的 dword/qword 屏蔽vmaskmovps/pd
和vpmaskmovd/q
以及 AVX512 屏蔽存储。
但它可能很慢。
AVXvmaskmov
完全屏蔽存储到只读页面非常慢,每条指令都需要微码辅助。if(a[i] == x) a[i] = y;
(因此,如果不需要更改,并且页面是“干净的”并且 COW 映射到零页面,那么在数组上的循环中执行非常糟糕。)
我不确定当完整向量在同一页面中的两个缓存行中拆分时它的性能如何,其中一个会在缓存中丢失,但是该不存在行的所有元素都被屏蔽掉了。您希望存储的那一侧根本不会出现在存储缓冲区中,因此核心没有理由对它进行 RFO(获得对它的独占访问权)。
同样,在架构上对被屏蔽的字节没有影响,只有可能的性能。
推荐阅读
- javascript - Jasmine 从脚本文件中获取未定义的数组
- ruby-on-rails - 测试命名空间控制器
- html - 如何在 Bootstrap 表中垂直居中元素
- http - HTTPS 代理网站创建虚假网站
- ios - 快速保存图像的最佳方法?
- java - Spring(规范) - 如何创建具有多对多关系和集合的 Criteria Builder
- php - laravel LoginController::showLoginForm 不存在
- php - 如何跳过登录页面的查询字符串检查
- c# - 如何从 c# 中的已知偏移量读取 4、6、8 个字节?
- firebase - Firestore:对于帖子上的“喜欢计数”的情况,如何处理单个文档限制(每秒 1 次)上的多次写入