我有以下类型的代码
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
当我使用perf注释此代码时,此单行占18% 整个抽样!当我说行时,它处于汇编级别,即从v计数移动18%后的指令
是缓存未命中吗?我该如何测试?
我不需要存储结果,但是如何避免往返内存,并且仍然可以单独访问构成m128i值的8短路。
更新: 如果我使用_mm_extract_epi16,那么整体性能并不是更好,但是等待在每次访问之间平均分配而不是仅仅是第一次访问。
答案 0 :(得分:6)
您应该使用_mm_extract_epi16
(PEXTRW
)直接从128位SSE寄存器获取16位标量值,而无需通过内存,而不是执行SIMD存储,然后使用标量加载,例如
outp[0] = _mm_extract_epi16(some_m128i_value, 6);