首页 > 解决方案 > 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(例如通过加载它然后再次写回)?

标签: ssesimdavx2avx512

解决方案


他们进行故障抑制并保持正确性;请参阅当使用带有 AVX-512 加载和存储的屏蔽寄存器时,是否会因对屏蔽元素的无效访问而引发错误?

它绝对不会非原子 RMW。

这一切都适用于 SSE(慢 NT 存储)maskmovdqu、AVX 相对高效的 dword/qword 屏蔽vmaskmovps/pdvpmaskmovd/q以及 AVX512 屏蔽存储。

但它可能很慢。

AVXvmaskmov完全屏蔽存储到只读页面非常慢,每条指令都需要微码辅助。if(a[i] == x) a[i] = y;(因此,如果不需要更改,并且页面是“干净的”并且 COW 映射到零页面,那么在数组上的循环中执行非常糟糕。)

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

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


推荐阅读