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

时间:2011-08-27 23:16:23

标签: sse simd intrinsics

有两个指向2个未对齐的8字节块的指针要加载到xmm寄存器中。如果可能,使用内在函数。如果可能,不使用辅助寄存器。没有pinrd。 (SSSE Core 2)

2 个答案:

答案 0 :(得分:3)

msvc specs,您可以执行以下操作:

__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

从未对齐存储中加载(根据我的经验)比从对齐指针加载要慢得多,因此如果您真的想要更高的性能,那么您也不希望过于频繁地执行此类操作。

希望这有帮助。

答案 1 :(得分:2)

未对齐访问速度比对齐访问速度慢得多(至少在Nehalem之前); 通过加载包含所需的未对齐64位字的对齐的128位字,可以获得更好的速度,然后将它们随机播放以获得所需的结果。

假设:

  • 您拥有对完整128字的内存读取权限
  • 64位字在至少32位边界上对齐

e.g。 (未经测试)

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位对齐