simd存储延迟

时间:2011-12-08 17:17:51

标签: 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 

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

是缓存未命中吗?我该如何测试?

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

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

1 个答案:

答案 0 :(得分:6)

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

outp[0] = _mm_extract_epi16(some_m128i_value, 6);
相关问题