使用 SSSE3 将 2 个未对齐的 64 位值加载到 sse 寄存器中的最佳方法是什么?



有2个指针指向2个未对齐的8字节块,将被加载到xmm寄存器中。如果可能的话,使用内在函数。如果可能的话,不使用辅助寄存器。没有pinsrd。

msvc规格来看,您可以执行以下操作:

__m128d xx;                   // an uninitialised xmm register 
xx = _mm_loadh_pd(xx, ptra);  // load the higher 64 bits from (unaligned) ptra
xx = _mm_loadl_pd(xx, ptrb);  // load the lower 64 bits from (unaligned) ptrb

从未对齐的存储中加载(以我的经验)比从对齐的指针中加载要慢得多,所以如果你真的想要更高的性能,你不应该太频繁地做这种类型的操作。

不对齐的访问比对齐的访问慢得多(至少在nehalem之前);您可以通过加载包含所需未对齐的64位字的对齐128位字来获得更好的速度,然后对它们进行洗牌以获得您想要的结果。

假定:

  • 你有内存读取访问完整的128字
  • 64位字至少在32位边界上对齐

。(未测试)

int aoff = ptra & 15;
int boff = ptrb & 15;
__m128 va = _mm_load_ps( (char*)ptra - aoff ); 
__m128 vb = _mm_load_ps( (char*)ptrb - boff ); 
switch ( (aoff<<4) | boff ) 
{
    case 0:  _mm_shuffle_ps(va,vb, ...

情况的数量取决于您是否可以假设64位对齐

最新更新