simd存储延迟

sho*_*nex 1 c gcc sse simd

我有以下类型的代码

short v[8] __attribute__ (( aligned(16)));
...
// in an inlined function :
_mm_store_si128(v, some_m128i_value);
... // some more operation (4 additions )
outp[0] = v[1] / 2; // <- first access of v since the previous store 
Run Code Online (Sandbox Code Playgroud)

当我用perf注释这个代码时,这一行占整个采样的18%!当我说行时,它处于汇编级别,即从v计数移动18%后的指令

它是缓存未命中吗?我怎么测试呢?

我真的不需要存储结果,但是如何避免往返内存,并且仍然单独访问组成我的m128i值的8短路.

更新:如果我使用_mm_extract_epi16,那么整体性能并不是更好,但等待在每次访问之间平均分配,而不是仅仅按第一次访问.

Pau*_*l R 6

您应该使用_mm_extract_epi16(PEXTRW)直接从128位SSE寄存器获取16位标量值而不是通过内存,而不是使用SIMD存储,然后执行标量加载,例如

outp[0] = _mm_extract_epi16(some_m128i_value, 6);
Run Code Online (Sandbox Code Playgroud)

  • 当然,我在1小时前睡着了...... +1.我想补充一下.您通常希望避免使用不同的字大小立即访问相同的内存.大多数处理器加载/存储单元都没有经过优化来处理这些情况,最终会将所有内容刷新到缓存和再次读回 - 通常会导致10+周期的惩罚. (3认同)