6

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

4

2 回答 2

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

从未对齐的存储加载(根据我的经验)比从对齐的指针加载要慢得多,所以如果你真的想要更高的性能,你不希望经常执行这种类型的操作。

希望这可以帮助。

于 2011-08-27T23:27:41.913 回答
2

非对齐访问比对齐访问慢得多(至少在 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 位对齐

于 2011-08-30T14:06:47.373 回答