SSE:掩码存储是否影响被屏蔽掉的字节

SSE: does mask store affect the bytes that were masked out

在英特尔内在函数指南中,有一些允许存储宽寄存器的一部分。我的意思是 _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 的数据(例如,通过加载它然后再将其写回)?

他们进行故障抑制并保持正确性;参见

它绝对不会做非原子 RMW。

这都适用于 SSE(慢速 NT 存储)maskmovdqu, AVX's relatively efficient dword/qword masked vmaskmovps/pd and vpmaskmovd/q,以及 AVX512 屏蔽存储。

但它可能会很慢。

AVX vmaskmov 全屏蔽存储到只读页面 非常 慢,每条指令都需要微码辅助。 (因此,如果不需要更改,则在执行 if(a[i] == x) a[i] = y; 的数组循环中执行非常糟糕,页面为 "clean" 并且 COW 映射到零页面。)

我不确定当完整向量在同一页中跨越两个缓存行时它是如何执行的,其中一个会在缓存中丢失,但该不存在的行的所有元素都被屏蔽掉了。您希望存储的那一侧根本不会出现在存储缓冲区中,因此核心没有理由 RFO 它(获得对其的独占访问权)。

同样,在架构上对被屏蔽的字节没有影响,只有可能的性能。