我有以下类型的代码
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,那么整体性能并不是更好,但等待在每次访问之间平均分配,而不是仅仅按第一次访问.
您应该使用_mm_extract_epi16(PEXTRW)直接从128位SSE寄存器获取16位标量值而不是通过内存,而不是使用SIMD存储,然后执行标量加载,例如
outp[0] = _mm_extract_epi16(some_m128i_value, 6);
Run Code Online (Sandbox Code Playgroud)